ZGlmZiAtLWdpdCBhL1JFQURNRSBiL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTgwNTFiCi0tLSAvZGV2L251bGwKKysrIGIvUkVBRE1FCkBAIC0wLDAgKzEgQEAKK1NUTFBvcnQgd2FzIGNvcGllZCB3aXRoIG1pbm9yIGVkaXRzIGZyb20gdGhlIEFuZHJvaWQgcG9ydCBvZiBnZWFycy4KZGlmZiAtLWdpdCBhL2FsZ29yaXRobSBiL2FsZ29yaXRobQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjk1NzM1Ci0tLSAvZGV2L251bGwKKysrIGIvYWxnb3JpdGhtCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX0FMR09SSVRITQorI2RlZmluZSBfU1RMUF9BTEdPUklUSE0KKworI2lmbmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDEKKyMgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+CisjZW5kaWYKKworI2lmZGVmIF9TVExQX1BSQUdNQV9PTkNFCisjICBwcmFnbWEgb25jZQorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1NURElPCisvLyByZW1vdmUoKSBjb25mbGljdHMsIDxjc3RkaW8+IHNob3VsZCBhbHdheXMgZ28gZmlyc3QKKyMgIGluY2x1ZGUgPHN0bC9fY3N0ZGlvLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9BTEdPX0gKKyMgIGluY2x1ZGUgPHN0bC9fYWxnby5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9JTVBPUlRfVkVORE9SX1NURCkKKyMgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0hFQURFUihhbGdvcml0aG0pCisjZW5kaWYgLyogX1NUTFBfSU1QT1JUX1ZFTkRPUl9TVEQgKi8KKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MSApCisjICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9BTEdPUklUSE0gKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL2Fzc2VydC5oIGIvYXNzZXJ0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhkMDEwOQotLS0gL2Rldi9udWxsCisrKyBiL2Fzc2VydC5oCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWYgIWRlZmluZWQgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQpCisjICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDIwMgorIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KKyNlbGlmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MjAyKSAmJiAhIGRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKKyMgIGRlZmluZSBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKKyNlbmRpZgorCisvKiBldmMzIGRvZXNuJ3QgaGF2ZSBhc3NlcnQuaDsgbWFjcm8gYXNzZXJ0KCkgaXMgZGVmaW5lZCBpbiBzdGxfZXZjLmggKi8KKyNpZm5kZWYgX1NUTFBfV0NFX0VWQzMKKyMgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NfSEVBREVSKGFzc2VydC5oKQorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDIwMikKKyMgIGlmICEgZGVmaW5lZCAoX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lEKQorIyAgICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgICB1bmRlZiAgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZW5kaWYKKyMgIHVuZGVmICBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKKyNlbmRpZgorCisvKiBMb2NhbCBWYXJpYWJsZXM6CisgKiBtb2RlOkMrKworICogRW5kOgorICovCmRpZmYgLS1naXQgYS9iaXRzZXQgYi9iaXRzZXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU0NjZlNQotLS0gL2Rldi9udWxsCisrKyBiL2JpdHNldApAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk4CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX0JJVFNFVAorI2RlZmluZSBfU1RMUF9CSVRTRVQKKworLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBiaXRzZXQ8PiBoYXMgYSBzZWNvbmQgdGVtcGxhdGUgcGFyYW1ldGVyLAorLy8gX1dvcmRULCB3aGljaCBkZWZhdWx0cyB0byB1bnNpZ25lZCBsb25nLiAgKllPVSBTSE9VTEQgTk9UIFVTRQorLy8gVEhJUyBGRUFUVVJFKi4gIEl0IGlzIGV4cGVyaW1lbnRhbCwgYW5kIGl0IG1heSBiZSByZW1vdmVkIGluCisvLyBmdXR1cmUgcmVsZWFzZXMuCisKKy8vIEEgYml0c2V0IG9mIHNpemUgTiwgdXNpbmcgd29yZHMgb2YgdHlwZSBfV29yZFQsIHdpbGwgaGF2ZQorLy8gTiAlIChzaXplb2YoX1dvcmRUKSAqIENIQVJfQklUKSB1bnVzZWQgYml0cy4gIChUaGV5IGFyZSB0aGUgaGlnaC0KKy8vIG9yZGVyIGJpdHMgaW4gdGhlIGhpZ2hlc3Qgd29yZC4pICBJdCBpcyBhIGNsYXNzIGludmFyaWFudAorLy8gb2YgY2xhc3MgYml0c2V0PD4gdGhhdCB0aG9zZSB1bnVzZWQgYml0cyBhcmUgYWx3YXlzIHplcm8uCisKKy8vIE1vc3Qgb2YgdGhlIGFjdHVhbCBjb2RlIGlzbid0IGNvbnRhaW5lZCBpbiBiaXRzZXQ8PiBpdHNlbGYsIGJ1dCBpbiB0aGUKKy8vIGJhc2UgY2xhc3MgX0Jhc2VfYml0c2V0LiAgVGhlIGJhc2UgY2xhc3Mgd29ya3Mgd2l0aCB3aG9sZSB3b3Jkcywgbm90IHdpdGgKKy8vIGluZGl2aWR1YWwgYml0cy4gIFRoaXMgYWxsb3dzIHVzIHRvIHNwZWNpYWxpemUgX0Jhc2VfYml0c2V0IGZvciB0aGUKKy8vIGltcG9ydGFudCBzcGVjaWFsIGNhc2Ugd2hlcmUgdGhlIGJpdHNldCBpcyBvbmx5IGEgc2luZ2xlIHdvcmQuCisKKy8vIFRoZSBDKysgc3RhbmRhcmQgZG9lcyBub3QgZGVmaW5lIHRoZSBwcmVjaXNlIHNlbWFudGljcyBvZiBvcGVyYXRvcltdLgorLy8gSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiB0aGUgY29uc3QgdmVyc2lvbiBvZiBvcGVyYXRvcltdIGlzIGVxdWl2YWxlbnQKKy8vIHRvIHRlc3QoKSwgZXhjZXB0IHRoYXQgaXQgZG9lcyBubyByYW5nZSBjaGVja2luZy4gIFRoZSBub24tY29uc3QgdmVyc2lvbgorLy8gcmV0dXJucyBhIHJlZmVyZW5jZSB0byBhIGJpdCwgYWdhaW4gd2l0aG91dCBkb2luZyBhbnkgcmFuZ2UgY2hlY2tpbmcuCisKKyNpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHgyCisjICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgorI2VuZGlmCisKKyNpZmRlZiBfU1RMUF9QUkFHTUFfT05DRQorIyAgcHJhZ21hIG9uY2UKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RsL19iaXRzZXQuaD4KKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MiApCisjICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9CSVRTRVQgKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKKwpkaWZmIC0tZ2l0IGEvY2Fzc2VydCBiL2Nhc3NlcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE3NTdkZQotLS0gL2Rldi9udWxsCisrKyBiL2Nhc3NlcnQKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHgxMDMKKyMgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+CisjZWxpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDEwMykgJiYgISBkZWZpbmVkIChfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQpCisjICAgZGVmaW5lIF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRAorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfV0NFX0VWQzMpCisjICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfTkVXX0NfSEVBREVSUykKKyMgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ1BQX0NfSEVBREVSKGNhc3NlcnQpCisjICBlbHNlCisjICAgIGluY2x1ZGUgPGFzc2VydC5oPgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgxMDMgKQorIyAgaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKKyMgICAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KKyMgICAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZWxzZQorIyAgICB1bmRlZiBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKKyMgIGVuZGlmCisjZW5kaWYKKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL2NjdHlwZSBiL2NjdHlwZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDZjNjg2Ci0tLSAvZGV2L251bGwKKysrIGIvY2N0eXBlCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX0NDVFlQRQorCisjaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MTA0CisjICBkZWZpbmUgX1NUTFBfQ0NUWVBFCisjICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAhPSAweDEwNCApCisjICBpbmNsdWRlIF9TVExQX05BVElWRV9DUFBfQ19IRUFERVIoY2N0eXBlKQorI2Vsc2UKKyMgIGlmbmRlZiBfU1RMUF9JTlRFUk5BTF9DQ1RZUEUKKyMgICAgaW5jbHVkZSA8c3RsL19jY3R5cGUuaD4KKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MTA0ICkKKyMgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+CisjICB1bmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjZW5kaWYKKworI2VuZGlmIC8qIF9TVExQX0NDVFlQRSAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvY2Vycm5vIGIvY2Vycm5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzYjM5NjAKLS0tIC9kZXYvbnVsbAorKysgYi9jZXJybm8KQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfQ0VSUk5PCisjIGRlZmluZSBfU1RMUF9DRVJSTk8KKworIyBpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHgxMDUKKyMgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+CisjIGVuZGlmCisKKyMgaWZuZGVmIF9TVExQX1dDRQorIyBpZiBkZWZpbmVkIChfU1RMUF9VU0VfTkVXX0NfSEVBREVSUykKKyMgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9DX0hFQURFUihjZXJybm8pCisjIGVsc2UKKyMgIGluY2x1ZGUgPGVycm5vLmg+CisjIGVuZGlmCisjIGVuZGlmCisKKyNpZm5kZWYgZXJybm8KKworIyBpZiBkZWZpbmVkIChfU1RMUF9JTVBPUlRfVkVORE9SX0NTVEQpICYmIFwKKyAgISBkZWZpbmVkIChfX0lCTUNQUF9fKSAmJiAhIGRlZmluZWQoX19ocHV4KSAmJiAhIGRlZmluZWQoX19NV0VSS1NfXykgJiYgIWRlZmluZWQoX1NUTFBfV0NFKQorX1NUTFBfQkVHSU5fTkFNRVNQQUNFCit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6ZXJybm87CitfU1RMUF9FTkRfTkFNRVNQQUNFCisjIGVuZGlmIC8qIF9TVExQX0lNUE9SVF9WRU5ET1JfQ1NURCAqLworCisjZW5kaWYKKworIyBpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDEwNSApCisjICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyBlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfQ0VSUk5PICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9jZmxvYXQgYi9jZmxvYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE3NmExMAotLS0gL2Rldi9udWxsCisrKyBiL2NmbG9hdApAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmbmRlZiBfU1RMUF9DRkxPQVQKKyNkZWZpbmUgX1NUTFBfQ0ZMT0FUCisKKyNpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHgxMDYKKyMgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+CisjZW5kaWYKKworLy8gQm9ybGFuZCBkZWZpbmVzIHNvbWUgaW1wbGVtZW50YXRpb24gY29uc3RhbnRzIGluIHN0ZDo6IG5hbWVzcGFjZSwKKy8vIHdlIGRvIG5vdCB3YW50IHRvIGltcG9ydCB0aGVtLgorI2lmIGRlZmluZWQgIChfU1RMUF9VU0VfTkVXX0NfSEVBREVSUykgJiYgIWRlZmluZWQgKF9fQk9STEFORENfXykKKyMgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9DX0hFQURFUihjZmxvYXQpCisjZWxzZQorIyAgaW5jbHVkZSA8ZmxvYXQuaD4KKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgxMDYgKQorIyAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KKyMgIHVuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfQ0ZMT0FUICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9jaXNvNjQ2IGIvY2lzbzY0NgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDFmMzZmCi0tLSAvZGV2L251bGwKKysrIGIvY2lzbzY0NgpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmbmRlZiBfU1RMUF9DSVNPNjQ2CisjZGVmaW5lIF9TVExQX0NJU082NDYKKworI2lmbmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDEwNworIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX1NUTFBfV0NFX0VWQzMpICYmICFkZWZpbmVkIChOX1BMQVRfTkxNKSAmJiAhZGVmaW5lZCAoX19CT1JMQU5EQ19fKQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX05FV19DX0hFQURFUlMpCisjICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9DX0hFQURFUihjaXNvNjQ2KQorIyAgZWxzZQorIyAgICBpbmNsdWRlIDxpc282NDYuaD4KKyMgIGVuZGlmIC8qIF9TVExQX1VTRV9ORVdfQ19IRUFERVJTICovCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MTA3ICkKKyMgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+CisjICB1bmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjZW5kaWYKKworI2VuZGlmIC8qIF9TVExQX0NJU082NDYgKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL2NsaW1pdHMgYi9jbGltaXRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkZDRhYjQKLS0tIC9kZXYvbnVsbAorKysgYi9jbGltaXRzCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX0NMSU1JVFMKKyMgZGVmaW5lIF9TVExQX0NMSU1JVFMKKworI2lmbmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDEwOAorIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19TVU5QUk9fQ0MpICYmICgoX19TVU5QUk9fQ0MgPT0gMHg1MDApICYmIChfX1NVTlBST19DQ19DT01QQVQgPiA0KSkKKyMgIGluY2x1ZGUgPC91c3IvaW5jbHVkZS9saW1pdHMuaD4KKyNlbGlmIGRlZmluZWQgKF9TVExQX1VTRV9ORVdfQ19IRUFERVJTKQorIyAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ1BQX0NfSEVBREVSKGNsaW1pdHMpCisjZWxzZQorIyAgaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKQorIyAgICBpbmNsdWRlIF9TVExQX05BVElWRV9DX0hFQURFUihsaW1pdHMuaCkKKyMgIGVsc2UKKyMgICAgaW5jbHVkZSA8bGltaXRzLmg+CisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAgMHgxMDggKQorIyAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KKyMgIHVuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfQ0xJTUlUUyAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvY2xvY2FsZSBiL2Nsb2NhbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU5ZmY3YQotLS0gL2Rldi9udWxsCisrKyBiL2Nsb2NhbGUKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfQ0xPQ0FMRQorI2RlZmluZSBfU1RMUF9DTE9DQUxFCisKKyNpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgIDB4MTA5CisjICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAhPSAweDEwOSApCisjICBpbmNsdWRlIF9TVExQX05BVElWRV9DUFBfQ19IRUFERVIoY2xvY2FsZSkKKyNlbHNlCisjICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ0xPQ0FMRQorIyAgICBpbmNsdWRlIDxzdGwvX2Nsb2NhbGUuaD4KKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MTA5ICkKKyMgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+CisjICB1bmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjZW5kaWYKKworI2VuZGlmIC8qIF9TVExQX0NMT0NBTEUgKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL2NtYXRoIGIvY21hdGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMzMTliMAotLS0gL2Rldi9udWxsCisrKyBiL2NtYXRoCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX0NNQVRICisKKyNpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgIDB4MTEwCisjICBkZWZpbmUgX1NUTFBfQ01BVEgKKyMgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+CisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEICE9IDB4MTEwKQorIyAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ1BQX0NfSEVBREVSKGNtYXRoKQorI2Vsc2UKKyMgIGlmbmRlZiBfU1RMUF9JTlRFUk5BTF9DTUFUSAorIyAgICBpbmNsdWRlIDxzdGwvX2NtYXRoLmg+CisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAgMHgxMTAgKQorIyAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KKyMgIHVuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfQ01BVEggKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL2NvbXBsZXggYi9jb21wbGV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNzM4MjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21wbGV4CkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfQ09NUExFWAorI2RlZmluZSBfU1RMUF9DT01QTEVYCisKKyNpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgIDB4MTAKKyMgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+CisjZW5kaWYKKworLy8gVGhpcyBoZWFkZXIgZGVjbGFyZXMgdGhlIHRlbXBsYXRlIGNsYXNzIGNvbXBsZXgsIGFzIGRlc2NyaWJlZCBpbgorLy8gaW4gdGhlIGRyYWZ0IEMrKyBzdGFuZGFyZC4gIFNpbmdsZS1wcmVjaXNpb24gY29tcGxleCBudW1iZXJzCisvLyBhcmUgY29tcGxleDxmbG9hdD4sIGRvdWJsZS1wcmVjaXNpb24gYXJlIGNvbXBsZXg8ZG91YmxlPiwgYW5kCisvLyBxdWFkIHByZWNpc2lvbiBhcmUgY29tcGxleDxsb25nIGRvdWJsZT4uCisKKy8vIE5vdGUgdGhhdCB0aGUgdGVtcGxhdGUgY2xhc3MgY29tcGxleCBpcyBkZWNsYXJlZCB3aXRoaW4gbmFtZXNwYWNlCisvLyBzdGQsIGFzIGNhbGxlZCBmb3IgYnkgdGhlIGRyYWZ0IEMrKyBzdGFuZGFyZAorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NPTVBMRVgKKyMgIGluY2x1ZGUgPHN0bC9fY29tcGxleC5oPgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAgMHgxMCApCisjICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9DT01QTEVYICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9jc2V0am1wIGIvY3NldGptcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjhkMGIzCi0tLSAvZGV2L251bGwKKysrIGIvY3NldGptcApAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmbmRlZiBfU1RMUF9DU0VUSk1QCisKKyNpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHgxMTEKKyMgIGRlZmluZSBfU1RMUF9DU0VUSk1QCisjICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAhPSAweDExMSkKKyMgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9DX0hFQURFUihjc2V0am1wKQorI2Vsc2UKKyMgIGlmbmRlZiBfU1RMUF9JTlRFUk5BTF9DU0VUSk1QCisjICAgIGluY2x1ZGUgPHN0bC9fY3NldGptcC5oPgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgxMTEgKQorIyAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KKyMgIHVuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfQ1NFVEpNUCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvY3NpZ25hbCBiL2NzaWduYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE0MjY0OAotLS0gL2Rldi9udWxsCisrKyBiL2NzaWduYWwKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfQ1NJR05BTAorCisjaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MTEyCisjICBkZWZpbmUgX1NUTFBfQ1NJR05BTAorIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgIT0gMHgxMTIpCisjICBpbmNsdWRlIF9TVExQX05BVElWRV9DUFBfQ19IRUFERVIoY3NpZ25hbCkKKyNlbHNlCisjICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1NJR05BTAorIyAgICBpbmNsdWRlIDxzdGwvX2NzaWduYWwuaD4KKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MTEyICkKKyMgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+CisjICB1bmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjZW5kaWYKKworI2VuZGlmIC8qIF9TVExQX0NTSUdOQUwgKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL2NzdGRhcmcgYi9jc3RkYXJnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMTQxZWMKLS0tIC9kZXYvbnVsbAorKysgYi9jc3RkYXJnCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICovCisKKyNpZm5kZWYgX1NUTFBfQ1NUREFSRworCisjaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MTEzCisjICBkZWZpbmUgX1NUTFBfQ1NUREFSRworIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgIT0gMHgxMTMpCisjICBpbmNsdWRlIF9TVExQX05BVElWRV9DUFBfQ19IRUFERVIoY3N0ZGFyZykKKyNlbHNlCisjICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1NUREFSRworIyAgICBpbmNsdWRlIDxzdGwvX2NzdGRhcmcuaD4KKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MTEzICkKKyMgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+CisjICB1bmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjZW5kaWYKKworI2VuZGlmIC8qIF9TVExQX0NTVERBUkcgKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL2NzdGRkZWYgYi9jc3RkZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ZDE1MjcKLS0tIC9kZXYvbnVsbAorKysgYi9jc3RkZGVmCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX0NTVERERUYKKworI2lmbmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDExNAorIyAgZGVmaW5lIF9TVExQX0NTVERERUYKKyMgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+CisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEICE9IDB4MTE0KQorIyAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ1BQX0NfSEVBREVSKGNzdGRkZWYpCisjZWxzZQorIyAgaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NTVERERUYKKyMgICAgaW5jbHVkZSA8c3RsL19jc3RkZGVmLmg+CisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDExNCApCisjICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9DU1REREVGICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9jc3RkaW8gYi9jc3RkaW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNlZmY4NgotLS0gL2Rldi9udWxsCisrKyBiL2NzdGRpbwpAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmbmRlZiBfU1RMUF9DU1RESU8KKyNkZWZpbmUgX1NUTFBfQ1NURElPCisKKyNpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHgxNQorIyAgZGVmaW5lIF9TVExQX0NTVERJTworIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgIT0gMHgxNSkKKyMgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9DX0hFQURFUihjc3RkaW8pCisjZWxzZQorIyAgaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NTVERJTworIyAgICBpbmNsdWRlIDxzdGwvX2NzdGRpby5oPgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgxNSkKKyMgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+CisjICB1bmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjZW5kaWYKKworI2VuZGlmCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9jc3RkbGliIGIvY3N0ZGxpYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzE4ZmJiCi0tLSAvZGV2L251bGwKKysrIGIvY3N0ZGxpYgpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmbmRlZiBfU1RMUF9DU1RETElCCisKKyNpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHgxMTYKKyMgIGRlZmluZSBfU1RMUF9DU1RETElCCisjICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAhPSAweDExNikKKyMgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9DX0hFQURFUihjc3RkbGliKQorI2Vsc2UKKyMgIGlmbmRlZiBfU1RMUF9JTlRFUk5BTF9DU1RETElCCisjICAgIGluY2x1ZGUgPHN0bC9fY3N0ZGxpYi5oPgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgxMTYpCisjICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9DU1RETElCICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9jc3RyaW5nIGIvY3N0cmluZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGQzYmRiCi0tLSAvZGV2L251bGwKKysrIGIvY3N0cmluZwpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmbmRlZiBfU1RMUF9DU1RSSU5HCisKKyNpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHgxMTcKKyMgIGRlZmluZSBfU1RMUF9DU1RSSU5HCisjICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAhPSAweDExNykKKyMgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9DX0hFQURFUihjc3RyaW5nKQorI2Vsc2UKKyMgIGlmbmRlZiBfU1RMUF9JTlRFUk5BTF9DU1RSSU5HCisjICAgIGluY2x1ZGUgPHN0bC9fY3N0cmluZy5oPgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgxMTcpCisjICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9DU1RSSU5HICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9jdGltZSBiL2N0aW1lCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmOWMzN2IKLS0tIC9kZXYvbnVsbAorKysgYi9jdGltZQpAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqLworCisjaWZuZGVmIF9TVExQX0NUSU1FCisKKyNpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHgxMTgKKyMgIGRlZmluZSBfU1RMUF9DVElNRQorIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgIT0gMHgxMTgpCisjICBpbmNsdWRlIF9TVExQX05BVElWRV9DUFBfQ19IRUFERVIoY3RpbWUpCisjZWxzZQorIyAgaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NUSU1FCisjICAgIGluY2x1ZGUgPHN0bC9fY3RpbWUuaD4KKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MTE4KQorIyAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KKyMgIHVuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfQ1RJTUUgKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL2N0eXBlLmggYi9jdHlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzYTgwMzIKLS0tIC9kZXYvbnVsbAorKysgYi9jdHlwZS5oCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmbmRlZiBfU1RMUF9DVFlQRV9ICisKKy8qIFdvcmthcm91bmQgZm9yIGEgIm1pc2JlaGF2aW91ciIgd2hlbiBjb21waWxpbmcgcmVzb3VyY2Ugc2NyaXB0cyB1c2luZworICogZU1iZWRkZWQgVmlzdWFsIEMrKy4gVGhlIHN0YW5kYXJkIC5yYyBmaWxlIGluY2x1ZGVzIHdpbmRvd3MgaGVhZGVyIGZpbGVzLAorICogd2hpY2ggaW4gdHVybiBpbmNsdWRlIGN0eXBlLmgsIHdoaWNoIHJlc3VsdHMgaW4gd2FybmluZ3MgYW5kIGVycm9ycworICovCisjaWYgIWRlZmluZWQoUkNfSU5WT0tFRCkKKworIyAgaWYgIWRlZmluZWQgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQpCisjICAgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MjE5CisjICAgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+CisjICBlbGlmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MjE5KQorIyAgICBkZWZpbmUgX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lECisjICAgIGRlZmluZSBfU1RMUF9DVFlQRV9ICisjICBlbmRpZgorCisjICBpZiBkZWZpbmVkKF9TVExQX1dDRV9FVkMzKQorc3RydWN0IF9leGNlcHRpb247CisjICBlbmRpZgorCisjICBpbmNsdWRlIF9TVExQX05BVElWRV9DX0hFQURFUihjdHlwZS5oKQorCisvKiBvbiBldmM0IGluY2x1ZGluZyBjdHlwZS5oIGFsc28gZGVmaW5lcyBzZXRqbXAgbWFjcm8gKi8KKyMgIGlmIGRlZmluZWQgKF9TVExQX1dDRSkKKyMgICAgZGVmaW5lIF9TVExQX05BVElWRV9TRVRKTVBfSF9JTkNMVURFRAorIyAgZW5kaWYKKworIyAgaWZuZGVmIF9TVExQX0NUWVBFX0hfU0VFTgorIyAgICBkZWZpbmUgX1NUTFBfQ1RZUEVfSF9TRUVOCisKKy8qIFVuZGVmIGNvbnZlbmllbmNlIGludGVyZmFjZXMgKi8KKyMgICAgdW5kZWYgaXNzcGFjZQorIyAgICB1bmRlZiBpc3ByaW50CisjICAgIHVuZGVmIGlzY250cmwKKyMgICAgdW5kZWYgaXN1cHBlcgorIyAgICB1bmRlZiBpc2xvd2VyCisjICAgIHVuZGVmIGlzYWxwaGEKKyMgICAgdW5kZWYgaXNkaWdpdAorIyAgICB1bmRlZiBpc3B1bmN0CisjICAgIHVuZGVmIGlzeGRpZ2l0CisjICAgIHVuZGVmIGlzYWxudW0KKyMgICAgdW5kZWYgaXNncmFwaAorIyAgICB1bmRlZiB0b3VwcGVyCisjICAgIHVuZGVmIHRvbG93ZXIKKworIyAgICBpZiBkZWZpbmVkIChVTkRFUl9DRSkKKworIyAgICAgIGlmIChfV0lOMzJfV0NFIDwgMzAwKSAgICAgLyogT25seSB3aWRlIGNoYXJzIGZvciBvbGRlciB2ZXJzaW9ucyAqLworIyAgICAgICAgZGVmaW5lIF9pc2N0eXBlIGlzd2N0eXBlCisjICAgICAgZW5kaWYKKworX19pbmxpbmUgaW50IChpc2FscGhhKShpbnQgYykgeyByZXR1cm4gX2lzY3R5cGUoYywgX0FMUEhBKTsgfQorX19pbmxpbmUgaW50IChpc3VwcGVyKShpbnQgYykgeyByZXR1cm4gX2lzY3R5cGUoYywgX1VQUEVSKTsgfQorX19pbmxpbmUgaW50IChpc2xvd2VyKShpbnQgYykgeyByZXR1cm4gX2lzY3R5cGUoYywgX0xPV0VSKTsgfQorX19pbmxpbmUgaW50IChpc2RpZ2l0KShpbnQgYykgeyByZXR1cm4gX2lzY3R5cGUoYywgX0RJR0lUKTsgfQorX19pbmxpbmUgaW50IChpc3hkaWdpdCkoaW50IGMpIHsgcmV0dXJuIF9pc2N0eXBlKGMsIF9IRVgpOyB9CitfX2lubGluZSBpbnQgKGlzc3BhY2UpKGludCBjKSB7IHJldHVybiBfaXNjdHlwZShjLCBfU1BBQ0UpOyB9CitfX2lubGluZSBpbnQgKGlzcHVuY3QpKGludCBjKSB7IHJldHVybiBfaXNjdHlwZShjLCBfUFVOQ1QpOyB9CitfX2lubGluZSBpbnQgKGlzYWxudW0pKGludCBjKSB7IHJldHVybiBfaXNjdHlwZShjLCBfQUxQSEF8X0RJR0lUKTsgfQorX19pbmxpbmUgaW50IChpc3ByaW50KShpbnQgYykgeyByZXR1cm4gX2lzY3R5cGUoYywgX0JMQU5LfF9QVU5DVHxfQUxQSEF8X0RJR0lUKTsgfQorX19pbmxpbmUgaW50IChpc2dyYXBoKShpbnQgYykgeyByZXR1cm4gX2lzY3R5cGUoYywgX1BVTkNUfF9BTFBIQXxfRElHSVQpOyB9CitfX2lubGluZSBpbnQgKGlzY250cmwpKGludCBjKSB7IHJldHVybiBfaXNjdHlwZShjLCBfQ09OVFJPTCk7IH0KK19faW5saW5lIGludCAoaXNhc2NpaSkoaW50IGMpIHsgcmV0dXJuICgodW5zaWduZWQpKGMpIDwgMHg4MCk7IH0KKworIyAgICAgIHVuZGVmIF9pc2N0eXBlCisKK19faW5saW5lIGludCAoaXN3YWxwaGEpKGludCBjKSB7IHJldHVybiBpc3djdHlwZShjLCBfQUxQSEEpOyB9CitfX2lubGluZSBpbnQgKGlzd3VwcGVyKShpbnQgYykgeyByZXR1cm4gaXN3Y3R5cGUoYywgX1VQUEVSKTsgfQorX19pbmxpbmUgaW50IChpc3dsb3dlcikoaW50IGMpIHsgcmV0dXJuIGlzd2N0eXBlKGMsIF9MT1dFUik7IH0KK19faW5saW5lIGludCAoaXN3ZGlnaXQpKGludCBjKSB7IHJldHVybiBpc3djdHlwZShjLCBfRElHSVQpOyB9CitfX2lubGluZSBpbnQgKGlzd3hkaWdpdCkoaW50IGMpIHsgcmV0dXJuIGlzd2N0eXBlKGMsIF9IRVgpOyB9CitfX2lubGluZSBpbnQgKGlzd3NwYWNlKShpbnQgYykgeyByZXR1cm4gaXN3Y3R5cGUoYywgX1NQQUNFKTsgfQorX19pbmxpbmUgaW50IChpc3dwdW5jdCkoaW50IGMpIHsgcmV0dXJuIGlzd2N0eXBlKGMsIF9QVU5DVCk7IH0KK19faW5saW5lIGludCAoaXN3YWxudW0pKGludCBjKSB7IHJldHVybiBpc3djdHlwZShjLCBfQUxQSEF8X0RJR0lUKTsgfQorX19pbmxpbmUgaW50IChpc3dwcmludCkoaW50IGMpIHsgcmV0dXJuIGlzd2N0eXBlKGMsIF9CTEFOS3xfUFVOQ1R8X0FMUEhBfF9ESUdJVCk7IH0KK19faW5saW5lIGludCAoaXN3Z3JhcGgpKGludCBjKSB7IHJldHVybiBpc3djdHlwZShjLCBfUFVOQ1R8X0FMUEhBfF9ESUdJVCk7IH0KK19faW5saW5lIGludCAoaXN3Y250cmwpKGludCBjKSB7IHJldHVybiBpc3djdHlwZShjLCBfQ09OVFJPTCk7IH0KK19faW5saW5lIGludCAoaXN3YXNjaWkpKGludCBjKSB7IHJldHVybiAoKHVuc2lnbmVkKShjKSA8IDB4ODApOyB9CisKKyMgICAgZW5kaWYgLyogVU5ERVJfQ0UgKi8KKworIyAgZW5kaWYgLyogX1NUTFBfQ1RZUEVfSF9TRUVOICovCisKKyMgIGlmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MjE5KQorIyAgICBpZiAhIGRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKKyMgICAgICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgICAgIHVuZGVmICBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjICAgIGVsc2UKKyMgICAgICB1bmRlZiAgX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lECisjICAgIGVuZGlmCisjICBlbmRpZgorCisjZW5kaWYgLyogUkNfSU5WT0tFRCAqLworCisjZW5kaWYgLyogX1NUTFBfQ1RZUEVfSCAqLwpkaWZmIC0tZ2l0IGEvY3djaGFyIGIvY3djaGFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1Yjk5ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9jd2NoYXIKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfQ1dDSEFSCisKKyNpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHgxMjAKKyMgIGRlZmluZSBfU1RMUF9DV0NIQVIKKyMgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+CisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEICE9IDB4MTIwKQorIyAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ1BQX0NfSEVBREVSKGN3Y2hhcikKKyNlbHNlCisjICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1dDSEFSCisjICAgIGluY2x1ZGUgPHN0bC9fY3djaGFyLmg+CisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDEyMCkKKyMgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+CisjICB1bmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjZW5kaWYKKworI2VuZGlmIC8qIF9TVExQX0NXQ0hBUiAqLworCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9jd2N0eXBlIGIvY3djdHlwZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWYwODU5Ci0tLSAvZGV2L251bGwKKysrIGIvY3djdHlwZQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmbmRlZiBfU1RMUF9DV0NUWVBFCisjZGVmaW5lIF9TVExQX0NXQ1RZUEUKKworI2lmbmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDEyMQorIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgIT0gMHgxMjEpCisjICBpbmNsdWRlIF9TVExQX05BVElWRV9DUFBfQ19IRUFERVIoY3djdHlwZSkKKyNlbHNlCisjICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1dDVFlQRQorIyAgICBpbmNsdWRlIDxzdGwvX2N3Y3R5cGUuaD4KKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MTIxKQorIyAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KKyMgIHVuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfQ1dDVFlQRSAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvZGVxdWUgYi9kZXF1ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmRmNTEzCi0tLSAvZGV2L251bGwKKysrIGIvZGVxdWUKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfREVRVUUKKyNkZWZpbmUgX1NUTFBfREVRVUUKKworI2lmbmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDIyCisjICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgorI2VuZGlmCisKKyNpZmRlZiBfU1RMUF9QUkFHTUFfT05DRQorIyAgcHJhZ21hIG9uY2UKKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0RFUVVFX0gKKyMgIGluY2x1ZGUgPHN0bC9fZGVxdWUuaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfSU1QT1JUX1ZFTkRPUl9TVEQpCisjICBpbmNsdWRlIF9TVExQX05BVElWRV9IRUFERVIoZGVxdWUpCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MjIpCisjICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9ERVFVRSAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvZXJybm8uaCBiL2Vycm5vLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjcwMzdlYQotLS0gL2Rldi9udWxsCisrKyBiL2Vycm5vLmgKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCkKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MjA1CisjICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgorI2VsaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgyMDUpICYmICFkZWZpbmVkIChfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQpCisjICBkZWZpbmUgX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lECisjZW5kaWYKKworI2lmZGVmIF9TVExQX1dDRQorLy8gb25seSBzaG93IG1lc3NhZ2Ugd2hlbiBkaXJlY3RseSBpbmNsdWRpbmcgdGhpcyBmaWxlIGluIGEgbm9uLWxpYnJhcnkgYnVpbGQKKyMgIGlmICFkZWZpbmVkKF9fQlVJTERJTkdfU1RMUE9SVCkgJiYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgyMDUpCisjICAgIHByYWdtYSBtZXNzYWdlKCJlTWJlZGRlZCBWaXN1YWwgQysrIDMgYW5kIC5ORVQgZG9uJ3QgaGF2ZSBhIGVycm5vLmggaGVhZGVyOyBTVExwb3J0IHdvbid0IGluY2x1ZGUgbmF0aXZlIGVycm5vLmggaGVyZSIpCisjICBlbmRpZgorI2Vsc2UKKyMgIGlmbmRlZiBlcnJubworLyogV2UgZGVmaW5lIHRoZSBmb2xsb3dpbmcgbWFjcm8gZmlyc3QgdG8gZ3VhcmFudHkgdGhlIGhlYWRlciByZWVudHJhbmN5OiAqLworIyAgICBkZWZpbmUgX1NUTFBfTkFUSVZFX0VSUk5PX0hfSU5DTFVERUQKKyMgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ19IRUFERVIoZXJybm8uaCkKKyMgIGVuZGlmIC8qIGVycm5vICovCisKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9OQVRJVkVfRVJSTk9fSF9JTkNMVURFRCkKKy8qIElmIGVycm5vIGhhcyBiZWVuIGRlZmluZWQgYmVmb3JlIGluY2x1c2lvbiBvZiBuYXRpdmUgZXJybm8uaCBpbmNsdWRpbmcgaXQgZnJvbSBTVExwb3J0IGVycm5vLmgKKyAqIGJlY29tZXMgaW1wb3NzaWJsZSBiZWNhdXNlIGlmOgorICogI2RlZmluZSBlcnJubyBmb28KKyAqIHRoZW4KKyAqICNpbmNsdWRlIF9TVExQX05BVElWRV9DX0hFQURFUihlcnJuby5oKQorICogYmVjb21lczoKKyAqICNpbmNsdWRlIF9TVExQX05BVElWRV9DX0hFQURFUihmb28uaCkKKyAqCisgKiBUbyBmaXggdGhpcyBwcm9ibGVtIHlvdSBoYXZlIHRvIGZpbmQgd2hlcmUgdGhpcyBkZWZpbml0aW9uIGNvbWVzIGZyb20gYW5kIGluY2x1ZGUgZXJybm8uaCBiZWZvcmUgaXQuCisgKi8KKyMgICAgZXJyb3IgZXJybm8gaGFzIGJlZW4gZGVmaW5lZCBiZWZvcmUgaW5jbHVzaW9uIG9mIGVycm5vLmggaGVhZGVyLgorIyAgZW5kaWYKKworIyAgaWZkZWYgX19jcGx1c3BsdXMKKyMgICAgaWZuZGVmIGVycm5vIC8qIGVycm5vIHN0aWxsIG5vdCBkZWZpbmVkICovCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKyMgICAgICBpZiAhZGVmaW5lZCAoX19CT1JMQU5EQ19fKQordXNpbmcgOjplcnJubzsKKyMgICAgICBlbHNlCit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6ZXJybm87CisjICAgICAgZW5kaWYKK19TVExQX0VORF9OQU1FU1BBQ0UKKyMgICBlbmRpZiAvKiBlcnJubyAqLworIyAgZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDIwNSkKKyMgIGlmICEgZGVmaW5lZCAoX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lEKQorIyAgICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgICB1bmRlZiAgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZW5kaWYKKyMgIHVuZGVmICBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKKyNlbmRpZgorCisvKiBMb2NhbCBWYXJpYWJsZXM6CisgKiBtb2RlOkMrKworICogRW5kOgorICovCmRpZmYgLS1naXQgYS9leGNlcHRpb24gYi9leGNlcHRpb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThlOGNkNwotLS0gL2Rldi9udWxsCisrKyBiL2V4Y2VwdGlvbgpAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKi8KKworLy8gVGhpcyBoZWFkZXIgZXhpc3RzIHNvbGVseSBmb3IgcG9ydGFiaWxpdHkuICBOb3JtYWxseSBpdCBqdXN0IGluY2x1ZGVzCisvLyB0aGUgbmF0aXZlIGhlYWRlciA8ZXhjZXB0aW9uPi4KKworI2lmbmRlZiBfU1RMUF9FWENFUFRJT04KKworI2lmICFkZWZpbmVkIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEKQorIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHg0MjMKKyMgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+CisjZWxpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDQyMykKKyMgIGRlZmluZSBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKKyMgIGRlZmluZSBfU1RMUF9FWENFUFRJT04KKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgIT0gMHg0MjMpIHx8IGRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKKy8qIElmIHdlIGFyZSBoZXJlIGl0IG1lYW5zIHRoYXQgd2UgYXJlIGluIGFuIGluY2x1ZGUgY2FsbGVkIAorICogZnJvbSB0aGUgbmF0aXZlIGxpYiB3aGljaCBtZWFucyB0aGF0IHdlIGNhbiBzaW1wbHkgZm9yd2FyZCB0aGlzCisgKiBjYWxsIHRvIHRoZSBuYXRpdmUgZXhjZXB0aW9uIGhlYWRlcjoKKyAqLworIyAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ1BQX1JVTlRJTUVfSEVBREVSKGV4Y2VwdGlvbikKKyNlbHNlCisjICBpbmNsdWRlIDxzdGwvX2V4Y2VwdGlvbi5oPgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDQyMykKKyMgIGlmICFkZWZpbmVkKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKKyMgICAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KKyMgICAgdW5kZWYgIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGVsc2UKKyMgICAgdW5kZWYgIF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRAorIyAgZW5kaWYKKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfRVhDRVBUSU9OICovCisKKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL2V4Y2VwdGlvbi5oIGIvZXhjZXB0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU5MzdhYgotLS0gL2Rldi9udWxsCisrKyBiL2V4Y2VwdGlvbi5oCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX09MRFNURF9leGNlcHRpb24KKyNkZWZpbmUgX1NUTFBfT0xEU1REX2V4Y2VwdGlvbgorCisjaWYgIWRlZmluZWQgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQpCisjICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDgyNAorIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKSB8fCBkZWZpbmVkIChfTVNDX1ZFUikKKyMgIGluY2x1ZGUgPGV4Y2VwdGlvbj4KKyNlbHNlCisjICBpbmNsdWRlIF9TVExQX05BVElWRV9DUFBfUlVOVElNRV9IRUFERVIoZXhjZXB0aW9uLmgpCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4ODI0KQorIyAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KKyMgIHVuZGVmICBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjZW5kaWYKKworI2VuZGlmIC8qIF9TVExQX09MRFNURF9leGNlcHRpb24gKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL2Zsb2F0LmggYi9mbG9hdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3YWRiNTcKLS0tIC9kZXYvbnVsbAorKysgYi9mbG9hdC5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWYgIWRlZmluZWQgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQpCisjICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDIwMworIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KKyNlbGlmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MjAzKSAmJiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lEKQorIyAgZGVmaW5lIF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRAorI2VsaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgyMDMpCisjICBlcnJvciBUaGlzIGhlYWRlciBpcyBvbmx5IHJlZW50cmFudCBvbmNlLCBpdCBzaG91bGQgYmUgbW9kaWZpZWQgaWYgaXQgaGFzIHRvIGJlIGluY2x1ZGVkIG1vcmUuCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX1dDRV9FVkMzKQorc3RydWN0IF9leGNlcHRpb247CisjZW5kaWYKKworI2luY2x1ZGUgX1NUTFBfTkFUSVZFX0NfSEVBREVSKGZsb2F0LmgpCisKKyNpZiBkZWZpbmVkKF9fQk9STEFORENfXykgJiYgZGVmaW5lZCAoX19jcGx1c3BsdXMpICYmIChfX0JPUkxBTkRDX18gPj0gMHg1NjApCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKK3VzaW5nIDo6X21heF9kYmxlOwordXNpbmcgOjpfbWF4X2ZsdDsKK3VzaW5nIDo6X21heF9sZGJsZTsKK3VzaW5nIDo6X3RpbnlfbGRibGU7CitfU1RMUF9FTkRfTkFNRVNQQUNFCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fQk9STEFORENfXykgJiYgZGVmaW5lZCAoX19jcGx1c3BsdXMpICYmICFkZWZpbmVkIChfU1RMUF9CQ0NfRlBVX0JVRykKKyMgIGRlZmluZSBfU1RMUF9CQ0NfRlBVX0JVRworLy8gSWdub3JlIEZQVSBleGNlcHRpb25zLCBzZXQgRlBVIHByZWNpc2lvbiB0byA1MyBiaXRzIGZvciBmbG9hdGlvX3Rlc3QgYW5kIGNtYXRoX3Rlc3QKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX2JjY19mcHVfYnVnID0gX2NvbnRyb2w4NyhQQ181M3xNQ1dfRU0sIE1DV19QQ3xNQ1dfRU0pOwordGVtcGxhdGUgPGNsYXNzIF9GcD4KK2ludCBfX2ZwY2xhc3MoX0ZwIF9fdmFsKQoreyBpbnQgX19mID0gX2ZwY2xhc3MoX192YWwpOyBfY29udHJvbDg3KFBDXzUzfE1DV19FTSwgTUNXX1BDfE1DV19FTSk7IHJldHVybiBfX2Y7IH0KKyMgIGRlZmluZSBfZnBjbGFzcyBfX2ZwY2xhc3MKKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgyMDMpCisjICBpZiAhIGRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKKyMgICAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KKyMgICAgdW5kZWYgIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGVuZGlmCisjICB1bmRlZiAgX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lECisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzdHJlYW0gYi9mc3RyZWFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmZGY2NDUKLS0tIC9kZXYvbnVsbAorKysgYi9mc3RyZWFtCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKworLy8gVGhpcyBoZWFkZXIgZGVmaW5lcyBjbGFzc2VzIGJhc2ljX2ZpbGVidWYsIGJhc2ljX2lmc3RyZWFtLAorLy8gYmFzaWNfb2ZzdHJlYW0sIGFuZCBiYXNpY19mc3RyZWFtLiAgVGhlc2UgY2xhc3NlcyByZXByZXNlbnQKKy8vIHN0cmVhbWJ1ZnMgYW5kIHN0cmVhbXMgd2hvc2Ugc291cmNlcyBvciBkZXN0aW5hdGlvbnMgYXJlIGZpbGVzLgorCisjaWZuZGVmIF9TVExQX0ZTVFJFQU0KKyNkZWZpbmUgX1NUTFBfRlNUUkVBTQorCisjIGlmbmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDEwMjUKKyMgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+CisjIGVuZGlmCisKKyNpZmRlZiBfU1RMUF9QUkFHTUFfT05DRQorIyBwcmFnbWEgb25jZQorI2VuZGlmCisKKyMgaW5jbHVkZSA8c3RsL19pb3NlcnIuaD4KKyMgaW5jbHVkZSA8c3RsL19mc3RyZWFtLmg+CisKKyMgaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgxMDI1KQorIyAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KKyMgIHVuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgZW5kaWYKKworI2VuZGlmIC8qIF9TVExQX0ZTVFJFQU0gKi8KKworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvZnN0cmVhbS5oIGIvZnN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NDAwMzMKLS0tIC9kZXYvbnVsbAorKysgYi9mc3RyZWFtLmgKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfRlNUUkVBTV9ICisjZGVmaW5lIF9TVExQX0ZTVFJFQU1fSAorCisjaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MjAyNgorIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZnN0cmVhbT4KKworLy8gZ2V0IGRlc2lyZWQgcG9sbHV0aW9uCisjaW5jbHVkZSA8aW9zdHJlYW0uaD4KKworI2lmbmRlZiBfU1RMUF9IQVNfTk9fTkFNRVNQQUNFUworIyAgaW5jbHVkZSA8dXNpbmcvZnN0cmVhbT4KKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgyMDI2KQorIyAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KKyMgIHVuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfRlNUUkVBTV9IICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9mdW5jdGlvbmFsIGIvZnVuY3Rpb25hbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDc0MTAzCi0tLSAvZGV2L251bGwKKysrIGIvZnVuY3Rpb25hbApAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfRlVOQ1RJT05BTAorI2RlZmluZSBfU1RMUF9GVU5DVElPTkFMCisKKyMgaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MjcKKyMgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+CisjIGVuZGlmCisKKyMgaWZkZWYgX1NUTFBfUFJBR01BX09OQ0UKKyMgIHByYWdtYSBvbmNlCisjIGVuZGlmCisKKyMgaWYgZGVmaW5lZCAoX1NUTFBfSU1QT1JUX1ZFTkRPUl9TVEQpCisjICBpbmNsdWRlIF9TVExQX05BVElWRV9IRUFERVIoZnVuY3Rpb25hbCkKKyMgZW5kaWYKKworIyBpZm5kZWYgX1NUTFBfSU5URVJOQUxfRlVOQ1RJT05fSAorIyAgaW5jbHVkZSA8c3RsL19mdW5jdGlvbi5oPgorIyBlbmRpZgorCisjIGlmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MjcpCisjICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyBlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfRlVOQ1RJT05BTCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvaGFzaF9tYXAgYi9oYXNoX21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTI0MjJkCi0tLSAvZGV2L251bGwKKysrIGIvaGFzaF9tYXAKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX0hBU0hfTUFQCisjZGVmaW5lIF9TVExQX0hBU0hfTUFQCisKKyNpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHg0MDI4CisjICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgorI2VuZGlmCisKKyNpZmRlZiBfU1RMUF9QUkFHTUFfT05DRQorIyAgcHJhZ21hIG9uY2UKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKKy8qIENvbW1lbnQgZm9sbG93aW5nIGlmIHlvdSB3YW50IHRvIHVzZSBoYXNoIGNvbnN0YWluZXJzIGV2ZW4gaWYgeW91IGFzayBmb3IKKyAqIG5vIGV4dGVuc2lvbi4KKyAqLworIyAgZXJyb3IgVGhlIGhhc2hfbWFwIGFuZCBoYXNoX211bHRpbWFwIGNsYXNzIGFyZSBTVExwb3J0IGV4dGVuc2lvbnMuCisjZW5kaWYKKworI2luY2x1ZGUgPHN0bC9faGFzaF9tYXAuaD4KKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4NDAyOCkKKyMgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+CisjICB1bmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjZW5kaWYKKworI2VuZGlmIC8qIF9TVExQX0hBU0hfTUFQICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9oYXNoX3NldCBiL2hhc2hfc2V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmYzg5ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9oYXNoX3NldApAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfSEFTSF9TRVQKKyNkZWZpbmUgX1NUTFBfSEFTSF9TRVQKKworI2lmbmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDQwMjkKKyMgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+CisjZW5kaWYKKworI2lmZGVmIF9TVExQX1BSQUdNQV9PTkNFCisjICBwcmFnbWEgb25jZQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKQorLyogQ29tbWVudCBmb2xsb3dpbmcgaWYgeW91IHdhbnQgdG8gdXNlIGhhc2ggY29uc3RhaW5lcnMgZXZlbiBpZiB5b3UgYXNrIGZvcgorICogbm8gZXh0ZW5zaW9uLgorICovCisjICBlcnJvciBUaGUgaGFzaF9zZXQgYW5kIGhhc2hfbXVsdGlzZXQgY2xhc3MgYXJlIFNUTHBvcnQgZXh0ZW5zaW9ucy4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RsL19oYXNoX3NldC5oPgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHg0MDI5KQorIyAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KKyMgIHVuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfSEFTSF9TRVQgKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL2lvbWFuaXAgYi9pb21hbmlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5NTYxOTAKLS0tIC9kZXYvbnVsbAorKysgYi9pb21hbmlwCkBAIC0wLDAgKzEsMTc1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX0lPTUFOSVAKKyNkZWZpbmUgX1NUTFBfSU9NQU5JUAorCisjaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MTAzMAorIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KKyNlbmRpZgorCisjaWZkZWYgX1NUTFBfUFJBR01BX09OQ0UKKyMgIHByYWdtYSBvbmNlCisjZW5kaWYKKworI2luY2x1ZGUgPHN0bC9faW9zZXJyLmg+CisjaW5jbHVkZSA8c3RsL19pc3RyZWFtLmg+ICAgICAgICAgICAgICAvLyBJbmNsdWRlcyA8b3N0cmVhbT4gYW5kIDxpb3M+CisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1hY2hpbmVyeSBmb3IgZGVmaW5pbmcgbWFuaXB1bGF0b3JzLgorCisvLyBDbGFzcyB0aGF0IGNhbGxzIG9uZSBvZiBpb3NfYmFzZSdzIHNpbmdsZS1hcmd1bWVudCBtZW1iZXIgZnVuY3Rpb25zLgordGVtcGxhdGUgPGNsYXNzIF9Bcmc+CitzdHJ1Y3QgX0lvc19NYW5pcF8xIHsKKyAgIHR5cGVkZWYgX0FyZyAoaW9zX2Jhc2U6OipfX2ZfcHRyX3R5cGUpKF9BcmcpOworCisgIF9Jb3NfTWFuaXBfMShfX2ZfcHRyX3R5cGUgX19mLCBjb25zdCBfQXJnJiBfX2FyZykKKyAgICA6IF9NX2YoX19mKSwgX01fYXJnKF9fYXJnKSB7fQorCisgIHZvaWQgb3BlcmF0b3IoKShpb3NfYmFzZSYgX19pb3MpIGNvbnN0CisgIHsgKF9faW9zLipfTV9mKShfTV9hcmcpOyB9CisKKyAgX19mX3B0cl90eXBlIF9NX2Y7CisgIF9BcmcgX01fYXJnOworfTsKKworLy8gQ2xhc3MgdGhhdCBjYWxscyBvbmUgb2YgaW9zX2Jhc2UncyB0d28tYXJndW1lbnQgbWVtYmVyIGZ1bmN0aW9ucy4KK3N0cnVjdCBfSW9zX1NldGZfTWFuaXAgeworICBpb3NfYmFzZTo6Zm10ZmxhZ3MgX01fZmxhZzsKKyAgaW9zX2Jhc2U6OmZtdGZsYWdzIF9NX21hc2s7CisgIGJvb2wgX01fdHdvX2FyZ3M7CisKKyAgX0lvc19TZXRmX01hbmlwKGlvc19iYXNlOjpmbXRmbGFncyBfX2YpCisgICAgOiBfTV9mbGFnKF9fZiksIF9NX21hc2soMCksIF9NX3R3b19hcmdzKGZhbHNlKSB7fQorCisgIF9Jb3NfU2V0Zl9NYW5pcChpb3NfYmFzZTo6Zm10ZmxhZ3MgX19mLCBpb3NfYmFzZTo6Zm10ZmxhZ3MgX19tKQorICAgIDogX01fZmxhZyhfX2YpLCBfTV9tYXNrKF9fbSksIF9NX3R3b19hcmdzKHRydWUpIHt9CisKKyAgdm9pZCBvcGVyYXRvcigpKGlvc19iYXNlJiBfX2lvcykgY29uc3QgeworICAgIGlmIChfTV90d29fYXJncykKKyAgICAgIF9faW9zLnNldGYoX01fZmxhZywgX01fbWFzayk7CisgICAgZWxzZQorICAgICAgX19pb3Muc2V0ZihfTV9mbGFnKTsKKyAgfQorfTsKKworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQXJnPgoraW5saW5lIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX1NUTFBfQ0FMTAorb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXN0ciwKKyAgICAgICAgICAgY29uc3QgX0lvc19NYW5pcF8xPF9Bcmc+JiBfX2YpIHsKKyAgX19mKF9faXN0cik7CisgIHJldHVybiBfX2lzdHI7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9Bcmc+CitpbmxpbmUgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfU1RMUF9DQUxMCitvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKyAgICAgICAgICAgY29uc3QgX0lvc19NYW5pcF8xPF9Bcmc+JiBfX2YpIHsKKyAgX19mKF9fb3MpOworICByZXR1cm4gX19vczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2lubGluZSBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9TVExQX0NBTEwKK29wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzdHIsIGNvbnN0IF9Jb3NfU2V0Zl9NYW5pcCYgX19mKSB7CisgIF9fZihfX2lzdHIpOworICByZXR1cm4gX19pc3RyOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgoraW5saW5lIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX1NUTFBfQ0FMTAorb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsIGNvbnN0IF9Jb3NfU2V0Zl9NYW5pcCYgX19mKSB7CisgIF9fZihfX29zKTsKKyAgcmV0dXJuIF9fb3M7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVGhlIGlvc19iYXNlIG1hbmlwdWxhdG9ycy4KK2lubGluZSBfSW9zX1NldGZfTWFuaXAgIF9TVExQX0NBTEwgcmVzZXRpb3NmbGFncyhpb3NfYmFzZTo6Zm10ZmxhZ3MgX19tYXNrKQoreyByZXR1cm4gX0lvc19TZXRmX01hbmlwKDAsIF9fbWFzayk7IH0KKworaW5saW5lIF9Jb3NfU2V0Zl9NYW5pcCBfU1RMUF9DQUxMIHNldGlvc2ZsYWdzKGlvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWcpCit7IHJldHVybiBfSW9zX1NldGZfTWFuaXAoX19mbGFnKTsgfQorCitpbmxpbmUgX0lvc19TZXRmX01hbmlwIF9TVExQX0NBTEwgc2V0YmFzZShpbnQgX19uKSB7CisgIGlvc19iYXNlOjpmbXRmbGFncyBfX2Jhc2UgPSBfX24gPT0gOCAgPyBpb3NfYmFzZTo6b2N0IDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbiA9PSAxMCA/IGlvc19iYXNlOjpkZWMgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19uID09IDE2ID8gaW9zX2Jhc2U6OmhleCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6Zm10ZmxhZ3MoMCk7CisgIHJldHVybiBfSW9zX1NldGZfTWFuaXAoX19iYXNlLCBpb3NfYmFzZTo6YmFzZWZpZWxkKTsKK30KKworaW5saW5lIF9Jb3NfTWFuaXBfMTxzdHJlYW1zaXplPiBfU1RMUF9DQUxMCitzZXRwcmVjaXNpb24oaW50IF9fbikgeworICBfSW9zX01hbmlwXzE8c3RyZWFtc2l6ZT46Ol9fZl9wdHJfdHlwZSBfX2YgPSAmaW9zX2Jhc2U6OnByZWNpc2lvbjsKKyAgcmV0dXJuIF9Jb3NfTWFuaXBfMTxzdHJlYW1zaXplPihfX2YsIF9fbik7Cit9CisKK2lubGluZSBfSW9zX01hbmlwXzE8c3RyZWFtc2l6ZT4gIF9TVExQX0NBTEwKK3NldHcoaW50IF9fbikgeworICBfSW9zX01hbmlwXzE8c3RyZWFtc2l6ZT46Ol9fZl9wdHJfdHlwZSBfX2YgPSAmaW9zX2Jhc2U6OndpZHRoOyAgCisgIHJldHVybiBfSW9zX01hbmlwXzE8c3RyZWFtc2l6ZT4oX19mLCBfX24pOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHNldGZpbGwsIGEgbWFuaXB1bGF0b3IgdGhhdCBvcGVyYXRlcyBvbiBiYXNpY19pb3M8PiBpbnN0ZWFkIG9mIGlvc19iYXNlLgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgorc3RydWN0IF9TZXRmaWxsX01hbmlwIHsKKyAgX1NldGZpbGxfTWFuaXAoX0NoYXJUIF9fYykgOiBfTV9jKF9fYykge30KKyAgX0NoYXJUIF9NX2M7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQ2hhclQyLCBjbGFzcyBfVHJhaXRzPgoraW5saW5lIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX1NUTFBfQ0FMTAorb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisgICAgICAgICAgIGNvbnN0IF9TZXRmaWxsX01hbmlwPF9DaGFyVDI+JiBfX20pIHsKKyAgX19vcy5maWxsKF9fbS5fTV9jKTsKKyAgcmV0dXJuIF9fb3M7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9DaGFyVDIsIGNsYXNzIF9UcmFpdHM+CitpbmxpbmUgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfU1RMUF9DQUxMCitvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKyAgICAgICAgICAgY29uc3QgX1NldGZpbGxfTWFuaXA8X0NoYXJUMj4mIF9fbSkgeworICBfX2lzLmZpbGwoX19tLl9NX2MpOworICByZXR1cm4gX19pczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KK2lubGluZSBfU2V0ZmlsbF9NYW5pcDxfQ2hhclQ+IF9TVExQX0NBTEwKK3NldGZpbGwoX0NoYXJUIF9fYykgeworICByZXR1cm4gX1NldGZpbGxfTWFuaXA8X0NoYXJUPihfX2MpOworfQorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDEwMzApCisjICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9JT01BTklQICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9pb21hbmlwLmggYi9pb21hbmlwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJmYjBkMgotLS0gL2Rldi9udWxsCisrKyBiL2lvbWFuaXAuaApAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmbmRlZiBfU1RMUF9JT01BTklQX0gKKyNkZWZpbmUgX1NUTFBfSU9NQU5JUF9ICisKKyNpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHgyMDMxCisjICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGwvX2lvc2Vyci5oPgorCisjaW5jbHVkZSA8aW9tYW5pcD4KKworI2lmbmRlZiBfU1RMUF9IQVNfTk9fTkFNRVNQQUNFUworIyAgaWZkZWYgX1NUTFBfQlJPS0VOX1VTSU5HX0RJUkVDVElWRQorX1NUTFBfVVNJTkdfTkFNRVNQQUNFKHN0bHBvcnQpCisjICBlbHNlCit1c2luZyBfU1RMUF9TVEQ6OnNldGlvc2ZsYWdzOwordXNpbmcgX1NUTFBfU1REOjpyZXNldGlvc2ZsYWdzOwordXNpbmcgX1NUTFBfU1REOjpzZXRiYXNlOwordXNpbmcgX1NUTFBfU1REOjpzZXRmaWxsOwordXNpbmcgX1NUTFBfU1REOjpzZXRwcmVjaXNpb247Cit1c2luZyBfU1RMUF9TVEQ6OnNldHc7CisjICBlbmRpZgorI2VuZGlmIC8qIF9TVExQX0hBU19OT19OQU1FU1BBQ0VTICovCisKKy8vIGdldCBhbGwgdGhlIHBvbGx1dGlvbiB3ZSB3YW50CisjaW5jbHVkZSA8aW9zdHJlYW0uaD4KKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MjAzMSkKKyMgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+CisjICB1bmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjZW5kaWYKKworI2VuZGlmIC8qIF9TVExQX0lPTUFOSVBfSCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvaW9zIGIvaW9zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhOTIzYWQKLS0tIC9kZXYvbnVsbAorKysgYi9pb3MKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmbmRlZiBfU1RMUF9JT1MKKyNkZWZpbmUgX1NUTFBfSU9TCisKKyMgaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MTAzMgorIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KKyMgZW5kaWYKKworIyBpZmRlZiBfU1RMUF9QUkFHTUFfT05DRQorIyAgcHJhZ21hIG9uY2UKKyMgZW5kaWYKKworIyBpbmNsdWRlIDxzdGwvX2lvc2Vyci5oPgorIyBpbmNsdWRlIDxzdGwvX2lvcy5oPgorCisjIGlmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MTAzMikKKyMgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+CisjICB1bmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjIGVuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9JT1MgKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL2lvcy5oIGIvaW9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBjY2ZiYgotLS0gL2Rldi9udWxsCisrKyBiL2lvcy5oCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX0lPU19ICisjZGVmaW5lIF9TVExQX0lPU19ICisKKyNpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHgxMDMzCisjICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxpb3M+CisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfTkFNRVNQQUNFUykKKyMgIGluY2x1ZGUgPHVzaW5nL2lvcz4KKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgxMDMzKQorIyAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KKyMgIHVuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfSU9TX0ggKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL2lvc2Z3ZCBiL2lvc2Z3ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTQ0OTgyCi0tLSAvZGV2L251bGwKKysrIGIvaW9zZndkCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfSU9TRldECisjZGVmaW5lIF9TVExQX0lPU0ZXRAorCisjaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MTAzNAorIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KKyNlbmRpZgorCisjaWZkZWYgX1NUTFBfUFJBR01BX09OQ0UKKyMgIHByYWdtYSBvbmNlCisjZW5kaWYKKworI2lmICFkZWZpbmVkIChfU1RMUF9VU0VfTk9fSU9TVFJFQU1TKQorCisjICBpZiBkZWZpbmVkIChfU1RMUF9IQVNfV0NIQVJfVCkgJiYgIWRlZmluZWQgKF9TVExQX0lOVEVSTkFMX0NXQ0hBUikKKyMgICAgaW5jbHVkZSA8c3RsL19jd2NoYXIuaD4KKyMgIGVuZGlmIC8qIF9TVExQX0hBU19XQ0hBUl9UICYmICFfU1RMUF9DV0NIQVIgKi8gICAgICAKKworIyAgaW5jbHVkZSA8c3RsL19pb3Nmd2QuaD4KKyNlbHNlCisjICBpbmNsdWRlIDxzdGwvY2hhcl90cmFpdHMuaD4KKyNlbmRpZiAvKiBfU1RMUF9VU0VfTk9fSU9TVFJFQU1TICovCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDEwMzQpCisjICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9JT1NGV0QgKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL2lvc3RyZWFtIGIvaW9zdHJlYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUyODllNAotLS0gL2Rldi9udWxsCisrKyBiL2lvc3RyZWFtCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfSU9TVFJFQU0KKyNkZWZpbmUgX1NUTFBfSU9TVFJFQU0KKworIyBpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHgxMDM3CisjICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgorIyBlbmRpZgorCisjIGlmZGVmIF9TVExQX1BSQUdNQV9PTkNFCisjICBwcmFnbWEgb25jZQorIyBlbmRpZgorCisjaW5jbHVkZSA8c3RsL19pb3NlcnIuaD4KKworI2lmZGVmIF9TVExQX1JFRElSRUNUX1NURFNUUkVBTVMKKy8vIGZvciBvZnN0cmVhbSByZWRpcmVjdGlvbgorIyBpbmNsdWRlIDxmc3RyZWFtPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGwvX2lvc2Z3ZC5oPgorI2luY2x1ZGUgPHN0bC9faXN0cmVhbS5oPgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworI2lmbmRlZiBfU1RMUF9VU0VfTkFNRVNQQUNFUworLy8gaW4gY2FzZSBvZiBTR0kgaW9zdHJlYW1zLCB3ZSBoYXZlIHRvIHJlbmFtZSBvdXIgc3RyZWFtcyBub3QgdG8gY2xhc2ggd2l0aCB0aG9zZQorLy8gcHJvdmlkZWQgaW4gbmF0aXZlIGxpYgorIyBkZWZpbmUgY2luIF9TVExQX2NpbgorIyBkZWZpbmUgY291dCBfU1RMUF9jb3V0CisjIGRlZmluZSBjZXJyIF9TVExQX2NlcnIKKyMgZGVmaW5lIGNsb2cgX1NUTFBfY2xvZworI2VuZGlmCisKKy8vIE5vdGU6IGNpbiBhbmQgd2NpbiBhcmUgYm90aCBhc3NvY2lhdGVkIHdpdGggc3RkaW8uICBUaGUgQyBzdGFuZGFyZAorLy8gKEFtZW5kbWVudCAxLCBzZWN0aW9uIDQuNi4yLjEpIHNheXMgdGhhdCBpdCBpcyBhbiBlcnJvciB0byBtaXgKKy8vIHdpZGUtIGFuZCBuYXJyb3ctb3JpZW50ZWQgSS9PIG9uIHRoZSBzYW1lIHN0cmVhbS4gIFRoaXMgaW1wbGllcworLy8gdGhhdCBpdCBpcyBhbiBlcnJvciB0byB1c2UgYm90aCBjaW4gYW5kIHdjaW4gaW4gdGhlIHNhbWUgQysrCisvLyBwcm9ncmFtOyB0aGUgc2FtZSBhcHBsaWVzIHRvIGNvdXQgYW5kIHdjb3V0LCBhbmQgY2Vyci9jbG9nIGFuZAorLy8gd2NlcnIvd2Nsb2cuCisKKyMgaWZkZWYgX1NUTFBfUkVESVJFQ1RfU1REU1RSRUFNUworZXh0ZXJuIF9TVExQX0RFQ0xTUEVDIGlzdHJlYW0gY2luOworZXh0ZXJuIF9TVExQX0RFQ0xTUEVDIG9mc3RyZWFtIGNvdXQ7CitleHRlcm4gX1NUTFBfREVDTFNQRUMgb2ZzdHJlYW0gY2VycjsKK2V4dGVybiBfU1RMUF9ERUNMU1BFQyBvZnN0cmVhbSBjbG9nOworIyBlbHNlCitleHRlcm4gX1NUTFBfREVDTFNQRUMgaXN0cmVhbSBjaW47CitleHRlcm4gX1NUTFBfREVDTFNQRUMgb3N0cmVhbSBjb3V0OworZXh0ZXJuIF9TVExQX0RFQ0xTUEVDIG9zdHJlYW0gY2VycjsKK2V4dGVybiBfU1RMUF9ERUNMU1BFQyBvc3RyZWFtIGNsb2c7CisjIGVuZGlmCisKKyMgaWZuZGVmIF9TVExQX05PX1dDSEFSX1QKK2V4dGVybiBfU1RMUF9ERUNMU1BFQyB3aXN0cmVhbSB3Y2luOworZXh0ZXJuIF9TVExQX0RFQ0xTUEVDIHdvc3RyZWFtIHdjb3V0OworZXh0ZXJuIF9TVExQX0RFQ0xTUEVDIHdvc3RyZWFtIHdjZXJyOworZXh0ZXJuIF9TVExQX0RFQ0xTUEVDIHdvc3RyZWFtIHdjbG9nOworIyBlbmRpZgorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKy8vIyBlbGlmIGRlZmluZWQgKCBfU1RMUF9VU0VfTk9fSU9TVFJFQU1TICkKKy8vIyAgaW5jbHVkZSA8c3RsL19udWxsX3N0cmVhbS5oPgorCisjIGlmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MTAzNykKKyMgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+CisjICB1bmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjIGVuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9JT1NUUkVBTSAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvaW9zdHJlYW0uaCBiL2lvc3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU3YTdhOQotLS0gL2Rldi9udWxsCisrKyBiL2lvc3RyZWFtLmgKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX0lPU1RSRUFNX0gKKyNkZWZpbmUgX1NUTFBfSU9TVFJFQU1fSAorCisjaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MjAzNQorIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8aW9zdHJlYW0+CisKKy8vIFRob3NlIHNob3VsZCBiZSBpbmNsdWRlZCBhbGwgc2VwYXJhdGVseSwgYXMgdGhleSBkbyBjb250YWluIHVzaW5nIGRlY2xhcmF0aW9ucworI2luY2x1ZGUgPHN0cmVhbWJ1Zi5oPgorI2luY2x1ZGUgPG9zdHJlYW0uaD4KKyNpbmNsdWRlIDxpc3RyZWFtLmg+CisKKyNpZm5kZWYgX1NUTFBfSEFTX05PX05BTUVTUEFDRVMKKworIyAgaWZkZWYgX1NUTFBfQlJPS0VOX1VTSU5HX0RJUkVDVElWRQorX1NUTFBfVVNJTkdfTkFNRVNQQUNFKHN0bHBvcnQpCisjICBlbHNlCit1c2luZyBfU1RMUF9TVEQ6OmNpbjsKK3VzaW5nIF9TVExQX1NURDo6Y291dDsKK3VzaW5nIF9TVExQX1NURDo6Y2xvZzsKK3VzaW5nIF9TVExQX1NURDo6Y2VycjsKK3VzaW5nIF9TVExQX1NURDo6aW9zdHJlYW07CisjICAgIGlmbmRlZiBfU1RMUF9OT19XQ0hBUl9UCit1c2luZyBfU1RMUF9TVEQ6OndjaW47Cit1c2luZyBfU1RMUF9TVEQ6Ondjb3V0OwordXNpbmcgX1NUTFBfU1REOjp3Y2xvZzsKK3VzaW5nIF9TVExQX1NURDo6d2NlcnI7CisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmIC8qIF9TVExQX0hBU19OT19OQU1FU1BBQ0VTICovCisKKy8vIE9ic29sZXRlIGNsYXNzZXMgZm9yIG9sZC1zdHlsZSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQorCisKK2NsYXNzIGlzdHJlYW1fd2l0aGFzc2lnbiA6IHB1YmxpYyBpc3RyZWFtIHsKKyBwdWJsaWM6CisgIGlzdHJlYW1fd2l0aGFzc2lnbigpIDogaXN0cmVhbSgoc3RyZWFtYnVmKikwKSB7fQorICB+aXN0cmVhbV93aXRoYXNzaWduKCkge30KKworICBpc3RyZWFtX3dpdGhhc3NpZ24mIG9wZXJhdG9yPShpc3RyZWFtJiBfX3MpIHsKKyAgICBpb3M6OmluaXQoX19zLnJkYnVmKCkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBpc3RyZWFtX3dpdGhhc3NpZ24mIG9wZXJhdG9yPShzdHJlYW1idWYqIF9fcykgeworICAgIGlvczo6aW5pdChfX3MpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorfTsKKworY2xhc3Mgb3N0cmVhbV93aXRoYXNzaWduIDogcHVibGljIG9zdHJlYW0geworIHB1YmxpYzoKKyAgb3N0cmVhbV93aXRoYXNzaWduKCkgOiBvc3RyZWFtKChzdHJlYW1idWYqKTApIHt9CisgIH5vc3RyZWFtX3dpdGhhc3NpZ24oKSB7fQorCisgIG9zdHJlYW1fd2l0aGFzc2lnbiYgb3BlcmF0b3I9KG9zdHJlYW0mIF9fcykgeworICAgIGlvczo6aW5pdChfX3MucmRidWYoKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIG9zdHJlYW1fd2l0aGFzc2lnbiYgb3BlcmF0b3I9KHN0cmVhbWJ1ZiogX19zKSB7CisgICAgaW9zOjppbml0KF9fcyk7CisgICAgcmV0dXJuICp0aGlzOworICB9Cit9OworCitjbGFzcyBpb3N0cmVhbV93aXRoYXNzaWduIDogcHVibGljIGlvc3RyZWFtIHsKKyBwdWJsaWM6CisgIGlvc3RyZWFtX3dpdGhhc3NpZ24oKSA6IGlvc3RyZWFtKChzdHJlYW1idWYqKTApIHt9CisgIH5pb3N0cmVhbV93aXRoYXNzaWduKCkge30KKyAgaW9zdHJlYW1fd2l0aGFzc2lnbiAmIG9wZXJhdG9yPShpb3MmIF9faSkgeworICAgIGlvczo6aW5pdChfX2kucmRidWYoKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIGlvc3RyZWFtX3dpdGhhc3NpZ24gJiBvcGVyYXRvcj0oc3RyZWFtYnVmKiBfX3MpIHsKKyAgICBpb3M6OmluaXQoX19zKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KK30gOworCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgyMDM1KQorIyAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KKyMgIHVuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfSU9TVFJFQU1fSCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvaXNvNjQ2LmggYi9pc282NDYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNThlZDNiCi0tLSAvZGV2L251bGwKKysrIGIvaXNvNjQ2LmgKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCkKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MjA0CisjICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgorI2VsaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgyMDQpICYmICFkZWZpbmVkIChfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQpCisjICBkZWZpbmUgX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lECisjZW5kaWYKKworLyogZXZjMyBkb2Vzbid0IGhhdmUgaXNvNjQ2LmggKi8KKyNpZiAhZGVmaW5lZCAoX1NUTFBfV0NFX0VWQzMpICYmICFkZWZpbmVkIChOX1BMQVRfTkxNKSAmJiAhZGVmaW5lZCAoX19CT1JMQU5EQ19fKQorIyAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ19IRUFERVIoaXNvNjQ2LmgpCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MjA0KQorIyAgaWYgISBkZWZpbmVkIChfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQpCisjICAgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+CisjICAgIHVuZGVmICBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjICBlbmRpZgorIyAgdW5kZWYgIF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRAorI2VuZGlmCisKKy8qIExvY2FsIFZhcmlhYmxlczoKKyAqIG1vZGU6QysrCisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2lzdHJlYW0gYi9pc3RyZWFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMjg4YmEKLS0tIC9kZXYvbnVsbAorKysgYi9pc3RyZWFtCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfSVNUUkVBTQorI2RlZmluZSBfU1RMUF9JU1RSRUFNCisKKyNpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHgxMDM2CisjICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgorI2VuZGlmCisKKyNpZmRlZiBfU1RMUF9QUkFHTUFfT05DRQorIyAgcHJhZ21hIG9uY2UKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RsL19pb3NlcnIuaD4KKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9JU1RSRUFNCisjICBpbmNsdWRlIDxzdGwvX2lzdHJlYW0uaD4KKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgxMDM2KQorIyAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KKyMgIHVuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfSVNUUkVBTSAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvaXN0cmVhbS5oIGIvaXN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzODJkOTYKLS0tIC9kZXYvbnVsbAorKysgYi9pc3RyZWFtLmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfSVNUUkVBTV9ICisjZGVmaW5lIF9TVExQX0lTVFJFQU1fSAorCisjaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MjAzNworIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RsL19pb3NlcnIuaD4KKworI2luY2x1ZGUgPGlzdHJlYW0+CisKKyNpZm5kZWYgX1NUTFBfSEFTX05PX05BTUVTUEFDRVMKKyMgIGlmZGVmIF9TVExQX0JST0tFTl9VU0lOR19ESVJFQ1RJVkUKK19TVExQX1VTSU5HX05BTUVTUEFDRShzdGxwb3J0KQorIyAgZWxzZQordXNpbmcgX1NUTFBfU1REOjpiYXNpY19pc3RyZWFtOwordXNpbmcgX1NUTFBfU1REOjpiYXNpY19pb3N0cmVhbTsKK3VzaW5nIF9TVExQX1NURDo6aXN0cmVhbTsKK3VzaW5nIF9TVExQX1NURDo6aW9zdHJlYW07Cit1c2luZyBfU1RMUF9TVEQ6OmlvczsKKyMgICAgaWZuZGVmIF9TVExQX05PX1dDSEFSX1QKK3VzaW5nIF9TVExQX1NURDo6d2lzdHJlYW07Cit1c2luZyBfU1RMUF9TVEQ6Ondpb3N0cmVhbTsKKyMgICAgZW5kaWYKK3VzaW5nIF9TVExQX1NURDo6d3M7CisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDIwMzcpCisjICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9JU1RSRUFNX0ggKi8KZGlmZiAtLWdpdCBhL2l0ZXJhdG9yIGIvaXRlcmF0b3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA4Y2FmNAotLS0gL2Rldi9udWxsCisrKyBiL2l0ZXJhdG9yCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX0lURVJBVE9SCisjZGVmaW5lIF9TVExQX0lURVJBVE9SCisKKyMgaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MzgKKyMgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+CisjIGVuZGlmCisKKyMgaWZkZWYgX1NUTFBfUFJBR01BX09OQ0UKKyMgIHByYWdtYSBvbmNlCisjIGVuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9JTVBPUlRfVkVORE9SX1NURCkKKyMgaW5jbHVkZSBfU1RMUF9OQVRJVkVfSEVBREVSKGl0ZXJhdG9yKQorI2VuZGlmIC8qIElNUE9SVCAqLworCisjIGlmbmRlZiBfU1RMUF9JTlRFUk5BTF9JVEVSQVRPUl9ICisjICBpbmNsdWRlIDxzdGwvX2l0ZXJhdG9yLmg+CisjIGVuZGlmCisKKyMgaWZuZGVmIF9TVExQX0lOVEVSTkFMX1NUUkVBTV9JVEVSQVRPUl9ICisjICBpbmNsdWRlIDxzdGwvX3N0cmVhbV9pdGVyYXRvci5oPgorIyBlbmRpZgorCisjIGlmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MzgpCisjICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyBlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfSVRFUkFUT1IgKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL2xpbWl0cyBiL2xpbWl0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGRiOWViCi0tLSAvZGV2L251bGwKKysrIGIvbGltaXRzCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfTElNSVRTCisjZGVmaW5lIF9TVExQX0xJTUlUUworCisjaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MzkKKyMgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+CisjZW5kaWYKKworI2lmZGVmIF9TVExQX1BSQUdNQV9PTkNFCisjICBwcmFnbWEgb25jZQorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfTElNSVRTCisjICBpbmNsdWRlIDxzdGwvX2xpbWl0cy5oPgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDM5KQorIyAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KKyMgIHVuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfTElNSVRTICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9saW1pdHMuaCBiL2xpbWl0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzNTNhZjEKLS0tIC9kZXYvbnVsbAorKysgYi9saW1pdHMuaApAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmICFkZWZpbmVkIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEKQorIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHgyMDEKKyMgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+CisjZWxpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDIwMSkgJiYgISBkZWZpbmVkIChfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQpCisjICBkZWZpbmUgX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lECisjZW5kaWYKKworI2lmIGRlZmluZWQoX1NUTFBfV0NFX0VWQzMpCitzdHJ1Y3QgX2V4Y2VwdGlvbjsKKyNlbmRpZgorCisjaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ19IRUFERVIobGltaXRzLmgpCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDIwMSkKKyMgIGlmICEgZGVmaW5lZCAoX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lEKQorIyAgICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgICB1bmRlZiAgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZW5kaWYKKyMgIHVuZGVmICBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlzdCBiL2xpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYzOGYwNAotLS0gL2Rldi9udWxsCisrKyBiL2xpc3QKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfTElTVAorI2RlZmluZSBfU1RMUF9MSVNUCisKKyNpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHg0MAorIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KKyNlbmRpZgorCisjaWZkZWYgX1NUTFBfUFJBR01BX09OQ0UKKyMgIHByYWdtYSBvbmNlCisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9MSVNUX0gKKyMgIGluY2x1ZGUgPHN0bC9fbGlzdC5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9JTVBPUlRfVkVORE9SX1NURCkKKyMgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0hFQURFUihsaXN0KQorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDQwKQorIyAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KKyMgIHVuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfTElTVCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvbG9jYWxlIGIvbG9jYWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4OWJmZTMKLS0tIC9kZXYvbnVsbAorKysgYi9sb2NhbGUKQEAgLTAsMCArMSwxNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisjaWZuZGVmIF9TVExQX0xPQ0FMRQorI2RlZmluZSBfU1RMUF9MT0NBTEUKKworLy8gQmFzaWMgZnJhbWV3b3JrOiBjbGFzcyBsb2NhbGUgYW5kIGNsYXNzIGxvY2FsZTo6ZmFjZXQKKworI2lmbmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDEwNDEKKyMgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+CisjZW5kaWYKKworI2lmZGVmIF9TVExQX1BSQUdNQV9PTkNFCisjICBwcmFnbWEgb25jZQorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGwvX2lvc2Vyci5oPgorCisvLyBJbmRpdmlkdWFsIGZhY2V0cworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DVFlQRV9ICisjICBpbmNsdWRlIDxzdGwvX2N0eXBlLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DT0RFQ1ZUX0gKKyMgIGluY2x1ZGUgPHN0bC9fY29kZWN2dC5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ09MTEFURV9ICisjICBpbmNsdWRlIDxzdGwvX2NvbGxhdGUuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX05VTV9QVVRfSAorIyAgaW5jbHVkZSA8c3RsL19udW1fcHV0Lmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9OVU1fR0VUX0gKKyMgIGluY2x1ZGUgPHN0bC9fbnVtX2dldC5oPgorI2VuZGlmCisKKy8vIHRob3NlIG5ldmVyIGluY2x1ZGVkIHNlcGFyYXRlbHkgYW55d2F5CisjaW5jbHVkZSA8c3RsL19tb25ldGFyeS5oPgorI2luY2x1ZGUgPHN0bC9fdGltZV9mYWNldHMuaD4KKyNpbmNsdWRlIDxzdGwvX21lc3NhZ2VzX2ZhY2V0cy5oPgorCisvLyBzb21lIHN0dWZmIGZvciBzdHJlYW1idWYgaXRlcmF0b3JzIGVuZGVkIHVwIGRlZmluZWQgdGhlcmUKKy8vIFN0cmljdGx5IHNwZWFraW5nLCBfaXN0cmVhbS5oIHBvcnRpb24gaXMgb25seSByZXF1aXJlZCBmb3IgPGl0ZXJhdG9yPiwgYnV0IGl0IG1heSBicmVhayB0b28gbWFueQorLy8gcHJvZ3JhbXMgaWYgd2Ugb21pdCBpdAorI2lmbmRlZiBfU1RMUF9JU1RSRUFNX0gKKyMgIGluY2x1ZGUgPHN0bC9faXN0cmVhbS5oPgorI2VuZGlmCisKKy8vIENvbnZlbmllbmNlIGludGVyZmFjZXMKKyN1bmRlZiBpc3NwYWNlCisjdW5kZWYgaXNwcmludAorI3VuZGVmIGlzY250cmwKKyN1bmRlZiBpc3VwcGVyCisjdW5kZWYgaXNsb3dlcgorI3VuZGVmIGlzYWxwaGEKKyN1bmRlZiBpc2RpZ2l0CisjdW5kZWYgaXNwdW5jdAorI3VuZGVmIGlzeGRpZ2l0CisjdW5kZWYgaXNhbG51bQorI3VuZGVmIGlzZ3JhcGgKKyN1bmRlZiB0b3VwcGVyCisjdW5kZWYgdG9sb3dlcgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4gCitpbmxpbmUgYm9vbCBpc3NwYWNlIChfQ2hhclQgYywgY29uc3QgbG9jYWxlJiBsb2MpCit7IHJldHVybiAodXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihsb2MpKS5pcyhjdHlwZV9iYXNlOjpzcGFjZSwgYyk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4gCitpbmxpbmUgYm9vbCBpc3ByaW50IChfQ2hhclQgYywgY29uc3QgbG9jYWxlJiBsb2MpCit7IHJldHVybiAodXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihsb2MpKS5pcyhjdHlwZV9iYXNlOjpwcmludCwgYyk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4gCitpbmxpbmUgYm9vbCBpc2NudHJsIChfQ2hhclQgYywgY29uc3QgbG9jYWxlJiBsb2MpCit7IHJldHVybiAodXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihsb2MpKS5pcyhjdHlwZV9iYXNlOjpjbnRybCwgYyk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4gCitpbmxpbmUgYm9vbCBpc3VwcGVyIChfQ2hhclQgYywgY29uc3QgbG9jYWxlJiBsb2MpCit7IHJldHVybiAodXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihsb2MpKS5pcyhjdHlwZV9iYXNlOjp1cHBlciwgYyk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4gCitpbmxpbmUgYm9vbCBpc2xvd2VyIChfQ2hhclQgYywgY29uc3QgbG9jYWxlJiBsb2MpCit7IHJldHVybiAodXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihsb2MpKS5pcyhjdHlwZV9iYXNlOjpsb3dlciwgYyk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4gCitpbmxpbmUgYm9vbCBpc2FscGhhIChfQ2hhclQgYywgY29uc3QgbG9jYWxlJiBsb2MpCit7IHJldHVybiAodXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihsb2MpKS5pcyhjdHlwZV9iYXNlOjphbHBoYSwgYyk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4gCitpbmxpbmUgYm9vbCBpc2RpZ2l0IChfQ2hhclQgYywgY29uc3QgbG9jYWxlJiBsb2MpCit7IHJldHVybiAodXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihsb2MpKS5pcyhjdHlwZV9iYXNlOjpkaWdpdCwgYyk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4gCitpbmxpbmUgYm9vbCBpc3B1bmN0IChfQ2hhclQgYywgY29uc3QgbG9jYWxlJiBsb2MpCit7IHJldHVybiAodXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihsb2MpKS5pcyhjdHlwZV9iYXNlOjpwdW5jdCwgYyk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4gCitpbmxpbmUgYm9vbCBpc3hkaWdpdCAoX0NoYXJUIGMsIGNvbnN0IGxvY2FsZSYgbG9jKQoreyByZXR1cm4gKHVzZV9mYWNldDxjdHlwZTxfQ2hhclQ+ID4obG9jKSkuaXMoY3R5cGVfYmFzZTo6eGRpZ2l0LCBjKTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPiAKK2lubGluZSBib29sIGlzYWxudW0gKF9DaGFyVCBjLCBjb25zdCBsb2NhbGUmIGxvYykKK3sgcmV0dXJuICh1c2VfZmFjZXQ8Y3R5cGU8X0NoYXJUPiA+KGxvYykpLmlzKGN0eXBlX2Jhc2U6OmFsbnVtLCBjKTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPiAKK2lubGluZSBib29sIGlzZ3JhcGggKF9DaGFyVCBjLCBjb25zdCBsb2NhbGUmIGxvYykKK3sgcmV0dXJuICh1c2VfZmFjZXQ8Y3R5cGU8X0NoYXJUPiA+KGxvYykpLmlzKGN0eXBlX2Jhc2U6OmdyYXBoLCBjKTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgoraW5saW5lIF9DaGFyVCB0b3VwcGVyKF9DaGFyVCBjLCBjb25zdCBsb2NhbGUmIGxvYykKK3sgcmV0dXJuICh1c2VfZmFjZXQ8Y3R5cGU8X0NoYXJUPiA+KGxvYykpLnRvdXBwZXIoYyk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KK2lubGluZSBfQ2hhclQgdG9sb3dlcihfQ2hhclQgYywgY29uc3QgbG9jYWxlJiBsb2MpCit7IHJldHVybiAodXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihsb2MpKS50b2xvd2VyKGMpOyB9CisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MTA0MSkKKyMgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+CisjICB1bmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjZW5kaWYKKworI2VuZGlmIC8qIF9TVExQX0xPQ0FMRSAqLworCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9sb2NhbGUuaCBiL2xvY2FsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZjc2OTEKLS0tIC9kZXYvbnVsbAorKysgYi9sb2NhbGUuaApAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmICFkZWZpbmVkIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEKQorIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHgyNDIKKyMgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+CisjZWxpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDI0MikKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQpCisjICAgIGRlZmluZSBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKKyMgIGVsc2UKKyMgICAgZXJyb3IgU1RMcG9ydCBpbmNsdWRlIHNjaGVtYSB2aW9sYXRpb24KKyMgIGVuZGlmCisjZW5kaWYKKworLyogZXZjMyBkb2Vzbid0IGhhdmUgbG9jYWxlLmggKi8KKyNpZm5kZWYgX1NUTFBfV0NFX0VWQzMKKyMgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NfSEVBREVSKGxvY2FsZS5oKQorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDI0MikKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQpCisjICAgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+CisjICAgIHVuZGVmICBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjICBlbHNlCisjICAgIHVuZGVmICBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKKyMgIGVuZGlmCisjZW5kaWYKKworLyogTG9jYWwgVmFyaWFibGVzOgorICogbW9kZTpDKysKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvbWFwIGIvbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxOGE4OWIKLS0tIC9kZXYvbnVsbAorKysgYi9tYXAKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfTUFQCisjZGVmaW5lIF9TVExQX01BUAorCisjaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4NDMKKyMgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+CisjZW5kaWYKKworI2lmZGVmIF9TVExQX1BSQUdNQV9PTkNFCisjICBwcmFnbWEgb25jZQorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGwvX21hcC5oPgorCisjaWYgZGVmaW5lZCAoX1NUTFBfSU1QT1JUX1ZFTkRPUl9TVEQpCisjICBpbmNsdWRlIF9TVExQX05BVElWRV9IRUFERVIobWFwKQorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDQzKQorIyAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KKyMgIHVuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfTUFQICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9tYXRoLmggYi9tYXRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdiZjU0MQotLS0gL2Rldi9udWxsCisrKyBiL21hdGguaApAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmICFkZWZpbmVkIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEKQorIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHgyNDQKKyMgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+CisjZWxpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDI0NCkgJiYgIWRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKKyMgIGRlZmluZSBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKGV4Y2VwdGlvbikgJiYgKCFkZWZpbmVkIChfX0tDQykgfHwgKF9fS0NDX1ZFUlNJT04gPCA0MDAwKSkgJiYgXAorICAgICEoZGVmaW5lZChfX0lCTUNQUF9fKSAmJiAoNTAwIDw9IF9fSUJNQ1BQX18pKSAmJiAhZGVmaW5lZChfU1RMUF9XQ0VfRVZDMykKKyMgIGRlZmluZSBfU1RMUF9FWENFUFRJT05fV0FTX1JFREVGSU5FRCAxCisjICBkZWZpbmUgZXhjZXB0aW9uIF9fbWF0aF9leGNlcHRpb24KKyNlbmRpZgorCisjaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ19IRUFERVIobWF0aC5oKQorCisjaWYgZGVmaW5lZCAoX1NUTFBfRVhDRVBUSU9OX1dBU19SRURFRklORUQpCisjICB1bmRlZiBleGNlcHRpb24KKyMgIHVuZGVmIF9TVExQX0VYQ0VQVElPTl9XQVNfUkVERUZJTkVECisjZW5kaWYKKworI2lmZGVmIF9TVExQX1dDRV9FVkMzCisjICB1bmRlZiBfZXhjZXB0aW9uCisjICBkZWZpbmUgX2V4Y2VwdGlvbiBleGNlcHRpb24KKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgyNDQpCisjICBpZiAhIGRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKKyMgICAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KKyMgICAgdW5kZWYgIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGVsc2UKKyMgICAgdW5kZWYgIF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRAorIyAgZW5kaWYKKyNlbmRpZgorCisvKiBMb2NhbCBWYXJpYWJsZXM6CisgKiBtb2RlOkMrKworICogRW5kOgorICovCmRpZmYgLS1naXQgYS9tZW0uaCBiL21lbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4YjM5MzUKLS0tIC9kZXYvbnVsbAorKysgYi9tZW0uaApAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmbmRlZiBfU1RMUF9tZW1faAorCisjaWYgIWRlZmluZWQgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQpCisjICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDI0NQorIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KKyNlbGlmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MjQ1KSAmJiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lEKQorIyAgZGVmaW5lIF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRAorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAhPSAweDI0NSkgfHwgZGVmaW5lZCAoX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lEKQorIyAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ19IRUFERVIobWVtLmgpCisjZWxzZQorIyAgaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKSAmJiBkZWZpbmVkIChfX1VTSU5HX0NOQU1FX18pCisjICAgIGRlZmluZSBfVVNJTkdfQ05BTUVfV0FTX1VOREVGSU5FRAorIyAgICB1bmRlZiBfX1VTSU5HX0NOQU1FX18KKyMgIGVuZGlmCisKKyMgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NfSEVBREVSKG1lbS5oKQorCisjICBpZiBkZWZpbmVkIChfX0JPUkxBTkRDX18pICYmIGRlZmluZWQgKF9VU0lOR19DTkFNRV9XQVNfVU5ERUZJTkVEKQorIyAgICBkZWZpbmUgX19VU0lOR19DTkFNRV9fCisjICAgIGRlZmluZSBfU1RMUF9tZW1faCAxCisjICAgIHVuZGVmIF9VU0lOR19DTkFNRV9XQVNfVU5ERUZJTkVECisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDI0NSkKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQpCisjICAgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+CisjICAgIHVuZGVmICBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjICBlbmRpZgorIyAgdW5kZWYgIF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRAorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9tZW1faCAqLworCisvKiBMb2NhbCBWYXJpYWJsZXM6CisgKiBtb2RlOkMrKworICogRW5kOgorICovCmRpZmYgLS1naXQgYS9tZW1vcnkgYi9tZW1vcnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlhZjg4MwotLS0gL2Rldi9udWxsCisrKyBiL21lbW9yeQpAQCAtMCwwICsxLDcwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk3LTE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfTUVNT1JZCisjZGVmaW5lIF9TVExQX01FTU9SWQorCisjaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4NDYKKyMgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+CisjZW5kaWYKKworI2lmZGVmIF9TVExQX1BSQUdNQV9PTkNFCisjICBwcmFnbWEgb25jZQorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQUxMT0NfSAorIyAgaW5jbHVkZSA8c3RsL19hbGxvYy5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfVEVNUEJVRl9ICisjICBpbmNsdWRlIDxzdGwvX3RlbXBidWYuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX1JBV19TVE9SQUdFX0lURVJfSAorIyAgaW5jbHVkZSA8c3RsL19yYXdfc3RvcmFnZV9pdGVyLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0bC9fYXV0b19wdHIuaD4KKworI2lmIGRlZmluZWQgKF9TVExQX0lNUE9SVF9WRU5ET1JfU1REKQorCisjICBpZiBkZWZpbmVkIChfX01TTF9fKQorIyAgICBpbmNsdWRlIF9TVExQX05BVElWRV9IRUFERVIobGltaXRzKQorIyAgZW5kaWYKKworIyAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfSEVBREVSKG1lbW9yeSkKKworIyAgaWYgZGVmaW5lZCAoX19NU0xfXykgJiYgKF9fTVNMX18gPj0gMHgyNDA1ICAgJiYgX19NU0xfXyA8IDB4NTIwMSkgCisvKiAgOTgwNDAxIHZzcyAgTVNMIDIuNCAgUHJvIDMgUmVsZWFzZSAgKi8gIAorIyAgICBpbmNsdWRlIDxuZXdfbWVtLmg+CisjICBlbmRpZgorCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4NDYpCisjICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9NRU1PUlkgKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKKwpkaWZmIC0tZ2l0IGEvbmV3IGIvbmV3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMTNkYWIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXcKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfTkVXX0hFQURFUgorI2RlZmluZSBfU1RMUF9ORVdfSEVBREVSCisKKyNpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHg0NDcKKyMgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+CisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEICE9IDB4NDQ3KQorIyAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ1BQX1JVTlRJTUVfSEVBREVSKG5ldykKKyNlbHNlCisjICBpZm5kZWYgX1NUTFBfTkVXX0hfSEVBREVSCisjICAgIGluY2x1ZGUgPHN0bC9fbmV3Lmg+CisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDQ0NykKKyMgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+CisjICB1bmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjZW5kaWYKKworI2VuZGlmIC8qIF9TVExQX05FVyAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvbmV3LmggYi9uZXcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDg5YjVkCi0tLSAvZGV2L251bGwKKysrIGIvbmV3LmgKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCkKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4ODQ4CisjICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgorI2VsaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHg4NDgpICYmICEgZGVmaW5lZCAoX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lEKQorIyAgZGVmaW5lIF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRAorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChfU1RMUF9OT19ORVdfSEVBREVSKQorIyAgaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKQorIyAgICBpbmNsdWRlIDxuZXc+CisjICBlbGlmIGRlZmluZWQoX19JTlRFTF9DT01QSUxFUikgJiYgKF9fSU5URUxfQ09NUElMRVIgPj0gODAwICYmICFkZWZpbmVkKF9NU0NfVkVSKSkKKyMgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfT0xEX1NUUkVBTVNfSEVBREVSKG5ldy5oKQorIyAgZWxzZQorIyAgICBpZiBkZWZpbmVkIChfX0dOVUNfXykgJiYgKF9fR05VQ19fID49IDMpCisjICAgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfT0xEX1NUUkVBTVNfSEVBREVSKG5ldy5oKQorIyAgICBlbHNlCisjICAgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ1BQX1JVTlRJTUVfSEVBREVSKG5ldy5oKQorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZiAvKiAhZGVmaW5lZChfU1RMUF9OT19ORVdfSEVBREVSKSAqLworCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHg4NDgpCisjICBpZiAhIGRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKKyMgICAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KKyMgICAgdW5kZWYgIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGVsc2UKKyMgICAgdW5kZWYgIF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRAorIyAgZW5kaWYKKyNlbmRpZgorCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvbnVtZXJpYyBiL251bWVyaWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEzMmNmZQotLS0gL2Rldi9udWxsCisrKyBiL251bWVyaWMKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfTlVNRVJJQworI2RlZmluZSBfU1RMUF9OVU1FUklDCisKKyNpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHg0OQorIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KKyNlbmRpZgorCisjaWZkZWYgX1NUTFBfUFJBR01BX09OQ0UKKyMgIHByYWdtYSBvbmNlCisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9OVU1FUklDX0gKKyMgIGluY2x1ZGUgPHN0bC9fbnVtZXJpYy5oPgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDQ5KQorIyAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KKyMgIHVuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfTlVNRVJJQyAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvb3N0cmVhbSBiL29zdHJlYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNmODIzZgotLS0gL2Rldi9udWxsCisrKyBiL29zdHJlYW0KQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKyNpZm5kZWYgX1NUTFBfT1NUUkVBTQorI2RlZmluZSBfU1RMUF9PU1RSRUFNCisKKyMgaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MTA1MAorIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KKyMgZW5kaWYKKworIyBpZmRlZiBfU1RMUF9QUkFHTUFfT05DRQorIyAgcHJhZ21hIG9uY2UKKyMgZW5kaWYKKworIyBpbmNsdWRlIDxzdGwvX2lvc2Vyci5oPgorIyBpbmNsdWRlIDxzdGwvX29zdHJlYW0uaD4KKworIyBpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDEwNTApCisjICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyBlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfT1NUUkVBTSAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvb3N0cmVhbS5oIGIvb3N0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2YTc2NjQKLS0tIC9kZXYvbnVsbAorKysgYi9vc3RyZWFtLmgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfT1NUUkVBTV9ICisjZGVmaW5lIF9TVExQX09TVFJFQU1fSAorCisjaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MjA1MQorIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RsL19pb3NlcnIuaD4KKworI2luY2x1ZGUgPG9zdHJlYW0+CisKKyNpZmRlZiBfU1RMUF9VU0VfTkFNRVNQQUNFUworIyAgaW5jbHVkZSA8dXNpbmcvb3N0cmVhbT4KKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgyMDUxKQorIyAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KKyMgIHVuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfT1NUUkVBTV9IICovCmRpZmYgLS1naXQgYS9wdGhyZWFkLmggYi9wdGhyZWFkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdjMGMyNAotLS0gL2Rldi9udWxsCisrKyBiL3B0aHJlYWQuaApAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworIyBpZiAhZGVmaW5lZCAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCkKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MjgwCisjICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgorIyBlbGlmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MjgwKSAmJiAhIGRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKKyMgIGRlZmluZSBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKKyMgZW5kaWYKKworIyBpZiBkZWZpbmVkIChfX1NVTlBST19DQykgfHwgZGVmaW5lZCAoX19IUF9hQ0MpCisjIGluY2x1ZGUgIi91c3IvaW5jbHVkZS9wdGhyZWFkLmgiCisjIGVsc2UKKyMgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ19IRUFERVIocHRocmVhZC5oKQorIyBlbmRpZgorCisjIGlmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MjgwKQorIyAgaWYgISBkZWZpbmVkIChfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQpCisjICAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KKyMgICB1bmRlZiAgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZWxzZQorIyAgIHVuZGVmICBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKKyMgIGVuZGlmCisjIGVuZGlmCisKKy8qCisgTG9jYWwgVmFyaWFibGVzOgorIG1vZGU6QysrCisgRW5kOgorKi8KZGlmZiAtLWdpdCBhL3B0aHJlYWRfYWxsb2MgYi9wdGhyZWFkX2FsbG9jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1Y2NiY2IKLS0tIC9kZXYvbnVsbAorKysgYi9wdGhyZWFkX2FsbG9jCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX1BUSFJFQURfQUxMT0MKKyNkZWZpbmUgX1NUTFBfUFRIUkVBRF9BTExPQworCisjIGlmbmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDUyCisjICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgorIyBlbmRpZgorCisjIGlmZGVmIF9TVExQX1BSQUdNQV9PTkNFCisjICBwcmFnbWEgb25jZQorIyBlbmRpZgorCisjIGluY2x1ZGUgPHN0bC9fcHRocmVhZF9hbGxvYy5oPgorCisjIGlmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4NTIpCisjICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyBlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfUFRIUkVBRF9BTExPQyAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvcXVldWUgYi9xdWV1ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTBiYzA2Ci0tLSAvZGV2L251bGwKKysrIGIvcXVldWUKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfUVVFVUUKKyNkZWZpbmUgX1NUTFBfUVVFVUUKKworI2lmbmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDUzCisjICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgorI2VuZGlmCisKKyNpZmRlZiBfU1RMUF9QUkFHTUFfT05DRQorIyAgcHJhZ21hIG9uY2UKKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX1FVRVVFX0gKKyMgIGluY2x1ZGUgPHN0bC9fcXVldWUuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0ZVTkNUSU9OQUwKKyMgIGluY2x1ZGUgPGZ1bmN0aW9uYWw+CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX0lNUE9SVF9WRU5ET1JfU1REKQorIyAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfSEVBREVSKHF1ZXVlKQorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDUzKQorIyAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KKyMgIHVuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfUVVFVUUgKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3Jsb2Nrcy5oIGIvcmxvY2tzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRkYjFmNAotLS0gL2Rldi9udWxsCisrKyBiL3Jsb2Nrcy5oCkBAIC0wLDAgKzEsMTEgQEAKKyNpZm5kZWYgX1NUTFBfbWlzY19ybG9ja3NfaAorIyBkZWZpbmUgX1NUTFBfbWlzY19ybG9ja3NfaAorIyBpZiAoX19TVU5QUk9fQ0MgPj0gMHg1MDAgKQorIyAgaW5jbHVkZSA8Li4vQ0Npb3MvcmxvY2tzLmg+CisjIGVsaWYgZGVmaW5lZCAoX19TVU5QUk9fQ0MpCisjICBpbmNsdWRlIDwuLi9DQy9ybG9ja3MuaD4KKyMgZWxzZQorIyAgZXJyb3IgIlRoaXMgZmlsZSBpcyBmb3IgU1VOIENDIG9ubHkuIFBsZWFzZSByZW1vdmUgaXQgaWYgaXQgY2F1c2VzIGFueSBoYXJtIGZvciBvdGhlciBjb21waWxlcnMuIgorIyBlbmRpZgorI2VuZGlmCisKZGlmZiAtLWdpdCBhL3JvcGUgYi9yb3BlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmYWEzNmIKLS0tIC9kZXYvbnVsbAorKysgYi9yb3BlCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKyNpZm5kZWYgX1NUTFBfUk9QRQorI2RlZmluZSBfU1RMUF9ST1BFCisKKyNpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHg1NAorIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KKyNlbmRpZgorCisjaWZkZWYgX1NUTFBfUFJBR01BX09OQ0UKKyMgIHByYWdtYSBvbmNlCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpCisvKiBDb21tZW50IGZvbGxvd2luZyBpZiB5b3Ugd2FudCB0byB1c2Ugcm9wZSBjbGFzcyBldmVuIGlmIHlvdSBhc2sgZm9yCisgKiBubyBleHRlbnNpb24uCisgKi8KKyMgIGVycm9yIFRoZSByb3BlIGNsYXNzIGlzIGEgU1RMcG9ydCBleHRlbnNpb24uCisjZW5kaWYKKworI2luY2x1ZGUgPHN0bC9fcm9wZS5oPgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHg1NCkKKyMgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+CisjICB1bmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjZW5kaWYKKworI2VuZGlmIC8qIF9TVExQX1JPUEUgKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3NldCBiL3NldApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzNkZDJkCi0tLSAvZGV2L251bGwKKysrIGIvc2V0CkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX1NFVAorI2RlZmluZSBfU1RMUF9TRVQKKworI2lmbmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDU1CisjICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgorI2VuZGlmCisKKyNpZmRlZiBfU1RMUF9QUkFHTUFfT05DRQorIyAgcHJhZ21hIG9uY2UKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RsL19zZXQuaD4KKworI2lmIGRlZmluZWQgKF9TVExQX0lNUE9SVF9WRU5ET1JfU1REKQorIyAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfSEVBREVSKHNldCkKKyNlbmRpZgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHg1NSkKKyMgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+CisjICB1bmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjZW5kaWYKKworI2VuZGlmIC8qIF9TVExQX1NFVCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc2V0am1wLmggYi9zZXRqbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWJlZjE2Ci0tLSAvZGV2L251bGwKKysrIGIvc2V0am1wLmgKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfU0VUSk1QX0gKKworI2lmICFkZWZpbmVkIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEKQorIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHgyNTYKKyMgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+CisjZWxpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDI1NikgJiYgIWRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKKyMgIGRlZmluZSBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKKyMgIGRlZmluZSBfU1RMUF9TRVRKTVBfSAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9TVExQX1dDRV9FVkMzKQorc3RydWN0IF9leGNlcHRpb247CisjZW5kaWYKKworI2lmICFkZWZpbmVkIChzZXRqbXApCisjICBkZWZpbmUgX1NUTFBfTkFUSVZFX1NFVEpNUF9IX0lOQ0xVREVECisjICBpbmNsdWRlIF9TVExQX05BVElWRV9DX0hFQURFUihzZXRqbXAuaCkKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKF9TVExQX05BVElWRV9TRVRKTVBfSF9JTkNMVURFRCkKKy8qIFNlZSBlcnJuby5oIGZpbGUgZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhpcyBwcm9ibGVtLiAqLworIyAgZXJyb3Igc2V0am1wIGhhcyBiZWVuIGRlZmluZWQgYmVmb3JlIGluY2x1c2lvbiBvZiBzZXRqbXAuaCBoZWFkZXIuCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MjU2KQorIyAgaWYgISBkZWZpbmVkIChfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQpCisjICAgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+CisjICAgIHVuZGVmICBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjICBlbHNlCisjICAgIHVuZGVmICBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKKyMgIGVuZGlmCisjZW5kaWYKKyNlbmRpZiAvKiBfU1RMUF9TRVRKTVBfSCAqLwpkaWZmIC0tZ2l0IGEvc2lnbmFsLmggYi9zaWduYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjNjNzBhCi0tLSAvZGV2L251bGwKKysrIGIvc2lnbmFsLmgKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCkKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MjU3CisjICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgorI2VsaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgyNTcpICYmICEgZGVmaW5lZCAoX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lEKQorIyAgZGVmaW5lIF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRAorI2VuZGlmCisKKy8qIGV2YzMgYW5kIGV2YzQgZG9uJ3QgaGF2ZSBzaWduYWwuaCAqLworI2lmbmRlZiBfU1RMUF9XQ0UKKyMgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NfSEVBREVSKHNpZ25hbC5oKQorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDI1NykKKyMgIGlmICEgZGVmaW5lZCAoX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lEKQorIyAgICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgICB1bmRlZiAgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZW5kaWYKKyMgIHVuZGVmICBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKKyNlbmRpZgorCisvKiBMb2NhbCBWYXJpYWJsZXM6CisgKiBtb2RlOkMrKworICogRW5kOgorICovCmRpZmYgLS1naXQgYS9zbGlzdCBiL3NsaXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxOTMwZTQKLS0tIC9kZXYvbnVsbAorKysgYi9zbGlzdApAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKi8KKworI2lmbmRlZiBfU1RMUF9TTElTVAorI2RlZmluZSBfU1RMUF9TTElTVAorCisjaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4NTgKKyMgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+CisjZW5kaWYKKworI2lmZGVmIF9TVExQX1BSQUdNQV9PTkNFCisjICBwcmFnbWEgb25jZQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKQorLyogQ29tbWVudCBmb2xsb3dpbmcgaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBzbGlzdCBjb25zdGFpbmVyIGV2ZW4gaWYgeW91IGFzayBmb3IKKyAqIG5vIGV4dGVuc2lvbi4KKyAqLworIyAgZXJyb3IgVGhlIHNsaXN0IGNsYXNzIGlzIGFuIFNUTHBvcnQgZXh0ZW5zaW9uLgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfU0xJU1RfSAorIyAgaW5jbHVkZSA8c3RsL19zbGlzdC5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9JTVBPUlRfVkVORE9SX1NURCkKKy8vVGhpcyBpcyBub3QgYSBTdGFuZGFyZCBoZWFkZXIsIGl0IG1pZ2h0IGZhaWxlZCBmb3IgbW9zdCBvZgorLy90aGUgY29tcGlsZXJzIHNvIHdlIGNvbW1lbnQgaXQgZm9yIHRoZSBtb21lbnQuIFNob3VsZCBiZSB1bmNvbW1lbnRlZAorLy9vbiBhIGNvbXBpbGVyIGJhc2lzLgorLy8jICBpbmNsdWRlIF9TVExQX05BVElWRV9IRUFERVIoc2xpc3QpCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4NTgpCisjICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9TTElTVCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3N0cmVhbSBiL3NzdHJlYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJiMzI1ZQotLS0gL2Rldi9udWxsCisrKyBiL3NzdHJlYW0KQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKy8vIFRoaXMgaGVhZGVyIGRlZmluZXMgY2xhc3NlcyBiYXNpY19zdHJpbmdidWYsIGJhc2ljX2lzdHJpbmdzdHJlYW0sCisvLyBiYXNpY19vc3RyaW5nc3RyZWFtLCBhbmQgYmFzaWNfc3RyaW5nc3RyZWFtLiAgVGhlc2UgY2xhc3NlcworLy8gcmVwcmVzZW50IHN0cmVhbXNidWZzIGFuZCBzdHJlYW1zIHdob3NlIHNvdXJjZXMgb3IgZGVzdGluYXRpb25zIGFyZQorLy8gQysrIHN0cmluZ3MuCisKKyNpZm5kZWYgX1NUTFBfU1NUUkVBTQorI2RlZmluZSBfU1RMUF9TU1RSRUFNCisKKyNpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHgxMDU5CisjICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgorI2VuZGlmCisKKyNpZmRlZiBfU1RMUF9QUkFHTUFfT05DRQorIyAgcHJhZ21hIG9uY2UKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RsL19pb3NlcnIuaD4KKworI2luY2x1ZGUgPHN0bC9fc3N0cmVhbS5oPgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgxMDU5KQorIyAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KKyMgIHVuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfU1NUUkVBTSAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RhY2sgYi9zdGFjawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTkxMDZiCi0tLSAvZGV2L251bGwKKysrIGIvc3RhY2sKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfU1RBQ0sKKyNkZWZpbmUgX1NUTFBfU1RBQ0sKKworI2lmbmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDYwCisjICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgorI2VuZGlmCisKKyNpZmRlZiBfU1RMUF9QUkFHTUFfT05DRQorIyAgcHJhZ21hIG9uY2UKKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX1NUQUNLX0gKKyMgIGluY2x1ZGUgPHN0bC9fc3RhY2suaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfSU1QT1JUX1ZFTkRPUl9TVEQpCisjICBpbmNsdWRlIF9TVExQX05BVElWRV9IRUFERVIoc3RhY2spCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4NjApCisjICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9TVEFDSyAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RkYXJnLmggYi9zdGRhcmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODYwNWNjCi0tLSAvZGV2L251bGwKKysrIGIvc3RkYXJnLmgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKy8qIFdvcmthcm91bmQgZm9yIGEgIm1pc2JlaGF2aW91ciIgd2hlbiBjb21waWxpbmcgcmVzb3VyY2Ugc2NyaXB0cyB1c2luZworICogZU1iZWRkZWQgVmlzdWFsIEMrKy4gVGhlIHN0YW5kYXJkIC5yYyBmaWxlIGluY2x1ZGVzIHdpbmRvd3MgaGVhZGVyIGZpbGVzLAorICogd2hpY2ggaW4gdHVybiBpbmNsdWRlIHN0ZGFyZy5oLCB3aGljaCByZXN1bHRzIGluIHdhcm5pbmdzIGFuZCBlcnJvcnMKKyAqLworI2lmICFkZWZpbmVkIChSQ19JTlZPS0VEKQorCisjICBpZiAhZGVmaW5lZCAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCkKKyMgICAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHgyNjEKKyMgICAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KKyMgIGVsaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgyNjEpICYmICFkZWZpbmVkIChfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQpCisjICAgIGRlZmluZSBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKKyMgIGVuZGlmCisKKyMgIGlmIGRlZmluZWQoX1NUTFBfV0NFX0VWQzMpCitzdHJ1Y3QgX2V4Y2VwdGlvbjsKKyMgIGVuZGlmCisKKyMgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NfSEVBREVSKHN0ZGFyZy5oKQorCisjICBpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDI2MSkKKyMgICAgaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKKyMgICAgICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgICAgIHVuZGVmICBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjICAgIGVsc2UKKyMgICAgICB1bmRlZiAgX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lECisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmIC8qIFJDX0lOVk9LRUQgKi8KZGlmZiAtLWdpdCBhL3N0ZGRlZi5oIGIvc3RkZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFjNDQ5ZgotLS0gL2Rldi9udWxsCisrKyBiL3N0ZGRlZi5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MjYyCisjICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgorI2VsaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgyNjIpICYmICEgZGVmaW5lZCAoX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lEKQorIyAgZGVmaW5lIF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRAorI2VuZGlmCisKKyMgIGlmIGRlZmluZWQgKF9NU0NfVkVSKSB8fCBkZWZpbmVkIChfX0RNQ19fKQorLyogTmF0aXZlIHN0ZGRlZi5oIGNvbnRhaW5zIGVycm5vIG1hY3JvIGRlZmluaXRpb24gbWFraW5nIGluY2x1c2lvbiBvZiBuYXRpdmUKKyAqIGVycm5vLmggaW4gU1RMcG9ydCBlcnJuby5oIGltcG9zc2libGUuIFdlIGFyZSB0aGVuIGZvcmNlZCB0byBpbmNsdWRlIGVycm5vLmgKKyAqIGZpcnN0LgorICovCisjICAgIGluY2x1ZGUgImVycm5vLmgiCisjICBlbmRpZgorCisjICBpbmNsdWRlIF9TVExQX05BVElWRV9DX0hFQURFUihzdGRkZWYuaCkKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MjYyKQorIyAgaWYgISBkZWZpbmVkIChfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQpCisjICAgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+CisjICAgIHVuZGVmICBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjICBlbHNlCisjICAgIHVuZGVmICBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKKyMgIGVuZGlmCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvc3RkZXhjZXB0IGIvc3RkZXhjZXB0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMDMzMWYKLS0tIC9kZXYvbnVsbAorKysgYi9zdGRleGNlcHQKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX1NUREVYQ0VQVAorCisjaWYgIWRlZmluZWQgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQpCisjICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDYzCisjICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgorI2VsaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHg2MykgJiYgISBkZWZpbmVkIChfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQpCisjICBkZWZpbmUgX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lECisjICBkZWZpbmUgX1NUTFBfU1RERVhDRVBUCisjZW5kaWYKKworI2lmZGVmIF9TVExQX1BSQUdNQV9PTkNFCisjICBwcmFnbWEgb25jZQorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAhPSAweDYzKSB8fCBkZWZpbmVkIChfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQpCisjICBpbmNsdWRlIF9TVExQX05BVElWRV9IRUFERVIoc3RkZXhjZXB0KQorI2Vsc2UKKyMgIGlmbmRlZiBfU1RMUF9JTlRFUk5BTF9TVERFWENFUFQKKyMgICAgaW5jbHVkZSA8c3RsL19zdGRleGNlcHQuaD4KKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4NjMpCisjICBpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lEKQorIyAgICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgICB1bmRlZiAgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZWxzZQorIyAgICB1bmRlZiAgX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lECisjICBlbmRpZgorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9TVERFWENFUFQgKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0ZGlvLmggYi9zdGRpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MWYzN2IKLS0tIC9kZXYvbnVsbAorKysgYi9zdGRpby5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisvKiBXb3JrYXJvdW5kIGZvciBhICJtaXNiZWhhdmlvdXIiIHdoZW4gY29tcGlsaW5nIHJlc291cmNlIHNjcmlwdHMgdXNpbmcKKyAqIGVNYmVkZGVkIFZpc3VhbCBDKysuIFRoZSBzdGFuZGFyZCAucmMgZmlsZSBpbmNsdWRlcyB3aW5kb3dzIGhlYWRlciBmaWxlcywKKyAqIHdoaWNoIGluIHR1cm4gaW5jbHVkZSBzdGRhcmcuaCwgd2hpY2ggcmVzdWx0cyBpbiB3YXJuaW5ncyBhbmQgZXJyb3JzCisgKi8KKyNpZiAhZGVmaW5lZChSQ19JTlZPS0VEKQorCisjICBpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDI2NAorIyAgICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgorIyAgZWxpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDI2NCkgJiYgIWRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKKyMgICAgZGVmaW5lIF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRAorIyAgZW5kaWYKKworIyAgICBpZiBkZWZpbmVkKF9TVExQX1dDRV9FVkMzKQorc3RydWN0IF9leGNlcHRpb247CisjICAgIGVuZGlmCisjICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NfSEVBREVSKHN0ZGlvLmgpCisKKyMgICAgaWYgZGVmaW5lZCAoX19TVU5QUk9fQ0MpICYmICFkZWZpbmVkIChfU1RSVUNUX0ZJTEUpCisjICAgICAgZGVmaW5lIF9TVFJVQ1RfRklMRQorIyAgICBlbmRpZgorCisjICAgIGlmIChkZWZpbmVkIChfX01XRVJLU19fKSAmJiAhZGVmaW5lZCAoTl9QTEFUX05MTSkpICB8fCBkZWZpbmVkIChfX0JPUkxBTkRDX18pCisjICAgICAgdW5kZWYgc3RkaW4KKyMgICAgICB1bmRlZiBzdGRvdXQKKyMgICAgICB1bmRlZiBzdGRlcnIKKyMgICAgICBpZiBkZWZpbmVkIChfX01XRVJLU19fKQorIyAgICAgIGRlZmluZSBzdGRpbiAgICgmX1NUTFBfVkVORE9SX0NTVEQ6Ol9fZmlsZXNbMF0pCisjICAgICAgZGVmaW5lIHN0ZG91dCAgKCZfU1RMUF9WRU5ET1JfQ1NURDo6X19maWxlc1sxXSkKKyMgICAgICBkZWZpbmUgc3RkZXJyICAoJl9TVExQX1ZFTkRPUl9DU1REOjpfX2ZpbGVzWzJdKQorIyAgICAgIGVsaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKQorIyAgICAgICAgZGVmaW5lIHN0ZGluICAgKCZfU1RMUF9WRU5ET1JfQ1NURDo6X3N0cmVhbXNbMF0pCisjICAgICAgICBkZWZpbmUgc3Rkb3V0ICAoJl9TVExQX1ZFTkRPUl9DU1REOjpfc3RyZWFtc1sxXSkKKyMgICAgICAgIGRlZmluZSBzdGRlcnIgICgmX1NUTFBfVkVORE9SX0NTVEQ6Ol9zdHJlYW1zWzJdKQorIyAgICAgIGVuZGlmCisjICAgIGVuZGlmCisKKyMgIGlmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MjY0KQorIyAgICBpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lEKQorIyAgICAgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+CisjICAgICAgdW5kZWYgIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgICAgZWxzZQorIyAgICAgIHVuZGVmICBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisKKyNlbmRpZiAvKiBSQ19JTlZPS0VEICovCmRpZmYgLS1naXQgYS9zdGRpb3N0cmVhbS5oIGIvc3RkaW9zdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGE1YzY3Ci0tLSAvZGV2L251bGwKKysrIGIvc3RkaW9zdHJlYW0uaApAQCAtMCwwICsxLDEwIEBACisjaWZuZGVmIF9TVExQX21pc2Nfc3RkaW9zdHJlYW1faAorIyBkZWZpbmUgX1NUTFBfbWlzY19zdGRpb3N0cmVhbV9oCisjIGlmIChfX1NVTlBST19DQyA+PSAweDUwMCApCisjICBpbmNsdWRlIDwuLi9DQ2lvcy9zdGRpb3N0cmVhbS5oPgorIyBlbHNlIGlmIGRlZmluZWQgKF9fU1VOUFJPX0NDKQorIyAgaW5jbHVkZSA8Li4vQ0Mvc3RkaW9zdHJlYW0uaD4KKyMgZWxzZQorIyAgZXJyb3IgIlRoaXMgZmlsZSBpcyBmb3IgU1VOIENDIG9ubHkuIFBsZWFzZSByZW1vdmUgaXQgaWYgaXQgY2F1c2VzIGFueSBoYXJtIGZvciBvdGhlciBjb21waWxlcnMuIgorIyBlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9zdGRsaWIuaCBiL3N0ZGxpYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNDE1ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9zdGRsaWIuaApAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworLyogV29ya2Fyb3VuZCBmb3IgYSAibWlzYmVoYXZpb3VyIiB3aGVuIGNvbXBpbGluZyByZXNvdXJjZSBzY3JpcHRzIHVzaW5nCisgKiBlTWJlZGRlZCBWaXN1YWwgQysrLiBUaGUgc3RhbmRhcmQgLnJjIGZpbGUgaW5jbHVkZXMgd2luZG93cyBoZWFkZXIgZmlsZXMsCisgKiB3aGljaCBpbiB0dXJuIGluY2x1ZGUgc3RkbGliLmgsIHdoaWNoIHJlc3VsdHMgaW4gd2FybmluZ3MgYW5kIGVycm9ycworICovCisjaWYgIWRlZmluZWQgKFJDX0lOVk9LRUQpCisKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEKQorIyAgICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDI2NQorIyAgICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgorIyAgZWxpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDI2NSkgJiYgIWRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKKyMgICAgZGVmaW5lIF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRAorIyAgZW5kaWYKKworIyAgaWYgZGVmaW5lZCAoX01TQ19WRVIpIHx8IChkZWZpbmVkIChfX0dOVUNfXykgJiYgZGVmaW5lZCAoX19NSU5HVzMyX18pKSB8fCBcCisgICAgICBkZWZpbmVkIChfX0JPUkxBTkRDX18pIHx8IGRlZmluZWQgKF9fRE1DX18pIHx8IFwKKyAgICAgIChkZWZpbmVkIChfX0hQX2FDQykgJiYgZGVmaW5lZCAoX1JFRU5UUkFOVCkpCisvKiBOYXRpdmUgc3RkbGliLmggY29udGFpbnMgZXJybm8gbWFjcm8gZGVmaW5pdGlvbiBtYWtpbmcgaW5jbHVzaW9uIG9mIG5hdGl2ZQorICogZXJybm8uaCBpbiBTVExwb3J0IGVycm5vLmggaW1wb3NzaWJsZS4gV2UgYXJlIHRoZW4gZm9yY2VkIHRvIGluY2x1ZGUgZXJybm8uaAorICogZmlyc3QuCisgKi8KKyMgICAgaW5jbHVkZSAiZXJybm8uaCIKKyMgIGVuZGlmCisKKy8qCisgZm9yd2FyZC1kZWNsYXJhdGlvbiBmb3IgX2V4Y2VwdGlvbiBzdHJ1Y3Q7IHByZXZlbnRzIHdhcm5pbmcgbWVzc2FnZQorIC4uL2luY2x1ZGUvc3RkbGliLmgoODE3KSA6IHdhcm5pbmcgQzQxMTU6ICdfZXhjZXB0aW9uJyA6IG5hbWVkIHR5cGUgZGVmaW5pdGlvbiBpbiBwYXJlbnRoZXNlcworKi8KKyMgIGlmIGRlZmluZWQoX1NUTFBfV0NFX0VWQzMpCitzdHJ1Y3QgX2V4Y2VwdGlvbjsKKyMgIGVuZGlmCisKKyMgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NfSEVBREVSKHN0ZGxpYi5oKQorCisvKiBvbiBldmMzL2V2YzQgaW5jbHVkaW5nIHN0ZGxpYi5oIGFsc28gZGVmaW5lcyBzZXRqbXAgbWFjcm8gKi8KKyMgIGlmIGRlZmluZWQgKF9TVExQX1dDRSkKKyMgICAgZGVmaW5lIF9TVExQX05BVElWRV9TRVRKTVBfSF9JTkNMVURFRAorIyAgZW5kaWYKKworIyAgaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgyNjUpCisjICAgIGlmICEgZGVmaW5lZCAoX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lEKQorIyAgICAgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+CisjICAgICAgdW5kZWYgIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgICAgZWxzZQorIyAgICAgIHVuZGVmICBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisKKyNlbmRpZiAvKiBSQ19JTlZPS0VEICovCisKKy8qCisgIExvY2FsIFZhcmlhYmxlczoKKyAgbW9kZTpDKysKKyAgRW5kOgorKi8KZGlmZiAtLWdpdCBhL3N0bC9fYWJicmV2cy5oIGIvc3RsL19hYmJyZXZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRhY2FjOAotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9fYWJicmV2cy5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworLyogTk9URTogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgU1RMIGhlYWRlcnMuCisgKiAgIFlvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LgorICovCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQUJCUkVWU19ICisjIGRlZmluZSBfU1RMUF9JTlRFUk5BTF9BQkJSRVZTX0gKKworLy8gdWdsaW5lc3MgaXMgaW50ZW50aW9uYWwgLSB0byByZWR1Y2UgY29uZmxpY3RzCisjICBkZWZpbmUgaW5wdXRfaXRlcmF0b3JfdGFnICAgICAgICAgICAgIF9Jbl9fSXRUCisjICBkZWZpbmUgb3V0cHV0X2l0ZXJhdG9yX3RhZyAgICAgICAgICAgIF9PdV9fSXRUCisjICBkZWZpbmUgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcgICAgIF9CZF9fSXRUCisjICBkZWZpbmUgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgICAgIF9SYV9fSXRUCisjICBkZWZpbmUgaW5wdXRfaXRlcmF0b3IgICAgICAgICAgICAgICAgIF9Jbl9fSXQKKyMgIGRlZmluZSBvdXRwdXRfaXRlcmF0b3IgICAgICAgICAgICAgICAgX091X19JdAorIyAgZGVmaW5lIGJpZGlyZWN0aW9uYWxfaXRlcmF0b3IgICAgICAgICBfQmRfX0l0CisjICBkZWZpbmUgcmFuZG9tX2FjY2Vzc19pdGVyYXRvciAgICAgICAgIF9SYV9fSXQKKyMgIGRlZmluZSByZXZlcnNlX2JpZGlyZWN0aW9uYWxfaXRlcmF0b3IgX3JCZF9fSXQKKyMgIGRlZmluZSByZXZlcnNlX2l0ZXJhdG9yICAgICAgICAgICAgICAgX3JfX0l0CisjICBkZWZpbmUgYmFja19pbnNlcnRfaXRlcmF0b3IgICAgICAgICAgIF9iSV9fSXQKKyMgIGRlZmluZSBmcm9udF9pbnNlcnRfaXRlcmF0b3IgICAgICAgICAgX2ZJX19JdAorIyAgZGVmaW5lIHJhd19zdG9yYWdlX2l0ZXJhdG9yICAgICAgICAgICBfclNfX0l0CisjICBkZWZpbmUgX0NvbnN0X3RyYWl0cyAgICAgICAgICAgICAgICAgIF9DX1RyCisjICBkZWZpbmUgX0NvbnN0X0NvbnN0X3RyYWl0cyAgICAgICAgICAgIF9DQ19UcgorIyAgZGVmaW5lIF9Ob25jb25zdF90cmFpdHMgICAgICAgICAgICAgICBfTl9UcgorIyAgZGVmaW5lIF9Ob25jb25zdF9Db25zdF90cmFpdHMgICAgICAgICBfTkNfVHIKKworLy8gdWdsaW5lc3MgaXMgaW50ZW50aW9uYWwgLSB0byByZWR1Y2UgY29uZmxpY3RzIHByb2JhYmlsaXR5CisjICBkZWZpbmUgX19tYWxsb2NfYWxsb2MgICAgTV9fQQorIyAgZGVmaW5lIF9fbm9kZV9hbGxvYyAgICAgIERfX0EKKyMgIGRlZmluZSBfX25ld19hbGxvYyAgICAgICBOX19BCisjICBkZWZpbmUgX19kZWJ1Z19hbGxvYyAgICAgR19fQQorIyAgZGVmaW5lIF9TVExQX2FsbG9jX3Byb3h5IFBfX0EKKworIyAgZGVmaW5lIF9EZXF1ZV9pdGVyYXRvcl9iYXNlICAgICBfRHFfX0l0QgorIyAgZGVmaW5lIF9EZXF1ZV9pdGVyYXRvciAgICAgICAgICBfRHFfX0l0CisKKyMgIGRlZmluZSBfU2VsZWN0MXN0ICAgICAgICAgICAgICAgICAgX1Mxc3QKKyMgIGRlZmluZSBfU2VsZWN0Mm5kICAgICAgICAgICAgICAgICAgX1MybmQKKyMgIGRlZmluZSBfX21vdmVfc291cmNlICAgICAgICAgICAgICAgX19tX3MKKyMgIGRlZmluZSBfVmVjdG9yX25vbmNvbnN0X3RyYWl0cyAgICAgX1ZfbmN0CisKKyMgIGRlZmluZSBfSHRfaXRlcmF0b3IgICAgICAgICAgICAgICAgX0h0X0l0CisKKyMgIGRlZmluZSBfTGlzdF9ub2RlX2Jhc2UgICAgICAgICAgX0xfX05CCisjICBkZWZpbmUgX0xpc3RfaXRlcmF0b3JfYmFzZSAgICAgIF9MX19JdEIKKyMgIGRlZmluZSBfTGlzdF9pdGVyYXRvciAgICAgICAgICAgX0xfX0l0CisKKyMgIGRlZmluZSBfU2xpc3RfaXRlcmF0b3JfYmFzZSAgICAgX1NMX19JdEIKKyMgIGRlZmluZSBfU2xpc3RfaXRlcmF0b3IgICAgICAgICAgX1NMX19JdAorCisjICBkZWZpbmUgX1JiX3RyZWVfbm9kZV9iYXNlICAgICAgIF9yYlRfX05CCisjICBkZWZpbmUgX1JiX3RyZWVfbm9kZSAgICAgICAgICAgIF9yYlRfX04KKyMgIGRlZmluZSBfUmJfdHJlZV9iYXNlX2l0ZXJhdG9yICAgX3JiVF9fSXQKKyMgIGRlZmluZSBfUmJfdHJlZV9iYXNlICAgICAgICAgICAgX3JiVF9fQgorCisjICBpZiBkZWZpbmVkIChfX0RNQ19fKSAmJiBkZWZpbmVkIChfU1RMUF9ERUJVRykKKyMgICAgZGVmaW5lIF9Ob25EYmdfaGFzaHRhYmxlICAgICAgX05kX0h0CisjICAgIGRlZmluZSBfREJHX2l0ZXIgICAgICAgICAgICAgIF9kX19JdAorIyAgZW5kaWYKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9zdGwvX2FsZ28uYyBiL3N0bC9fYWxnby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NzQ1YmEKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvX2FsZ28uYwpAQCAtMCwwICsxLDIwMTIgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX0FMR09fQworI2RlZmluZSBfU1RMUF9BTEdPX0MKKworI2lmICFkZWZpbmVkIChfU1RMUF9JTlRFUk5BTF9BTEdPX0gpCisjICBpbmNsdWRlIDxzdGwvX2FsZ28uaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX1RFTVBCVUZfSAorIyAgaW5jbHVkZSA8c3RsL190ZW1wYnVmLmg+CisjZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlciwgY2xhc3MgX0Rpc3RhbmNlLCBjbGFzcyBfQ29tcGFyZT4KK3ZvaWQgX19tZXJnZV93aXRob3V0X2J1ZmZlcihfQmlkaXJlY3Rpb25hbEl0ZXIgX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIgX19taWRkbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRGlzdGFuY2UgX19sZW4xLCBfRGlzdGFuY2UgX19sZW4yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Db21wYXJlIF9fY29tcCk7CisKKwordGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcjEsIGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcjIsCisgICAgICAgICAgY2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyMywgY2xhc3MgX0NvbXBhcmU+CitfQmlkaXJlY3Rpb25hbEl0ZXIzIF9fbWVyZ2VfYmFja3dhcmQoX0JpZGlyZWN0aW9uYWxJdGVyMSBfX2ZpcnN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIxIF9fbGFzdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyMiBfX2ZpcnN0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIyIF9fbGFzdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyMyBfX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ29tcGFyZSBfX2NvbXApOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorI2lmICEoZGVmaW5lZCAoX19TVU5QUk9fQ0MpICYmIChfX1NVTlBST19DQyA8IDB4NDIwICkpCitpbmxpbmUKKyNlbmRpZgorY29uc3QgX1RwJiBfX21lZGlhbihjb25zdCBfVHAmIF9fYSwgY29uc3QgX1RwJiBfX2IsIGNvbnN0IF9UcCYgX19jKSB7CisgIGlmIChfX2EgPCBfX2IpCisgICAgaWYgKF9fYiA8IF9fYykKKyAgICAgIHJldHVybiBfX2I7CisgICAgZWxzZSBpZiAoX19hIDwgX19jKQorICAgICAgcmV0dXJuIF9fYzsKKyAgICBlbHNlCisgICAgICByZXR1cm4gX19hOworICBlbHNlIGlmIChfX2EgPCBfX2MpCisgICAgcmV0dXJuIF9fYTsKKyAgZWxzZSBpZiAoX19iIDwgX19jKQorICAgIHJldHVybiBfX2M7CisgIGVsc2UKKyAgICByZXR1cm4gX19iOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZT4KKyNpZiAhKGRlZmluZWQgKF9fU1VOUFJPX0NDKSAmJiAoX19TVU5QUk9fQ0MgPCAweDQyMCApKQoraW5saW5lCisjZW5kaWYKK2NvbnN0IF9UcCYKK19fbWVkaWFuKGNvbnN0IF9UcCYgX19hLCBjb25zdCBfVHAmIF9fYiwgY29uc3QgX1RwJiBfX2MsIF9Db21wYXJlIF9fY29tcCkgeworICBpZiAoX19jb21wKF9fYSwgX19iKSkgeworICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFfX2NvbXAoX19iLCBfX2EpLCBfU3RsTXNnX0lOVkFMSURfU1RSSUNUX1dFQUtfUFJFRElDQVRFKQorICAgIGlmIChfX2NvbXAoX19iLCBfX2MpKSB7CisgICAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghX19jb21wKF9fYywgX19iKSwgX1N0bE1zZ19JTlZBTElEX1NUUklDVF9XRUFLX1BSRURJQ0FURSkKKyAgICAgIHJldHVybiBfX2I7CisgICAgfQorICAgIGVsc2UgaWYgKF9fY29tcChfX2EsIF9fYykpIHsKKyAgICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFfX2NvbXAoX19jLCBfX2EpLCBfU3RsTXNnX0lOVkFMSURfU1RSSUNUX1dFQUtfUFJFRElDQVRFKQorICAgICAgcmV0dXJuIF9fYzsKKyAgICB9CisgICAgZWxzZQorICAgICAgcmV0dXJuIF9fYTsKKyAgfQorICBlbHNlIGlmIChfX2NvbXAoX19hLCBfX2MpKSB7CisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoIV9fY29tcChfX2MsIF9fYSksIF9TdGxNc2dfSU5WQUxJRF9TVFJJQ1RfV0VBS19QUkVESUNBVEUpCisgICAgcmV0dXJuIF9fYTsKKyAgfQorICBlbHNlIGlmIChfX2NvbXAoX19iLCBfX2MpKSB7CisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoIV9fY29tcChfX2MsIF9fYiksIF9TdGxNc2dfSU5WQUxJRF9TVFJJQ1RfV0VBS19QUkVESUNBVEUpCisgICAgcmV0dXJuIF9fYzsKKyAgfQorICBlbHNlCisgICAgcmV0dXJuIF9fYjsKK30KKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIxLCBjbGFzcyBfRm9yd2FyZEl0ZXIyPgorX0ZvcndhcmRJdGVyMSBzZWFyY2goX0ZvcndhcmRJdGVyMSBfX2ZpcnN0MSwgX0ZvcndhcmRJdGVyMSBfX2xhc3QxLAorICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyMiBfX2ZpcnN0MiwgX0ZvcndhcmRJdGVyMiBfX2xhc3QyKSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0MSwgX19sYXN0MSkpCisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0MiwgX19sYXN0MikpCisgIC8vIFRlc3QgZm9yIGVtcHR5IHJhbmdlcworICBpZiAoX19maXJzdDEgPT0gX19sYXN0MSB8fCBfX2ZpcnN0MiA9PSBfX2xhc3QyKQorICAgIHJldHVybiBfX2ZpcnN0MTsKKworICAvLyBUZXN0IGZvciBhIHBhdHRlcm4gb2YgbGVuZ3RoIDEuCisgIF9Gb3J3YXJkSXRlcjIgX19wMShfX2ZpcnN0Mik7CisKKyAgaWYgKCArK19fcDEgPT0gX19sYXN0MiApCisgICAgcmV0dXJuIGZpbmQoX19maXJzdDEsIF9fbGFzdDEsICpfX2ZpcnN0Mik7CisKKyAgLy8gR2VuZXJhbCBjYXNlLgorCisgIGZvciAoIDsgOyApIHsgLy8gX19maXJzdDEgIT0gX19sYXN0MSB3aWxsIGJlIGNoZWNrZWQgaW4gZmluZCBiZWxvdworICAgIF9fZmlyc3QxID0gZmluZChfX2ZpcnN0MSwgX19sYXN0MSwgKl9fZmlyc3QyKTsKKyAgICBpZiAoX19maXJzdDEgPT0gX19sYXN0MSkKKyAgICAgIHJldHVybiBfX2xhc3QxOworCisgICAgX0ZvcndhcmRJdGVyMiBfX3AgPSBfX3AxOworICAgIF9Gb3J3YXJkSXRlcjEgX19jdXJyZW50ID0gX19maXJzdDE7CisgICAgaWYgKCsrX19jdXJyZW50ID09IF9fbGFzdDEpCisgICAgICByZXR1cm4gX19sYXN0MTsKKworICAgIHdoaWxlICgqX19jdXJyZW50ID09ICpfX3ApIHsKKyAgICAgIGlmICgrK19fcCA9PSBfX2xhc3QyKQorICAgICAgICByZXR1cm4gX19maXJzdDE7CisgICAgICBpZiAoKytfX2N1cnJlbnQgPT0gX19sYXN0MSkKKyAgICAgICAgcmV0dXJuIF9fbGFzdDE7CisgICAgfQorCisgICAgKytfX2ZpcnN0MTsKKyAgfQorICByZXR1cm4gX19maXJzdDE7Cit9CisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyLCBjbGFzcyBfSW50ZWdlciwgY2xhc3MgX1RwLAorICAgICAgICAgIGNsYXNzIF9CaW5hcnlQcmVkLCBjbGFzcyBfRGlzdGFuY2U+CitfUmFuZG9tQWNjZXNzSXRlciBfX3NlYXJjaF9uKF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0ludGVnZXIgX19jb3VudCwgY29uc3QgX1RwJiBfX3ZhbCwgX0JpbmFyeVByZWQgX19wcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRGlzdGFuY2UqLCBjb25zdCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyAmKQoreworICBfRGlzdGFuY2UgX190YWlsU2l6ZSA9IF9fbGFzdCAtIF9fZmlyc3Q7CisgIGNvbnN0IF9EaXN0YW5jZSBfX3BhdHRTaXplID0gX19jb3VudDsKKyAgY29uc3QgX0Rpc3RhbmNlIF9fc2tpcE9mZnNldCA9IF9fcGF0dFNpemUgLSAxOworICBfUmFuZG9tQWNjZXNzSXRlciBfX2JhY2tUcmFjazsKKyAgX0Rpc3RhbmNlIF9fcmVtYWluZGVyLCBfX3ByZXZSZW1haW5kZXI7CisKKyAgZm9yICggX1JhbmRvbUFjY2Vzc0l0ZXIgX19sb29rQWhlYWQgPSBfX2ZpcnN0ICsgX19za2lwT2Zmc2V0OyBfX3RhaWxTaXplID49IF9fcGF0dFNpemU7IF9fbG9va0FoZWFkICs9IF9fcGF0dFNpemUgKSB7IC8vIHRoZSBtYWluIGxvb3AuLi4KKyAgICAvL19fbG9va0FoZWFkIGhlcmUgaXMgYWx3YXlzIHBvaW50aW5nIHRvIHRoZSBsYXN0IGVsZW1lbnQgb2YgbmV4dCBwb3NzaWJsZSBtYXRjaC4KKyAgICBfX3RhaWxTaXplIC09IF9fcGF0dFNpemU7CisKKyAgICB3aGlsZSAoICFfX3ByZWQoKl9fbG9va0FoZWFkLCBfX3ZhbCkgKSB7IC8vIHRoZSBza2lwIGxvb3AuLi4KKyAgICAgIGlmIChfX3RhaWxTaXplIDwgX19wYXR0U2l6ZSkKKyAgICAgICAgcmV0dXJuIF9fbGFzdDsKKworICAgICAgX19sb29rQWhlYWQgKz0gX19wYXR0U2l6ZTsKKyAgICAgIF9fdGFpbFNpemUgLT0gX19wYXR0U2l6ZTsKKyAgICB9CisKKyAgICBpZiAoIF9fc2tpcE9mZnNldCA9PSAwICkgeworICAgICAgcmV0dXJuIChfX2xvb2tBaGVhZCAtIF9fc2tpcE9mZnNldCk7IC8vU3VjY2VzcworICAgIH0KKworICAgIF9fcmVtYWluZGVyID0gX19za2lwT2Zmc2V0OworCisgICAgZm9yIChfX2JhY2tUcmFjayA9IF9fbG9va0FoZWFkOyBfX3ByZWQoKi0tX19iYWNrVHJhY2ssIF9fdmFsKTsgKSB7CisgICAgICBpZiAoLS1fX3JlbWFpbmRlciA9PSAwKQorICAgICAgICByZXR1cm4gKF9fbG9va0FoZWFkIC0gX19za2lwT2Zmc2V0KTsgLy9TdWNjZXNzCisgICAgfQorCisgICAgaWYgKF9fcmVtYWluZGVyID4gX190YWlsU2l6ZSkKKyAgICAgIHJldHVybiBfX2xhc3Q7IC8vZmFpbHVyZQorCisgICAgX19sb29rQWhlYWQgKz0gX19yZW1haW5kZXI7CisgICAgX190YWlsU2l6ZSAtPSBfX3JlbWFpbmRlcjsKKworICAgIHdoaWxlICggX19wcmVkKCpfX2xvb2tBaGVhZCwgX192YWwpICkgeworICAgICAgX19wcmV2UmVtYWluZGVyID0gX19yZW1haW5kZXI7CisgICAgICBfX2JhY2tUcmFjayA9IF9fbG9va0FoZWFkOworCisgICAgICBkbyB7CisgICAgICAgIGlmICgtLV9fcmVtYWluZGVyID09IDApCisgICAgICAgICAgcmV0dXJuIChfX2xvb2tBaGVhZCAtIF9fc2tpcE9mZnNldCk7IC8vU3VjY2VzcworICAgICAgfSB3aGlsZSAoX19wcmVkKCotLV9fYmFja1RyYWNrLCBfX3ZhbCkpOworCisgICAgICAvL2FkanVzdCByZW1haW5kZXIgZm9yIG5leHQgY29tcGFyaXNvbgorICAgICAgX19yZW1haW5kZXIgKz0gX19wYXR0U2l6ZSAtIF9fcHJldlJlbWFpbmRlcjsKKworICAgICAgaWYgKF9fcmVtYWluZGVyID4gX190YWlsU2l6ZSkKKyAgICAgICAgcmV0dXJuIF9fbGFzdDsgLy9mYWlsdXJlCisKKyAgICAgIF9fbG9va0FoZWFkICs9IF9fcmVtYWluZGVyOworICAgICAgX190YWlsU2l6ZSAtPSBfX3JlbWFpbmRlcjsKKyAgICB9CisKKyAgICAvL19fbG9va0FoZWFkIGhlcmUgaXMgYWx3YXlzIHBvaW50aW5nIHRvIHRoZSBlbGVtZW50IG9mIHRoZSBsYXN0IG1pc21hdGNoLgorICB9CisKKyAgcmV0dXJuIF9fbGFzdDsgLy9mYWlsdXJlCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9JbnRlZ2VyLCBjbGFzcyBfVHAsCisgICAgICAgICAgY2xhc3MgX0Rpc3RhbmNlLCBjbGFzcyBfQmluYXJ5UHJlZD4KK19Gb3J3YXJkSXRlciBfX3NlYXJjaF9uKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgX0ludGVnZXIgX19jb3VudCwgY29uc3QgX1RwJiBfX3ZhbCwgX0JpbmFyeVByZWQgX19wcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgX0Rpc3RhbmNlKiwgY29uc3QgZm9yd2FyZF9pdGVyYXRvcl90YWcgJikgeworICBmb3IgKDsgKF9fZmlyc3QgIT0gX19sYXN0KSAmJiAhX19wcmVkKCpfX2ZpcnN0LCBfX3ZhbCk7ICsrX19maXJzdCkge30KKyAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0KSB7CisgICAgX0ludGVnZXIgX19uID0gX19jb3VudCAtIDE7CisgICAgX0ZvcndhcmRJdGVyIF9faSA9IF9fZmlyc3Q7CisgICAgKytfX2k7CisgICAgd2hpbGUgKF9faSAhPSBfX2xhc3QgJiYgX19uICE9IDAgJiYgX19wcmVkKCpfX2ksIF9fdmFsKSkgeworICAgICAgKytfX2k7CisgICAgICAtLV9fbjsKKyAgICB9CisgICAgaWYgKF9fbiA9PSAwKQorICAgICAgcmV0dXJuIF9fZmlyc3Q7CisgICAgZWxzZSBpZiAoX19pICE9IF9fbGFzdCkKKyAgICAgIGZvciAoX19maXJzdCA9ICsrX19pOyAoX19maXJzdCAhPSBfX2xhc3QpICYmICFfX3ByZWQoKl9fZmlyc3QsIF9fdmFsKTsgKytfX2ZpcnN0KSB7fQorICAgIGVsc2UKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBfX2xhc3Q7Cit9CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCisvLyBzZWFyY2hfbi4gIFNlYXJjaCBmb3IgX19jb3VudCBjb25zZWN1dGl2ZSBjb3BpZXMgb2YgX192YWwuCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfSW50ZWdlciwgY2xhc3MgX1RwPgorX0ZvcndhcmRJdGVyIHNlYXJjaF9uKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgIF9JbnRlZ2VyIF9fY291bnQsIGNvbnN0IF9UcCYgX192YWwpIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgIGlmIChfX2NvdW50IDw9IDApCisgICAgcmV0dXJuIF9fZmlyc3Q7CisgIGlmIChfX2NvdW50ID09IDEpCisgICAgLy9XZSB1c2UgZmluZCB3aGVuIF9fY291bnQgPT0gMSB0byB1c2UgcG90ZW50aWFsIGZpbmQgb3ZlcmxvYWQuCisgICAgcmV0dXJuIGZpbmQoX19maXJzdCwgX19sYXN0LCBfX3ZhbCk7CisgIHJldHVybiBfU1RMUF9QUklWIF9fc2VhcmNoX24oX19maXJzdCwgX19sYXN0LCBfX2NvdW50LCBfX3ZhbCwgZXF1YWxfdG88X1RwPigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX0RJU1RBTkNFX1RZUEUoX19maXJzdCwgX0ZvcndhcmRJdGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9JVEVSQVRPUl9DQVRFR09SWShfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX0ludGVnZXIsIGNsYXNzIF9UcCwgY2xhc3MgX0JpbmFyeVByZWQ+CitfRm9yd2FyZEl0ZXIgc2VhcmNoX24oX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgX0ludGVnZXIgX19jb3VudCwgY29uc3QgX1RwJiBfX3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICBfQmluYXJ5UHJlZCBfX2JpbmFyeV9wcmVkKSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICBpZiAoX19jb3VudCA8PSAwKQorICAgIHJldHVybiBfX2ZpcnN0OworICByZXR1cm4gX1NUTFBfUFJJViBfX3NlYXJjaF9uKF9fZmlyc3QsIF9fbGFzdCwgX19jb3VudCwgX192YWwsIF9fYmluYXJ5X3ByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfRElTVEFOQ0VfVFlQRShfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9fZmlyc3QsIF9Gb3J3YXJkSXRlcikpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyMSwgY2xhc3MgX0ZvcndhcmRJdGVyMj4KK19Gb3J3YXJkSXRlcjEKK2ZpbmRfZW5kKF9Gb3J3YXJkSXRlcjEgX19maXJzdDEsIF9Gb3J3YXJkSXRlcjEgX19sYXN0MSwKKyAgICAgICAgIF9Gb3J3YXJkSXRlcjIgX19maXJzdDIsIF9Gb3J3YXJkSXRlcjIgX19sYXN0MikgeworICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdDEsIF9fbGFzdDEpKQorICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdDIsIF9fbGFzdDIpKQorICByZXR1cm4gX1NUTFBfUFJJViBfX2ZpbmRfZW5kKF9fZmlyc3QxLCBfX2xhc3QxLCBfX2ZpcnN0MiwgX19sYXN0MiwKKyNpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9fZmlyc3QxLCBfRm9yd2FyZEl0ZXIxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9JVEVSQVRPUl9DQVRFR09SWShfX2ZpcnN0MiwgX0ZvcndhcmRJdGVyMiksCisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcndhcmRfaXRlcmF0b3JfdGFnKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yd2FyZF9pdGVyYXRvcl90YWcoKSwKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX19lcXVhbF90byhfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QxLCBfRm9yd2FyZEl0ZXIxKSkKKyAgICApOworfQorCisvLyB1bmlxdWUgYW5kIHVuaXF1ZV9jb3B5CitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvciwgY2xhc3MgX091dHB1dEl0ZXJhdG9yLCBjbGFzcyBfQmluYXJ5UHJlZGljYXRlLAorICAgICAgICAgIGNsYXNzIF9UcD4KK19TVExQX0lOTElORV9MT09QIF9PdXRwdXRJdGVyYXRvcgorX191bmlxdWVfY29weShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwKKyAgICAgICAgICAgICAgX0JpbmFyeVByZWRpY2F0ZSBfX2JpbmFyeV9wcmVkLCBfVHAqKSB7CisgIF9UcCBfX3ZhbCA9ICpfX2ZpcnN0OworICAqX19yZXN1bHQgPSBfX3ZhbDsKKyAgd2hpbGUgKCsrX19maXJzdCAhPSBfX2xhc3QpCisgICAgaWYgKCFfX2JpbmFyeV9wcmVkKF9fdmFsLCAqX19maXJzdCkpIHsKKyAgICAgIF9fdmFsID0gKl9fZmlyc3Q7CisgICAgICAqKytfX3Jlc3VsdCA9IF9fdmFsOworICAgIH0KKyAgcmV0dXJuICsrX19yZXN1bHQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfT3V0cHV0SXRlciwgY2xhc3MgX0JpbmFyeVByZWRpY2F0ZT4KK2lubGluZSBfT3V0cHV0SXRlcgorX191bmlxdWVfY29weShfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LF9PdXRwdXRJdGVyIF9fcmVzdWx0LAorICAgICAgICAgICAgICBfQmluYXJ5UHJlZGljYXRlIF9fYmluYXJ5X3ByZWQsIGNvbnN0IG91dHB1dF9pdGVyYXRvcl90YWcgJikgeworICByZXR1cm4gX191bmlxdWVfY29weShfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0LCBfX2JpbmFyeV9wcmVkLCBfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsIF9JbnB1dEl0ZXIpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX0JpbmFyeVByZWRpY2F0ZT4KK19TVExQX0lOTElORV9MT09QIF9Gb3J3YXJkSXRlcgorX191bmlxdWVfY29weShfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LCBfRm9yd2FyZEl0ZXIgX19yZXN1bHQsCisgICAgICAgICAgICAgIF9CaW5hcnlQcmVkaWNhdGUgX19iaW5hcnlfcHJlZCwgY29uc3QgZm9yd2FyZF9pdGVyYXRvcl90YWcgJikgeworICAqX19yZXN1bHQgPSAqX19maXJzdDsKKyAgd2hpbGUgKCsrX19maXJzdCAhPSBfX2xhc3QpCisgICAgaWYgKCFfX2JpbmFyeV9wcmVkKCpfX3Jlc3VsdCwgKl9fZmlyc3QpKSAqKytfX3Jlc3VsdCA9ICpfX2ZpcnN0OworICByZXR1cm4gKytfX3Jlc3VsdDsKK30KKworI2lmIGRlZmluZWQgKF9TVExQX05PTlRFTVBMX0JBU0VfTUFUQ0hfQlVHKQordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yLCBjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCBjbGFzcyBfQmluYXJ5UHJlZGljYXRlPgoraW5saW5lIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IKK19fdW5pcXVlX2NvcHkoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fcmVzdWx0LCBfQmluYXJ5UHJlZGljYXRlIF9fYmluYXJ5X3ByZWQsCisgICAgICAgICAgICAgIGNvbnN0IGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnICYpIHsKKyAgcmV0dXJuIF9fdW5pcXVlX2NvcHkoX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdCwgX19iaW5hcnlfcHJlZCwgZm9yd2FyZF9pdGVyYXRvcl90YWcoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvciwgY2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBjbGFzcyBfQmluYXJ5UHJlZGljYXRlPgoraW5saW5lIF9SYW5kb21BY2Nlc3NJdGVyYXRvcgorX191bmlxdWVfY29weShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX3Jlc3VsdCwgX0JpbmFyeVByZWRpY2F0ZSBfX2JpbmFyeV9wcmVkLAorICAgICAgICAgICAgICBjb25zdCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyAmKSB7CisgIHJldHVybiBfX3VuaXF1ZV9jb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQsIF9fYmluYXJ5X3ByZWQsIGZvcndhcmRfaXRlcmF0b3JfdGFnKCkpOworfQorI2VuZGlmIC8qIF9TVExQX05PTlRFTVBMX0JBU0VfTUFUQ0hfQlVHICovCisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX091dHB1dEl0ZXI+CitfT3V0cHV0SXRlcgordW5pcXVlX2NvcHkoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwgX091dHB1dEl0ZXIgX19yZXN1bHQpIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkgcmV0dXJuIF9fcmVzdWx0OworICByZXR1cm4gX1NUTFBfUFJJViBfX3VuaXF1ZV9jb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfX2VxdWFsX3RvKF9TVExQX1ZBTFVFX1RZUEUoX19maXJzdCwgX0lucHV0SXRlcikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9fcmVzdWx0LCBfT3V0cHV0SXRlcikpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX091dHB1dEl0ZXIsIGNsYXNzIF9CaW5hcnlQcmVkaWNhdGU+CitfT3V0cHV0SXRlcgordW5pcXVlX2NvcHkoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCxfT3V0cHV0SXRlciBfX3Jlc3VsdCwKKyAgICAgICAgICAgIF9CaW5hcnlQcmVkaWNhdGUgX19iaW5hcnlfcHJlZCkgeworICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKKyAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KSByZXR1cm4gX19yZXN1bHQ7CisgIHJldHVybiBfU1RMUF9QUklWIF9fdW5pcXVlX2NvcHkoX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdCwgX19iaW5hcnlfcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9JVEVSQVRPUl9DQVRFR09SWShfX3Jlc3VsdCwgX091dHB1dEl0ZXIpKTsKK30KKworLy8gcm90YXRlIGFuZCByb3RhdGVfY29weSwgYW5kIHRoZWlyIGF1eGlsaWFyeSBmdW5jdGlvbnMKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX0Rpc3RhbmNlPgorX0ZvcndhcmRJdGVyIF9fcm90YXRlX2F1eChfRm9yd2FyZEl0ZXIgX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyIF9fbWlkZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBfRGlzdGFuY2UqLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3J3YXJkX2l0ZXJhdG9yX3RhZyAmKSB7CisgIGlmIChfX2ZpcnN0ID09IF9fbWlkZGxlKQorICAgIHJldHVybiBfX2xhc3Q7CisgIGlmIChfX2xhc3QgID09IF9fbWlkZGxlKQorICAgIHJldHVybiBfX2ZpcnN0OworCisgIF9Gb3J3YXJkSXRlciBfX2ZpcnN0MiA9IF9fbWlkZGxlOworICBkbyB7CisgICAgc3dhcCgqX19maXJzdCsrLCAqX19maXJzdDIrKyk7CisgICAgaWYgKF9fZmlyc3QgPT0gX19taWRkbGUpCisgICAgICBfX21pZGRsZSA9IF9fZmlyc3QyOworICB9IHdoaWxlIChfX2ZpcnN0MiAhPSBfX2xhc3QpOworCisgIF9Gb3J3YXJkSXRlciBfX25ld19taWRkbGUgPSBfX2ZpcnN0OworCisgIF9fZmlyc3QyID0gX19taWRkbGU7CisKKyAgd2hpbGUgKF9fZmlyc3QyICE9IF9fbGFzdCkgeworICAgIHN3YXAgKCpfX2ZpcnN0KyssICpfX2ZpcnN0MisrKTsKKyAgICBpZiAoX19maXJzdCA9PSBfX21pZGRsZSkKKyAgICAgIF9fbWlkZGxlID0gX19maXJzdDI7CisgICAgZWxzZSBpZiAoX19maXJzdDIgPT0gX19sYXN0KQorICAgICAgX19maXJzdDIgPSBfX21pZGRsZTsKKyAgfQorCisgIHJldHVybiBfX25ld19taWRkbGU7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXIsIGNsYXNzIF9EaXN0YW5jZT4KK19CaWRpcmVjdGlvbmFsSXRlciBfX3JvdGF0ZV9hdXgoX0JpZGlyZWN0aW9uYWxJdGVyIF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlciBfX21pZGRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0Rpc3RhbmNlKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcgJikgeworICBpZiAoX19maXJzdCA9PSBfX21pZGRsZSkKKyAgICByZXR1cm4gX19sYXN0OworICBpZiAoX19sYXN0ICA9PSBfX21pZGRsZSkKKyAgICByZXR1cm4gX19maXJzdDsKKworICBfX3JldmVyc2UoX19maXJzdCwgIF9fbWlkZGxlLCBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZygpKTsKKyAgX19yZXZlcnNlKF9fbWlkZGxlLCBfX2xhc3QsICAgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcoKSk7CisKKyAgd2hpbGUgKF9fZmlyc3QgIT0gX19taWRkbGUgJiYgX19taWRkbGUgIT0gX19sYXN0KQorICAgIHN3YXAgKCpfX2ZpcnN0KyssICotLV9fbGFzdCk7CisKKyAgaWYgKF9fZmlyc3QgPT0gX19taWRkbGUpIHsKKyAgICBfX3JldmVyc2UoX19taWRkbGUsIF9fbGFzdCwgICBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZygpKTsKKyAgICByZXR1cm4gX19sYXN0OworICB9CisgIGVsc2UgeworICAgIF9fcmV2ZXJzZShfX2ZpcnN0LCAgX19taWRkbGUsIGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnKCkpOworICAgIHJldHVybiBfX2ZpcnN0OworICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX0Rpc3RhbmNlLCBjbGFzcyBfVHA+CitfUmFuZG9tQWNjZXNzSXRlciBfX3JvdGF0ZV9hdXgoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX21pZGRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0Rpc3RhbmNlICosIF9UcCAqKSB7CisKKyAgX0Rpc3RhbmNlIF9fbiA9IF9fbGFzdCAgIC0gX19maXJzdDsKKyAgX0Rpc3RhbmNlIF9fayA9IF9fbWlkZGxlIC0gX19maXJzdDsKKyAgX0Rpc3RhbmNlIF9fbCA9IF9fbiAtIF9fazsKKyAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19yZXN1bHQgPSBfX2ZpcnN0ICsgKF9fbGFzdCAtIF9fbWlkZGxlKTsKKworICBpZiAoX19rID09IDApICAvKiBfX2ZpcnN0ID09IG1pZGRsZSAqLworICAgIHJldHVybiBfX2xhc3Q7CisKKyAgaWYgKF9fayA9PSBfX2wpIHsKKyAgICBzd2FwX3JhbmdlcyhfX2ZpcnN0LCBfX21pZGRsZSwgX19taWRkbGUpOworICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgfQorCisgIF9EaXN0YW5jZSBfX2QgPSBfX2djZChfX24sIF9fayk7CisKKyAgZm9yIChfRGlzdGFuY2UgX19pID0gMDsgX19pIDwgX19kOyBfX2krKykgeworICAgIF9UcCBfX3RtcCA9ICpfX2ZpcnN0OworICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fcCA9IF9fZmlyc3Q7CisKKyAgICBpZiAoX19rIDwgX19sKSB7CisgICAgICBmb3IgKF9EaXN0YW5jZSBfX2ogPSAwOyBfX2ogPCBfX2wvX19kOyBfX2orKykgeworICAgICAgICBpZiAoX19wID4gX19maXJzdCArIF9fbCkgeworICAgICAgICAgICpfX3AgPSAqKF9fcCAtIF9fbCk7CisgICAgICAgICAgX19wIC09IF9fbDsKKyAgICAgICAgfQorCisgICAgICAgICpfX3AgPSAqKF9fcCArIF9fayk7CisgICAgICAgIF9fcCArPSBfX2s7CisgICAgICB9CisgICAgfQorCisgICAgZWxzZSB7CisgICAgICBmb3IgKF9EaXN0YW5jZSBfX2ogPSAwOyBfX2ogPCBfX2svX19kIC0gMTsgX19qICsrKSB7CisgICAgICAgIGlmIChfX3AgPCBfX2xhc3QgLSBfX2spIHsKKyAgICAgICAgICAqX19wID0gKihfX3AgKyBfX2spOworICAgICAgICAgIF9fcCArPSBfX2s7CisgICAgICAgIH0KKworICAgICAgICAqX19wID0gKiAoX19wIC0gX19sKTsKKyAgICAgICAgX19wIC09IF9fbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAqX19wID0gX190bXA7CisgICAgKytfX2ZpcnN0OworICB9CisKKyAgcmV0dXJuIF9fcmVzdWx0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9EaXN0YW5jZT4KK2lubGluZSBfUmFuZG9tQWNjZXNzSXRlcgorX19yb3RhdGVfYXV4KF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyIF9fbWlkZGxlLCBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsCisgICAgICAgICAgICAgX0Rpc3RhbmNlICogX19kaXMsIGNvbnN0IHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnICYpIHsKKyAgcmV0dXJuIF9fcm90YXRlX2F1eChfX2ZpcnN0LCBfX21pZGRsZSwgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgIF9fZGlzLCBfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXI+CitfRm9yd2FyZEl0ZXIKK19fcm90YXRlKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19taWRkbGUsIF9Gb3J3YXJkSXRlciBfX2xhc3QpIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX21pZGRsZSkpCisgIF9TVExQX0RFQlVHX0NIRUNLKF9fY2hlY2tfcmFuZ2UoX19taWRkbGUsIF9fbGFzdCkpCisgIHJldHVybiBfX3JvdGF0ZV9hdXgoX19maXJzdCwgX19taWRkbGUsIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9ESVNUQU5DRV9UWVBFKF9fZmlyc3QsIF9Gb3J3YXJkSXRlciksCisgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfSVRFUkFUT1JfQ0FURUdPUlkoX19maXJzdCwgX0ZvcndhcmRJdGVyKSk7Cit9CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyPgordm9pZCByb3RhdGUoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX21pZGRsZSwgX0ZvcndhcmRJdGVyIF9fbGFzdCkgeworICBfU1RMUF9QUklWIF9fcm90YXRlKF9fZmlyc3QsIF9fbWlkZGxlLCBfX2xhc3QpOworfQorCisvLyBSZXR1cm4gYSByYW5kb20gbnVtYmVyIGluIHRoZSByYW5nZSBbMCwgX19uKS4gIFRoaXMgZnVuY3Rpb24gZW5jYXBzdWxhdGVzCisvLyB3aGV0aGVyIHdlJ3JlIHVzaW5nIHJhbmQgKHBhcnQgb2YgdGhlIHN0YW5kYXJkIEMgbGlicmFyeSkgb3IgbHJhbmQ0OAorLy8gKG5vdCBzdGFuZGFyZCwgYnV0IGEgbXVjaCBiZXR0ZXIgY2hvaWNlIHdoZW5ldmVyIGl0J3MgYXZhaWxhYmxlKS4KK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9EaXN0YW5jZT4KK2lubGluZSBfRGlzdGFuY2UgX19yYW5kb21fbnVtYmVyKF9EaXN0YW5jZSBfX24pIHsKKyNpZmRlZiBfU1RMUF9OT19EUkFORDQ4CisgIHJldHVybiByYW5kKCkgJSBfX247CisjZWxzZQorICByZXR1cm4gbHJhbmQ0OCgpICUgX19uOworI2VuZGlmCit9CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXI+Cit2b2lkIHJhbmRvbV9zaHVmZmxlKF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCkgeworICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKKyAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KSByZXR1cm47CisgIGZvciAoX1JhbmRvbUFjY2Vzc0l0ZXIgX19pID0gX19maXJzdCArIDE7IF9faSAhPSBfX2xhc3Q7ICsrX19pKQorICAgIGl0ZXJfc3dhcChfX2ksIF9fZmlyc3QgKyBfU1RMUF9QUklWIF9fcmFuZG9tX251bWJlcigoX19pIC0gX19maXJzdCkgKyAxKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX1JhbmRvbU51bWJlckdlbmVyYXRvcj4KK3ZvaWQgcmFuZG9tX3NodWZmbGUoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICBfUmFuZG9tTnVtYmVyR2VuZXJhdG9yICZfX3JhbmQpIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkgcmV0dXJuOworICBmb3IgKF9SYW5kb21BY2Nlc3NJdGVyIF9faSA9IF9fZmlyc3QgKyAxOyBfX2kgIT0gX19sYXN0OyArK19faSkKKyAgICBpdGVyX3N3YXAoX19pLCBfX2ZpcnN0ICsgX19yYW5kKChfX2kgLSBfX2ZpcnN0KSArIDEpKTsKK30KKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKQorLy8gcmFuZG9tX3NhbXBsZSBhbmQgcmFuZG9tX3NhbXBsZV9uIChleHRlbnNpb25zLCBub3QgcGFydCBvZiB0aGUgc3RhbmRhcmQpLgordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX091dHB1dEl0ZXIsIGNsYXNzIF9EaXN0YW5jZT4KK19PdXRwdXRJdGVyIHJhbmRvbV9zYW1wbGVfbihfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlciBfX291dF9pdGUsIGNvbnN0IF9EaXN0YW5jZSBfX24pIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgIF9EaXN0YW5jZSBfX3JlbWFpbmluZyA9IGRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7CisgIF9EaXN0YW5jZSBfX20gPSAobWluKSAoX19uLCBfX3JlbWFpbmluZyk7CisKKyAgd2hpbGUgKF9fbSA+IDApIHsKKyAgICBpZiAoX1NUTFBfUFJJViBfX3JhbmRvbV9udW1iZXIoX19yZW1haW5pbmcpIDwgX19tKSB7CisgICAgICAqX19vdXRfaXRlID0gKl9fZmlyc3Q7CisgICAgICArK19fb3V0X2l0ZTsKKyAgICAgIC0tX19tOworICAgIH0KKworICAgIC0tX19yZW1haW5pbmc7CisgICAgKytfX2ZpcnN0OworICB9CisgIHJldHVybiBfX291dF9pdGU7Cit9CisKKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX091dHB1dEl0ZXIsIGNsYXNzIF9EaXN0YW5jZSwKKyAgICAgICAgICBjbGFzcyBfUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorX091dHB1dEl0ZXIgcmFuZG9tX3NhbXBsZV9uKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyIF9fb3V0X2l0ZSwgY29uc3QgX0Rpc3RhbmNlIF9fbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3JhbmQpIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgIF9EaXN0YW5jZSBfX3JlbWFpbmluZyA9IGRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7CisgIF9EaXN0YW5jZSBfX20gPSAobWluKSAoX19uLCBfX3JlbWFpbmluZyk7CisKKyAgd2hpbGUgKF9fbSA+IDApIHsKKyAgICBpZiAoX19yYW5kKF9fcmVtYWluaW5nKSA8IF9fbSkgeworICAgICAgKl9fb3V0X2l0ZSA9ICpfX2ZpcnN0OworICAgICAgKytfX291dF9pdGU7CisgICAgICAtLV9fbTsKKyAgICB9CisKKyAgICAtLV9fcmVtYWluaW5nOworICAgICsrX19maXJzdDsKKyAgfQorICByZXR1cm4gX19vdXRfaXRlOworfQorCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX0Rpc3RhbmNlPgorX1JhbmRvbUFjY2Vzc0l0ZXIgX19yYW5kb21fc2FtcGxlKF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19vdXRfaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9EaXN0YW5jZSBfX24pIHsKKyAgX0Rpc3RhbmNlIF9fbSA9IDA7CisgIF9EaXN0YW5jZSBfX3QgPSBfX247CisgIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3QgJiYgX19tIDwgX19uOyArK19fbSwgKytfX2ZpcnN0KQorICAgIF9fb3V0X2l0ZVtfX21dID0gKl9fZmlyc3Q7CisKKyAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0KSB7CisgICAgKytfX3Q7CisgICAgX0Rpc3RhbmNlIF9fTSA9IF9fcmFuZG9tX251bWJlcihfX3QpOworICAgIGlmIChfX00gPCBfX24pCisgICAgICBfX291dF9pdGVbX19NXSA9ICpfX2ZpcnN0OworICAgICsrX19maXJzdDsKKyAgfQorCisgIHJldHVybiBfX291dF9pdGUgKyBfX207Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwKKyAgICAgICAgICBjbGFzcyBfUmFuZG9tTnVtYmVyR2VuZXJhdG9yLCBjbGFzcyBfRGlzdGFuY2U+CitfUmFuZG9tQWNjZXNzSXRlciBfX3JhbmRvbV9zYW1wbGUoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX291dF9pdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JhbmRvbU51bWJlckdlbmVyYXRvciYgX19yYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9EaXN0YW5jZSBfX24pIHsKKyAgX0Rpc3RhbmNlIF9fbSA9IDA7CisgIF9EaXN0YW5jZSBfX3QgPSBfX247CisgIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3QgJiYgX19tIDwgX19uOyArK19fbSwgKytfX2ZpcnN0KQorICAgIF9fb3V0X2l0ZVtfX21dID0gKl9fZmlyc3Q7CisKKyAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0KSB7CisgICAgKytfX3Q7CisgICAgX0Rpc3RhbmNlIF9fTSA9IF9fcmFuZChfX3QpOworICAgIGlmIChfX00gPCBfX24pCisgICAgICBfX291dF9pdGVbX19NXSA9ICpfX2ZpcnN0OworICAgICsrX19maXJzdDsKKyAgfQorCisgIHJldHVybiBfX291dF9pdGUgKyBfX207Cit9CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXI+CitfUmFuZG9tQWNjZXNzSXRlcgorcmFuZG9tX3NhbXBsZShfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX291dF9maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIgX19vdXRfbGFzdCkgeworICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fb3V0X2ZpcnN0LCBfX291dF9sYXN0KSkKKyAgcmV0dXJuIF9TVExQX1BSSVYgX19yYW5kb21fc2FtcGxlKF9fZmlyc3QsIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fb3V0X2ZpcnN0LCBfX291dF9sYXN0IC0gX19vdXRfZmlyc3QpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9SYW5kb21OdW1iZXJHZW5lcmF0b3I+CitfUmFuZG9tQWNjZXNzSXRlcgorcmFuZG9tX3NhbXBsZShfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX291dF9maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIgX19vdXRfbGFzdCwKKyAgICAgICAgICAgICAgX1JhbmRvbU51bWJlckdlbmVyYXRvciYgX19yYW5kKSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19vdXRfZmlyc3QsIF9fb3V0X2xhc3QpKQorICByZXR1cm4gX1NUTFBfUFJJViBfX3JhbmRvbV9zYW1wbGUoX19maXJzdCwgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19vdXRfZmlyc3QsIF9fcmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fb3V0X2xhc3QgLSBfX291dF9maXJzdCk7Cit9CisKKyNlbmRpZiAvKiBfU1RMUF9OT19FWFRFTlNJT05TICovCisKKy8vIHBhcnRpdGlvbiwgc3RhYmxlX3BhcnRpdGlvbiwgYW5kIHRoZWlyIGF1eGlsaWFyeSBmdW5jdGlvbnMKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1ByZWRpY2F0ZT4KK19TVExQX0lOTElORV9MT09QIF9Gb3J3YXJkSXRlciBfX3BhcnRpdGlvbihfRm9yd2FyZEl0ZXIgX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QcmVkaWNhdGUgICBfX3ByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9yd2FyZF9pdGVyYXRvcl90YWcgJikgeworICBpZiAoX19maXJzdCA9PSBfX2xhc3QpIHJldHVybiBfX2ZpcnN0OworCisgIHdoaWxlIChfX3ByZWQoKl9fZmlyc3QpKQorICAgIGlmICgrK19fZmlyc3QgPT0gX19sYXN0KSByZXR1cm4gX19maXJzdDsKKworICBfRm9yd2FyZEl0ZXIgX19uZXh0ID0gX19maXJzdDsKKworICB3aGlsZSAoKytfX25leHQgIT0gX19sYXN0KSB7CisgICAgaWYgKF9fcHJlZCgqX19uZXh0KSkgeworICAgICAgc3dhcCgqX19maXJzdCwgKl9fbmV4dCk7CisgICAgICArK19fZmlyc3Q7CisgICAgfQorICB9CisgIHJldHVybiBfX2ZpcnN0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyLCBjbGFzcyBfUHJlZGljYXRlPgorX1NUTFBfSU5MSU5FX0xPT1AgX0JpZGlyZWN0aW9uYWxJdGVyIF9fcGFydGl0aW9uKF9CaWRpcmVjdGlvbmFsSXRlciBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1ByZWRpY2F0ZSBfX3ByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcgJikgeworICBmb3IgKDs7KSB7CisgICAgZm9yICg7OykgeworICAgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorICAgICAgICByZXR1cm4gX19maXJzdDsKKyAgICAgIGVsc2UgaWYgKF9fcHJlZCgqX19maXJzdCkpCisgICAgICAgICsrX19maXJzdDsKKyAgICAgIGVsc2UKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIC0tX19sYXN0OworICAgIGZvciAoOzspIHsKKyAgICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKyAgICAgICAgcmV0dXJuIF9fZmlyc3Q7CisgICAgICBlbHNlIGlmICghX19wcmVkKCpfX2xhc3QpKQorICAgICAgICAtLV9fbGFzdDsKKyAgICAgIGVsc2UKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGl0ZXJfc3dhcChfX2ZpcnN0LCBfX2xhc3QpOworICAgICsrX19maXJzdDsKKyAgfQorfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfTk9OVEVNUExfQkFTRV9NQVRDSF9CVUcpCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyLCBjbGFzcyBfUHJlZGljYXRlPgoraW5saW5lCitfQmlkaXJlY3Rpb25hbEl0ZXIgX19wYXJ0aXRpb24oX0JpZGlyZWN0aW9uYWxJdGVyIF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHJlZGljYXRlIF9fcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyAmKSB7CisgIHJldHVybiBfX3BhcnRpdGlvbihfX2ZpcnN0LCBfX2xhc3QsIF9fcHJlZCwgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcoKSk7Cit9CisjZW5kaWYKKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9QcmVkaWNhdGU+CitfRm9yd2FyZEl0ZXIgcGFydGl0aW9uKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LCBfUHJlZGljYXRlICAgX19wcmVkKSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICByZXR1cm4gX1NUTFBfUFJJViBfX3BhcnRpdGlvbihfX2ZpcnN0LCBfX2xhc3QsIF9fcHJlZCwgX1NUTFBfSVRFUkFUT1JfQ0FURUdPUlkoX19maXJzdCwgX0ZvcndhcmRJdGVyKSk7Cit9CisKKworLyogX19wcmVkX29mX2ZpcnN0OiBmYWxzZSBpZiB3ZSBrbm93IHRoYXQgX19wcmVkKCpfX2ZpcnN0KSBpcyBmYWxzZSwKKyAqICAgICAgICAgICAgICAgICAgdHJ1ZSB3aGVuIHdlIGRvbid0IGtub3cgdGhlIHJlc3VsdCBvZiBfX3ByZWQoKl9fZmlyc3QpLgorICogX19ub3RfcHJlZF9vZl9iZWZvcmVfbGFzdDogdHJ1ZSBpZiB3ZSBrbm93IHRoYXQgX19wcmVkKCotLV9fbGFzdCkgaXMgdHJ1ZSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIHdoZW4gd2UgZG9uJ3Qga25vdyB0aGUgcmVzdWx0IG9mIF9fcHJlZCgqLS1fX2xhc3QpLgorICovCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9QcmVkaWNhdGUsIGNsYXNzIF9EaXN0YW5jZT4KK19Gb3J3YXJkSXRlciBfX2lucGxhY2Vfc3RhYmxlX3BhcnRpdGlvbihfRm9yd2FyZEl0ZXIgX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QcmVkaWNhdGUgX19wcmVkLCBfRGlzdGFuY2UgX19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBfX3ByZWRfb2ZfZmlyc3QsIGJvb2wgX19wcmVkX29mX2JlZm9yZV9sYXN0KSB7CisgIGlmIChfX2xlbiA9PSAxKQorICAgIHJldHVybiAoX19wcmVkX29mX2ZpcnN0ICYmIChfX3ByZWRfb2ZfYmVmb3JlX2xhc3QgfHwgX19wcmVkKCpfX2ZpcnN0KSkpID8gX19sYXN0IDogX19maXJzdDsKKyAgX0ZvcndhcmRJdGVyIF9fbWlkZGxlID0gX19maXJzdDsKKyAgX0Rpc3RhbmNlIF9faGFsZl9sZW4gPSBfX2xlbiAvIDI7CisgIGFkdmFuY2UoX19taWRkbGUsIF9faGFsZl9sZW4pOworICByZXR1cm4gX19yb3RhdGUoX19pbnBsYWNlX3N0YWJsZV9wYXJ0aXRpb24oX19maXJzdCwgX19taWRkbGUsIF9fcHJlZCwgX19oYWxmX2xlbiwgX19wcmVkX29mX2ZpcnN0LCBmYWxzZSksCisgICAgICAgICAgICAgICAgICBfX21pZGRsZSwKKyAgICAgICAgICAgICAgICAgIF9faW5wbGFjZV9zdGFibGVfcGFydGl0aW9uKF9fbWlkZGxlLCBfX2xhc3QsIF9fcHJlZCwgX19sZW4gLSBfX2hhbGZfbGVuLCB0cnVlLCBfX3ByZWRfb2ZfYmVmb3JlX2xhc3QpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1BvaW50ZXIsIGNsYXNzIF9QcmVkaWNhdGUsCisgICAgICAgICAgY2xhc3MgX0Rpc3RhbmNlPgorX0ZvcndhcmRJdGVyIF9fc3RhYmxlX3BhcnRpdGlvbl9hZGFwdGl2ZShfRm9yd2FyZEl0ZXIgX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1ByZWRpY2F0ZSBfX3ByZWQsIF9EaXN0YW5jZSBfX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1BvaW50ZXIgX19idWZmZXIsIF9EaXN0YW5jZSBfX2J1ZmZlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIF9fcHJlZF9vZl9maXJzdCwgYm9vbCBfX3ByZWRfb2ZfYmVmb3JlX2xhc3QpIHsKKyAgaWYgKF9fbGVuIDw9IF9fYnVmZmVyX3NpemUpIHsKKyAgICBfRm9yd2FyZEl0ZXIgX19yZXN1bHQxID0gX19maXJzdDsKKyAgICBfUG9pbnRlciBfX3Jlc3VsdDIgPSBfX2J1ZmZlcjsKKyAgICBpZiAoKF9fZmlyc3QgIT0gX19sYXN0KSAmJiAoIV9fcHJlZF9vZl9maXJzdCB8fCBfX3ByZWQoKl9fZmlyc3QpKSkgeworICAgICAgKl9fcmVzdWx0MiA9ICpfX2ZpcnN0OworICAgICAgKytfX3Jlc3VsdDI7ICsrX19maXJzdDsgLS1fX2xlbjsKKyAgICB9CisgICAgZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0IDsgKytfX2ZpcnN0LCAtLV9fbGVuKSB7CisgICAgICBpZiAoKChfX2xlbiA9PSAxKSAmJiAoX19wcmVkX29mX2JlZm9yZV9sYXN0IHx8IF9fcHJlZCgqX19maXJzdCkpKSB8fAorICAgICAgICAgICgoX19sZW4gIT0gMSkgJiYgX19wcmVkKCpfX2ZpcnN0KSkpeworICAgICAgICAqX19yZXN1bHQxID0gKl9fZmlyc3Q7CisgICAgICAgICsrX19yZXN1bHQxOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgICpfX3Jlc3VsdDIgPSAqX19maXJzdDsKKyAgICAgICAgKytfX3Jlc3VsdDI7CisgICAgICB9CisgICAgfQorICAgIGNvcHkoX19idWZmZXIsIF9fcmVzdWx0MiwgX19yZXN1bHQxKTsKKyAgICByZXR1cm4gX19yZXN1bHQxOworICB9CisgIGVsc2UgeworICAgIF9Gb3J3YXJkSXRlciBfX21pZGRsZSA9IF9fZmlyc3Q7CisgICAgX0Rpc3RhbmNlIF9faGFsZl9sZW4gPSBfX2xlbiAvIDI7CisgICAgYWR2YW5jZShfX21pZGRsZSwgX19oYWxmX2xlbik7CisgICAgcmV0dXJuIF9fcm90YXRlKF9fc3RhYmxlX3BhcnRpdGlvbl9hZGFwdGl2ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX19maXJzdCwgX19taWRkbGUsIF9fcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX19oYWxmX2xlbiwgX19idWZmZXIsIF9fYnVmZmVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcHJlZF9vZl9maXJzdCwgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICBfX21pZGRsZSwKKyAgICAgICAgICAgICAgICAgICAgX19zdGFibGVfcGFydGl0aW9uX2FkYXB0aXZlKAorICAgICAgICAgICAgICAgICAgICAgICAgICBfX21pZGRsZSwgX19sYXN0LCBfX3ByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbGVuIC0gX19oYWxmX2xlbiwgX19idWZmZXIsIF9fYnVmZmVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIF9fcHJlZF9vZl9iZWZvcmVfbGFzdCkpOworICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9QcmVkaWNhdGUsIGNsYXNzIF9UcCwgY2xhc3MgX0Rpc3RhbmNlPgoraW5saW5lIF9Gb3J3YXJkSXRlcgorX19zdGFibGVfcGFydGl0aW9uX2F1eF9hdXgoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHJlZGljYXRlIF9fcHJlZCwgX1RwKiwgX0Rpc3RhbmNlKiwgYm9vbCBfX3ByZWRfb2ZfYmVmb3JlX2xhc3QgPSBmYWxzZSkgeworICBfVGVtcG9yYXJ5X2J1ZmZlcjxfRm9yd2FyZEl0ZXIsIF9UcD4gX19idWYoX19maXJzdCwgX19sYXN0KTsKKyAgX1NUTFBfTVBXRklYX1RSWSAgICAvLypUWSAwNi8wMS8yMDAwIC0gdGhleSBmb3JnZXQgdG8gY2FsbCBkdG9yIGZvciBfVGVtcG9yYXJ5X2J1ZmZlciBpZiBubyB0cnkvY2F0Y2ggYmxvY2sgaXMgcHJlc2VudAorICByZXR1cm4gKF9fYnVmLnNpemUoKSA+IDApID8KKyAgICBfX3N0YWJsZV9wYXJ0aXRpb25fYWRhcHRpdmUoX19maXJzdCwgX19sYXN0LCBfX3ByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EaXN0YW5jZShfX2J1Zi5yZXF1ZXN0ZWRfc2l6ZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19idWYuYmVnaW4oKSwgX19idWYuc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgX19wcmVkX29mX2JlZm9yZV9sYXN0KSAgOgorICAgIF9faW5wbGFjZV9zdGFibGVfcGFydGl0aW9uKF9fZmlyc3QsIF9fbGFzdCwgX19wcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EaXN0YW5jZShfX2J1Zi5yZXF1ZXN0ZWRfc2l6ZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgX19wcmVkX29mX2JlZm9yZV9sYXN0KTsKKyAgX1NUTFBfTVBXRklYX0NBVENIICAvLypUWSAwNi8wMS8yMDAwIC0gdGhleSBmb3JnZXQgdG8gY2FsbCBkdG9yIGZvciBfVGVtcG9yYXJ5X2J1ZmZlciBpZiBubyB0cnkvY2F0Y2ggYmxvY2sgaXMgcHJlc2VudAorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfUHJlZGljYXRlPgorX0ZvcndhcmRJdGVyCitfX3N0YWJsZV9wYXJ0aXRpb25fYXV4KF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LCBfUHJlZGljYXRlIF9fcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9yd2FyZF9pdGVyYXRvcl90YWcgJikgeworICByZXR1cm4gX19zdGFibGVfcGFydGl0aW9uX2F1eF9hdXgoX19maXJzdCwgX19sYXN0LCBfX3ByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsIF9Gb3J3YXJkSXRlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9ESVNUQU5DRV9UWVBFKF9fZmlyc3QsIF9Gb3J3YXJkSXRlcikpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0SXRlciwgY2xhc3MgX1ByZWRpY2F0ZT4KK19CaWRpcmVjdEl0ZXIKK19fc3RhYmxlX3BhcnRpdGlvbl9hdXgoX0JpZGlyZWN0SXRlciBfX2ZpcnN0LCBfQmlkaXJlY3RJdGVyIF9fbGFzdCwgX1ByZWRpY2F0ZSBfX3ByZWQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnICYpIHsKKyAgZm9yICgtLV9fbGFzdDs7KSB7CisgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorICAgICAgcmV0dXJuIF9fZmlyc3Q7CisgICAgZWxzZSBpZiAoIV9fcHJlZCgqX19sYXN0KSkKKyAgICAgIC0tX19sYXN0OworICAgIGVsc2UKKyAgICAgIGJyZWFrOworICB9CisgICsrX19sYXN0OworICAvL0hlcmUgd2Uga25vdyB0aGF0IF9fcHJlZCgqLS1fX2xhc3QpIGlzIHRydWUKKyAgcmV0dXJuIF9fc3RhYmxlX3BhcnRpdGlvbl9hdXhfYXV4KF9fZmlyc3QsIF9fbGFzdCwgX19wcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfVkFMVUVfVFlQRShfX2ZpcnN0LCBfQmlkaXJlY3RJdGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX0RJU1RBTkNFX1RZUEUoX19maXJzdCwgX0JpZGlyZWN0SXRlciksIHRydWUpOworfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfTk9OVEVNUExfQkFTRV9NQVRDSF9CVUcpCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0SXRlciwgY2xhc3MgX1ByZWRpY2F0ZT4KK19CaWRpcmVjdEl0ZXIKK19fc3RhYmxlX3BhcnRpdGlvbl9hdXgoX0JpZGlyZWN0SXRlciBfX2ZpcnN0LCBfQmlkaXJlY3RJdGVyIF9fbGFzdCwgX1ByZWRpY2F0ZSBfX3ByZWQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnICYpIHsKKyAgcmV0dXJuIF9fc3RhYmxlX3BhcnRpdGlvbl9hdXgoX19maXJzdCwgX19sYXN0LCBfX3ByZWQsIGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnKCkpOworfQorI2VuZGlmCisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfUHJlZGljYXRlPgorX0ZvcndhcmRJdGVyCitzdGFibGVfcGFydGl0aW9uKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LCBfUHJlZGljYXRlIF9fcHJlZCkgeworICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKKyAgZm9yICg7OykgeworICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKyAgICAgIHJldHVybiBfX2ZpcnN0OworICAgIGVsc2UgaWYgKF9fcHJlZCgqX19maXJzdCkpCisgICAgICArK19fZmlyc3Q7CisgICAgZWxzZQorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIF9TVExQX1BSSVYgX19zdGFibGVfcGFydGl0aW9uX2F1eChfX2ZpcnN0LCBfX2xhc3QsIF9fcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9JVEVSQVRPUl9DQVRFR09SWShfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIpKTsKK30KKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmU+CitfUmFuZG9tQWNjZXNzSXRlciBfX3VuZ3VhcmRlZF9wYXJ0aXRpb24oX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1RwIF9fcGl2b3QsIF9Db21wYXJlIF9fY29tcCkgeworICBmb3IgKDs7KSB7CisgICAgd2hpbGUgKF9fY29tcCgqX19maXJzdCwgX19waXZvdCkpIHsKKyAgICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFfX2NvbXAoX19waXZvdCwgKl9fZmlyc3QpLCBfU3RsTXNnX0lOVkFMSURfU1RSSUNUX1dFQUtfUFJFRElDQVRFKQorICAgICAgKytfX2ZpcnN0OworICAgIH0KKyAgICAtLV9fbGFzdDsKKyAgICB3aGlsZSAoX19jb21wKF9fcGl2b3QsICpfX2xhc3QpKSB7CisgICAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghX19jb21wKCpfX2xhc3QsIF9fcGl2b3QpLCBfU3RsTXNnX0lOVkFMSURfU1RSSUNUX1dFQUtfUFJFRElDQVRFKQorICAgICAgLS1fX2xhc3Q7CisgICAgfQorICAgIGlmICghKF9fZmlyc3QgPCBfX2xhc3QpKQorICAgICAgcmV0dXJuIF9fZmlyc3Q7CisgICAgaXRlcl9zd2FwKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgKytfX2ZpcnN0OworICB9Cit9CisKKy8vIHNvcnQoKSBhbmQgaXRzIGF1eGlsaWFyeSBmdW5jdGlvbnMuCisjZGVmaW5lIF9fc3RsX3RocmVzaG9sZCAgMTYKKwordGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyLCBjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlPgordm9pZCBfX3VuZ3VhcmRlZF9saW5lYXJfaW5zZXJ0KF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCwgX1RwIF9fdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Db21wYXJlIF9fY29tcCkgeworICBfUmFuZG9tQWNjZXNzSXRlciBfX25leHQgPSBfX2xhc3Q7CisgIC0tX19uZXh0OworICB3aGlsZSAoX19jb21wKF9fdmFsLCAqX19uZXh0KSkgeworICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFfX2NvbXAoKl9fbmV4dCwgX192YWwpLCBfU3RsTXNnX0lOVkFMSURfU1RSSUNUX1dFQUtfUFJFRElDQVRFKQorICAgICpfX2xhc3QgPSAqX19uZXh0OworICAgIF9fbGFzdCA9IF9fbmV4dDsKKyAgICAtLV9fbmV4dDsKKyAgfQorICAqX19sYXN0ID0gX192YWw7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZT4KK2lubGluZSB2b2lkIF9fbGluZWFyX2luc2VydChfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCwgX1RwIF9fdmFsLCBfQ29tcGFyZSBfX2NvbXApIHsKKyAgLy8qVFkgMTIvMjYvMTk5OCAtIGFkZGVkIF9fdmFsIGFzIGEgcGFyYW10ZXIKKyAgLy8gIF9UcCBfX3ZhbCA9ICpfX2xhc3Q7ICAgICAgICAvLypUWSAxMi8yNi8xOTk4IC0gX192YWwgc3VwcGxpZWQgYnkgY2FsbGVyCisgIGlmIChfX2NvbXAoX192YWwsICpfX2ZpcnN0KSkgeworICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFfX2NvbXAoKl9fZmlyc3QsIF9fdmFsKSwgX1N0bE1zZ19JTlZBTElEX1NUUklDVF9XRUFLX1BSRURJQ0FURSkKKyAgICBjb3B5X2JhY2t3YXJkKF9fZmlyc3QsIF9fbGFzdCwgX19sYXN0ICsgMSk7CisgICAgKl9fZmlyc3QgPSBfX3ZhbDsKKyAgfQorICBlbHNlCisgICAgX191bmd1YXJkZWRfbGluZWFyX2luc2VydChfX2xhc3QsIF9fdmFsLCBfX2NvbXApOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmU+Cit2b2lkIF9faW5zZXJ0aW9uX3NvcnQoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgX1RwICosIF9Db21wYXJlIF9fY29tcCkgeworICBpZiAoX19maXJzdCA9PSBfX2xhc3QpIHJldHVybjsKKyAgZm9yIChfUmFuZG9tQWNjZXNzSXRlciBfX2kgPSBfX2ZpcnN0ICsgMTsgX19pICE9IF9fbGFzdDsgKytfX2kpCisgICAgX19saW5lYXJfaW5zZXJ0PF9SYW5kb21BY2Nlc3NJdGVyLCBfVHAsIF9Db21wYXJlPihfX2ZpcnN0LCBfX2ksICpfX2ksIF9fY29tcCk7ICAvLypUWSAxMi8yNi8xOTk4IC0gc3VwcGx5ICpfX2kgYXMgX192YWwKK30KKwordGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyLCBjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlPgordm9pZCBfX3VuZ3VhcmRlZF9pbnNlcnRpb25fc29ydF9hdXgoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9UcCosIF9Db21wYXJlIF9fY29tcCkgeworICBmb3IgKF9SYW5kb21BY2Nlc3NJdGVyIF9faSA9IF9fZmlyc3Q7IF9faSAhPSBfX2xhc3Q7ICsrX19pKQorICAgIF9fdW5ndWFyZGVkX2xpbmVhcl9pbnNlcnQ8X1JhbmRvbUFjY2Vzc0l0ZXIsIF9UcCwgX0NvbXBhcmU+KF9faSwgKl9faSwgX19jb21wKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyLCBjbGFzcyBfQ29tcGFyZT4KK2lubGluZSB2b2lkIF9fdW5ndWFyZGVkX2luc2VydGlvbl9zb3J0KF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ29tcGFyZSBfX2NvbXApIHsKKyAgX191bmd1YXJkZWRfaW5zZXJ0aW9uX3NvcnRfYXV4KF9fZmlyc3QsIF9fbGFzdCwgX1NUTFBfVkFMVUVfVFlQRShfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlciksIF9fY29tcCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX0NvbXBhcmU+Cit2b2lkIF9fZmluYWxfaW5zZXJ0aW9uX3NvcnQoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsIF9Db21wYXJlIF9fY29tcCkgeworICBpZiAoX19sYXN0IC0gX19maXJzdCA+IF9fc3RsX3RocmVzaG9sZCkgeworICAgIF9faW5zZXJ0aW9uX3NvcnQoX19maXJzdCwgX19maXJzdCArIF9fc3RsX3RocmVzaG9sZCwgX1NUTFBfVkFMVUVfVFlQRShfX2ZpcnN0LF9SYW5kb21BY2Nlc3NJdGVyKSwgX19jb21wKTsKKyAgICBfX3VuZ3VhcmRlZF9pbnNlcnRpb25fc29ydChfX2ZpcnN0ICsgX19zdGxfdGhyZXNob2xkLCBfX2xhc3QsIF9fY29tcCk7CisgIH0KKyAgZWxzZQorICAgIF9faW5zZXJ0aW9uX3NvcnQoX19maXJzdCwgX19sYXN0LCBfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsX1JhbmRvbUFjY2Vzc0l0ZXIpLCBfX2NvbXApOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9UcCwgY2xhc3MgX1NpemUsIGNsYXNzIF9Db21wYXJlPgordm9pZCBfX2ludHJvc29ydF9sb29wKF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0LCBfVHAqLAorICAgICAgICAgICAgICAgICAgICAgIF9TaXplIF9fZGVwdGhfbGltaXQsIF9Db21wYXJlIF9fY29tcCkgeworICB3aGlsZSAoX19sYXN0IC0gX19maXJzdCA+IF9fc3RsX3RocmVzaG9sZCkgeworICAgIGlmIChfX2RlcHRoX2xpbWl0ID09IDApIHsKKyAgICAgIHBhcnRpYWxfc29ydChfX2ZpcnN0LCBfX2xhc3QsIF9fbGFzdCwgX19jb21wKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgLS1fX2RlcHRoX2xpbWl0OworICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fY3V0ID0KKyAgICAgIF9fdW5ndWFyZGVkX3BhcnRpdGlvbihfX2ZpcnN0LCBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1RwKF9fbWVkaWFuKCpfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKF9fZmlyc3QgKyAoX19sYXN0IC0gX19maXJzdCkvMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooX19sYXN0IC0gMSksIF9fY29tcCkpLAorICAgICAgIF9fY29tcCk7CisgICAgX19pbnRyb3NvcnRfbG9vcChfX2N1dCwgX19sYXN0LCAoX1RwKikgMCwgX19kZXB0aF9saW1pdCwgX19jb21wKTsKKyAgICBfX2xhc3QgPSBfX2N1dDsKKyAgfQorfQorCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyPgordm9pZCBzb3J0KF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCkgeworICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKKyAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KSB7CisgICAgX1NUTFBfUFJJViBfX2ludHJvc29ydF9sb29wKF9fZmlyc3QsIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfVkFMVUVfVFlQRShfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX19sZyhfX2xhc3QgLSBfX2ZpcnN0KSAqIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX19sZXNzKF9TVExQX1ZBTFVFX1RZUEUoX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIpKSk7CisgICAgX1NUTFBfUFJJViBfX2ZpbmFsX2luc2VydGlvbl9zb3J0KF9fZmlyc3QsIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfX2xlc3MoX1NUTFBfVkFMVUVfVFlQRShfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcikpKTsKKyAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9Db21wYXJlPgordm9pZCBzb3J0KF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCwgX0NvbXBhcmUgX19jb21wKSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICBpZiAoX19maXJzdCAhPSBfX2xhc3QpIHsKKyAgICBfU1RMUF9QUklWIF9faW50cm9zb3J0X2xvb3AoX19maXJzdCwgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfX2xnKF9fbGFzdCAtIF9fZmlyc3QpICogMiwgX19jb21wKTsKKyAgICBfU1RMUF9QUklWIF9fZmluYWxfaW5zZXJ0aW9uX3NvcnQoX19maXJzdCwgX19sYXN0LCBfX2NvbXApOworICB9Cit9CisKKy8vIHN0YWJsZV9zb3J0KCkgYW5kIGl0cyBhdXhpbGlhcnkgZnVuY3Rpb25zLgorX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9Db21wYXJlPgordm9pZCBfX2lucGxhY2Vfc3RhYmxlX3NvcnQoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCwgX0NvbXBhcmUgX19jb21wKSB7CisgIGlmIChfX2xhc3QgLSBfX2ZpcnN0IDwgMTUpIHsKKyAgICBfX2luc2VydGlvbl9zb3J0KF9fZmlyc3QsIF9fbGFzdCwgX1NUTFBfVkFMVUVfVFlQRShfX2ZpcnN0LF9SYW5kb21BY2Nlc3NJdGVyKSwgX19jb21wKTsKKyAgICByZXR1cm47CisgIH0KKyAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19taWRkbGUgPSBfX2ZpcnN0ICsgKF9fbGFzdCAtIF9fZmlyc3QpIC8gMjsKKyAgX19pbnBsYWNlX3N0YWJsZV9zb3J0KF9fZmlyc3QsIF9fbWlkZGxlLCBfX2NvbXApOworICBfX2lucGxhY2Vfc3RhYmxlX3NvcnQoX19taWRkbGUsIF9fbGFzdCwgX19jb21wKTsKKyAgX19tZXJnZV93aXRob3V0X2J1ZmZlcihfX2ZpcnN0LCBfX21pZGRsZSwgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIF9fbWlkZGxlIC0gX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfX2xhc3QgLSBfX21pZGRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfX2NvbXApOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIxLCBjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcjIsCisgICAgICAgICAgY2xhc3MgX0Rpc3RhbmNlLCBjbGFzcyBfQ29tcGFyZT4KK3ZvaWQgX19tZXJnZV9zb3J0X2xvb3AoX1JhbmRvbUFjY2Vzc0l0ZXIxIF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyMSBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyMiBfX3Jlc3VsdCwgX0Rpc3RhbmNlIF9fc3RlcF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICBfQ29tcGFyZSBfX2NvbXApIHsKKyAgX0Rpc3RhbmNlIF9fdHdvX3N0ZXAgPSAyICogX19zdGVwX3NpemU7CisKKyAgd2hpbGUgKF9fbGFzdCAtIF9fZmlyc3QgPj0gX190d29fc3RlcCkgeworICAgIF9fcmVzdWx0ID0gbWVyZ2UoX19maXJzdCwgX19maXJzdCArIF9fc3RlcF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgX19maXJzdCArIF9fc3RlcF9zaXplLCBfX2ZpcnN0ICsgX190d29fc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgIF9fcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgX19jb21wKTsKKyAgICBfX2ZpcnN0ICs9IF9fdHdvX3N0ZXA7CisgIH0KKyAgX19zdGVwX3NpemUgPSAobWluKSAoX0Rpc3RhbmNlKF9fbGFzdCAtIF9fZmlyc3QpLCBfX3N0ZXBfc2l6ZSk7CisKKyAgbWVyZ2UoX19maXJzdCwgX19maXJzdCArIF9fc3RlcF9zaXplLAorICAgICAgICBfX2ZpcnN0ICsgX19zdGVwX3NpemUsIF9fbGFzdCwKKyAgICAgICAgX19yZXN1bHQsCisgICAgICAgIF9fY29tcCk7Cit9CisKK2NvbnN0IGludCBfX3N0bF9jaHVua19zaXplID0gNzsKKwordGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyLCBjbGFzcyBfRGlzdGFuY2UsIGNsYXNzIF9Db21wYXJlPgordm9pZCBfX2NodW5rX2luc2VydGlvbl9zb3J0KF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EaXN0YW5jZSBfX2NodW5rX3NpemUsIF9Db21wYXJlIF9fY29tcCkgeworICB3aGlsZSAoX19sYXN0IC0gX19maXJzdCA+PSBfX2NodW5rX3NpemUpIHsKKyAgICBfX2luc2VydGlvbl9zb3J0KF9fZmlyc3QsIF9fZmlyc3QgKyBfX2NodW5rX3NpemUsCisgICAgICAgICAgICAgICAgICAgICBfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsX1JhbmRvbUFjY2Vzc0l0ZXIpLCBfX2NvbXApOworICAgIF9fZmlyc3QgKz0gX19jaHVua19zaXplOworICB9CisgIF9faW5zZXJ0aW9uX3NvcnQoX19maXJzdCwgX19sYXN0LCBfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsX1JhbmRvbUFjY2Vzc0l0ZXIpLCBfX2NvbXApOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9Qb2ludGVyLCBjbGFzcyBfRGlzdGFuY2UsCisgICAgICAgICAgY2xhc3MgX0NvbXBhcmU+Cit2b2lkIF9fbWVyZ2Vfc29ydF93aXRoX2J1ZmZlcihfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0LCBfUG9pbnRlciBfX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EaXN0YW5jZSosIF9Db21wYXJlIF9fY29tcCkgeworICBfRGlzdGFuY2UgX19sZW4gPSBfX2xhc3QgLSBfX2ZpcnN0OworICBfUG9pbnRlciBfX2J1ZmZlcl9sYXN0ID0gX19idWZmZXIgKyBfX2xlbjsKKworICBfRGlzdGFuY2UgX19zdGVwX3NpemUgPSBfX3N0bF9jaHVua19zaXplOworICBfX2NodW5rX2luc2VydGlvbl9zb3J0KF9fZmlyc3QsIF9fbGFzdCwgX19zdGVwX3NpemUsIF9fY29tcCk7CisKKyAgd2hpbGUgKF9fc3RlcF9zaXplIDwgX19sZW4pIHsKKyAgICBfX21lcmdlX3NvcnRfbG9vcChfX2ZpcnN0LCBfX2xhc3QsIF9fYnVmZmVyLCBfX3N0ZXBfc2l6ZSwgX19jb21wKTsKKyAgICBfX3N0ZXBfc2l6ZSAqPSAyOworICAgIF9fbWVyZ2Vfc29ydF9sb29wKF9fYnVmZmVyLCBfX2J1ZmZlcl9sYXN0LCBfX2ZpcnN0LCBfX3N0ZXBfc2l6ZSwgX19jb21wKTsKKyAgICBfX3N0ZXBfc2l6ZSAqPSAyOworICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXIxLCBjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXIyLAorICAgICAgICAgIGNsYXNzIF9EaXN0YW5jZT4KK19CaWRpcmVjdGlvbmFsSXRlcjEgX19yb3RhdGVfYWRhcHRpdmUoX0JpZGlyZWN0aW9uYWxJdGVyMSBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIxIF9fbWlkZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIxIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0Rpc3RhbmNlIF9fbGVuMSwgX0Rpc3RhbmNlIF9fbGVuMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyMiBfX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0Rpc3RhbmNlIF9fYnVmZmVyX3NpemUpIHsKKyAgaWYgKF9fbGVuMSA+IF9fbGVuMiAmJiBfX2xlbjIgPD0gX19idWZmZXJfc2l6ZSkgeworICAgIF9CaWRpcmVjdGlvbmFsSXRlcjIgX19idWZmZXJfZW5kID0gY29weShfX21pZGRsZSwgX19sYXN0LCBfX2J1ZmZlcik7CisgICAgY29weV9iYWNrd2FyZChfX2ZpcnN0LCBfX21pZGRsZSwgX19sYXN0KTsKKyAgICByZXR1cm4gY29weShfX2J1ZmZlciwgX19idWZmZXJfZW5kLCBfX2ZpcnN0KTsKKyAgfQorICBlbHNlIGlmIChfX2xlbjEgPD0gX19idWZmZXJfc2l6ZSkgeworICAgIF9CaWRpcmVjdGlvbmFsSXRlcjIgX19idWZmZXJfZW5kID0gY29weShfX2ZpcnN0LCBfX21pZGRsZSwgX19idWZmZXIpOworICAgIGNvcHkoX19taWRkbGUsIF9fbGFzdCwgX19maXJzdCk7CisgICAgcmV0dXJuIGNvcHlfYmFja3dhcmQoX19idWZmZXIsIF9fYnVmZmVyX2VuZCwgX19sYXN0KTsKKyAgfQorICBlbHNlCisgICAgcmV0dXJuIF9fcm90YXRlKF9fZmlyc3QsIF9fbWlkZGxlLCBfX2xhc3QpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyLCBjbGFzcyBfRGlzdGFuY2UsIGNsYXNzIF9Qb2ludGVyLAorICAgICAgICAgIGNsYXNzIF9Db21wYXJlPgordm9pZCBfX21lcmdlX2FkYXB0aXZlKF9CaWRpcmVjdGlvbmFsSXRlciBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlciBfX21pZGRsZSwKKyAgICAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgIF9EaXN0YW5jZSBfX2xlbjEsIF9EaXN0YW5jZSBfX2xlbjIsCisgICAgICAgICAgICAgICAgICAgICAgX1BvaW50ZXIgX19idWZmZXIsIF9EaXN0YW5jZSBfX2J1ZmZlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgIF9Db21wYXJlIF9fY29tcCkgeworICBpZiAoX19sZW4xIDw9IF9fbGVuMiAmJiBfX2xlbjEgPD0gX19idWZmZXJfc2l6ZSkgeworICAgIF9Qb2ludGVyIF9fYnVmZmVyX2VuZCA9IGNvcHkoX19maXJzdCwgX19taWRkbGUsIF9fYnVmZmVyKTsKKyAgICBtZXJnZShfX2J1ZmZlciwgX19idWZmZXJfZW5kLCBfX21pZGRsZSwgX19sYXN0LCBfX2ZpcnN0LCBfX2NvbXApOworICB9CisgIGVsc2UgaWYgKF9fbGVuMiA8PSBfX2J1ZmZlcl9zaXplKSB7CisgICAgX1BvaW50ZXIgX19idWZmZXJfZW5kID0gY29weShfX21pZGRsZSwgX19sYXN0LCBfX2J1ZmZlcik7CisgICAgX19tZXJnZV9iYWNrd2FyZChfX2ZpcnN0LCBfX21pZGRsZSwgX19idWZmZXIsIF9fYnVmZmVyX2VuZCwgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgX19jb21wKTsKKyAgfQorICBlbHNlIHsKKyAgICBfQmlkaXJlY3Rpb25hbEl0ZXIgX19maXJzdF9jdXQgPSBfX2ZpcnN0OworICAgIF9CaWRpcmVjdGlvbmFsSXRlciBfX3NlY29uZF9jdXQgPSBfX21pZGRsZTsKKyAgICBfRGlzdGFuY2UgX19sZW4xMSA9IDA7CisgICAgX0Rpc3RhbmNlIF9fbGVuMjIgPSAwOworICAgIGlmIChfX2xlbjEgPiBfX2xlbjIpIHsKKyAgICAgIF9fbGVuMTEgPSBfX2xlbjEgLyAyOworICAgICAgYWR2YW5jZShfX2ZpcnN0X2N1dCwgX19sZW4xMSk7CisgICAgICBfX3NlY29uZF9jdXQgPSBsb3dlcl9ib3VuZChfX21pZGRsZSwgX19sYXN0LCAqX19maXJzdF9jdXQsIF9fY29tcCk7CisgICAgICBfX2xlbjIyICs9IGRpc3RhbmNlKF9fbWlkZGxlLCBfX3NlY29uZF9jdXQpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIF9fbGVuMjIgPSBfX2xlbjIgLyAyOworICAgICAgYWR2YW5jZShfX3NlY29uZF9jdXQsIF9fbGVuMjIpOworICAgICAgX19maXJzdF9jdXQgPSB1cHBlcl9ib3VuZChfX2ZpcnN0LCBfX21pZGRsZSwgKl9fc2Vjb25kX2N1dCwgX19jb21wKTsKKyAgICAgIF9fbGVuMTEgKz0gZGlzdGFuY2UoX19maXJzdCwgX19maXJzdF9jdXQpOworICAgIH0KKyAgICBfQmlkaXJlY3Rpb25hbEl0ZXIgX19uZXdfbWlkZGxlID0KKyAgICAgIF9fcm90YXRlX2FkYXB0aXZlKF9fZmlyc3RfY3V0LCBfX21pZGRsZSwgX19zZWNvbmRfY3V0LCBfX2xlbjEgLSBfX2xlbjExLAorICAgICAgICAgICAgICAgICAgICAgICAgX19sZW4yMiwgX19idWZmZXIsIF9fYnVmZmVyX3NpemUpOworICAgIF9fbWVyZ2VfYWRhcHRpdmUoX19maXJzdCwgX19maXJzdF9jdXQsIF9fbmV3X21pZGRsZSwgX19sZW4xMSwKKyAgICAgICAgICAgICAgICAgICAgIF9fbGVuMjIsIF9fYnVmZmVyLCBfX2J1ZmZlcl9zaXplLCBfX2NvbXApOworICAgIF9fbWVyZ2VfYWRhcHRpdmUoX19uZXdfbWlkZGxlLCBfX3NlY29uZF9jdXQsIF9fbGFzdCwgX19sZW4xIC0gX19sZW4xMSwKKyAgICAgICAgICAgICAgICAgICAgIF9fbGVuMiAtIF9fbGVuMjIsIF9fYnVmZmVyLCBfX2J1ZmZlcl9zaXplLCBfX2NvbXApOworICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX1BvaW50ZXIsIGNsYXNzIF9EaXN0YW5jZSwKKyAgICAgICAgICBjbGFzcyBfQ29tcGFyZT4KK3ZvaWQgX19zdGFibGVfc29ydF9hZGFwdGl2ZShfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCwgX1BvaW50ZXIgX19idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0Rpc3RhbmNlIF9fYnVmZmVyX3NpemUsIF9Db21wYXJlIF9fY29tcCkgeworICBfRGlzdGFuY2UgX19sZW4gPSAoX19sYXN0IC0gX19maXJzdCArIDEpIC8gMjsKKyAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19taWRkbGUgPSBfX2ZpcnN0ICsgX19sZW47CisgIGlmIChfX2xlbiA+IF9fYnVmZmVyX3NpemUpIHsKKyAgICBfX3N0YWJsZV9zb3J0X2FkYXB0aXZlKF9fZmlyc3QsIF9fbWlkZGxlLCBfX2J1ZmZlciwgX19idWZmZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fY29tcCk7CisgICAgX19zdGFibGVfc29ydF9hZGFwdGl2ZShfX21pZGRsZSwgX19sYXN0LCBfX2J1ZmZlciwgX19idWZmZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fY29tcCk7CisgIH0KKyAgZWxzZSB7CisgICAgX19tZXJnZV9zb3J0X3dpdGhfYnVmZmVyKF9fZmlyc3QsIF9fbWlkZGxlLCBfX2J1ZmZlciwgKF9EaXN0YW5jZSopMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2NvbXApOworICAgIF9fbWVyZ2Vfc29ydF93aXRoX2J1ZmZlcihfX21pZGRsZSwgX19sYXN0LCBfX2J1ZmZlciwgKF9EaXN0YW5jZSopMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2NvbXApOworICB9CisgIF9fbWVyZ2VfYWRhcHRpdmUoX19maXJzdCwgX19taWRkbGUsIF9fbGFzdCwgX0Rpc3RhbmNlKF9fbWlkZGxlIC0gX19maXJzdCksCisgICAgICAgICAgICAgICAgICAgX0Rpc3RhbmNlKF9fbGFzdCAtIF9fbWlkZGxlKSwgX19idWZmZXIsIF9fYnVmZmVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgX19jb21wKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyLCBjbGFzcyBfVHAsIGNsYXNzIF9EaXN0YW5jZSwgY2xhc3MgX0NvbXBhcmU+Cit2b2lkIF9fc3RhYmxlX3NvcnRfYXV4KF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCwgX1RwKiwgX0Rpc3RhbmNlKiwKKyAgICAgICAgICAgICAgICAgICAgICAgX0NvbXBhcmUgX19jb21wKSB7CisgIF9UZW1wb3JhcnlfYnVmZmVyPF9SYW5kb21BY2Nlc3NJdGVyLCBfVHA+IGJ1ZihfX2ZpcnN0LCBfX2xhc3QpOworICBpZiAoYnVmLmJlZ2luKCkgPT0gMCkKKyAgICBfX2lucGxhY2Vfc3RhYmxlX3NvcnQoX19maXJzdCwgX19sYXN0LCBfX2NvbXApOworICBlbHNlCisgICAgX19zdGFibGVfc29ydF9hZGFwdGl2ZShfX2ZpcnN0LCBfX2xhc3QsIGJ1Zi5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX0Rpc3RhbmNlKGJ1Zi5zaXplKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX19jb21wKTsKK30KKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcj4KK3ZvaWQgc3RhYmxlX3NvcnQoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwKKyAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0KSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICBfU1RMUF9QUklWIF9fc3RhYmxlX3NvcnRfYXV4KF9fZmlyc3QsIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9ESVNUQU5DRV9UWVBFKF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fbGVzcyhfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyKSkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9Db21wYXJlPgordm9pZCBzdGFibGVfc29ydChfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsIF9Db21wYXJlIF9fY29tcCkgeworICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKKyAgX1NUTFBfUFJJViBfX3N0YWJsZV9zb3J0X2F1eChfX2ZpcnN0LCBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfVkFMVUVfVFlQRShfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfRElTVEFOQ0VfVFlQRShfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19jb21wKTsKK30KKworLy8gcGFydGlhbF9zb3J0LCBwYXJ0aWFsX3NvcnRfY29weSwgYW5kIGF1eGlsaWFyeSBmdW5jdGlvbnMuCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZT4KK3ZvaWQgX19wYXJ0aWFsX3NvcnQoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIgX19taWRkbGUsCisgICAgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCwgX1RwKiwgX0NvbXBhcmUgX19jb21wKSB7CisgIG1ha2VfaGVhcChfX2ZpcnN0LCBfX21pZGRsZSwgX19jb21wKTsKKyAgZm9yIChfUmFuZG9tQWNjZXNzSXRlciBfX2kgPSBfX21pZGRsZTsgX19pIDwgX19sYXN0OyArK19faSkgeworICAgIGlmIChfX2NvbXAoKl9faSwgKl9fZmlyc3QpKSB7CisgICAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghX19jb21wKCpfX2ZpcnN0LCAqX19pKSwgX1N0bE1zZ19JTlZBTElEX1NUUklDVF9XRUFLX1BSRURJQ0FURSkKKyAgICAgIF9fcG9wX2hlYXAoX19maXJzdCwgX19taWRkbGUsIF9faSwgX1RwKCpfX2kpLCBfX2NvbXAsCisgICAgICAgICAgICAgICAgIF9TVExQX0RJU1RBTkNFX1RZUEUoX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIpKTsKKyAgICB9CisgIH0KKyAgc29ydF9oZWFwKF9fZmlyc3QsIF9fbWlkZGxlLCBfX2NvbXApOworfQorCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyPgordm9pZCBwYXJ0aWFsX3NvcnQoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCxfUmFuZG9tQWNjZXNzSXRlciBfX21pZGRsZSwKKyAgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCkgeworICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19taWRkbGUpKQorICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19taWRkbGUsIF9fbGFzdCkpCisgIF9TVExQX1BSSVYgX19wYXJ0aWFsX3NvcnQoX19maXJzdCwgX19taWRkbGUsIF9fbGFzdCwgX1NUTFBfVkFMVUVfVFlQRShfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfX2xlc3MoX1NUTFBfVkFMVUVfVFlQRShfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcikpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyLCBjbGFzcyBfQ29tcGFyZT4KK3ZvaWQgcGFydGlhbF9zb3J0KF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsX1JhbmRvbUFjY2Vzc0l0ZXIgX19taWRkbGUsCisgICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsIF9Db21wYXJlIF9fY29tcCkgeworICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19taWRkbGUpKQorICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19taWRkbGUsIF9fbGFzdCkpCisgIF9TVExQX1BSSVYgX19wYXJ0aWFsX3NvcnQoX19maXJzdCwgX19taWRkbGUsIF9fbGFzdCwgX1NUTFBfVkFMVUVfVFlQRShfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlciksIF9fY29tcCk7Cit9CisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyLCBjbGFzcyBfQ29tcGFyZSwKKyAgICAgICAgICBjbGFzcyBfRGlzdGFuY2UsIGNsYXNzIF9UcD4KK19SYW5kb21BY2Nlc3NJdGVyIF9fcGFydGlhbF9zb3J0X2NvcHkoX0lucHV0SXRlciBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19yZXN1bHRfZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fcmVzdWx0X2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Db21wYXJlIF9fY29tcCwgX0Rpc3RhbmNlKiwgX1RwKikgeworICBpZiAoX19yZXN1bHRfZmlyc3QgPT0gX19yZXN1bHRfbGFzdCkgcmV0dXJuIF9fcmVzdWx0X2xhc3Q7CisgIF9SYW5kb21BY2Nlc3NJdGVyIF9fcmVzdWx0X3JlYWxfbGFzdCA9IF9fcmVzdWx0X2ZpcnN0OworICB3aGlsZShfX2ZpcnN0ICE9IF9fbGFzdCAmJiBfX3Jlc3VsdF9yZWFsX2xhc3QgIT0gX19yZXN1bHRfbGFzdCkgeworICAgICpfX3Jlc3VsdF9yZWFsX2xhc3QgPSAqX19maXJzdDsKKyAgICArK19fcmVzdWx0X3JlYWxfbGFzdDsKKyAgICArK19fZmlyc3Q7CisgIH0KKyAgbWFrZV9oZWFwKF9fcmVzdWx0X2ZpcnN0LCBfX3Jlc3VsdF9yZWFsX2xhc3QsIF9fY29tcCk7CisgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkgeworICAgIGlmIChfX2NvbXAoKl9fZmlyc3QsICpfX3Jlc3VsdF9maXJzdCkpIHsKKyAgICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFfX2NvbXAoKl9fcmVzdWx0X2ZpcnN0LCAqX19maXJzdCksIF9TdGxNc2dfSU5WQUxJRF9TVFJJQ1RfV0VBS19QUkVESUNBVEUpCisgICAgICBfX2FkanVzdF9oZWFwKF9fcmVzdWx0X2ZpcnN0LCBfRGlzdGFuY2UoMCksCisgICAgICAgICAgICAgICAgICAgIF9EaXN0YW5jZShfX3Jlc3VsdF9yZWFsX2xhc3QgLSBfX3Jlc3VsdF9maXJzdCksCisgICAgICAgICAgICAgICAgICAgIF9UcCgqX19maXJzdCksCisgICAgICAgICAgICAgICAgICAgIF9fY29tcCk7CisgICAgfQorICAgICsrX19maXJzdDsKKyAgfQorICBzb3J0X2hlYXAoX19yZXN1bHRfZmlyc3QsIF9fcmVzdWx0X3JlYWxfbGFzdCwgX19jb21wKTsKKyAgcmV0dXJuIF9fcmVzdWx0X3JlYWxfbGFzdDsKK30KKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcj4KK19SYW5kb21BY2Nlc3NJdGVyCitwYXJ0aWFsX3NvcnRfY29weShfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19yZXN1bHRfZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyIF9fcmVzdWx0X2xhc3QpIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX3Jlc3VsdF9maXJzdCwgX19yZXN1bHRfbGFzdCkpCisgIHJldHVybiBfU1RMUF9QUklWIF9fcGFydGlhbF9zb3J0X2NvcHkoX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdF9maXJzdCwgX19yZXN1bHRfbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fbGVzcyhfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsIF9JbnB1dEl0ZXIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9ESVNUQU5DRV9UWVBFKF9fcmVzdWx0X2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfVkFMVUVfVFlQRShfX2ZpcnN0LCBfSW5wdXRJdGVyKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX0NvbXBhcmU+CitfUmFuZG9tQWNjZXNzSXRlcgorcGFydGlhbF9zb3J0X2NvcHkoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fcmVzdWx0X2ZpcnN0LAorICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19yZXN1bHRfbGFzdCwgX0NvbXBhcmUgX19jb21wKSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19yZXN1bHRfZmlyc3QsIF9fcmVzdWx0X2xhc3QpKQorICByZXR1cm4gX1NUTFBfUFJJViBfX3BhcnRpYWxfc29ydF9jb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHRfZmlyc3QsIF9fcmVzdWx0X2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19jb21wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX0RJU1RBTkNFX1RZUEUoX19yZXN1bHRfZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsIF9JbnB1dEl0ZXIpKTsKK30KKworLy8gbnRoX2VsZW1lbnQoKSBhbmQgaXRzIGF1eGlsaWFyeSBmdW5jdGlvbnMuCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZT4KK3ZvaWQgX19udGhfZWxlbWVudChfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlciBfX250aCwKKyAgICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsIF9UcCosIF9Db21wYXJlIF9fY29tcCkgeworICB3aGlsZSAoX19sYXN0IC0gX19maXJzdCA+IDMpIHsKKyAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2N1dCA9CisgICAgICBfX3VuZ3VhcmRlZF9wYXJ0aXRpb24oX19maXJzdCwgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9UcChfX21lZGlhbigqX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihfX2ZpcnN0ICsgKF9fbGFzdCAtIF9fZmlyc3QpLzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKF9fbGFzdCAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2NvbXApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2NvbXApOworICAgIGlmIChfX2N1dCA8PSBfX250aCkKKyAgICAgIF9fZmlyc3QgPSBfX2N1dDsKKyAgICBlbHNlCisgICAgICBfX2xhc3QgPSBfX2N1dDsKKyAgfQorICBfX2luc2VydGlvbl9zb3J0KF9fZmlyc3QsIF9fbGFzdCwgX1NUTFBfVkFMVUVfVFlQRShfX2ZpcnN0LF9SYW5kb21BY2Nlc3NJdGVyKSwgX19jb21wKTsKK30KKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcj4KK3ZvaWQgbnRoX2VsZW1lbnQoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIgX19udGgsCisgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCkgeworICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19udGgpKQorICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19udGgsIF9fbGFzdCkpCisgIF9TVExQX1BSSVYgX19udGhfZWxlbWVudChfX2ZpcnN0LCBfX250aCwgX19sYXN0LCBfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX19sZXNzKF9TVExQX1ZBTFVFX1RZUEUoX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIpKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX0NvbXBhcmU+Cit2b2lkIG50aF9lbGVtZW50KF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyIF9fbnRoLAorICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsIF9Db21wYXJlIF9fY29tcCkgeworICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19udGgpKQorICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19udGgsIF9fbGFzdCkpCisgIF9TVExQX1BSSVYgX19udGhfZWxlbWVudChfX2ZpcnN0LCBfX250aCwgX19sYXN0LCBfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyKSwgX19jb21wKTsKK30KKworLy8gQmluYXJ5IHNlYXJjaCAobG93ZXJfYm91bmQsIHVwcGVyX2JvdW5kLCBlcXVhbF9yYW5nZSwgYmluYXJ5X3NlYXJjaCkuCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9UcCwKKyAgICAgICAgICBjbGFzcyBfQ29tcGFyZTEsIGNsYXNzIF9Db21wYXJlMiwgY2xhc3MgX0Rpc3RhbmNlPgorX0ZvcndhcmRJdGVyIF9fdXBwZXJfYm91bmQoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsIGNvbnN0IF9UcCYgX192YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ29tcGFyZTEgX19jb21wMSwgX0NvbXBhcmUyIF9fY29tcDIsIF9EaXN0YW5jZSopIHsKKyAgX0Rpc3RhbmNlIF9fbGVuID0gZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KTsKKyAgX0Rpc3RhbmNlIF9faGFsZjsKKworICB3aGlsZSAoX19sZW4gPiAwKSB7CisgICAgX19oYWxmID0gX19sZW4gPj4gMTsKKyAgICBfRm9yd2FyZEl0ZXIgX19taWRkbGUgPSBfX2ZpcnN0OworICAgIGFkdmFuY2UoX19taWRkbGUsIF9faGFsZik7CisgICAgaWYgKF9fY29tcDIoX192YWwsICpfX21pZGRsZSkpIHsKKyAgICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFfX2NvbXAxKCpfX21pZGRsZSwgX192YWwpLCBfU3RsTXNnX0lOVkFMSURfU1RSSUNUX1dFQUtfUFJFRElDQVRFKQorICAgICAgX19sZW4gPSBfX2hhbGY7CisgICAgfQorICAgIGVsc2UgeworICAgICAgX19maXJzdCA9IF9fbWlkZGxlOworICAgICAgKytfX2ZpcnN0OworICAgICAgX19sZW4gPSBfX2xlbiAtIF9faGFsZiAtIDE7CisgICAgfQorICB9CisgIHJldHVybiBfX2ZpcnN0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfVHAsCisgICAgICAgICAgY2xhc3MgX0NvbXBhcmUxLCBjbGFzcyBfQ29tcGFyZTIsIGNsYXNzIF9EaXN0YW5jZT4KK3BhaXI8X0ZvcndhcmRJdGVyLCBfRm9yd2FyZEl0ZXI+CitfX2VxdWFsX3JhbmdlKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LCBjb25zdCBfVHAmIF9fdmFsLAorICAgICAgICAgICAgICBfQ29tcGFyZTEgX19jb21wMSwgX0NvbXBhcmUyIF9fY29tcDIsIF9EaXN0YW5jZSogX19kaXN0KSB7CisgIF9EaXN0YW5jZSBfX2xlbiA9IGRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7CisgIF9EaXN0YW5jZSBfX2hhbGY7CisKKyAgd2hpbGUgKF9fbGVuID4gMCkgeworICAgIF9faGFsZiA9IF9fbGVuID4+IDE7CisgICAgX0ZvcndhcmRJdGVyIF9fbWlkZGxlID0gX19maXJzdDsKKyAgICBhZHZhbmNlKF9fbWlkZGxlLCBfX2hhbGYpOworICAgIGlmIChfX2NvbXAxKCpfX21pZGRsZSwgX192YWwpKSB7CisgICAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghX19jb21wMihfX3ZhbCwgKl9fbWlkZGxlKSwgX1N0bE1zZ19JTlZBTElEX1NUUklDVF9XRUFLX1BSRURJQ0FURSkKKyAgICAgIF9fZmlyc3QgPSBfX21pZGRsZTsKKyAgICAgICsrX19maXJzdDsKKyAgICAgIF9fbGVuID0gX19sZW4gLSBfX2hhbGYgLSAxOworICAgIH0KKyAgICBlbHNlIGlmIChfX2NvbXAyKF9fdmFsLCAqX19taWRkbGUpKSB7CisgICAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghX19jb21wMSgqX19taWRkbGUsIF9fdmFsKSwgX1N0bE1zZ19JTlZBTElEX1NUUklDVF9XRUFLX1BSRURJQ0FURSkKKyAgICAgIF9fbGVuID0gX19oYWxmOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIF9Gb3J3YXJkSXRlciBfX2xlZnQgPSBfX2xvd2VyX2JvdW5kKF9fZmlyc3QsIF9fbWlkZGxlLCBfX3ZhbCwgX19jb21wMSwgX19jb21wMiwgX19kaXN0KTsKKyAgICAgIC8vU21hbGwgb3B0aW06IElmIGxvd2VyX2JvdW5kIGhhdmVuJ3QgZm91bmQgYW4gZXF1aXZhbGVudCB2YWx1ZQorICAgICAgLy90aGVyZSBpcyBubyBuZWVkIHRvIGNhbGwgdXBwZXJfYm91bmQuCisgICAgICBpZiAoX19jb21wMSgqX19sZWZ0LCBfX3ZhbCkpIHsKKyAgICAgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoIV9fY29tcDIoX192YWwsICpfX2xlZnQpLCBfU3RsTXNnX0lOVkFMSURfU1RSSUNUX1dFQUtfUFJFRElDQVRFKQorICAgICAgICByZXR1cm4gcGFpcjxfRm9yd2FyZEl0ZXIsIF9Gb3J3YXJkSXRlcj4oX19sZWZ0LCBfX2xlZnQpOworICAgICAgfQorICAgICAgYWR2YW5jZShfX2ZpcnN0LCBfX2xlbik7CisgICAgICBfRm9yd2FyZEl0ZXIgX19yaWdodCA9IF9fdXBwZXJfYm91bmQoKytfX21pZGRsZSwgX19maXJzdCwgX192YWwsIF9fY29tcDEsIF9fY29tcDIsIF9fZGlzdCk7CisgICAgICByZXR1cm4gcGFpcjxfRm9yd2FyZEl0ZXIsIF9Gb3J3YXJkSXRlcj4oX19sZWZ0LCBfX3JpZ2h0KTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHBhaXI8X0ZvcndhcmRJdGVyLCBfRm9yd2FyZEl0ZXI+KF9fZmlyc3QsIF9fZmlyc3QpOworfQorCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMiwgY2xhc3MgX091dHB1dEl0ZXI+CitfT3V0cHV0SXRlciBtZXJnZShfSW5wdXRJdGVyMSBfX2ZpcnN0MSwgX0lucHV0SXRlcjEgX19sYXN0MSwKKyAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyLCBfSW5wdXRJdGVyMiBfX2xhc3QyLAorICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXIgX19yZXN1bHQpIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QxLCBfX2xhc3QxKSkKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QyLCBfX2xhc3QyKSkKKyAgd2hpbGUgKF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19maXJzdDIgIT0gX19sYXN0MikgeworICAgIGlmICgqX19maXJzdDIgPCAqX19maXJzdDEpIHsKKyAgICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0MjsKKyAgICAgICsrX19maXJzdDI7CisgICAgfQorICAgIGVsc2UgeworICAgICAgKl9fcmVzdWx0ID0gKl9fZmlyc3QxOworICAgICAgKytfX2ZpcnN0MTsKKyAgICB9CisgICAgKytfX3Jlc3VsdDsKKyAgfQorICByZXR1cm4gY29weShfX2ZpcnN0MiwgX19sYXN0MiwgY29weShfX2ZpcnN0MSwgX19sYXN0MSwgX19yZXN1bHQpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMiwgY2xhc3MgX091dHB1dEl0ZXIsCisgICAgICAgICAgY2xhc3MgX0NvbXBhcmU+CitfT3V0cHV0SXRlciBtZXJnZShfSW5wdXRJdGVyMSBfX2ZpcnN0MSwgX0lucHV0SXRlcjEgX19sYXN0MSwKKyAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyLCBfSW5wdXRJdGVyMiBfX2xhc3QyLAorICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXIgX19yZXN1bHQsIF9Db21wYXJlIF9fY29tcCkgeworICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdDEsIF9fbGFzdDEpKQorICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdDIsIF9fbGFzdDIpKQorICB3aGlsZSAoX19maXJzdDEgIT0gX19sYXN0MSAmJiBfX2ZpcnN0MiAhPSBfX2xhc3QyKSB7CisgICAgaWYgKF9fY29tcCgqX19maXJzdDIsICpfX2ZpcnN0MSkpIHsKKyAgICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFfX2NvbXAoKl9fZmlyc3QxLCAqX19maXJzdDIpLCBfU3RsTXNnX0lOVkFMSURfU1RSSUNUX1dFQUtfUFJFRElDQVRFKQorICAgICAgKl9fcmVzdWx0ID0gKl9fZmlyc3QyOworICAgICAgKytfX2ZpcnN0MjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAqX19yZXN1bHQgPSAqX19maXJzdDE7CisgICAgICArK19fZmlyc3QxOworICAgIH0KKyAgICArK19fcmVzdWx0OworICB9CisgIHJldHVybiBjb3B5KF9fZmlyc3QyLCBfX2xhc3QyLCBjb3B5KF9fZmlyc3QxLCBfX2xhc3QxLCBfX3Jlc3VsdCkpOworfQorCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXIsIGNsYXNzIF9EaXN0YW5jZSwgY2xhc3MgX0NvbXBhcmU+Cit2b2lkIF9fbWVyZ2Vfd2l0aG91dF9idWZmZXIoX0JpZGlyZWN0aW9uYWxJdGVyIF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyIF9fbWlkZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0Rpc3RhbmNlIF9fbGVuMSwgX0Rpc3RhbmNlIF9fbGVuMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ29tcGFyZSBfX2NvbXApIHsKKyAgaWYgKF9fbGVuMSA9PSAwIHx8IF9fbGVuMiA9PSAwKQorICAgIHJldHVybjsKKyAgaWYgKF9fbGVuMSArIF9fbGVuMiA9PSAyKSB7CisgICAgaWYgKF9fY29tcCgqX19taWRkbGUsICpfX2ZpcnN0KSkgeworICAgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoIV9fY29tcCgqX19maXJzdCwgKl9fbWlkZGxlKSwgX1N0bE1zZ19JTlZBTElEX1NUUklDVF9XRUFLX1BSRURJQ0FURSkKKyAgICAgIGl0ZXJfc3dhcChfX2ZpcnN0LCBfX21pZGRsZSk7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorICBfQmlkaXJlY3Rpb25hbEl0ZXIgX19maXJzdF9jdXQgPSBfX2ZpcnN0OworICBfQmlkaXJlY3Rpb25hbEl0ZXIgX19zZWNvbmRfY3V0ID0gX19taWRkbGU7CisgIF9EaXN0YW5jZSBfX2xlbjExID0gMDsKKyAgX0Rpc3RhbmNlIF9fbGVuMjIgPSAwOworICBpZiAoX19sZW4xID4gX19sZW4yKSB7CisgICAgX19sZW4xMSA9IF9fbGVuMSAvIDI7CisgICAgYWR2YW5jZShfX2ZpcnN0X2N1dCwgX19sZW4xMSk7CisgICAgX19zZWNvbmRfY3V0ID0gbG93ZXJfYm91bmQoX19taWRkbGUsIF9fbGFzdCwgKl9fZmlyc3RfY3V0LCBfX2NvbXApOworICAgIF9fbGVuMjIgKz0gZGlzdGFuY2UoX19taWRkbGUsIF9fc2Vjb25kX2N1dCk7CisgIH0KKyAgZWxzZSB7CisgICAgX19sZW4yMiA9IF9fbGVuMiAvIDI7CisgICAgYWR2YW5jZShfX3NlY29uZF9jdXQsIF9fbGVuMjIpOworICAgIF9fZmlyc3RfY3V0ID0gdXBwZXJfYm91bmQoX19maXJzdCwgX19taWRkbGUsICpfX3NlY29uZF9jdXQsIF9fY29tcCk7CisgICAgX19sZW4xMSArPWRpc3RhbmNlKF9fZmlyc3QsIF9fZmlyc3RfY3V0KTsKKyAgfQorICBfQmlkaXJlY3Rpb25hbEl0ZXIgX19uZXdfbWlkZGxlCisgICAgPSBfX3JvdGF0ZShfX2ZpcnN0X2N1dCwgX19taWRkbGUsIF9fc2Vjb25kX2N1dCk7CisgIF9fbWVyZ2Vfd2l0aG91dF9idWZmZXIoX19maXJzdCwgX19maXJzdF9jdXQsIF9fbmV3X21pZGRsZSwgX19sZW4xMSwgX19sZW4yMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfX2NvbXApOworICBfX21lcmdlX3dpdGhvdXRfYnVmZmVyKF9fbmV3X21pZGRsZSwgX19zZWNvbmRfY3V0LCBfX2xhc3QsIF9fbGVuMSAtIF9fbGVuMTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgX19sZW4yIC0gX19sZW4yMiwgX19jb21wKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcjEsIGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcjIsCisgICAgICAgICAgY2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyMywgY2xhc3MgX0NvbXBhcmU+CitfQmlkaXJlY3Rpb25hbEl0ZXIzIF9fbWVyZ2VfYmFja3dhcmQoX0JpZGlyZWN0aW9uYWxJdGVyMSBfX2ZpcnN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIxIF9fbGFzdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyMiBfX2ZpcnN0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIyIF9fbGFzdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyMyBfX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ29tcGFyZSBfX2NvbXApIHsKKyAgaWYgKF9fZmlyc3QxID09IF9fbGFzdDEpCisgICAgcmV0dXJuIGNvcHlfYmFja3dhcmQoX19maXJzdDIsIF9fbGFzdDIsIF9fcmVzdWx0KTsKKyAgaWYgKF9fZmlyc3QyID09IF9fbGFzdDIpCisgICAgcmV0dXJuIGNvcHlfYmFja3dhcmQoX19maXJzdDEsIF9fbGFzdDEsIF9fcmVzdWx0KTsKKyAgLS1fX2xhc3QxOworICAtLV9fbGFzdDI7CisgIGZvciAoOzspIHsKKyAgICBpZiAoX19jb21wKCpfX2xhc3QyLCAqX19sYXN0MSkpIHsKKyAgICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFfX2NvbXAoKl9fbGFzdDEsICpfX2xhc3QyKSwgX1N0bE1zZ19JTlZBTElEX1NUUklDVF9XRUFLX1BSRURJQ0FURSkKKyAgICAgICotLV9fcmVzdWx0ID0gKl9fbGFzdDE7CisgICAgICBpZiAoX19maXJzdDEgPT0gX19sYXN0MSkKKyAgICAgICAgcmV0dXJuIGNvcHlfYmFja3dhcmQoX19maXJzdDIsICsrX19sYXN0MiwgX19yZXN1bHQpOworICAgICAgLS1fX2xhc3QxOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICotLV9fcmVzdWx0ID0gKl9fbGFzdDI7CisgICAgICBpZiAoX19maXJzdDIgPT0gX19sYXN0MikKKyAgICAgICAgcmV0dXJuIGNvcHlfYmFja3dhcmQoX19maXJzdDEsICsrX19sYXN0MSwgX19yZXN1bHQpOworICAgICAgLS1fX2xhc3QyOworICAgIH0KKyAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyLCBjbGFzcyBfVHAsCisgICAgICAgICAgY2xhc3MgX0Rpc3RhbmNlLCBjbGFzcyBfQ29tcGFyZT4KK2lubGluZSB2b2lkIF9faW5wbGFjZV9tZXJnZV9hdXgoX0JpZGlyZWN0aW9uYWxJdGVyIF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlciBfX21pZGRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyIF9fbGFzdCwgX1RwKiwgX0Rpc3RhbmNlKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NvbXBhcmUgX19jb21wKSB7CisgIF9EaXN0YW5jZSBfX2xlbjEgPSBkaXN0YW5jZShfX2ZpcnN0LCBfX21pZGRsZSk7CisgIF9EaXN0YW5jZSBfX2xlbjIgPSBkaXN0YW5jZShfX21pZGRsZSwgX19sYXN0KTsKKworICBfVGVtcG9yYXJ5X2J1ZmZlcjxfQmlkaXJlY3Rpb25hbEl0ZXIsIF9UcD4gX19idWYoX19maXJzdCwgX19sYXN0KTsKKyAgaWYgKF9fYnVmLmJlZ2luKCkgPT0gMCkKKyAgICBfX21lcmdlX3dpdGhvdXRfYnVmZmVyKF9fZmlyc3QsIF9fbWlkZGxlLCBfX2xhc3QsIF9fbGVuMSwgX19sZW4yLCBfX2NvbXApOworICBlbHNlCisgICAgX19tZXJnZV9hZGFwdGl2ZShfX2ZpcnN0LCBfX21pZGRsZSwgX19sYXN0LCBfX2xlbjEsIF9fbGVuMiwKKyAgICAgICAgICAgICAgICAgICAgIF9fYnVmLmJlZ2luKCksIF9EaXN0YW5jZShfX2J1Zi5zaXplKCkpLAorICAgICAgICAgICAgICAgICAgICAgX19jb21wKTsKK30KKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXI+Cit2b2lkIGlucGxhY2VfbWVyZ2UoX0JpZGlyZWN0aW9uYWxJdGVyIF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyIF9fbWlkZGxlLAorICAgICAgICAgICAgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlciBfX2xhc3QpIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbWlkZGxlKSkKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fbWlkZGxlLCBfX2xhc3QpKQorICBpZiAoX19maXJzdCA9PSBfX21pZGRsZSB8fCBfX21pZGRsZSA9PSBfX2xhc3QpCisgICAgcmV0dXJuOworICBfU1RMUF9QUklWIF9faW5wbGFjZV9tZXJnZV9hdXgoX19maXJzdCwgX19taWRkbGUsIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1ZBTFVFX1RZUEUoX19maXJzdCwgX0JpZGlyZWN0aW9uYWxJdGVyKSwgX1NUTFBfRElTVEFOQ0VfVFlQRShfX2ZpcnN0LCBfQmlkaXJlY3Rpb25hbEl0ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfX2xlc3MoX1NUTFBfVkFMVUVfVFlQRShfX2ZpcnN0LCBfQmlkaXJlY3Rpb25hbEl0ZXIpKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXIsIGNsYXNzIF9Db21wYXJlPgordm9pZCBpbnBsYWNlX21lcmdlKF9CaWRpcmVjdGlvbmFsSXRlciBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlciBfX21pZGRsZSwKKyAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIgX19sYXN0LCBfQ29tcGFyZSBfX2NvbXApIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbWlkZGxlKSkKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fbWlkZGxlLCBfX2xhc3QpKQorICBpZiAoX19maXJzdCA9PSBfX21pZGRsZSB8fCBfX21pZGRsZSA9PSBfX2xhc3QpCisgICAgcmV0dXJuOworICBfU1RMUF9QUklWIF9faW5wbGFjZV9tZXJnZV9hdXgoX19maXJzdCwgX19taWRkbGUsIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1ZBTFVFX1RZUEUoX19maXJzdCwgX0JpZGlyZWN0aW9uYWxJdGVyKSwgX1NUTFBfRElTVEFOQ0VfVFlQRShfX2ZpcnN0LCBfQmlkaXJlY3Rpb25hbEl0ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19jb21wKTsKK30KKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcjEsIGNsYXNzIF9JbnB1dEl0ZXIyLCBjbGFzcyBfQ29tcGFyZT4KK2Jvb2wgX19pbmNsdWRlcyhfSW5wdXRJdGVyMSBfX2ZpcnN0MSwgX0lucHV0SXRlcjEgX19sYXN0MSwKKyAgICAgICAgICAgICAgICBfSW5wdXRJdGVyMiBfX2ZpcnN0MiwgX0lucHV0SXRlcjIgX19sYXN0MiwgX0NvbXBhcmUgX19jb21wKSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9fY2hlY2tfcmFuZ2UoX19maXJzdDEsIF9fbGFzdDEpKQorICBfU1RMUF9ERUJVR19DSEVDSyhfX2NoZWNrX3JhbmdlKF9fZmlyc3QyLCBfX2xhc3QyKSkKKyAgd2hpbGUgKF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19maXJzdDIgIT0gX19sYXN0MikKKyAgICBpZiAoX19jb21wKCpfX2ZpcnN0MiwgKl9fZmlyc3QxKSkgeworICAgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoIV9fY29tcCgqX19maXJzdDEsICpfX2ZpcnN0MiksIF9TdGxNc2dfSU5WQUxJRF9TVFJJQ1RfV0VBS19QUkVESUNBVEUpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGVsc2UgaWYgKF9fY29tcCgqX19maXJzdDEsICpfX2ZpcnN0MikpCisgICAgICArK19fZmlyc3QxOworICAgIGVsc2UKKyAgICAgICsrX19maXJzdDEsICsrX19maXJzdDI7CisKKyAgcmV0dXJuIF9fZmlyc3QyID09IF9fbGFzdDI7Cit9CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcjEsIGNsYXNzIF9JbnB1dEl0ZXIyLCBjbGFzcyBfQ29tcGFyZT4KK2Jvb2wgaW5jbHVkZXMoX0lucHV0SXRlcjEgX19maXJzdDEsIF9JbnB1dEl0ZXIxIF9fbGFzdDEsCisgICAgICAgICAgICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyLCBfSW5wdXRJdGVyMiBfX2xhc3QyLCBfQ29tcGFyZSBfX2NvbXApIHsKKyAgcmV0dXJuIF9TVExQX1BSSVYgX19pbmNsdWRlcyhfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIsIF9fbGFzdDIsIF9fY29tcCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0SXRlcjI+Citib29sIGluY2x1ZGVzKF9JbnB1dEl0ZXIxIF9fZmlyc3QxLCBfSW5wdXRJdGVyMSBfX2xhc3QxLAorICAgICAgICAgICAgICBfSW5wdXRJdGVyMiBfX2ZpcnN0MiwgX0lucHV0SXRlcjIgX19sYXN0MikgeworICByZXR1cm4gX1NUTFBfUFJJViBfX2luY2x1ZGVzKF9fZmlyc3QxLCBfX2xhc3QxLCBfX2ZpcnN0MiwgX19sYXN0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fbGVzcyhfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QxLCBfSW5wdXRJdGVyMSkpKTsKK30KKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcjEsIGNsYXNzIF9JbnB1dEl0ZXIyLCBjbGFzcyBfT3V0cHV0SXRlciwKKyAgICAgICAgICBjbGFzcyBfQ29tcGFyZT4KK19PdXRwdXRJdGVyIF9fc2V0X3VuaW9uKF9JbnB1dEl0ZXIxIF9fZmlyc3QxLCBfSW5wdXRJdGVyMSBfX2xhc3QxLAorICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcjIgX19maXJzdDIsIF9JbnB1dEl0ZXIyIF9fbGFzdDIsCisgICAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlciBfX3Jlc3VsdCwgX0NvbXBhcmUgX19jb21wKSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9fY2hlY2tfcmFuZ2UoX19maXJzdDEsIF9fbGFzdDEpKQorICBfU1RMUF9ERUJVR19DSEVDSyhfX2NoZWNrX3JhbmdlKF9fZmlyc3QyLCBfX2xhc3QyKSkKKyAgd2hpbGUgKF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19maXJzdDIgIT0gX19sYXN0MikgeworICAgIGlmIChfX2NvbXAoKl9fZmlyc3QxLCAqX19maXJzdDIpKSB7CisgICAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghX19jb21wKCpfX2ZpcnN0MiwgKl9fZmlyc3QxKSwgX1N0bE1zZ19JTlZBTElEX1NUUklDVF9XRUFLX1BSRURJQ0FURSkKKyAgICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0MTsKKyAgICAgICsrX19maXJzdDE7CisgICAgfQorICAgIGVsc2UgaWYgKF9fY29tcCgqX19maXJzdDIsICpfX2ZpcnN0MSkpIHsKKyAgICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFfX2NvbXAoKl9fZmlyc3QxLCAqX19maXJzdDIpLCBfU3RsTXNnX0lOVkFMSURfU1RSSUNUX1dFQUtfUFJFRElDQVRFKQorICAgICAgKl9fcmVzdWx0ID0gKl9fZmlyc3QyOworICAgICAgKytfX2ZpcnN0MjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAqX19yZXN1bHQgPSAqX19maXJzdDE7CisgICAgICArK19fZmlyc3QxOworICAgICAgKytfX2ZpcnN0MjsKKyAgICB9CisgICAgKytfX3Jlc3VsdDsKKyAgfQorICByZXR1cm4gY29weShfX2ZpcnN0MiwgX19sYXN0MiwgY29weShfX2ZpcnN0MSwgX19sYXN0MSwgX19yZXN1bHQpKTsKK30KKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0SXRlcjIsIGNsYXNzIF9PdXRwdXRJdGVyPgorX091dHB1dEl0ZXIgc2V0X3VuaW9uKF9JbnB1dEl0ZXIxIF9fZmlyc3QxLCBfSW5wdXRJdGVyMSBfX2xhc3QxLAorICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyLCBfSW5wdXRJdGVyMiBfX2xhc3QyLAorICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyIF9fcmVzdWx0KSB7CisgIHJldHVybiBfU1RMUF9QUklWIF9fc2V0X3VuaW9uKF9fZmlyc3QxLCBfX2xhc3QxLCBfX2ZpcnN0MiwgX19sYXN0MiwgX19yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX19sZXNzKF9TVExQX1ZBTFVFX1RZUEUoX19maXJzdDEsIF9JbnB1dEl0ZXIxKSkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcjEsIGNsYXNzIF9JbnB1dEl0ZXIyLCBjbGFzcyBfT3V0cHV0SXRlciwKKyAgICAgICAgICBjbGFzcyBfQ29tcGFyZT4KK19PdXRwdXRJdGVyIHNldF91bmlvbihfSW5wdXRJdGVyMSBfX2ZpcnN0MSwgX0lucHV0SXRlcjEgX19sYXN0MSwKKyAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyMiBfX2ZpcnN0MiwgX0lucHV0SXRlcjIgX19sYXN0MiwKKyAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlciBfX3Jlc3VsdCwgX0NvbXBhcmUgX19jb21wKSB7CisgIHJldHVybiBfU1RMUF9QUklWIF9fc2V0X3VuaW9uKF9fZmlyc3QxLCBfX2xhc3QxLCBfX2ZpcnN0MiwgX19sYXN0MiwgX19yZXN1bHQsIF9fY29tcCk7Cit9CisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMiwgY2xhc3MgX091dHB1dEl0ZXIsCisgICAgICAgICAgY2xhc3MgX0NvbXBhcmU+CitfT3V0cHV0SXRlciBfX3NldF9pbnRlcnNlY3Rpb24oX0lucHV0SXRlcjEgX19maXJzdDEsIF9JbnB1dEl0ZXIxIF9fbGFzdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcjIgX19maXJzdDIsIF9JbnB1dEl0ZXIyIF9fbGFzdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXIgX19yZXN1bHQsIF9Db21wYXJlIF9fY29tcCkgeworICBfU1RMUF9ERUJVR19DSEVDSyhfX2NoZWNrX3JhbmdlKF9fZmlyc3QxLCBfX2xhc3QxKSkKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX19jaGVja19yYW5nZShfX2ZpcnN0MiwgX19sYXN0MikpCisgIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDIpCisgICAgaWYgKF9fY29tcCgqX19maXJzdDEsICpfX2ZpcnN0MikpIHsKKyAgICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFfX2NvbXAoKl9fZmlyc3QyLCAqX19maXJzdDEpLCBfU3RsTXNnX0lOVkFMSURfU1RSSUNUX1dFQUtfUFJFRElDQVRFKQorICAgICAgKytfX2ZpcnN0MTsKKyAgICB9CisgICAgZWxzZSBpZiAoX19jb21wKCpfX2ZpcnN0MiwgKl9fZmlyc3QxKSkKKyAgICAgICsrX19maXJzdDI7CisgICAgZWxzZSB7CisgICAgICAqX19yZXN1bHQgPSAqX19maXJzdDE7CisgICAgICArK19fZmlyc3QxOworICAgICAgKytfX2ZpcnN0MjsKKyAgICAgICsrX19yZXN1bHQ7CisgICAgfQorICByZXR1cm4gX19yZXN1bHQ7Cit9CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcjEsIGNsYXNzIF9JbnB1dEl0ZXIyLCBjbGFzcyBfT3V0cHV0SXRlcj4KK19PdXRwdXRJdGVyIHNldF9pbnRlcnNlY3Rpb24oX0lucHV0SXRlcjEgX19maXJzdDEsIF9JbnB1dEl0ZXIxIF9fbGFzdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyLCBfSW5wdXRJdGVyMiBfX2xhc3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlciBfX3Jlc3VsdCkgeworICByZXR1cm4gX1NUTFBfUFJJViBfX3NldF9pbnRlcnNlY3Rpb24oX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyLCBfX2xhc3QyLCBfX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX19sZXNzKF9TVExQX1ZBTFVFX1RZUEUoX19maXJzdDEsIF9JbnB1dEl0ZXIxKSkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcjEsIGNsYXNzIF9JbnB1dEl0ZXIyLCBjbGFzcyBfT3V0cHV0SXRlciwKKyAgICAgICAgICBjbGFzcyBfQ29tcGFyZT4KK19PdXRwdXRJdGVyIHNldF9pbnRlcnNlY3Rpb24oX0lucHV0SXRlcjEgX19maXJzdDEsIF9JbnB1dEl0ZXIxIF9fbGFzdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyLCBfSW5wdXRJdGVyMiBfX2xhc3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlciBfX3Jlc3VsdCwgX0NvbXBhcmUgX19jb21wKSB7CisgIHJldHVybiBfU1RMUF9QUklWIF9fc2V0X2ludGVyc2VjdGlvbihfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIsIF9fbGFzdDIsIF9fcmVzdWx0LCBfX2NvbXApOworfQorCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0SXRlcjIsIGNsYXNzIF9PdXRwdXRJdGVyLAorICAgICAgICAgIGNsYXNzIF9Db21wYXJlPgorX091dHB1dEl0ZXIgX19zZXRfZGlmZmVyZW5jZShfSW5wdXRJdGVyMSBfX2ZpcnN0MSwgX0lucHV0SXRlcjEgX19sYXN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcjIgX19maXJzdDIsIF9JbnB1dEl0ZXIyIF9fbGFzdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyIF9fcmVzdWx0LCBfQ29tcGFyZSBfX2NvbXApIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX19jaGVja19yYW5nZShfX2ZpcnN0MSwgX19sYXN0MSkpCisgIF9TVExQX0RFQlVHX0NIRUNLKF9fY2hlY2tfcmFuZ2UoX19maXJzdDIsIF9fbGFzdDIpKQorICB3aGlsZSAoX19maXJzdDEgIT0gX19sYXN0MSAmJiBfX2ZpcnN0MiAhPSBfX2xhc3QyKQorICAgIGlmIChfX2NvbXAoKl9fZmlyc3QxLCAqX19maXJzdDIpKSB7CisgICAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghX19jb21wKCpfX2ZpcnN0MiwgKl9fZmlyc3QxKSwgX1N0bE1zZ19JTlZBTElEX1NUUklDVF9XRUFLX1BSRURJQ0FURSkKKyAgICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0MTsKKyAgICAgICsrX19maXJzdDE7CisgICAgICArK19fcmVzdWx0OworICAgIH0KKyAgICBlbHNlIGlmIChfX2NvbXAoKl9fZmlyc3QyLCAqX19maXJzdDEpKQorICAgICAgKytfX2ZpcnN0MjsKKyAgICBlbHNlIHsKKyAgICAgICsrX19maXJzdDE7CisgICAgICArK19fZmlyc3QyOworICAgIH0KKyAgcmV0dXJuIGNvcHkoX19maXJzdDEsIF9fbGFzdDEsIF9fcmVzdWx0KTsKK30KKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0SXRlcjIsIGNsYXNzIF9PdXRwdXRJdGVyPgorX091dHB1dEl0ZXIgc2V0X2RpZmZlcmVuY2UoX0lucHV0SXRlcjEgX19maXJzdDEsIF9JbnB1dEl0ZXIxIF9fbGFzdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyMiBfX2ZpcnN0MiwgX0lucHV0SXRlcjIgX19sYXN0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyIF9fcmVzdWx0KSB7CisgIHJldHVybiBfU1RMUF9QUklWIF9fc2V0X2RpZmZlcmVuY2UoX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyLCBfX2xhc3QyLCBfX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fbGVzcyhfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QxLCBfSW5wdXRJdGVyMSkpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMiwgY2xhc3MgX091dHB1dEl0ZXIsCisgICAgICAgICAgY2xhc3MgX0NvbXBhcmU+CitfT3V0cHV0SXRlciBzZXRfZGlmZmVyZW5jZShfSW5wdXRJdGVyMSBfX2ZpcnN0MSwgX0lucHV0SXRlcjEgX19sYXN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyLCBfSW5wdXRJdGVyMiBfX2xhc3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXIgX19yZXN1bHQsIF9Db21wYXJlIF9fY29tcCkgeworICByZXR1cm4gX1NUTFBfUFJJViBfX3NldF9kaWZmZXJlbmNlKF9fZmlyc3QxLCBfX2xhc3QxLCBfX2ZpcnN0MiwgX19sYXN0MiwgX19yZXN1bHQsIF9fY29tcCk7Cit9CisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMiwgY2xhc3MgX091dHB1dEl0ZXIsIGNsYXNzIF9Db21wYXJlPgorX091dHB1dEl0ZXIKK19fc2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlKF9JbnB1dEl0ZXIxIF9fZmlyc3QxLCBfSW5wdXRJdGVyMSBfX2xhc3QxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcjIgX19maXJzdDIsIF9JbnB1dEl0ZXIyIF9fbGFzdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlciBfX3Jlc3VsdCwgX0NvbXBhcmUgX19jb21wKSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9fY2hlY2tfcmFuZ2UoX19maXJzdDEsIF9fbGFzdDEpKQorICBfU1RMUF9ERUJVR19DSEVDSyhfX2NoZWNrX3JhbmdlKF9fZmlyc3QyLCBfX2xhc3QyKSkKKyAgd2hpbGUgKF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19maXJzdDIgIT0gX19sYXN0MikgeworICAgIGlmIChfX2NvbXAoKl9fZmlyc3QxLCAqX19maXJzdDIpKSB7CisgICAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghX19jb21wKCpfX2ZpcnN0MiwgKl9fZmlyc3QxKSwgX1N0bE1zZ19JTlZBTElEX1NUUklDVF9XRUFLX1BSRURJQ0FURSkKKyAgICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0MTsKKyAgICAgICsrX19maXJzdDE7CisgICAgICArK19fcmVzdWx0OworICAgIH0KKyAgICBlbHNlIGlmIChfX2NvbXAoKl9fZmlyc3QyLCAqX19maXJzdDEpKSB7CisgICAgICAqX19yZXN1bHQgPSAqX19maXJzdDI7CisgICAgICArK19fZmlyc3QyOworICAgICAgKytfX3Jlc3VsdDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICArK19fZmlyc3QxOworICAgICAgKytfX2ZpcnN0MjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGNvcHkoX19maXJzdDIsIF9fbGFzdDIsIGNvcHkoX19maXJzdDEsIF9fbGFzdDEsIF9fcmVzdWx0KSk7Cit9CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcjEsIGNsYXNzIF9JbnB1dEl0ZXIyLCBjbGFzcyBfT3V0cHV0SXRlcj4KK19PdXRwdXRJdGVyCitzZXRfc3ltbWV0cmljX2RpZmZlcmVuY2UoX0lucHV0SXRlcjEgX19maXJzdDEsIF9JbnB1dEl0ZXIxIF9fbGFzdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcjIgX19maXJzdDIsIF9JbnB1dEl0ZXIyIF9fbGFzdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXIgX19yZXN1bHQpIHsKKyAgcmV0dXJuIF9TVExQX1BSSVYgX19zZXRfc3ltbWV0cmljX2RpZmZlcmVuY2UoX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyLCBfX2xhc3QyLCBfX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfX2xlc3MoX1NUTFBfVkFMVUVfVFlQRShfX2ZpcnN0MSwgX0lucHV0SXRlcjEpKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0SXRlcjIsIGNsYXNzIF9PdXRwdXRJdGVyLCBjbGFzcyBfQ29tcGFyZT4KK19PdXRwdXRJdGVyCitzZXRfc3ltbWV0cmljX2RpZmZlcmVuY2UoX0lucHV0SXRlcjEgX19maXJzdDEsIF9JbnB1dEl0ZXIxIF9fbGFzdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcjIgX19maXJzdDIsIF9JbnB1dEl0ZXIyIF9fbGFzdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXIgX19yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgX0NvbXBhcmUgX19jb21wKSB7CisgIHJldHVybiBfU1RMUF9QUklWIF9fc2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlKF9fZmlyc3QxLCBfX2xhc3QxLCBfX2ZpcnN0MiwgX19sYXN0MiwgX19yZXN1bHQsIF9fY29tcCk7Cit9CisKKy8vIG1pbl9lbGVtZW50IGFuZCBtYXhfZWxlbWVudCwgd2l0aCBhbmQgd2l0aG91dCBhbiBleHBsaWNpdGx5IHN1cHBsaWVkCisvLyBjb21wYXJpc29uIGZ1bmN0aW9uLgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyPgorX0ZvcndhcmRJdGVyIG1heF9lbGVtZW50KF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0KSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICBpZiAoX19maXJzdCA9PSBfX2xhc3QpIHJldHVybiBfX2ZpcnN0OworICBfRm9yd2FyZEl0ZXIgX19yZXN1bHQgPSBfX2ZpcnN0OworICB3aGlsZSAoKytfX2ZpcnN0ICE9IF9fbGFzdCkKKyAgICBpZiAoKl9fcmVzdWx0IDwgKl9fZmlyc3QpCisgICAgICBfX3Jlc3VsdCA9IF9fZmlyc3Q7CisgIHJldHVybiBfX3Jlc3VsdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX0NvbXBhcmU+CitfRm9yd2FyZEl0ZXIgbWF4X2VsZW1lbnQoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgX0NvbXBhcmUgX19jb21wKSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICBpZiAoX19maXJzdCA9PSBfX2xhc3QpIHJldHVybiBfX2ZpcnN0OworICBfRm9yd2FyZEl0ZXIgX19yZXN1bHQgPSBfX2ZpcnN0OworICB3aGlsZSAoKytfX2ZpcnN0ICE9IF9fbGFzdCkgeworICAgIGlmIChfX2NvbXAoKl9fcmVzdWx0LCAqX19maXJzdCkpIHsKKyAgICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFfX2NvbXAoKl9fZmlyc3QsICpfX3Jlc3VsdCksIF9TdGxNc2dfSU5WQUxJRF9TVFJJQ1RfV0VBS19QUkVESUNBVEUpCisgICAgICBfX3Jlc3VsdCA9IF9fZmlyc3Q7CisgICAgfQorICB9CisgIHJldHVybiBfX3Jlc3VsdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcj4KK19Gb3J3YXJkSXRlciBtaW5fZWxlbWVudChfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCkgeworICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKKyAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KSByZXR1cm4gX19maXJzdDsKKyAgX0ZvcndhcmRJdGVyIF9fcmVzdWx0ID0gX19maXJzdDsKKyAgd2hpbGUgKCsrX19maXJzdCAhPSBfX2xhc3QpCisgICAgaWYgKCpfX2ZpcnN0IDwgKl9fcmVzdWx0KQorICAgICAgX19yZXN1bHQgPSBfX2ZpcnN0OworICByZXR1cm4gX19yZXN1bHQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9Db21wYXJlPgorX0ZvcndhcmRJdGVyIG1pbl9lbGVtZW50KF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIF9Db21wYXJlIF9fY29tcCkgeworICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKKyAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KSByZXR1cm4gX19maXJzdDsKKyAgX0ZvcndhcmRJdGVyIF9fcmVzdWx0ID0gX19maXJzdDsKKyAgd2hpbGUgKCsrX19maXJzdCAhPSBfX2xhc3QpIHsKKyAgICBpZiAoX19jb21wKCpfX2ZpcnN0LCAqX19yZXN1bHQpKSB7CisgICAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghX19jb21wKCpfX3Jlc3VsdCwgKl9fZmlyc3QpLCBfU3RsTXNnX0lOVkFMSURfU1RSSUNUX1dFQUtfUFJFRElDQVRFKQorICAgICAgX19yZXN1bHQgPSBfX2ZpcnN0OworICAgIH0KKyAgfQorICByZXR1cm4gX19yZXN1bHQ7Cit9CisKKy8vIG5leHRfcGVybXV0YXRpb24gYW5kIHByZXZfcGVybXV0YXRpb24sIHdpdGggYW5kIHdpdGhvdXQgYW4gZXhwbGljaXRseQorLy8gc3VwcGxpZWQgY29tcGFyaXNvbiBmdW5jdGlvbi4KK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlciwgY2xhc3MgX0NvbXBhcmU+Citib29sIF9fbmV4dF9wZXJtdXRhdGlvbihfQmlkaXJlY3Rpb25hbEl0ZXIgX19maXJzdCwgX0JpZGlyZWN0aW9uYWxJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9Db21wYXJlIF9fY29tcCkgeworICBfU1RMUF9ERUJVR19DSEVDSyhfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKyAgICByZXR1cm4gZmFsc2U7CisgIF9CaWRpcmVjdGlvbmFsSXRlciBfX2kgPSBfX2ZpcnN0OworICArK19faTsKKyAgaWYgKF9faSA9PSBfX2xhc3QpCisgICAgcmV0dXJuIGZhbHNlOworICBfX2kgPSBfX2xhc3Q7CisgIC0tX19pOworCisgIGZvcig7OykgeworICAgIF9CaWRpcmVjdGlvbmFsSXRlciBfX2lpID0gX19pOworICAgIC0tX19pOworICAgIGlmIChfX2NvbXAoKl9faSwgKl9faWkpKSB7CisgICAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghX19jb21wKCpfX2lpLCAqX19pKSwgX1N0bE1zZ19JTlZBTElEX1NUUklDVF9XRUFLX1BSRURJQ0FURSkKKyAgICAgIF9CaWRpcmVjdGlvbmFsSXRlciBfX2ogPSBfX2xhc3Q7CisgICAgICB3aGlsZSAoIV9fY29tcCgqX19pLCAqLS1fX2opKSB7fQorICAgICAgaXRlcl9zd2FwKF9faSwgX19qKTsKKyAgICAgIHJldmVyc2UoX19paSwgX19sYXN0KTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoX19pID09IF9fZmlyc3QpIHsKKyAgICAgIHJldmVyc2UoX19maXJzdCwgX19sYXN0KTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKyNpZiBkZWZpbmVkIChfU1RMUF9ORUVEX1VOUkVBQ0hBQkxFX1JFVFVSTikKKyAgICByZXR1cm4gZmFsc2U7CisjZW5kaWYKK30KKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXI+Citib29sIG5leHRfcGVybXV0YXRpb24oX0JpZGlyZWN0aW9uYWxJdGVyIF9fZmlyc3QsIF9CaWRpcmVjdGlvbmFsSXRlciBfX2xhc3QpIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgIHJldHVybiBfU1RMUF9QUklWIF9fbmV4dF9wZXJtdXRhdGlvbihfX2ZpcnN0LCBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fbGVzcyhfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsIF9CaWRpcmVjdGlvbmFsSXRlcikpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlciwgY2xhc3MgX0NvbXBhcmU+Citib29sIG5leHRfcGVybXV0YXRpb24oX0JpZGlyZWN0aW9uYWxJdGVyIF9fZmlyc3QsIF9CaWRpcmVjdGlvbmFsSXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgX0NvbXBhcmUgX19jb21wKSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICByZXR1cm4gX1NUTFBfUFJJViBfX25leHRfcGVybXV0YXRpb24oX19maXJzdCwgX19sYXN0LCBfX2NvbXApOworfQorCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXIsIGNsYXNzIF9Db21wYXJlPgorYm9vbCBfX3ByZXZfcGVybXV0YXRpb24oX0JpZGlyZWN0aW9uYWxJdGVyIF9fZmlyc3QsIF9CaWRpcmVjdGlvbmFsSXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBfQ29tcGFyZSBfX2NvbXApIHsKKyAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorICAgIHJldHVybiBmYWxzZTsKKyAgX0JpZGlyZWN0aW9uYWxJdGVyIF9faSA9IF9fZmlyc3Q7CisgICsrX19pOworICBpZiAoX19pID09IF9fbGFzdCkKKyAgICByZXR1cm4gZmFsc2U7CisgIF9faSA9IF9fbGFzdDsKKyAgLS1fX2k7CisKKyAgZm9yKDs7KSB7CisgICAgX0JpZGlyZWN0aW9uYWxJdGVyIF9faWkgPSBfX2k7CisgICAgLS1fX2k7CisgICAgaWYgKF9fY29tcCgqX19paSwgKl9faSkpIHsKKyAgICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFfX2NvbXAoKl9faSwgKl9faWkpLCBfU3RsTXNnX0lOVkFMSURfU1RSSUNUX1dFQUtfUFJFRElDQVRFKQorICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyIF9faiA9IF9fbGFzdDsKKyAgICAgIHdoaWxlICghX19jb21wKCotLV9faiwgKl9faSkpIHt9CisgICAgICBpdGVyX3N3YXAoX19pLCBfX2opOworICAgICAgcmV2ZXJzZShfX2lpLCBfX2xhc3QpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmIChfX2kgPT0gX19maXJzdCkgeworICAgICAgcmV2ZXJzZShfX2ZpcnN0LCBfX2xhc3QpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorI2lmIGRlZmluZWQgKF9TVExQX05FRURfVU5SRUFDSEFCTEVfUkVUVVJOKQorICAgIHJldHVybiBmYWxzZTsKKyNlbmRpZgorfQorCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcj4KK2Jvb2wgcHJldl9wZXJtdXRhdGlvbihfQmlkaXJlY3Rpb25hbEl0ZXIgX19maXJzdCwgX0JpZGlyZWN0aW9uYWxJdGVyIF9fbGFzdCkgeworICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKKyAgcmV0dXJuIF9TVExQX1BSSVYgX19wcmV2X3Blcm11dGF0aW9uKF9fZmlyc3QsIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX19sZXNzKF9TVExQX1ZBTFVFX1RZUEUoX19maXJzdCwgX0JpZGlyZWN0aW9uYWxJdGVyKSkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyLCBjbGFzcyBfQ29tcGFyZT4KK2Jvb2wgcHJldl9wZXJtdXRhdGlvbihfQmlkaXJlY3Rpb25hbEl0ZXIgX19maXJzdCwgX0JpZGlyZWN0aW9uYWxJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICBfQ29tcGFyZSBfX2NvbXApIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgIHJldHVybiBfU1RMUF9QUklWIF9fcHJldl9wZXJtdXRhdGlvbihfX2ZpcnN0LCBfX2xhc3QsIF9fY29tcCk7Cit9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKKworLy8gaXNfaGVhcCwgYSBwcmVkaWNhdGUgdGVzdGluZyB3aGV0aGVyIG9yIG5vdCBhIHJhbmdlIGlzCisvLyBhIGhlYXAuICBUaGlzIGZ1bmN0aW9uIGlzIGFuIGV4dGVuc2lvbiwgbm90IHBhcnQgb2YgdGhlIEMrKworLy8gc3RhbmRhcmQuCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX0Rpc3RhbmNlLCBjbGFzcyBfU3RyaWN0V2Vha09yZGVyaW5nPgorYm9vbCBfX2lzX2hlYXAoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwgX1N0cmljdFdlYWtPcmRlcmluZyBfX2NvbXAsCisgICAgICAgICAgICAgICBfRGlzdGFuY2UgX19uKSB7CisgIF9EaXN0YW5jZSBfX3BhcmVudCA9IDA7CisgIGZvciAoX0Rpc3RhbmNlIF9fY2hpbGQgPSAxOyBfX2NoaWxkIDwgX19uOyArK19fY2hpbGQpIHsKKyAgICBpZiAoX19jb21wKF9fZmlyc3RbX19wYXJlbnRdLCBfX2ZpcnN0W19fY2hpbGRdKSkgeworICAgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoIV9fY29tcChfX2ZpcnN0W19fY2hpbGRdLCBfX2ZpcnN0W19fcGFyZW50XSksIF9TdGxNc2dfSU5WQUxJRF9TVFJJQ1RfV0VBS19QUkVESUNBVEUpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICgoX19jaGlsZCAmIDEpID09IDApCisgICAgICArK19fcGFyZW50OworICB9CisgIHJldHVybiB0cnVlOworfQorCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyPgorYm9vbCBpc19oZWFwKF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCkgeworICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKKyAgcmV0dXJuIF9TVExQX1BSSVYgX19pc19oZWFwKF9fZmlyc3QsIF9TVExQX1BSSVYgX19sZXNzKF9TVExQX1ZBTFVFX1RZUEUoX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIpKSwgX19sYXN0IC0gX19maXJzdCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX1N0cmljdFdlYWtPcmRlcmluZz4KK2Jvb2wgaXNfaGVhcChfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsCisgICAgICAgICAgICAgX1N0cmljdFdlYWtPcmRlcmluZyBfX2NvbXApIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgIHJldHVybiBfU1RMUF9QUklWIF9faXNfaGVhcChfX2ZpcnN0LCBfX2NvbXAsIF9fbGFzdCAtIF9fZmlyc3QpOworfQorCisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1N0cmljdFdlYWtPcmRlcmluZz4KK2Jvb2wgX19pc19zb3J0ZWQoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgIF9TdHJpY3RXZWFrT3JkZXJpbmcgX19jb21wKSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKKyAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorICAgIHJldHVybiB0cnVlOworCisgIF9Gb3J3YXJkSXRlciBfX25leHQgPSBfX2ZpcnN0OworICBmb3IgKCsrX19uZXh0OyBfX25leHQgIT0gX19sYXN0OyBfX2ZpcnN0ID0gX19uZXh0LCArK19fbmV4dCkgeworICAgIGlmIChfX2NvbXAoKl9fbmV4dCwgKl9fZmlyc3QpKSB7CisgICAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghX19jb21wKCpfX2ZpcnN0LCAqX19uZXh0KSwgX1N0bE1zZ19JTlZBTElEX1NUUklDVF9XRUFLX1BSRURJQ0FURSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisjZW5kaWYgLyogX1NUTFBfTk9fRVhURU5TSU9OUyAqLworCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyN1bmRlZiBfX3N0bF90aHJlc2hvbGQKKworI2VuZGlmIC8qIF9TVExQX0FMR09fQyAqLworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9fYWxnby5oIGIvc3RsL19hbGdvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY1MTNmYwotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9fYWxnby5oCkBAIC0wLDAgKzEsNzYwIEBACisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBNb3Njb3cgQ2VudGVyIGZvciBTUEFSQyBUZWNobm9sb2d5CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworLyogTk9URTogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgU1RMIGhlYWRlcnMuCisgKiAgIFlvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LgorICovCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQUxHT19ICisjZGVmaW5lIF9TVExQX0lOVEVSTkFMX0FMR09fSAorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0FMR09CQVNFX0gKKyMgIGluY2x1ZGUgPHN0bC9fYWxnb2Jhc2UuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0hFQVBfSAorIyAgaW5jbHVkZSA8c3RsL19oZWFwLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9JVEVSQVRPUl9ICisjICBpbmNsdWRlIDxzdGwvX2l0ZXJhdG9yLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9GVU5DVElPTl9CQVNFX0gKKyMgIGluY2x1ZGUgPHN0bC9fZnVuY3Rpb25fYmFzZS5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX1NVTlBST19DQykgJiYgIWRlZmluZWQgKF9TVExQX0lOVEVSTkFMX0NTVERJTykKKy8vIHJlbW92ZSgpIGNvbmZsaWN0CisjICBpbmNsdWRlIDxzdGwvX2NzdGRpby5oPgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisvLyBmb3JfZWFjaC4gIEFwcGx5IGEgZnVuY3Rpb24gdG8gZXZlcnkgZWxlbWVudCBvZiBhIHJhbmdlLgordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9GdW5jdGlvbj4KK19TVExQX0lOTElORV9MT09QIF9GdW5jdGlvbgorZm9yX2VhY2goX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwgX0Z1bmN0aW9uIF9fZikgeworICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisgICAgX19mKCpfX2ZpcnN0KTsKKyAgcmV0dXJuIF9fZjsKK30KKworLy8gY291bnRfaWYKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfUHJlZGljYXRlPgorX1NUTFBfSU5MSU5FX0xPT1AgX1NUTFBfRElGRkVSRU5DRV9UWVBFKF9JbnB1dEl0ZXIpCitjb3VudF9pZihfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LCBfUHJlZGljYXRlIF9fcHJlZCkgeworICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKKyAgX1NUTFBfRElGRkVSRU5DRV9UWVBFKF9JbnB1dEl0ZXIpIF9fbiA9IDA7CisgIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkgeworICAgIGlmIChfX3ByZWQoKl9fZmlyc3QpKQorICAgICAgKytfX247CisgIH0KKyAgcmV0dXJuIF9fbjsKK30KKworLy8gYWRqYWNlbnRfZmluZC4KKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX0JpbmFyeVByZWRpY2F0ZT4KK19TVExQX0lOTElORV9MT09QIF9Gb3J3YXJkSXRlcgorYWRqYWNlbnRfZmluZChfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgX0JpbmFyeVByZWRpY2F0ZSBfX2JpbmFyeV9wcmVkKSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICBpZiAoX19maXJzdCA9PSBfX2xhc3QpCisgICAgcmV0dXJuIF9fbGFzdDsKKyAgX0ZvcndhcmRJdGVyIF9fbmV4dCA9IF9fZmlyc3Q7CisgIHdoaWxlKCsrX19uZXh0ICE9IF9fbGFzdCkgeworICAgIGlmIChfX2JpbmFyeV9wcmVkKCpfX2ZpcnN0LCAqX19uZXh0KSkKKyAgICAgIHJldHVybiBfX2ZpcnN0OworICAgIF9fZmlyc3QgPSBfX25leHQ7CisgIH0KKyAgcmV0dXJuIF9fbGFzdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcj4KK19TVExQX0lOTElORV9MT09QIF9Gb3J3YXJkSXRlcgorYWRqYWNlbnRfZmluZChfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCkgeworICByZXR1cm4gYWRqYWNlbnRfZmluZChfX2ZpcnN0LCBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX19lcXVhbF90byhfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsIF9Gb3J3YXJkSXRlcikpKTsKK30KKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19BTkFDSFJPTklTTVMpCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX1RwLCBjbGFzcyBfU2l6ZT4KK19TVExQX0lOTElORV9MT09QIHZvaWQKK2NvdW50KF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsIGNvbnN0IF9UcCYgX192YWwsIF9TaXplJiBfX24pIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgICAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorICAgICAgaWYgKCpfX2ZpcnN0ID09IF9fdmFsKQorICAgICAgICArK19fbjsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9QcmVkaWNhdGUsIGNsYXNzIF9TaXplPgorX1NUTFBfSU5MSU5FX0xPT1Agdm9pZAorY291bnRfaWYoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwgX1ByZWRpY2F0ZSBfX3ByZWQsIF9TaXplJiBfX24pIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKyAgICBpZiAoX19wcmVkKCpfX2ZpcnN0KSkKKyAgICAgICsrX19uOworfQorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIxLCBjbGFzcyBfRm9yd2FyZEl0ZXIyPgorX0ZvcndhcmRJdGVyMSBzZWFyY2goX0ZvcndhcmRJdGVyMSBfX2ZpcnN0MSwgX0ZvcndhcmRJdGVyMSBfX2xhc3QxLAorICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyMiBfX2ZpcnN0MiwgX0ZvcndhcmRJdGVyMiBfX2xhc3QyKTsKKworLy8gc2VhcmNoX24uICBTZWFyY2ggZm9yIF9fY291bnQgY29uc2VjdXRpdmUgY29waWVzIG9mIF9fdmFsLgordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX0ludGVnZXIsIGNsYXNzIF9UcD4KK19Gb3J3YXJkSXRlciBzZWFyY2hfbihfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICBfSW50ZWdlciBfX2NvdW50LCBjb25zdCBfVHAmIF9fdmFsKTsKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9JbnRlZ2VyLCBjbGFzcyBfVHAsIGNsYXNzIF9CaW5hcnlQcmVkPgorX0ZvcndhcmRJdGVyIHNlYXJjaF9uKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgIF9JbnRlZ2VyIF9fY291bnQsIGNvbnN0IF9UcCYgX192YWwsIF9CaW5hcnlQcmVkIF9fYmluYXJ5X3ByZWQpOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX0ZvcndhcmRJdGVyPgoraW5saW5lIF9JbnB1dEl0ZXIgZmluZF9maXJzdF9vZihfSW5wdXRJdGVyIF9fZmlyc3QxLCBfSW5wdXRJdGVyIF9fbGFzdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlciBfX2ZpcnN0MiwgX0ZvcndhcmRJdGVyIF9fbGFzdDIpIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QxLCBfX2xhc3QxKSkKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QyLCBfX2xhc3QyKSkKKyAgcmV0dXJuIF9TVExQX1BSSVYgX19maW5kX2ZpcnN0X29mKF9fZmlyc3QxLCBfX2xhc3QxLCBfX2ZpcnN0MiwgX19sYXN0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX19lcXVhbF90byhfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QxLCBfSW5wdXRJdGVyKSkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfQmluYXJ5UHJlZGljYXRlPgoraW5saW5lIF9JbnB1dEl0ZXIKK2ZpbmRfZmlyc3Rfb2YoX0lucHV0SXRlciBfX2ZpcnN0MSwgX0lucHV0SXRlciBfX2xhc3QxLAorICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXIgX19maXJzdDIsIF9Gb3J3YXJkSXRlciBfX2xhc3QyLCBfQmluYXJ5UHJlZGljYXRlIF9fY29tcCkgeworICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdDEsIF9fbGFzdDEpKQorICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdDIsIF9fbGFzdDIpKQorICByZXR1cm4gX1NUTFBfUFJJViBfX2ZpbmRfZmlyc3Rfb2YoX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyLCBfX2xhc3QyLCBfX2NvbXApOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyMSwgY2xhc3MgX0ZvcndhcmRJdGVyMj4KK19Gb3J3YXJkSXRlcjEKK2ZpbmRfZW5kKF9Gb3J3YXJkSXRlcjEgX19maXJzdDEsIF9Gb3J3YXJkSXRlcjEgX19sYXN0MSwKKyAgICAgICAgIF9Gb3J3YXJkSXRlcjIgX19maXJzdDIsIF9Gb3J3YXJkSXRlcjIgX19sYXN0Mik7CisKKy8vIHN3YXBfcmFuZ2VzCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyMSwgY2xhc3MgX0ZvcndhcmRJdGVyMj4KK19TVExQX0lOTElORV9MT09QIF9Gb3J3YXJkSXRlcjIKK3N3YXBfcmFuZ2VzKF9Gb3J3YXJkSXRlcjEgX19maXJzdDEsIF9Gb3J3YXJkSXRlcjEgX19sYXN0MSwgX0ZvcndhcmRJdGVyMiBfX2ZpcnN0MikgeworICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdDEsIF9fbGFzdDEpKQorICBmb3IgKCA7IF9fZmlyc3QxICE9IF9fbGFzdDE7ICsrX19maXJzdDEsICsrX19maXJzdDIpCisgICAgaXRlcl9zd2FwKF9fZmlyc3QxLCBfX2ZpcnN0Mik7CisgIHJldHVybiBfX2ZpcnN0MjsKK30KKworLy8gdHJhbnNmb3JtCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX091dHB1dEl0ZXIsIGNsYXNzIF9VbmFyeU9wZXJhdGlvbj4KK19TVExQX0lOTElORV9MT09QIF9PdXRwdXRJdGVyCit0cmFuc2Zvcm0oX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwgX091dHB1dEl0ZXIgX19yZXN1bHQsIF9VbmFyeU9wZXJhdGlvbiBfX29wcikgeworICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKKyAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0LCArK19fcmVzdWx0KQorICAgICpfX3Jlc3VsdCA9IF9fb3ByKCpfX2ZpcnN0KTsKKyAgcmV0dXJuIF9fcmVzdWx0OworfQordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMiwgY2xhc3MgX091dHB1dEl0ZXIsIGNsYXNzIF9CaW5hcnlPcGVyYXRpb24+CitfU1RMUF9JTkxJTkVfTE9PUCBfT3V0cHV0SXRlcgordHJhbnNmb3JtKF9JbnB1dEl0ZXIxIF9fZmlyc3QxLCBfSW5wdXRJdGVyMSBfX2xhc3QxLAorICAgICAgICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyLCBfT3V0cHV0SXRlciBfX3Jlc3VsdCxfQmluYXJ5T3BlcmF0aW9uIF9fYmluYXJ5X29wKSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0MSwgX19sYXN0MSkpCisgIGZvciAoIDsgX19maXJzdDEgIT0gX19sYXN0MTsgKytfX2ZpcnN0MSwgKytfX2ZpcnN0MiwgKytfX3Jlc3VsdCkKKyAgICAqX19yZXN1bHQgPSBfX2JpbmFyeV9vcCgqX19maXJzdDEsICpfX2ZpcnN0Mik7CisgIHJldHVybiBfX3Jlc3VsdDsKK30KKworLy8gcmVwbGFjZV9pZiwgcmVwbGFjZV9jb3B5LCByZXBsYWNlX2NvcHlfaWYKKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1ByZWRpY2F0ZSwgY2xhc3MgX1RwPgorX1NUTFBfSU5MSU5FX0xPT1Agdm9pZAorcmVwbGFjZV9pZihfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwgX1ByZWRpY2F0ZSBfX3ByZWQsIGNvbnN0IF9UcCYgX19uZXdfdmFsdWUpIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKyAgICBpZiAoX19wcmVkKCpfX2ZpcnN0KSkKKyAgICAgICpfX2ZpcnN0ID0gX19uZXdfdmFsdWU7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfT3V0cHV0SXRlciwgY2xhc3MgX1RwPgorX1NUTFBfSU5MSU5FX0xPT1AgIF9PdXRwdXRJdGVyCityZXBsYWNlX2NvcHkoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCxfT3V0cHV0SXRlciBfX3Jlc3VsdCwKKyAgICAgICAgICAgICBjb25zdCBfVHAmIF9fb2xkX3ZhbHVlLCBjb25zdCBfVHAmIF9fbmV3X3ZhbHVlKSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QsICsrX19yZXN1bHQpCisgICAgKl9fcmVzdWx0ID0gKl9fZmlyc3QgPT0gX19vbGRfdmFsdWUgPyBfX25ld192YWx1ZSA6ICpfX2ZpcnN0OworICByZXR1cm4gX19yZXN1bHQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3IsIGNsYXNzIF9PdXRwdXRJdGVyLCBjbGFzcyBfUHJlZGljYXRlLCBjbGFzcyBfVHA+CitfU1RMUF9JTkxJTkVfTE9PUCBfT3V0cHV0SXRlcgorcmVwbGFjZV9jb3B5X2lmKF9JdGVyYXRvciBfX2ZpcnN0LCBfSXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyIF9fcmVzdWx0LAorICAgICAgICAgICAgICAgIF9QcmVkaWNhdGUgX19wcmVkLCBjb25zdCBfVHAmIF9fbmV3X3ZhbHVlKSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QsICsrX19yZXN1bHQpCisgICAgKl9fcmVzdWx0ID0gX19wcmVkKCpfX2ZpcnN0KSA/IF9fbmV3X3ZhbHVlIDogKl9fZmlyc3Q7CisgIHJldHVybiBfX3Jlc3VsdDsKK30KKworLy8gZ2VuZXJhdGUgYW5kIGdlbmVyYXRlX24KKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX0dlbmVyYXRvcj4KK19TVExQX0lOTElORV9MT09QIHZvaWQKK2dlbmVyYXRlKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LCBfR2VuZXJhdG9yIF9fZ2VuKSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisgICAgKl9fZmlyc3QgPSBfX2dlbigpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX091dHB1dEl0ZXIsIGNsYXNzIF9TaXplLCBjbGFzcyBfR2VuZXJhdG9yPgorX1NUTFBfSU5MSU5FX0xPT1Agdm9pZAorZ2VuZXJhdGVfbihfT3V0cHV0SXRlciBfX2ZpcnN0LCBfU2l6ZSBfX24sIF9HZW5lcmF0b3IgX19nZW4pIHsKKyAgZm9yICggOyBfX24gPiAwOyAtLV9fbiwgKytfX2ZpcnN0KQorICAgICpfX2ZpcnN0ID0gX19nZW4oKTsKK30KKworLy8gcmVtb3ZlLCByZW1vdmVfaWYsIHJlbW92ZV9jb3B5LCByZW1vdmVfY29weV9pZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX091dHB1dEl0ZXIsIGNsYXNzIF9UcD4KK19TVExQX0lOTElORV9MT09QIF9PdXRwdXRJdGVyCityZW1vdmVfY29weShfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LF9PdXRwdXRJdGVyIF9fcmVzdWx0LCBjb25zdCBfVHAmIF9fdmFsKSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpIHsKKyAgICBpZiAoISgqX19maXJzdCA9PSBfX3ZhbCkpIHsKKyAgICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0OworICAgICAgKytfX3Jlc3VsdDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIF9fcmVzdWx0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX091dHB1dEl0ZXIsIGNsYXNzIF9QcmVkaWNhdGU+CitfU1RMUF9JTkxJTkVfTE9PUCBfT3V0cHV0SXRlcgorcmVtb3ZlX2NvcHlfaWYoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwgX091dHB1dEl0ZXIgX19yZXN1bHQsIF9QcmVkaWNhdGUgX19wcmVkKSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpIHsKKyAgICBpZiAoIV9fcHJlZCgqX19maXJzdCkpIHsKKyAgICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0OworICAgICAgKytfX3Jlc3VsdDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIF9fcmVzdWx0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfVHA+CitfU1RMUF9JTkxJTkVfTE9PUCBfRm9yd2FyZEl0ZXIKK3JlbW92ZShfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwgY29uc3QgX1RwJiBfX3ZhbCkgeworICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKKyAgX19maXJzdCA9IGZpbmQoX19maXJzdCwgX19sYXN0LCBfX3ZhbCk7CisgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKyAgICByZXR1cm4gX19maXJzdDsKKyAgZWxzZSB7CisgICAgX0ZvcndhcmRJdGVyIF9fbmV4dCA9IF9fZmlyc3Q7CisgICAgcmV0dXJuIHJlbW92ZV9jb3B5KCsrX19uZXh0LCBfX2xhc3QsIF9fZmlyc3QsIF9fdmFsKTsKKyAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfUHJlZGljYXRlPgorX1NUTFBfSU5MSU5FX0xPT1AgX0ZvcndhcmRJdGVyCityZW1vdmVfaWYoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsIF9QcmVkaWNhdGUgX19wcmVkKSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICBfX2ZpcnN0ID0gZmluZF9pZihfX2ZpcnN0LCBfX2xhc3QsIF9fcHJlZCk7CisgIGlmICggX19maXJzdCA9PSBfX2xhc3QgKQorICAgIHJldHVybiBfX2ZpcnN0OworICBlbHNlIHsKKyAgICBfRm9yd2FyZEl0ZXIgX19uZXh0ID0gX19maXJzdDsKKyAgICByZXR1cm4gcmVtb3ZlX2NvcHlfaWYoKytfX25leHQsIF9fbGFzdCwgX19maXJzdCwgX19wcmVkKTsKKyAgfQorfQorCisvLyB1bmlxdWUgYW5kIHVuaXF1ZV9jb3B5Cit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX091dHB1dEl0ZXI+CitfT3V0cHV0SXRlciB1bmlxdWVfY29weShfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LCBfT3V0cHV0SXRlciBfX3Jlc3VsdCk7CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfT3V0cHV0SXRlciwgY2xhc3MgX0JpbmFyeVByZWRpY2F0ZT4KK19PdXRwdXRJdGVyIHVuaXF1ZV9jb3B5KF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsX091dHB1dEl0ZXIgX19yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICBfQmluYXJ5UHJlZGljYXRlIF9fYmluYXJ5X3ByZWQpOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyPgoraW5saW5lIF9Gb3J3YXJkSXRlciB1bmlxdWUoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QpIHsKKyAgX19maXJzdCA9IGFkamFjZW50X2ZpbmQoX19maXJzdCwgX19sYXN0KTsKKyAgcmV0dXJuIHVuaXF1ZV9jb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19maXJzdCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9CaW5hcnlQcmVkaWNhdGU+CitpbmxpbmUgX0ZvcndhcmRJdGVyIHVuaXF1ZShfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9CaW5hcnlQcmVkaWNhdGUgX19iaW5hcnlfcHJlZCkgeworICBfX2ZpcnN0ID0gYWRqYWNlbnRfZmluZChfX2ZpcnN0LCBfX2xhc3QsIF9fYmluYXJ5X3ByZWQpOworICByZXR1cm4gdW5pcXVlX2NvcHkoX19maXJzdCwgX19sYXN0LCBfX2ZpcnN0LCBfX2JpbmFyeV9wcmVkKTsKK30KKworLy8gcmV2ZXJzZSBhbmQgcmV2ZXJzZV9jb3B5LCBhbmQgdGhlaXIgYXV4aWxpYXJ5IGZ1bmN0aW9ucworCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyPgorX1NUTFBfSU5MSU5FX0xPT1Agdm9pZAorX19yZXZlcnNlKF9CaWRpcmVjdGlvbmFsSXRlciBfX2ZpcnN0LCBfQmlkaXJlY3Rpb25hbEl0ZXIgX19sYXN0LCBjb25zdCBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZyAmKSB7CisgIGZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdCAmJiBfX2ZpcnN0ICE9IC0tX19sYXN0OyArK19fZmlyc3QpCisgICAgaXRlcl9zd2FwKF9fZmlyc3QsX19sYXN0KTsKK30KKworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXI+CitfU1RMUF9JTkxJTkVfTE9PUCB2b2lkCitfX3JldmVyc2UoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0LCBjb25zdCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyAmKSB7CisgIGZvciAoOyBfX2ZpcnN0IDwgX19sYXN0OyArK19fZmlyc3QpCisgICAgaXRlcl9zd2FwKF9fZmlyc3QsIC0tX19sYXN0KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcj4KK2lubGluZSB2b2lkCityZXZlcnNlKF9CaWRpcmVjdGlvbmFsSXRlciBfX2ZpcnN0LCBfQmlkaXJlY3Rpb25hbEl0ZXIgX19sYXN0KSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICBfX3JldmVyc2UoX19maXJzdCwgX19sYXN0LCBfU1RMUF9JVEVSQVRPUl9DQVRFR09SWShfX2ZpcnN0LCBfQmlkaXJlY3Rpb25hbEl0ZXIpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlciwgY2xhc3MgX091dHB1dEl0ZXI+CitfU1RMUF9JTkxJTkVfTE9PUAorX091dHB1dEl0ZXIgcmV2ZXJzZV9jb3B5KF9CaWRpcmVjdGlvbmFsSXRlciBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXIgX19yZXN1bHQpIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkgeworICAgIC0tX19sYXN0OworICAgICpfX3Jlc3VsdCA9ICpfX2xhc3Q7CisgICAgKytfX3Jlc3VsdDsKKyAgfQorICByZXR1cm4gX19yZXN1bHQ7Cit9CisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKworLy8gcm90YXRlIGFuZCByb3RhdGVfY29weSwgYW5kIHRoZWlyIGF1eGlsaWFyeSBmdW5jdGlvbnMKK3RlbXBsYXRlIDxjbGFzcyBfRXVjbGlkZWFuUmluZ0VsZW1lbnQ+CitfU1RMUF9JTkxJTkVfTE9PUAorX0V1Y2xpZGVhblJpbmdFbGVtZW50IF9fZ2NkKF9FdWNsaWRlYW5SaW5nRWxlbWVudCBfX20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0V1Y2xpZGVhblJpbmdFbGVtZW50IF9fbikgeworICB3aGlsZSAoX19uICE9IDApIHsKKyAgICBfRXVjbGlkZWFuUmluZ0VsZW1lbnQgX190ID0gX19tICUgX19uOworICAgIF9fbSA9IF9fbjsKKyAgICBfX24gPSBfX3Q7CisgIH0KKyAgcmV0dXJuIF9fbTsKK30KKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXI+Cit2b2lkIHJvdGF0ZShfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbWlkZGxlLCBfRm9yd2FyZEl0ZXIgX19sYXN0KTsKKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX091dHB1dEl0ZXI+CitpbmxpbmUgX091dHB1dEl0ZXIgcm90YXRlX2NvcHkoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX21pZGRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXIgX19sYXN0LCBfT3V0cHV0SXRlciBfX3Jlc3VsdCkgeworICByZXR1cm4gY29weShfX2ZpcnN0LCBfX21pZGRsZSwgY29weShfX21pZGRsZSwgX19sYXN0LCBfX3Jlc3VsdCkpOworfQorCisvLyByYW5kb21fc2h1ZmZsZQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXI+Cit2b2lkIHJhbmRvbV9zaHVmZmxlKF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCk7CisKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX1JhbmRvbU51bWJlckdlbmVyYXRvcj4KK3ZvaWQgcmFuZG9tX3NodWZmbGUoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICBfUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3JhbmQpOworCisjaWYgIWRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpCisvLyByYW5kb21fc2FtcGxlIGFuZCByYW5kb21fc2FtcGxlX24gKGV4dGVuc2lvbnMsIG5vdCBwYXJ0IG9mIHRoZSBzdGFuZGFyZCkuCisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9PdXRwdXRJdGVyLCBjbGFzcyBfRGlzdGFuY2U+CitfT3V0cHV0SXRlciByYW5kb21fc2FtcGxlX24oX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXIgX19vdXRfaXRlLCBjb25zdCBfRGlzdGFuY2UgX19uKTsKKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX091dHB1dEl0ZXIsIGNsYXNzIF9EaXN0YW5jZSwKKyAgICAgICAgICBjbGFzcyBfUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorX091dHB1dEl0ZXIgcmFuZG9tX3NhbXBsZV9uKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyIF9fb3V0X2l0ZSwgY29uc3QgX0Rpc3RhbmNlIF9fbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3JhbmQpOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXI+CitfUmFuZG9tQWNjZXNzSXRlcgorcmFuZG9tX3NhbXBsZShfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX291dF9maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIgX19vdXRfbGFzdCk7CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwKKyAgICAgICAgICBjbGFzcyBfUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorX1JhbmRvbUFjY2Vzc0l0ZXIKK3JhbmRvbV9zYW1wbGUoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19vdXRfZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyIF9fb3V0X2xhc3QsCisgICAgICAgICAgICAgIF9SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fcmFuZCk7CisKKyNlbmRpZiAvKiBfU1RMUF9OT19FWFRFTlNJT05TICovCisKKy8vIHBhcnRpdGlvbiwgc3RhYmxlX3BhcnRpdGlvbiwgYW5kIHRoZWlyIGF1eGlsaWFyeSBmdW5jdGlvbnMKKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1ByZWRpY2F0ZT4KK19Gb3J3YXJkSXRlciBwYXJ0aXRpb24oX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsIF9QcmVkaWNhdGUgICBfX3ByZWQpOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfUHJlZGljYXRlPgorX0ZvcndhcmRJdGVyCitzdGFibGVfcGFydGl0aW9uKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LCBfUHJlZGljYXRlIF9fcHJlZCk7CisKKy8vIHNvcnQoKSBhbmQgaXRzIGF1eGlsaWFyeSBmdW5jdGlvbnMuCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfU2l6ZT4KK2lubGluZSBfU2l6ZSBfX2xnKF9TaXplIF9fbikgeworICBfU2l6ZSBfX2s7CisgIGZvciAoX19rID0gMDsgX19uICE9IDE7IF9fbiA+Pj0gMSkgKytfX2s7CisgIHJldHVybiBfX2s7Cit9CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXI+Cit2b2lkIHNvcnQoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0KTsKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX0NvbXBhcmU+Cit2b2lkIHNvcnQoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0LCBfQ29tcGFyZSBfX2NvbXApOworCisvLyBzdGFibGVfc29ydCgpIGFuZCBpdHMgYXV4aWxpYXJ5IGZ1bmN0aW9ucy4KK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcj4KK3ZvaWQgc3RhYmxlX3NvcnQoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwKKyAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0KTsKKwordGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyLCBjbGFzcyBfQ29tcGFyZT4KK3ZvaWQgc3RhYmxlX3NvcnQoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwKKyAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0LCBfQ29tcGFyZSBfX2NvbXApOworCisvLyBwYXJ0aWFsX3NvcnQsIHBhcnRpYWxfc29ydF9jb3B5LCBhbmQgYXV4aWxpYXJ5IGZ1bmN0aW9ucy4KKwordGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyPgordm9pZCBwYXJ0aWFsX3NvcnQoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIgX19taWRkbGUsCisgICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QpOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9Db21wYXJlPgordm9pZCBwYXJ0aWFsX3NvcnQoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCxfUmFuZG9tQWNjZXNzSXRlciBfX21pZGRsZSwKKyAgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCwgX0NvbXBhcmUgX19jb21wKTsKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyPgorX1JhbmRvbUFjY2Vzc0l0ZXIKK3BhcnRpYWxfc29ydF9jb3B5KF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX3Jlc3VsdF9maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIgX19yZXN1bHRfbGFzdCk7CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX0NvbXBhcmU+CitfUmFuZG9tQWNjZXNzSXRlcgorcGFydGlhbF9zb3J0X2NvcHkoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fcmVzdWx0X2ZpcnN0LAorICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19yZXN1bHRfbGFzdCwgX0NvbXBhcmUgX19jb21wKTsKKworLy8gbnRoX2VsZW1lbnQoKSBhbmQgaXRzIGF1eGlsaWFyeSBmdW5jdGlvbnMuCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXI+Cit2b2lkIG50aF9lbGVtZW50KF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyIF9fbnRoLAorICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QpOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9Db21wYXJlPgordm9pZCBudGhfZWxlbWVudChfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlciBfX250aCwKKyAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0LCBfQ29tcGFyZSBfX2NvbXApOworCisvLyBhdXhpbGlhcnkgY2xhc3MgZm9yIGxvd2VyX2JvdW5kLCBldGMuCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KK3N0cnVjdCBfX2xlc3NfMiB7CisgIGJvb2wgb3BlcmF0b3IoKSAoY29uc3QgX1QxJiBfX3gsIGNvbnN0IF9UMiYgX195KSBjb25zdCB7IHJldHVybiBfX3ggPCBfX3kgOyB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+CitfX2xlc3NfMjxfVDEsX1QyPiBfX2xlc3MyKF9UMSosIF9UMiogKSB7IHJldHVybiBfX2xlc3NfMjxfVDEsIF9UMj4oKTsgfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfRlVOQ1RJT05fUEFSVElBTF9PUkRFUikKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitsZXNzPF9UcD4gX19sZXNzMihfVHAqLCBfVHAqICkgeyByZXR1cm4gbGVzczxfVHA+KCk7IH0KKyNlbmRpZgorCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKworLy8gQmluYXJ5IHNlYXJjaCAobG93ZXJfYm91bmQsIHVwcGVyX2JvdW5kLCBlcXVhbF9yYW5nZSwgYmluYXJ5X3NlYXJjaCkuCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfVHA+CitpbmxpbmUgX0ZvcndhcmRJdGVyIGxvd2VyX2JvdW5kKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfVHAmIF9fdmFsKSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICByZXR1cm4gX1NUTFBfUFJJViBfX2xvd2VyX2JvdW5kKF9fZmlyc3QsIF9fbGFzdCwgX192YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfX2xlc3MyKF9TVExQX1ZBTFVFX1RZUEUoX19maXJzdCwgX0ZvcndhcmRJdGVyKSwgKF9UcCopMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfX2xlc3MyKChfVHAqKTAsIF9TVExQX1ZBTFVFX1RZUEUoX19maXJzdCwgX0ZvcndhcmRJdGVyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfRElTVEFOQ0VfVFlQRShfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZT4KK2lubGluZSBfRm9yd2FyZEl0ZXIgbG93ZXJfYm91bmQoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9UcCYgX192YWwsIF9Db21wYXJlIF9fY29tcCkgeworICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKKyAgcmV0dXJuIF9TVExQX1BSSVYgX19sb3dlcl9ib3VuZChfX2ZpcnN0LCBfX2xhc3QsIF9fdmFsLCBfX2NvbXAsIF9fY29tcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9ESVNUQU5DRV9UWVBFKF9fZmlyc3QsIF9Gb3J3YXJkSXRlcikpOworfQorCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmUxLCBjbGFzcyBfQ29tcGFyZTIsIGNsYXNzIF9EaXN0YW5jZT4KK19Gb3J3YXJkSXRlciBfX3VwcGVyX2JvdW5kKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LCBjb25zdCBfVHAmIF9fdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NvbXBhcmUxIF9fY29tcDEsIF9Db21wYXJlMiBfX2NvbXAyLCBfRGlzdGFuY2UqKTsKKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9UcD4KK2lubGluZSBfRm9yd2FyZEl0ZXIgdXBwZXJfYm91bmQoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9UcCYgX192YWwpIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgIHJldHVybiBfU1RMUF9QUklWIF9fdXBwZXJfYm91bmQoX19maXJzdCwgX19sYXN0LCBfX3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fbGVzczIoX1NUTFBfVkFMVUVfVFlQRShfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIpLCAoX1RwKikwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fbGVzczIoKF9UcCopMCwgX1NUTFBfVkFMVUVfVFlQRShfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9ESVNUQU5DRV9UWVBFKF9fZmlyc3QsIF9Gb3J3YXJkSXRlcikpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlPgoraW5saW5lIF9Gb3J3YXJkSXRlciB1cHBlcl9ib3VuZChfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1RwJiBfX3ZhbCwgX0NvbXBhcmUgX19jb21wKSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICByZXR1cm4gX1NUTFBfUFJJViBfX3VwcGVyX2JvdW5kKF9fZmlyc3QsIF9fbGFzdCwgX192YWwsIF9fY29tcCwgX19jb21wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX0RJU1RBTkNFX1RZUEUoX19maXJzdCwgX0ZvcndhcmRJdGVyKSk7Cit9CisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZTEsIGNsYXNzIF9Db21wYXJlMiwgY2xhc3MgX0Rpc3RhbmNlPgorcGFpcjxfRm9yd2FyZEl0ZXIsIF9Gb3J3YXJkSXRlcj4KK19fZXF1YWxfcmFuZ2UoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsIGNvbnN0IF9UcCYgX192YWwsCisgICAgICAgICAgICAgIF9Db21wYXJlMSBfX2NvbXAxLCBfQ29tcGFyZTIgX19jb21wMiwgX0Rpc3RhbmNlKik7CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfVHA+CitpbmxpbmUgcGFpcjxfRm9yd2FyZEl0ZXIsIF9Gb3J3YXJkSXRlcj4KK2VxdWFsX3JhbmdlKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LCBjb25zdCBfVHAmIF9fdmFsKSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICByZXR1cm4gX1NUTFBfUFJJViBfX2VxdWFsX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCwgX192YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfX2xlc3MyKF9TVExQX1ZBTFVFX1RZUEUoX19maXJzdCwgX0ZvcndhcmRJdGVyKSwgKF9UcCopMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfX2xlc3MyKChfVHAqKTAsIF9TVExQX1ZBTFVFX1RZUEUoX19maXJzdCwgX0ZvcndhcmRJdGVyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfRElTVEFOQ0VfVFlQRShfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZT4KK2lubGluZSBwYWlyPF9Gb3J3YXJkSXRlciwgX0ZvcndhcmRJdGVyPgorZXF1YWxfcmFuZ2UoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsIGNvbnN0IF9UcCYgX192YWwsCisgICAgICAgICAgICBfQ29tcGFyZSBfX2NvbXApIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgIHJldHVybiBfU1RMUF9QUklWIF9fZXF1YWxfcmFuZ2UoX19maXJzdCwgX19sYXN0LCBfX3ZhbCwgX19jb21wLCBfX2NvbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfRElTVEFOQ0VfVFlQRShfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1RwPgoraW5saW5lIGJvb2wgYmluYXJ5X3NlYXJjaChfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBfVHAmIF9fdmFsKSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICBfRm9yd2FyZEl0ZXIgX19pID0gX1NUTFBfUFJJViBfX2xvd2VyX2JvdW5kKF9fZmlyc3QsIF9fbGFzdCwgX192YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfX2xlc3MyKF9TVExQX1ZBTFVFX1RZUEUoX19maXJzdCwgX0ZvcndhcmRJdGVyKSwgKF9UcCopMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfX2xlc3MyKChfVHAqKTAsIF9TVExQX1ZBTFVFX1RZUEUoX19maXJzdCwgX0ZvcndhcmRJdGVyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfRElTVEFOQ0VfVFlQRShfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIpKTsKKyAgcmV0dXJuIF9faSAhPSBfX2xhc3QgJiYgIShfX3ZhbCA8ICpfX2kpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlPgoraW5saW5lIGJvb2wgYmluYXJ5X3NlYXJjaChfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1RwJiBfX3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX0NvbXBhcmUgX19jb21wKSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICBfRm9yd2FyZEl0ZXIgX19pID0gX1NUTFBfUFJJViBfX2xvd2VyX2JvdW5kKF9fZmlyc3QsIF9fbGFzdCwgX192YWwsIF9fY29tcCwgX19jb21wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX0RJU1RBTkNFX1RZUEUoX19maXJzdCwgX0ZvcndhcmRJdGVyKSk7CisgIHJldHVybiBfX2kgIT0gX19sYXN0ICYmICFfX2NvbXAoX192YWwsICpfX2kpOworfQorCisvLyBtZXJnZSwgd2l0aCBhbmQgd2l0aG91dCBhbiBleHBsaWNpdGx5IHN1cHBsaWVkIGNvbXBhcmlzb24gZnVuY3Rpb24uCisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0SXRlcjIsIGNsYXNzIF9PdXRwdXRJdGVyPgorX091dHB1dEl0ZXIgbWVyZ2UoX0lucHV0SXRlcjEgX19maXJzdDEsIF9JbnB1dEl0ZXIxIF9fbGFzdDEsCisgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyMiBfX2ZpcnN0MiwgX0lucHV0SXRlcjIgX19sYXN0MiwKKyAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyIF9fcmVzdWx0KTsKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMiwgY2xhc3MgX091dHB1dEl0ZXIsCisgICAgICAgICAgY2xhc3MgX0NvbXBhcmU+CitfT3V0cHV0SXRlciBtZXJnZShfSW5wdXRJdGVyMSBfX2ZpcnN0MSwgX0lucHV0SXRlcjEgX19sYXN0MSwKKyAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyLCBfSW5wdXRJdGVyMiBfX2xhc3QyLAorICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXIgX19yZXN1bHQsIF9Db21wYXJlIF9fY29tcCk7CisKKworLy8gaW5wbGFjZV9tZXJnZSBhbmQgaXRzIGF1eGlsaWFyeSBmdW5jdGlvbnMuCisKKwordGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcj4KK3ZvaWQgaW5wbGFjZV9tZXJnZShfQmlkaXJlY3Rpb25hbEl0ZXIgX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIgX19taWRkbGUsCisgICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyIF9fbGFzdCkgOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyLCBjbGFzcyBfQ29tcGFyZT4KK3ZvaWQgaW5wbGFjZV9tZXJnZShfQmlkaXJlY3Rpb25hbEl0ZXIgX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIgX19taWRkbGUsCisgICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyIF9fbGFzdCwgX0NvbXBhcmUgX19jb21wKTsKKworLy8gU2V0IGFsZ29yaXRobXM6IGluY2x1ZGVzLCBzZXRfdW5pb24sIHNldF9pbnRlcnNlY3Rpb24sIHNldF9kaWZmZXJlbmNlLAorLy8gc2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlLiAgQWxsIG9mIHRoZXNlIGFsZ29yaXRobXMgaGF2ZSB0aGUgcHJlY29uZGl0aW9uCisvLyB0aGF0IHRoZWlyIGlucHV0IHJhbmdlcyBhcmUgc29ydGVkIGFuZCB0aGUgcG9zdGNvbmRpdGlvbiB0aGF0IHRoZWlyIG91dHB1dAorLy8gcmFuZ2VzIGFyZSBzb3J0ZWQuCisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0SXRlcjI+Citib29sIGluY2x1ZGVzKF9JbnB1dEl0ZXIxIF9fZmlyc3QxLCBfSW5wdXRJdGVyMSBfX2xhc3QxLAorICAgICAgICAgICAgICBfSW5wdXRJdGVyMiBfX2ZpcnN0MiwgX0lucHV0SXRlcjIgX19sYXN0Mik7CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0SXRlcjIsIGNsYXNzIF9Db21wYXJlPgorYm9vbCBpbmNsdWRlcyhfSW5wdXRJdGVyMSBfX2ZpcnN0MSwgX0lucHV0SXRlcjEgX19sYXN0MSwKKyAgICAgICAgICAgICAgX0lucHV0SXRlcjIgX19maXJzdDIsIF9JbnB1dEl0ZXIyIF9fbGFzdDIsIF9Db21wYXJlIF9fY29tcCk7CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0SXRlcjIsIGNsYXNzIF9PdXRwdXRJdGVyPgorX091dHB1dEl0ZXIgc2V0X3VuaW9uKF9JbnB1dEl0ZXIxIF9fZmlyc3QxLCBfSW5wdXRJdGVyMSBfX2xhc3QxLAorICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyLCBfSW5wdXRJdGVyMiBfX2xhc3QyLAorICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyIF9fcmVzdWx0KTsKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMiwgY2xhc3MgX091dHB1dEl0ZXIsCisgICAgICAgICAgY2xhc3MgX0NvbXBhcmU+CitfT3V0cHV0SXRlciBzZXRfdW5pb24oX0lucHV0SXRlcjEgX19maXJzdDEsIF9JbnB1dEl0ZXIxIF9fbGFzdDEsCisgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcjIgX19maXJzdDIsIF9JbnB1dEl0ZXIyIF9fbGFzdDIsCisgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXIgX19yZXN1bHQsIF9Db21wYXJlIF9fY29tcCk7CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0SXRlcjIsIGNsYXNzIF9PdXRwdXRJdGVyPgorX091dHB1dEl0ZXIgc2V0X2ludGVyc2VjdGlvbihfSW5wdXRJdGVyMSBfX2ZpcnN0MSwgX0lucHV0SXRlcjEgX19sYXN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcjIgX19maXJzdDIsIF9JbnB1dEl0ZXIyIF9fbGFzdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyIF9fcmVzdWx0KTsKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMiwgY2xhc3MgX091dHB1dEl0ZXIsCisgICAgICAgICAgY2xhc3MgX0NvbXBhcmU+CitfT3V0cHV0SXRlciBzZXRfaW50ZXJzZWN0aW9uKF9JbnB1dEl0ZXIxIF9fZmlyc3QxLCBfSW5wdXRJdGVyMSBfX2xhc3QxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyMiBfX2ZpcnN0MiwgX0lucHV0SXRlcjIgX19sYXN0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXIgX19yZXN1bHQsIF9Db21wYXJlIF9fY29tcCk7CisKKworCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcjEsIGNsYXNzIF9JbnB1dEl0ZXIyLCBjbGFzcyBfT3V0cHV0SXRlcj4KK19PdXRwdXRJdGVyIHNldF9kaWZmZXJlbmNlKF9JbnB1dEl0ZXIxIF9fZmlyc3QxLCBfSW5wdXRJdGVyMSBfX2xhc3QxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcjIgX19maXJzdDIsIF9JbnB1dEl0ZXIyIF9fbGFzdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlciBfX3Jlc3VsdCk7CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0SXRlcjIsIGNsYXNzIF9PdXRwdXRJdGVyLAorICAgICAgICAgIGNsYXNzIF9Db21wYXJlPgorX091dHB1dEl0ZXIgc2V0X2RpZmZlcmVuY2UoX0lucHV0SXRlcjEgX19maXJzdDEsIF9JbnB1dEl0ZXIxIF9fbGFzdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyMiBfX2ZpcnN0MiwgX0lucHV0SXRlcjIgX19sYXN0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyIF9fcmVzdWx0LCBfQ29tcGFyZSBfX2NvbXApOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcjEsIGNsYXNzIF9JbnB1dEl0ZXIyLCBjbGFzcyBfT3V0cHV0SXRlcj4KK19PdXRwdXRJdGVyCitzZXRfc3ltbWV0cmljX2RpZmZlcmVuY2UoX0lucHV0SXRlcjEgX19maXJzdDEsIF9JbnB1dEl0ZXIxIF9fbGFzdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcjIgX19maXJzdDIsIF9JbnB1dEl0ZXIyIF9fbGFzdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXIgX19yZXN1bHQpOworCisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0SXRlcjIsIGNsYXNzIF9PdXRwdXRJdGVyLAorICAgICAgICAgIGNsYXNzIF9Db21wYXJlPgorX091dHB1dEl0ZXIKK3NldF9zeW1tZXRyaWNfZGlmZmVyZW5jZShfSW5wdXRJdGVyMSBfX2ZpcnN0MSwgX0lucHV0SXRlcjEgX19sYXN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyMiBfX2ZpcnN0MiwgX0lucHV0SXRlcjIgX19sYXN0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlciBfX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfQ29tcGFyZSBfX2NvbXApOworCisKKy8vIG1pbl9lbGVtZW50IGFuZCBtYXhfZWxlbWVudCwgd2l0aCBhbmQgd2l0aG91dCBhbiBleHBsaWNpdGx5IHN1cHBsaWVkCisvLyBjb21wYXJpc29uIGZ1bmN0aW9uLgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyPgorX0ZvcndhcmRJdGVyIG1heF9lbGVtZW50KF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0KTsKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9Db21wYXJlPgorX0ZvcndhcmRJdGVyIG1heF9lbGVtZW50KF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Db21wYXJlIF9fY29tcCk7CisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXI+CitfRm9yd2FyZEl0ZXIgbWluX2VsZW1lbnQoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QpOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfQ29tcGFyZT4KK19Gb3J3YXJkSXRlciBtaW5fZWxlbWVudChfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ29tcGFyZSBfX2NvbXApOworCisvLyBuZXh0X3Blcm11dGF0aW9uIGFuZCBwcmV2X3Blcm11dGF0aW9uLCB3aXRoIGFuZCB3aXRob3V0IGFuIGV4cGxpY2l0bHkKKy8vIHN1cHBsaWVkIGNvbXBhcmlzb24gZnVuY3Rpb24uCisKK3RlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXI+Citib29sIG5leHRfcGVybXV0YXRpb24oX0JpZGlyZWN0aW9uYWxJdGVyIF9fZmlyc3QsIF9CaWRpcmVjdGlvbmFsSXRlciBfX2xhc3QpOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyLCBjbGFzcyBfQ29tcGFyZT4KK2Jvb2wgbmV4dF9wZXJtdXRhdGlvbihfQmlkaXJlY3Rpb25hbEl0ZXIgX19maXJzdCwgX0JpZGlyZWN0aW9uYWxJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICBfQ29tcGFyZSBfX2NvbXApOworCisKK3RlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXI+Citib29sIHByZXZfcGVybXV0YXRpb24oX0JpZGlyZWN0aW9uYWxJdGVyIF9fZmlyc3QsIF9CaWRpcmVjdGlvbmFsSXRlciBfX2xhc3QpOworCisKK3RlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXIsIGNsYXNzIF9Db21wYXJlPgorYm9vbCBwcmV2X3Blcm11dGF0aW9uKF9CaWRpcmVjdGlvbmFsSXRlciBfX2ZpcnN0LCBfQmlkaXJlY3Rpb25hbEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgIF9Db21wYXJlIF9fY29tcCk7CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKKy8vIGlzX2hlYXAsIGEgcHJlZGljYXRlIHRlc3Rpbmcgd2hldGhlciBvciBub3QgYSByYW5nZSBpcworLy8gYSBoZWFwLiAgVGhpcyBmdW5jdGlvbiBpcyBhbiBleHRlbnNpb24sIG5vdCBwYXJ0IG9mIHRoZSBDKysKKy8vIHN0YW5kYXJkLgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXI+Citib29sIGlzX2hlYXAoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0KTsKKwordGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyLCBjbGFzcyBfU3RyaWN0V2Vha09yZGVyaW5nPgorYm9vbCBpc19oZWFwKF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICBfU3RyaWN0V2Vha09yZGVyaW5nIF9fY29tcCk7CisKKy8vIGlzX3NvcnRlZCwgYSBwcmVkaWNhdGVkIHRlc3Rpbmcgd2hldGhlciBhIHJhbmdlIGlzIHNvcnRlZCBpbgorLy8gbm9uZGVzY2VuZGluZyBvcmRlci4gIFRoaXMgaXMgYW4gZXh0ZW5zaW9uLCBub3QgcGFydCBvZiB0aGUgQysrCisvLyBzdGFuZGFyZC4KK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1N0cmljdFdlYWtPcmRlcmluZz4KK2Jvb2wgX19pc19zb3J0ZWQoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgIF9TdHJpY3RXZWFrT3JkZXJpbmcgX19jb21wKTsKKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyPgoraW5saW5lIGJvb2wgaXNfc29ydGVkKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0KSB7CisgIHJldHVybiBfU1RMUF9QUklWIF9faXNfc29ydGVkKF9fZmlyc3QsIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfX2xlc3MoX1NUTFBfVkFMVUVfVFlQRShfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIpKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9TdHJpY3RXZWFrT3JkZXJpbmc+CitpbmxpbmUgYm9vbCBpc19zb3J0ZWQoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgX1N0cmljdFdlYWtPcmRlcmluZyBfX2NvbXApIHsKKyAgcmV0dXJuIF9TVExQX1BSSVYgX19pc19zb3J0ZWQoX19maXJzdCwgX19sYXN0LCBfX2NvbXApOworfQorI2VuZGlmCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2lmICFkZWZpbmVkIChfU1RMUF9MSU5LX1RJTUVfSU5TVEFOVElBVElPTikKKyMgIGluY2x1ZGUgPHN0bC9fYWxnby5jPgorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9BTEdPX0ggKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKKwpkaWZmIC0tZ2l0IGEvc3RsL19hbGdvYmFzZS5jIGIvc3RsL19hbGdvYmFzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMWY2NTcKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvX2FsZ29iYXNlLmMKQEAgLTAsMCArMSw0MDMgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworI2lmbmRlZiBfU1RMUF9BTEdPQkFTRV9DCisjZGVmaW5lIF9TVExQX0FMR09CQVNFX0MKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9BTEdPQkFTRV9ICisjICBpbmNsdWRlIDxzdGwvX2FsZ29iYXNlLmg+CisjZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0SXRlcjI+Citib29sIGxleGljb2dyYXBoaWNhbF9jb21wYXJlKF9JbnB1dEl0ZXIxIF9fZmlyc3QxLCBfSW5wdXRJdGVyMSBfX2xhc3QxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyMiBfX2ZpcnN0MiwgX0lucHV0SXRlcjIgX19sYXN0MikgeworICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdDEsIF9fbGFzdDEpKQorICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdDIsIF9fbGFzdDIpKQorICBmb3IgKCA7IF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19maXJzdDIgIT0gX19sYXN0MgorICAgICAgICA7ICsrX19maXJzdDEsICsrX19maXJzdDIpIHsKKyAgICBpZiAoKl9fZmlyc3QxIDwgKl9fZmlyc3QyKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKCpfX2ZpcnN0MiA8ICpfX2ZpcnN0MSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gX19maXJzdDEgPT0gX19sYXN0MSAmJiBfX2ZpcnN0MiAhPSBfX2xhc3QyOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcjEsIGNsYXNzIF9JbnB1dEl0ZXIyLCBjbGFzcyBfQ29tcGFyZT4KK2Jvb2wgbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoX0lucHV0SXRlcjEgX19maXJzdDEsIF9JbnB1dEl0ZXIxIF9fbGFzdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyLCBfSW5wdXRJdGVyMiBfX2xhc3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ29tcGFyZSBfX2NvbXApIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QxLCBfX2xhc3QxKSkKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QyLCBfX2xhc3QyKSkKKyAgZm9yICggOyBfX2ZpcnN0MSAhPSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDIKKyAgICAgICAgOyArK19fZmlyc3QxLCArK19fZmlyc3QyKSB7CisgICAgaWYgKF9fY29tcCgqX19maXJzdDEsICpfX2ZpcnN0MikpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoX19jb21wKCpfX2ZpcnN0MiwgKl9fZmlyc3QxKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gX19maXJzdDEgPT0gX19sYXN0MSAmJiBfX2ZpcnN0MiAhPSBfX2xhc3QyOworfQorCisjaWYgIWRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0SXRlcjI+CitpbnQgX19sZXhpY29ncmFwaGljYWxfY29tcGFyZV8zd2F5KF9JbnB1dEl0ZXIxIF9fZmlyc3QxLCBfSW5wdXRJdGVyMSBfX2xhc3QxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyMiBfX2ZpcnN0MiwgX0lucHV0SXRlcjIgX19sYXN0MikgeworICB3aGlsZSAoX19maXJzdDEgIT0gX19sYXN0MSAmJiBfX2ZpcnN0MiAhPSBfX2xhc3QyKSB7CisgICAgaWYgKCpfX2ZpcnN0MSA8ICpfX2ZpcnN0MikgeworICAgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoISgqX19maXJzdDIgPCAqX19maXJzdDEpLCBfU3RsTXNnX0lOVkFMSURfU1RSSUNUX1dFQUtfUFJFRElDQVRFKQorICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoKl9fZmlyc3QyIDwgKl9fZmlyc3QxKQorICAgICAgcmV0dXJuIDE7CisgICAgKytfX2ZpcnN0MTsKKyAgICArK19fZmlyc3QyOworICB9CisgIGlmIChfX2ZpcnN0MiA9PSBfX2xhc3QyKSB7CisgICAgcmV0dXJuICEoX19maXJzdDEgPT0gX19sYXN0MSk7CisgIH0KKyAgZWxzZSB7CisgICAgcmV0dXJuIC0xOworICB9Cit9CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcjEsIGNsYXNzIF9JbnB1dEl0ZXIyPgoraW50IGxleGljb2dyYXBoaWNhbF9jb21wYXJlXzN3YXkoX0lucHV0SXRlcjEgX19maXJzdDEsIF9JbnB1dEl0ZXIxIF9fbGFzdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyMiBfX2ZpcnN0MiwgX0lucHV0SXRlcjIgX19sYXN0MikgeworICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdDEsIF9fbGFzdDEpKQorICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdDIsIF9fbGFzdDIpKQorICByZXR1cm4gX1NUTFBfUFJJViBfX2xleGljb2dyYXBoaWNhbF9jb21wYXJlXzN3YXkoX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyLCBfX2xhc3QyKTsKK30KKyNlbmRpZgorCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX1RwPgorX1NUTFBfSU5MSU5FX0xPT1AgX1JhbmRvbUFjY2Vzc0l0ZXIgX19maW5kKF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfVHAmIF9fdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnICYpIHsKKyAgX1NUTFBfRElGRkVSRU5DRV9UWVBFKF9SYW5kb21BY2Nlc3NJdGVyKSBfX3RyaXBfY291bnQgPSAoX19sYXN0IC0gX19maXJzdCkgPj4gMjsKKworICBmb3IgKCA7IF9fdHJpcF9jb3VudCA+IDAgOyAtLV9fdHJpcF9jb3VudCkgeworICAgIGlmICgqX19maXJzdCA9PSBfX3ZhbCkgcmV0dXJuIF9fZmlyc3Q7CisgICAgKytfX2ZpcnN0OworCisgICAgaWYgKCpfX2ZpcnN0ID09IF9fdmFsKSByZXR1cm4gX19maXJzdDsKKyAgICArK19fZmlyc3Q7CisKKyAgICBpZiAoKl9fZmlyc3QgPT0gX192YWwpIHJldHVybiBfX2ZpcnN0OworICAgICsrX19maXJzdDsKKworICAgIGlmICgqX19maXJzdCA9PSBfX3ZhbCkgcmV0dXJuIF9fZmlyc3Q7CisgICAgKytfX2ZpcnN0OworICB9CisKKyAgc3dpdGNoIChfX2xhc3QgLSBfX2ZpcnN0KSB7CisgIGNhc2UgMzoKKyAgICBpZiAoKl9fZmlyc3QgPT0gX192YWwpIHJldHVybiBfX2ZpcnN0OworICAgICsrX19maXJzdDsKKyAgY2FzZSAyOgorICAgIGlmICgqX19maXJzdCA9PSBfX3ZhbCkgcmV0dXJuIF9fZmlyc3Q7CisgICAgKytfX2ZpcnN0OworICBjYXNlIDE6CisgICAgaWYgKCpfX2ZpcnN0ID09IF9fdmFsKSByZXR1cm4gX19maXJzdDsKKyAgICAvLysrX19maXJzdDsKKyAgY2FzZSAwOgorICBkZWZhdWx0OgorICAgIHJldHVybiBfX2xhc3Q7CisgIH0KK30KKworaW5saW5lIGNoYXIqCitfX2ZpbmQoY2hhciogX19maXJzdCwgY2hhciogX19sYXN0LCBjaGFyIF9fdmFsLCBjb25zdCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyAmKSB7CisgIHZvaWQgKnJlcyA9ICBtZW1jaHIoX19maXJzdCwgX192YWwsIF9fbGFzdCAtIF9fZmlyc3QpOworICByZXR1cm4gcmVzICE9IDAgPyBfX1NUQVRJQ19DQVNUKGNoYXIqLCByZXMpIDogX19sYXN0OworfQoraW5saW5lIGNvbnN0IGNoYXIqCitfX2ZpbmQoY29uc3QgY2hhciogX19maXJzdCwgY29uc3QgY2hhciogX19sYXN0LCBjaGFyIF9fdmFsLCBjb25zdCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyAmKSB7CisgIGNvbnN0IHZvaWQgKnJlcyA9ICBtZW1jaHIoX19maXJzdCwgX192YWwsIF9fbGFzdCAtIF9fZmlyc3QpOworICByZXR1cm4gcmVzICE9IDAgPyBfX1NUQVRJQ19DQVNUKGNvbnN0IGNoYXIqLCByZXMpIDogX19sYXN0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9QcmVkaWNhdGU+CitfU1RMUF9JTkxJTkVfTE9PUCBfUmFuZG9tQWNjZXNzSXRlciBfX2ZpbmRfaWYoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QcmVkaWNhdGUgX19wcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnICYpIHsKKyAgX1NUTFBfRElGRkVSRU5DRV9UWVBFKF9SYW5kb21BY2Nlc3NJdGVyKSBfX3RyaXBfY291bnQgPSAoX19sYXN0IC0gX19maXJzdCkgPj4gMjsKKworICBmb3IgKCA7IF9fdHJpcF9jb3VudCA+IDAgOyAtLV9fdHJpcF9jb3VudCkgeworICAgIGlmIChfX3ByZWQoKl9fZmlyc3QpKSByZXR1cm4gX19maXJzdDsKKyAgICArK19fZmlyc3Q7CisKKyAgICBpZiAoX19wcmVkKCpfX2ZpcnN0KSkgcmV0dXJuIF9fZmlyc3Q7CisgICAgKytfX2ZpcnN0OworCisgICAgaWYgKF9fcHJlZCgqX19maXJzdCkpIHJldHVybiBfX2ZpcnN0OworICAgICsrX19maXJzdDsKKworICAgIGlmIChfX3ByZWQoKl9fZmlyc3QpKSByZXR1cm4gX19maXJzdDsKKyAgICArK19fZmlyc3Q7CisgIH0KKworICBzd2l0Y2goX19sYXN0IC0gX19maXJzdCkgeworICBjYXNlIDM6CisgICAgaWYgKF9fcHJlZCgqX19maXJzdCkpIHJldHVybiBfX2ZpcnN0OworICAgICsrX19maXJzdDsKKyAgY2FzZSAyOgorICAgIGlmIChfX3ByZWQoKl9fZmlyc3QpKSByZXR1cm4gX19maXJzdDsKKyAgICArK19fZmlyc3Q7CisgIGNhc2UgMToKKyAgICBpZiAoX19wcmVkKCpfX2ZpcnN0KSkgcmV0dXJuIF9fZmlyc3Q7CisgICAgICAvLysrX19maXJzdDsKKyAgY2FzZSAwOgorICBkZWZhdWx0OgorICAgIHJldHVybiBfX2xhc3Q7CisgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9UcD4KK19TVExQX0lOTElORV9MT09QIF9JbnB1dEl0ZXIgX19maW5kKF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfVHAmIF9fdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5wdXRfaXRlcmF0b3JfdGFnICYpIHsKKyAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0ICYmICEoKl9fZmlyc3QgPT0gX192YWwpKSArK19fZmlyc3Q7CisgIHJldHVybiBfX2ZpcnN0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX1ByZWRpY2F0ZT4KK19TVExQX0lOTElORV9MT09QIF9JbnB1dEl0ZXIgX19maW5kX2lmKF9JbnB1dEl0ZXIgX19maXJzdCwgX1NUTFBfTVBXX0VYVFJBX0NPTlNUIF9JbnB1dEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1ByZWRpY2F0ZSBfX3ByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnB1dF9pdGVyYXRvcl90YWcgJikgeworICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QgJiYgIV9fcHJlZCgqX19maXJzdCkpCisgICAgKytfX2ZpcnN0OworICByZXR1cm4gX19maXJzdDsKK30KKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfUHJlZGljYXRlPgorX0lucHV0SXRlciBmaW5kX2lmKF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgX1ByZWRpY2F0ZSBfX3ByZWQpIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgIHJldHVybiBfU1RMUF9QUklWIF9fZmluZF9pZihfX2ZpcnN0LCBfX2xhc3QsIF9fcHJlZCwgX1NUTFBfSVRFUkFUT1JfQ0FURUdPUlkoX19maXJzdCwgX0lucHV0SXRlcikpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX1RwPgorX0lucHV0SXRlciBmaW5kKF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsIGNvbnN0IF9UcCYgX192YWwpIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgIHJldHVybiBfU1RMUF9QUklWIF9fZmluZChfX2ZpcnN0LCBfX2xhc3QsIF9fdmFsLCBfU1RMUF9JVEVSQVRPUl9DQVRFR09SWShfX2ZpcnN0LCBfSW5wdXRJdGVyKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIxLCBjbGFzcyBfRm9yd2FyZEl0ZXIyLCBjbGFzcyBfQmluYXJ5UHJlZD4KK19Gb3J3YXJkSXRlcjEgc2VhcmNoKF9Gb3J3YXJkSXRlcjEgX19maXJzdDEsIF9Gb3J3YXJkSXRlcjEgX19sYXN0MSwKKyAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlcjIgX19maXJzdDIsIF9Gb3J3YXJkSXRlcjIgX19sYXN0MiwKKyAgICAgICAgICAgICAgICAgICAgIF9CaW5hcnlQcmVkICBfX3ByZWQpIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QxLCBfX2xhc3QxKSkKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QyLCBfX2xhc3QyKSkKKyAgLy8gVGVzdCBmb3IgZW1wdHkgcmFuZ2VzCisgIGlmIChfX2ZpcnN0MSA9PSBfX2xhc3QxIHx8IF9fZmlyc3QyID09IF9fbGFzdDIpCisgICAgcmV0dXJuIF9fZmlyc3QxOworCisgIC8vIFRlc3QgZm9yIGEgcGF0dGVybiBvZiBsZW5ndGggMS4KKyAgX0ZvcndhcmRJdGVyMiBfX3AxKF9fZmlyc3QyKTsKKworICBpZiAoICsrX19wMSA9PSBfX2xhc3QyICkgeworICAgIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxICYmICFfX3ByZWQoKl9fZmlyc3QxLCAqX19maXJzdDIpKSB7CisgICAgICArK19fZmlyc3QxOworICAgIH0KKyAgICByZXR1cm4gX19maXJzdDE7CisgIH0KKworICAvLyBHZW5lcmFsIGNhc2UuCisKKyAgZm9yICggOyA7ICkgeyAvLyBfX2ZpcnN0MSAhPSBfX2xhc3QxIHdpbGwgYmUgY2hlY2tlZCBiZWxvdworICAgIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxICYmICFfX3ByZWQoKl9fZmlyc3QxLCAqX19maXJzdDIpKSB7CisgICAgICArK19fZmlyc3QxOworICAgIH0KKyAgICBpZiAoX19maXJzdDEgPT0gX19sYXN0MSkgeworICAgICAgcmV0dXJuIF9fbGFzdDE7CisgICAgfQorICAgIF9Gb3J3YXJkSXRlcjIgX19wID0gX19wMTsKKyAgICBfRm9yd2FyZEl0ZXIxIF9fY3VycmVudCA9IF9fZmlyc3QxOworICAgIGlmICgrK19fY3VycmVudCA9PSBfX2xhc3QxKSByZXR1cm4gX19sYXN0MTsKKworICAgIHdoaWxlIChfX3ByZWQoKl9fY3VycmVudCwgKl9fcCkpIHsKKyAgICAgIGlmICgrK19fcCA9PSBfX2xhc3QyKQorICAgICAgICByZXR1cm4gX19maXJzdDE7CisgICAgICBpZiAoKytfX2N1cnJlbnQgPT0gX19sYXN0MSkKKyAgICAgICAgcmV0dXJuIF9fbGFzdDE7CisgICAgfQorCisgICAgKytfX2ZpcnN0MTsKKyAgfQorICByZXR1cm4gX19maXJzdDE7Cit9CisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKworLy8gZmluZF9maXJzdF9vZiwgd2l0aCBhbmQgd2l0aG91dCBhbiBleHBsaWNpdGx5IHN1cHBsaWVkIGNvbXBhcmlzb24gZnVuY3Rpb24uCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfQmluYXJ5UHJlZGljYXRlPgorX0lucHV0SXRlciBfX2ZpbmRfZmlyc3Rfb2YoX0lucHV0SXRlciBfX2ZpcnN0MSwgX0lucHV0SXRlciBfX2xhc3QxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyIF9fZmlyc3QyLCBfRm9yd2FyZEl0ZXIgX19sYXN0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9CaW5hcnlQcmVkaWNhdGUgX19jb21wKSB7CisgIGZvciAoIDsgX19maXJzdDEgIT0gX19sYXN0MTsgKytfX2ZpcnN0MSkgeworICAgIGZvciAoX0ZvcndhcmRJdGVyIF9faXRlciA9IF9fZmlyc3QyOyBfX2l0ZXIgIT0gX19sYXN0MjsgKytfX2l0ZXIpIHsKKyAgICAgIGlmIChfX2NvbXAoKl9fZmlyc3QxLCAqX19pdGVyKSkgeworICAgICAgICByZXR1cm4gX19maXJzdDE7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBfX2xhc3QxOworfQorCisvLyBmaW5kX2VuZCwgd2l0aCBhbmQgd2l0aG91dCBhbiBleHBsaWNpdGx5IHN1cHBsaWVkIGNvbXBhcmlzb24gZnVuY3Rpb24uCisvLyBTZWFyY2ggW2ZpcnN0MiwgbGFzdDIpIGFzIGEgc3Vic2VxdWVuY2UgaW4gW2ZpcnN0MSwgbGFzdDEpLCBhbmQgcmV0dXJuCisvLyB0aGUgKmxhc3QqIHBvc3NpYmxlIG1hdGNoLiAgTm90ZSB0aGF0IGZpbmRfZW5kIGZvciBiaWRpcmVjdGlvbmFsIGl0ZXJhdG9ycworLy8gaXMgbXVjaCBmYXN0ZXIgdGhhbiBmb3IgZm9yd2FyZCBpdGVyYXRvcnMuCisKKy8vIGZpbmRfZW5kIGZvciBmb3J3YXJkIGl0ZXJhdG9ycy4KK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIxLCBjbGFzcyBfRm9yd2FyZEl0ZXIyLAorICBjbGFzcyBfQmluYXJ5UHJlZGljYXRlPgorX0ZvcndhcmRJdGVyMSBfX2ZpbmRfZW5kKF9Gb3J3YXJkSXRlcjEgX19maXJzdDEsIF9Gb3J3YXJkSXRlcjEgX19sYXN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXIyIF9fZmlyc3QyLCBfRm9yd2FyZEl0ZXIyIF9fbGFzdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9yd2FyZF9pdGVyYXRvcl90YWcgJiwgY29uc3QgZm9yd2FyZF9pdGVyYXRvcl90YWcgJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfQmluYXJ5UHJlZGljYXRlIF9fY29tcCkgeworICBpZiAoX19maXJzdDIgPT0gX19sYXN0MikKKyAgICByZXR1cm4gX19sYXN0MTsKKyAgZWxzZSB7CisgICAgX0ZvcndhcmRJdGVyMSBfX3Jlc3VsdCA9IF9fbGFzdDE7CisgICAgZm9yICg7OykgeworICAgICAgX0ZvcndhcmRJdGVyMSBfX25ld19yZXN1bHQgPSBzZWFyY2goX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyLCBfX2xhc3QyLCBfX2NvbXApOworICAgICAgaWYgKF9fbmV3X3Jlc3VsdCA9PSBfX2xhc3QxKQorICAgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgICBlbHNlIHsKKyAgICAgICAgX19yZXN1bHQgPSBfX25ld19yZXN1bHQ7CisgICAgICAgIF9fZmlyc3QxID0gX19uZXdfcmVzdWx0OworICAgICAgICArK19fZmlyc3QxOworICAgICAgfQorICAgIH0KKyAgfQorfQorCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKworLy8gZmluZF9lbmQgZm9yIGJpZGlyZWN0aW9uYWwgaXRlcmF0b3JzLiAgUmVxdWlyZXMgcGFydGlhbCBzcGVjaWFsaXphdGlvbi4KKyNpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQorCisjICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfSVRFUkFUT1JfSAorX1NUTFBfRU5EX05BTUVTUEFDRQorIyAgICBpbmNsdWRlIDxzdGwvX2l0ZXJhdG9yLmg+CitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKyMgIGVuZGlmIC8qX1NUTFBfSU5URVJOQUxfSVRFUkFUT1JfSCovCisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcjEsIGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcjIsCisgICAgICAgICAgY2xhc3MgX0JpbmFyeVByZWRpY2F0ZT4KK19CaWRpcmVjdGlvbmFsSXRlcjEKK19fZmluZF9lbmQoX0JpZGlyZWN0aW9uYWxJdGVyMSBfX2ZpcnN0MSwgX0JpZGlyZWN0aW9uYWxJdGVyMSBfX2xhc3QxLAorICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIyIF9fZmlyc3QyLCBfQmlkaXJlY3Rpb25hbEl0ZXIyIF9fbGFzdDIsCisgICAgICAgICAgIGNvbnN0IGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnICYsIGNvbnN0IGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnICYsCisgICAgICAgICAgIF9CaW5hcnlQcmVkaWNhdGUgX19jb21wKSB7CisgIHR5cGVkZWYgcmV2ZXJzZV9pdGVyYXRvcjxfQmlkaXJlY3Rpb25hbEl0ZXIxPiBfUmV2SXRlcjE7CisgIHR5cGVkZWYgcmV2ZXJzZV9pdGVyYXRvcjxfQmlkaXJlY3Rpb25hbEl0ZXIyPiBfUmV2SXRlcjI7CisKKyAgX1Jldkl0ZXIxIF9fcmxhc3QxKF9fZmlyc3QxKTsKKyAgX1Jldkl0ZXIyIF9fcmxhc3QyKF9fZmlyc3QyKTsKKyAgX1Jldkl0ZXIxIF9fcnJlc3VsdCA9IHNlYXJjaChfUmV2SXRlcjEoX19sYXN0MSksIF9fcmxhc3QxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9SZXZJdGVyMihfX2xhc3QyKSwgX19ybGFzdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19jb21wKTsKKworICBpZiAoX19ycmVzdWx0ID09IF9fcmxhc3QxKQorICAgIHJldHVybiBfX2xhc3QxOworICBlbHNlIHsKKyAgICBfQmlkaXJlY3Rpb25hbEl0ZXIxIF9fcmVzdWx0ID0gX19ycmVzdWx0LmJhc2UoKTsKKyAgICBhZHZhbmNlKF9fcmVzdWx0LCAtZGlzdGFuY2UoX19maXJzdDIsIF9fbGFzdDIpKTsKKyAgICByZXR1cm4gX19yZXN1bHQ7CisgIH0KK30KKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisjZW5kaWYgLyogX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTiAqLworCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyMSwgY2xhc3MgX0ZvcndhcmRJdGVyMiwKKyAgICAgICAgICBjbGFzcyBfQmluYXJ5UHJlZGljYXRlPgorX0ZvcndhcmRJdGVyMQorZmluZF9lbmQoX0ZvcndhcmRJdGVyMSBfX2ZpcnN0MSwgX0ZvcndhcmRJdGVyMSBfX2xhc3QxLAorICAgICAgICAgX0ZvcndhcmRJdGVyMiBfX2ZpcnN0MiwgX0ZvcndhcmRJdGVyMiBfX2xhc3QyLAorICAgICAgICAgX0JpbmFyeVByZWRpY2F0ZSBfX2NvbXApIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QxLCBfX2xhc3QxKSkKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QyLCBfX2xhc3QyKSkKKyAgcmV0dXJuIF9TVExQX1BSSVYgX19maW5kX2VuZChfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIsIF9fbGFzdDIsCisjaWYgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9JVEVSQVRPUl9DQVRFR09SWShfX2ZpcnN0MSwgX0ZvcndhcmRJdGVyMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfSVRFUkFUT1JfQ0FURUdPUlkoX19maXJzdDIsIF9Gb3J3YXJkSXRlcjIpLAorI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3J3YXJkX2l0ZXJhdG9yX3RhZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcndhcmRfaXRlcmF0b3JfdGFnKCksCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2NvbXApOworfQorCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmUxLCBjbGFzcyBfQ29tcGFyZTIsIGNsYXNzIF9EaXN0YW5jZT4KK19Gb3J3YXJkSXRlciBfX2xvd2VyX2JvdW5kKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LCBjb25zdCBfVHAmIF9fdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NvbXBhcmUxIF9fY29tcDEsIF9Db21wYXJlMiBfX2NvbXAyLCBfRGlzdGFuY2UqKSB7CisgIF9EaXN0YW5jZSBfX2xlbiA9IGRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7CisgIF9EaXN0YW5jZSBfX2hhbGY7CisgIF9Gb3J3YXJkSXRlciBfX21pZGRsZTsKKworICB3aGlsZSAoX19sZW4gPiAwKSB7CisgICAgX19oYWxmID0gX19sZW4gPj4gMTsKKyAgICBfX21pZGRsZSA9IF9fZmlyc3Q7CisgICAgYWR2YW5jZShfX21pZGRsZSwgX19oYWxmKTsKKyAgICBpZiAoX19jb21wMSgqX19taWRkbGUsIF9fdmFsKSkgeworICAgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoIV9fY29tcDIoX192YWwsICpfX21pZGRsZSksIF9TdGxNc2dfSU5WQUxJRF9TVFJJQ1RfV0VBS19QUkVESUNBVEUpCisgICAgICBfX2ZpcnN0ID0gX19taWRkbGU7CisgICAgICArK19fZmlyc3Q7CisgICAgICBfX2xlbiA9IF9fbGVuIC0gX19oYWxmIC0gMTsKKyAgICB9CisgICAgZWxzZQorICAgICAgX19sZW4gPSBfX2hhbGY7CisgIH0KKyAgcmV0dXJuIF9fZmlyc3Q7Cit9CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNlbmRpZiAvKiBfU1RMUF9BTEdPQkFTRV9DICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvX2FsZ29iYXNlLmggYi9zdGwvX2FsZ29iYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg2NDIyMwotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9fYWxnb2Jhc2UuaApAQCAtMCwwICsxLDY3MCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKy8qIE5PVEU6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIFNUTCBoZWFkZXJzLgorICogICBZb3Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4KKyAqLworCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0FMR09CQVNFX0gKKyNkZWZpbmUgX1NUTFBfSU5URVJOQUxfQUxHT0JBU0VfSAorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NTVERERUYKKyMgIGluY2x1ZGUgPHN0bC9fY3N0ZGRlZi5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1NUUklORworIyAgaW5jbHVkZSA8c3RsL19jc3RyaW5nLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9DTElNSVRTCisjICBpbmNsdWRlIDxjbGltaXRzPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1NURExJQgorIyAgaW5jbHVkZSA8c3RsL19jc3RkbGliLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9QQUlSX0gKKyMgIGluY2x1ZGUgPHN0bC9fcGFpci5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfSVRFUkFUT1JfQkFTRV9ICisjICBpbmNsdWRlIDxzdGwvX2l0ZXJhdG9yX2Jhc2UuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX1RZUEVfVFJBSVRTX0gKKyMgIGluY2x1ZGUgPHN0bC90eXBlX3RyYWl0cy5oPgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisjaWYgZGVmaW5lZChfU1RMUF9VU0VfUEFSVElBTF9TUEVDX1dPUktBUk9VTkQpICYmICFkZWZpbmVkKF9TVExQX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUikKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgdm9pZCBfX3N3YXBfYXV4KF9UcCYgX19hLCBfVHAmIF9fYiwgY29uc3QgX190cnVlX3R5cGUmIC8qU3dhcEltcGxlbWVudGVkKi8pIHsKKyAgX19hLnN3YXAoX19iKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSB2b2lkIF9fc3dhcF9hdXgoX1RwJiBfX2EsIF9UcCYgX19iLCBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qU3dhcEltcGxlbWVudGVkKi8pIHsKKyAgX1RwIF9fdG1wID0gX19hOworICBfX2EgPSBfX2I7CisgIF9fYiA9IF9fdG1wOworfQorX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisjZW5kaWYgLyogX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EICovCisKKy8vIHN3YXAgYW5kIGl0ZXJfc3dhcAordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSB2b2lkIHN3YXAoX1RwJiBfX2EsIF9UcCYgX19iKSB7CisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EKSAmJiAhZGVmaW5lZCAoX1NUTFBfRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSKQorIyAgaWYgIWRlZmluZWQoX19CT1JMQU5EQ19fKQorICB0eXBlZGVmIHR5cGVuYW1lIF9Td2FwSW1wbGVtZW50ZWQ8X1RwPjo6X1JldCBfSW1wbGVtZW50ZWQ7CisjICBlbHNlCisgIGVudW0geyBfSXMgPSBfU3dhcEltcGxlbWVudGVkPF9UcD46Ol9JcyB9OworICB0eXBlZGVmIHR5cGVuYW1lIF9fYm9vbDJ0eXBlPF9Jcz46Ol9SZXQgX0ltcGxlbWVudGVkOworIyAgZW5kaWYKKyAgX1NUTFBfUFJJViBfX3N3YXBfYXV4KF9fYSwgX19iLCBfSW1wbGVtZW50ZWQoKSk7CisjZWxzZQorICBfVHAgX190bXAgPSBfX2E7CisgIF9fYSA9IF9fYjsKKyAgX19iID0gX190bXA7CisjZW5kaWYgLyogX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EICovCit9CisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcjEsIGNsYXNzIF9Gb3J3YXJkSXRlcjIsIGNsYXNzIF9WYWx1ZT4KK2lubGluZSB2b2lkIF9faXRlcl9zd2FwX2F1eF9hdXgoX0ZvcndhcmRJdGVyMSYgX19pMSwgX0ZvcndhcmRJdGVyMiYgX19pMiwgX1ZhbHVlICopIHsKKyAgX1ZhbHVlIHRtcCA9ICpfX2kxOworICAqX19pMSA9ICpfX2kyOworICAqX19pMiA9IHRtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcjEsIGNsYXNzIF9Gb3J3YXJkSXRlcjI+CitpbmxpbmUgdm9pZCBfX2l0ZXJfc3dhcF9hdXgoX0ZvcndhcmRJdGVyMSYgX19pMSwgX0ZvcndhcmRJdGVyMiYgX19pMiwgY29uc3QgX190cnVlX3R5cGUmIC8qT0tUb1N3YXAqLykgeworICBzd2FwKCpfX2kxLCAqX19pMik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIxLCBjbGFzcyBfRm9yd2FyZEl0ZXIyPgoraW5saW5lIHZvaWQgX19pdGVyX3N3YXBfYXV4KF9Gb3J3YXJkSXRlcjEmIF9faTEsIF9Gb3J3YXJkSXRlcjImIF9faTIsIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypPS1RvU3dhcCovKSB7CisgIF9faXRlcl9zd2FwX2F1eF9hdXgoIF9faTEsIF9faTIsIF9TVExQX1ZBTFVFX1RZUEUoX19pMSxfRm9yd2FyZEl0ZXIxKSApOworfQorCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcjEsIGNsYXNzIF9Gb3J3YXJkSXRlcjI+CitpbmxpbmUgdm9pZCBpdGVyX3N3YXAoX0ZvcndhcmRJdGVyMSBfX2kxLCBfRm9yd2FyZEl0ZXIyIF9faTIpIHsKKyAgLy8gc3dhcCgqX19pMSwgKl9faTIpOworICBfU1RMUF9QUklWIF9faXRlcl9zd2FwX2F1eCggX19pMSwgX19pMiwgX0lzT0tUb1N3YXAoX1NUTFBfVkFMVUVfVFlQRShfX2kxLCBfRm9yd2FyZEl0ZXIxKSwgX1NUTFBfVkFMVUVfVFlQRShfX2kyLCBfRm9yd2FyZEl0ZXIyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX0lTX1JFRl9UWVBFX1JFQUxfUkVGKF9faTEsIF9Gb3J3YXJkSXRlcjEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfSVNfUkVGX1RZUEVfUkVBTF9SRUYoX19pMiwgX0ZvcndhcmRJdGVyMikpLl9BbnN3ZXIoKSk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG1pbiBhbmQgbWF4CisKKyNpZiAhZGVmaW5lZCAoX19CT1JMQU5EQ19fKSB8fCBkZWZpbmVkIChfU1RMUF9VU0VfT1dOX05BTUVTUEFDRSkKKyMgIGlmIChkZWZpbmVkIChfX0JPUkxBTkRDX18pICYmIChfX0JPUkxBTkRDX18gPCAweDU4MCkpICYmICFkZWZpbmVkIChfX1NURENfXykKKy8vSW4gbm90IEFOU0kgbW9kZSBCb3JsYW5kIGltcG9ydCBtaW4vbWF4IGluIGdsb2JhbCBuYW1lc3BhY2Ugd2hpY2ggY29uZmxpY3QKKy8vd2l0aCBTVExwb3J0IG1pbi9tYXggd2hlbiB1c2VyIGRvZXMgYSAndXNpbmcgbmFtZXNwYWNlIHN0ZCcgaW4gaXRzIGNvZGUKKy8vKHNlZSB0ZXN0L3VuaXQvYWxnX3Rlc3QuY3BwKS4gVG8gYXZvaWQgdGhpcyBjbGFzaCB3ZSBzaW1wbHkgaW1wb3J0IEJvcmxhbmQgbWluL21heAorLy9pbiBTVExwb3J0IG5hbWVzcGFjZS4KK3VzaW5nIF9TVExQX1ZFTkRPUl9TVEQ6Om1pbjsKK3VzaW5nIF9TVExQX1ZFTkRPUl9TVEQ6Om1heDsKKyMgIGVsc2UKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgY29uc3QgX1RwJiAobWluKShjb25zdCBfVHAmIF9fYSwgY29uc3QgX1RwJiBfX2IpIHsgcmV0dXJuIF9fYiA8IF9fYSA/IF9fYiA6IF9fYTsgfQordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBjb25zdCBfVHAmIChtYXgpKGNvbnN0IF9UcCYgX19hLCBjb25zdCBfVHAmIF9fYikgeyAgcmV0dXJuICBfX2EgPCBfX2IgPyBfX2IgOiBfX2E7IH0KKyMgIGVuZGlmCisjZW5kaWYKKworIyBpZiBkZWZpbmVkIChfX0JPUkxBTkRDX18pICYmIGRlZmluZWQgKF9TVExQX1VTRV9PV05fTkFNRVNQQUNFKQoraW5saW5lIHVuc2lnbmVkIGxvbmcgKG1pbikgKHVuc2lnbmVkIGxvbmcgX19hLCB1bnNpZ25lZCBsb25nIF9fYikgeyByZXR1cm4gX19iIDwgX19hID8gX19iIDogX19hOyB9CitpbmxpbmUgdW5zaWduZWQgbG9uZyAobWF4KSAodW5zaWduZWQgbG9uZyBfX2EsIHVuc2lnbmVkIGxvbmcgX19iKSB7ICByZXR1cm4gIF9fYSA8IF9fYiA/IF9fYiA6IF9fYTsgfQorIyBlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZT4KK2lubGluZSBjb25zdCBfVHAmIChtaW4pKGNvbnN0IF9UcCYgX19hLCBjb25zdCBfVHAmIF9fYiwgX0NvbXBhcmUgX19jb21wKSB7CisgIHJldHVybiBfX2NvbXAoX19iLCBfX2EpID8gX19iIDogX19hOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZT4KK2lubGluZSBjb25zdCBfVHAmIChtYXgpKGNvbnN0IF9UcCYgX19hLCBjb25zdCBfVHAmIF9fYiwgX0NvbXBhcmUgX19jb21wKSB7CisgIHJldHVybiBfX2NvbXAoX19hLCBfX2IpID8gX19iIDogX19hOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb3B5CisKKy8vIEFsbCBvZiB0aGVzZSBhdXhpbGlhcnkgZnVuY3Rpb25zIHNlcnZlIHR3byBwdXJwb3Nlcy4gICgxKSBSZXBsYWNlCisvLyBjYWxscyB0byBjb3B5IHdpdGggbWVtbW92ZSB3aGVuZXZlciBwb3NzaWJsZS4gIChNZW1tb3ZlLCBub3QgbWVtY3B5LAorLy8gYmVjYXVzZSB0aGUgaW5wdXQgYW5kIG91dHB1dCByYW5nZXMgYXJlIHBlcm1pdHRlZCB0byBvdmVybGFwLikKKy8vICgyKSBJZiB3ZSdyZSB1c2luZyByYW5kb20gYWNjZXNzIGl0ZXJhdG9ycywgdGhlbiB3cml0ZSB0aGUgbG9vcCBhcworLy8gYSBmb3IgbG9vcCB3aXRoIGFuIGV4cGxpY2l0IGNvdW50LgorCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfT3V0cHV0SXRlciwgY2xhc3MgX0Rpc3RhbmNlPgoraW5saW5lIF9PdXRwdXRJdGVyIF9fY29weShfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlciBfX3Jlc3VsdCwgY29uc3QgaW5wdXRfaXRlcmF0b3JfdGFnICYsIF9EaXN0YW5jZSopIHsKKyAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX3Jlc3VsdCwgKytfX2ZpcnN0KQorICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0OworICByZXR1cm4gX19yZXN1bHQ7Cit9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9OT05URU1QTF9CQVNFX01BVENIX0JVRykKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfT3V0cHV0SXRlciwgY2xhc3MgX0Rpc3RhbmNlPgoraW5saW5lIF9PdXRwdXRJdGVyIF9fY29weShfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlciBfX3Jlc3VsdCwgY29uc3QgZm9yd2FyZF9pdGVyYXRvcl90YWcgJiwgX0Rpc3RhbmNlKiApIHsKKyAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX3Jlc3VsdCwgKytfX2ZpcnN0KQorICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0OworICByZXR1cm4gX19yZXN1bHQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfT3V0cHV0SXRlciwgY2xhc3MgX0Rpc3RhbmNlPgoraW5saW5lIF9PdXRwdXRJdGVyIF9fY29weShfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlciBfX3Jlc3VsdCwgY29uc3QgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcgJiwgX0Rpc3RhbmNlKiApIHsKKyAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX3Jlc3VsdCwgKytfX2ZpcnN0KQorICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0OworICByZXR1cm4gX19yZXN1bHQ7Cit9CisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyLCBjbGFzcyBfT3V0cHV0SXRlciwgY2xhc3MgX0Rpc3RhbmNlPgoraW5saW5lIF9PdXRwdXRJdGVyCitfX2NvcHkoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0LAorICAgICAgIF9PdXRwdXRJdGVyIF9fcmVzdWx0LCBjb25zdCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyAmLCBfRGlzdGFuY2UqKSB7CisgIGZvciAoX0Rpc3RhbmNlIF9fbiA9IF9fbGFzdCAtIF9fZmlyc3Q7IF9fbiA+IDA7IC0tX19uKSB7CisgICAgKl9fcmVzdWx0ID0gKl9fZmlyc3Q7CisgICAgKytfX2ZpcnN0OworICAgICsrX19yZXN1bHQ7CisgIH0KKyAgcmV0dXJuIF9fcmVzdWx0OworfQorCitpbmxpbmUgdm9pZCoKK19fY29weV90cml2aWFsKGNvbnN0IHZvaWQqIF9fZmlyc3QsIGNvbnN0IHZvaWQqIF9fbGFzdCwgdm9pZCogX19yZXN1bHQpIHsKKyAgc2l6ZV90IF9fbiA9IChjb25zdCBjaGFyKilfX2xhc3QgLSAoY29uc3QgY2hhciopX19maXJzdDsKKyAgcmV0dXJuIF9fbiA/ICh2b2lkICopKChjaGFyKiltZW1tb3ZlKF9fcmVzdWx0LCBfX2ZpcnN0LCBfX24pICsgX19uKSA6IF9fcmVzdWx0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb3B5X2JhY2t3YXJkIGF1eGlsaWFyeSBmdW5jdGlvbnMKKwordGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcjEsIGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcjIsCisgICAgICAgICAgY2xhc3MgX0Rpc3RhbmNlPgoraW5saW5lIF9CaWRpcmVjdGlvbmFsSXRlcjIgX19jb3B5X2JhY2t3YXJkKF9CaWRpcmVjdGlvbmFsSXRlcjEgX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIxIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIyIF9fcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnICYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0Rpc3RhbmNlKikgeworICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QpCisgICAgKi0tX19yZXN1bHQgPSAqLS1fX2xhc3Q7CisgIHJldHVybiBfX3Jlc3VsdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyLCBjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXIsIGNsYXNzIF9EaXN0YW5jZT4KK2lubGluZSBfQmlkaXJlY3Rpb25hbEl0ZXIgX19jb3B5X2JhY2t3YXJkKF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIgX19yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyAmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0Rpc3RhbmNlKikgeworICBmb3IgKF9EaXN0YW5jZSBfX24gPSBfX2xhc3QgLSBfX2ZpcnN0OyBfX24gPiAwOyAtLV9fbikKKyAgICAqLS1fX3Jlc3VsdCA9ICotLV9fbGFzdDsKKyAgcmV0dXJuIF9fcmVzdWx0OworfQorCitpbmxpbmUgdm9pZCoKK19fY29weV90cml2aWFsX2JhY2t3YXJkKGNvbnN0IHZvaWQqIF9fZmlyc3QsIGNvbnN0IHZvaWQqIF9fbGFzdCwgdm9pZCogX19yZXN1bHQpIHsKKyAgY29uc3QgcHRyZGlmZl90IF9OdW0gPSAoY29uc3QgY2hhciopX19sYXN0IC0gKGNvbnN0IGNoYXIqKV9fZmlyc3Q7CisgIHJldHVybiAoX051bSA+IDApID8gbWVtbW92ZSgoY2hhciopX19yZXN1bHQgLSBfTnVtLCBfX2ZpcnN0LCBfTnVtKSA6IF9fcmVzdWx0IDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9PdXRwdXRJdGVyPgoraW5saW5lIF9PdXRwdXRJdGVyIF9fY29weV9wdHJzKF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsIF9PdXRwdXRJdGVyIF9fcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypJc09LVG9NZW1DcHkqLykgeworICByZXR1cm4gX19jb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQsIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKCksIChwdHJkaWZmX3QqKTApOworfQordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9PdXRwdXRJdGVyPgoraW5saW5lIF9PdXRwdXRJdGVyIF9fY29weV9wdHJzKF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsIF9PdXRwdXRJdGVyIF9fcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKklzT0tUb01lbUNweSovKSB7CisgIC8vIHdlIGtub3cgdGhleSBhbGwgcG9pbnRlcnMsIHNvIHRoaXMgY2FzdCBpcyBPSworICAvLyAgcmV0dXJuIChfT3V0cHV0SXRlcilfX2NvcHlfdHJpdmlhbCgmKCpfX2ZpcnN0KSwgJigqX19sYXN0KSwgJigqX19yZXN1bHQpKTsKKyAgcmV0dXJuIChfT3V0cHV0SXRlcilfX2NvcHlfdHJpdmlhbChfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9PdXRwdXRJdGVyPgoraW5saW5lIF9PdXRwdXRJdGVyIF9fY29weV9hdXgoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwgX091dHB1dEl0ZXIgX19yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX3RydWVfdHlwZSYgLypCb3RoUHRyVHlwZSovKSB7CisgIHJldHVybiBfX2NvcHlfcHRycyhfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgX1VzZVRyaXZpYWxDb3B5KF9TVExQX1ZBTFVFX1RZUEUoX19maXJzdCwgX0lucHV0SXRlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfVkFMVUVfVFlQRShfX3Jlc3VsdCwgX091dHB1dEl0ZXIpKS5fQW5zd2VyKCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX091dHB1dEl0ZXI+CitpbmxpbmUgX091dHB1dEl0ZXIgX19jb3B5X2F1eChfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LCBfT3V0cHV0SXRlciBfX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypCb3RoUHRyVHlwZSovKSB7CisgIHJldHVybiBfX2NvcHkoX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICBfU1RMUF9JVEVSQVRPUl9DQVRFR09SWShfX2ZpcnN0LCBfSW5wdXRJdGVyKSwKKyAgICAgICAgICAgICAgICBfU1RMUF9ESVNUQU5DRV9UWVBFKF9fZmlyc3QsIF9JbnB1dEl0ZXIpKTsKK30KKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfT3V0cHV0SXRlcj4KK2lubGluZSBfT3V0cHV0SXRlciBjb3B5KF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsIF9PdXRwdXRJdGVyIF9fcmVzdWx0KSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICByZXR1cm4gX1NUTFBfUFJJViBfX2NvcHlfYXV4KF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQsIF9Cb3RoUHRyVHlwZTwgX0lucHV0SXRlciwgX091dHB1dEl0ZXI+OjpfQW5zd2VyKCkpOworfQorCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfT3V0cHV0SXRlcj4KK2lubGluZSBfT3V0cHV0SXRlciBfX2NvcHlfYmFja3dhcmRfcHRycyhfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyIF9fcmVzdWx0LCBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qVHJpdmlhbEFzc2lnbm1lbnQqLykgeworICByZXR1cm4gX19jb3B5X2JhY2t3YXJkKF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQsIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9fZmlyc3QsIF9JbnB1dEl0ZXIpLCBfU1RMUF9ESVNUQU5DRV9UWVBFKF9fZmlyc3QsIF9JbnB1dEl0ZXIpKTsKK30KK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfT3V0cHV0SXRlcj4KK2lubGluZSBfT3V0cHV0SXRlciBfX2NvcHlfYmFja3dhcmRfcHRycyhfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyIF9fcmVzdWx0LCBjb25zdCBfX3RydWVfdHlwZSYgLypUcml2aWFsQXNzaWdubWVudCovKSB7CisgIHJldHVybiAoX091dHB1dEl0ZXIpX19jb3B5X3RyaXZpYWxfYmFja3dhcmQoX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfT3V0cHV0SXRlcj4KK2lubGluZSBfT3V0cHV0SXRlciBfX2NvcHlfYmFja3dhcmRfYXV4KF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsIF9PdXRwdXRJdGVyIF9fcmVzdWx0LCBjb25zdCBfX2ZhbHNlX3R5cGUmKSB7CisgIHJldHVybiBfX2NvcHlfYmFja3dhcmQoX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdCwgX1NUTFBfSVRFUkFUT1JfQ0FURUdPUlkoX19maXJzdCxfSW5wdXRJdGVyKSwgX1NUTFBfRElTVEFOQ0VfVFlQRShfX2ZpcnN0LCBfSW5wdXRJdGVyKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfT3V0cHV0SXRlcj4KK2lubGluZSBfT3V0cHV0SXRlciBfX2NvcHlfYmFja3dhcmRfYXV4KF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsIF9PdXRwdXRJdGVyIF9fcmVzdWx0LCBjb25zdCBfX3RydWVfdHlwZSYpIHsKKyAgcmV0dXJuIF9fY29weV9iYWNrd2FyZF9wdHJzKF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVXNlVHJpdmlhbENvcHkoX1NUTFBfVkFMVUVfVFlQRShfX2ZpcnN0LCBfSW5wdXRJdGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9WQUxVRV9UWVBFKF9fcmVzdWx0LCBfT3V0cHV0SXRlcikpLl9BbnN3ZXIoKSk7Cit9CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX091dHB1dEl0ZXI+CitpbmxpbmUgX091dHB1dEl0ZXIgY29weV9iYWNrd2FyZChfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LCBfT3V0cHV0SXRlciBfX3Jlc3VsdCkgeworICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKKyAgcmV0dXJuIF9TVExQX1BSSVYgX19jb3B5X2JhY2t3YXJkX2F1eChfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0LCBfQm90aFB0clR5cGU8IF9JbnB1dEl0ZXIsIF9PdXRwdXRJdGVyPjo6X0Fuc3dlcigpICk7Cit9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikgJiYgIWRlZmluZWQgKF9TVExQX1NJTVVMQVRFX1BBUlRJQUxfU1BFQ19GT1JfVFlQRV9UUkFJVFMpCisjICBkZWZpbmUgX1NUTFBfREVDTEFSRV9DT1BZX1RSSVZJQUwoX1RwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2lubGluZSBfVHAqIGNvcHkoY29uc3QgX1RwKiBfX2ZpcnN0LCBjb25zdCBfVHAqIF9fbGFzdCwgX1RwKiBfX3Jlc3VsdCkgICAgICAgICAgXAoreyByZXR1cm4gKF9UcCopX19jb3B5X3RyaXZpYWwoX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdCk7IH0gICAgICAgICAgICAgICAgICAgICBcCitpbmxpbmUgX1RwKiBjb3B5X2JhY2t3YXJkKGNvbnN0IF9UcCogX19maXJzdCwgY29uc3QgX1RwKiBfX2xhc3QsIF9UcCogX19yZXN1bHQpIFwKK3sgcmV0dXJuIChfVHAqKV9fY29weV90cml2aWFsX2JhY2t3YXJkKF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQpOyB9CisKK19TVExQX0RFQ0xBUkVfQ09QWV9UUklWSUFMKGNoYXIpCisjICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fU0lHTkVEX0JVSUxUSU5TKQorX1NUTFBfREVDTEFSRV9DT1BZX1RSSVZJQUwoc2lnbmVkIGNoYXIpCisjICBlbmRpZgorX1NUTFBfREVDTEFSRV9DT1BZX1RSSVZJQUwodW5zaWduZWQgY2hhcikKK19TVExQX0RFQ0xBUkVfQ09QWV9UUklWSUFMKHNob3J0KQorX1NUTFBfREVDTEFSRV9DT1BZX1RSSVZJQUwodW5zaWduZWQgc2hvcnQpCitfU1RMUF9ERUNMQVJFX0NPUFlfVFJJVklBTChpbnQpCitfU1RMUF9ERUNMQVJFX0NPUFlfVFJJVklBTCh1bnNpZ25lZCBpbnQpCitfU1RMUF9ERUNMQVJFX0NPUFlfVFJJVklBTChsb25nKQorX1NUTFBfREVDTEFSRV9DT1BZX1RSSVZJQUwodW5zaWduZWQgbG9uZykKKyMgIGlmICFkZWZpbmVkKF9TVExQX05PX1dDSEFSX1QpICYmICFkZWZpbmVkIChfU1RMUF9XQ0hBUl9UX0lTX1VTSE9SVCkKK19TVExQX0RFQ0xBUkVfQ09QWV9UUklWSUFMKHdjaGFyX3QpCisjICBlbmRpZgorIyAgaWYgZGVmaW5lZCAoX1NUTFBfTE9OR19MT05HKQorX1NUTFBfREVDTEFSRV9DT1BZX1RSSVZJQUwoX1NUTFBfTE9OR19MT05HKQorX1NUTFBfREVDTEFSRV9DT1BZX1RSSVZJQUwodW5zaWduZWQgX1NUTFBfTE9OR19MT05HKQorIyAgZW5kaWYKK19TVExQX0RFQ0xBUkVfQ09QWV9UUklWSUFMKGZsb2F0KQorX1NUTFBfREVDTEFSRV9DT1BZX1RSSVZJQUwoZG91YmxlKQorIyAgaWYgIWRlZmluZWQgKF9TVExQX05PX0xPTkdfRE9VQkxFKQorX1NUTFBfREVDTEFSRV9DT1BZX1RSSVZJQUwobG9uZyBkb3VibGUpCisjICBlbmRpZgorIyAgdW5kZWYgX1NUTFBfREVDTEFSRV9DT1BZX1RSSVZJQUwKKyNlbmRpZiAvKiBfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OICovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvcHlfbiAobm90IHBhcnQgb2YgdGhlIEMrKyBzdGFuZGFyZCkKKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKQorX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX1NpemUsIGNsYXNzIF9PdXRwdXRJdGVyPgorX1NUTFBfSU5MSU5FX0xPT1AgcGFpcjxfSW5wdXRJdGVyLCBfT3V0cHV0SXRlcj4KK19fY29weV9uKF9JbnB1dEl0ZXIgX19maXJzdCwgX1NpemUgX19jb3VudCwKKyAgICAgICAgIF9PdXRwdXRJdGVyIF9fcmVzdWx0LAorICAgICAgICAgY29uc3QgaW5wdXRfaXRlcmF0b3JfdGFnICYpIHsKKyAgZm9yICggOyBfX2NvdW50ID4gMDsgLS1fX2NvdW50KSB7CisgICAgKl9fcmVzdWx0ID0gKl9fZmlyc3Q7CisgICAgKytfX2ZpcnN0OworICAgICsrX19yZXN1bHQ7CisgIH0KKyAgcmV0dXJuIHBhaXI8X0lucHV0SXRlciwgX091dHB1dEl0ZXI+KF9fZmlyc3QsIF9fcmVzdWx0KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9SQUl0ZXIsIGNsYXNzIF9TaXplLCBjbGFzcyBfT3V0cHV0SXRlcj4KK2lubGluZSBwYWlyPF9SQUl0ZXIsIF9PdXRwdXRJdGVyPgorX19jb3B5X24oX1JBSXRlciBfX2ZpcnN0LCBfU2l6ZSBfX2NvdW50LAorICAgICAgICAgX091dHB1dEl0ZXIgX19yZXN1bHQsCisgICAgICAgICBjb25zdCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyAmKSB7CisgIF9SQUl0ZXIgX19sYXN0ID0gX19maXJzdCArIF9fY291bnQ7CisgIHJldHVybiBwYWlyPF9SQUl0ZXIsIF9PdXRwdXRJdGVyPihfX2xhc3QsIGNvcHkoX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdCkpOworfQorCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9TaXplLCBjbGFzcyBfT3V0cHV0SXRlcj4KK2lubGluZSBwYWlyPF9JbnB1dEl0ZXIsIF9PdXRwdXRJdGVyPgorY29weV9uKF9JbnB1dEl0ZXIgX19maXJzdCwgX1NpemUgX19jb3VudCwgX091dHB1dEl0ZXIgX19yZXN1bHQpIHsKKyAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fZmlyc3QpCisgIHJldHVybiBfU1RMUF9QUklWIF9fY29weV9uKF9fZmlyc3QsIF9fY291bnQsIF9fcmVzdWx0LCBfU1RMUF9JVEVSQVRPUl9DQVRFR09SWShfX2ZpcnN0LCBfSW5wdXRJdGVyKSk7Cit9CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZmlsbCBhbmQgZmlsbF9uCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfVHA+CitfU1RMUF9JTkxJTkVfTE9PUAordm9pZCBmaWxsKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LCBjb25zdCBfVHAmIF9fdmFsKSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisgICAgKl9fZmlyc3QgPSBfX3ZhbDsKK30KKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX091dHB1dEl0ZXIsIGNsYXNzIF9TaXplLCBjbGFzcyBfVHA+CitfU1RMUF9JTkxJTkVfTE9PUAorX091dHB1dEl0ZXIgX19maWxsX24oX091dHB1dEl0ZXIgX19maXJzdCwgX1NpemUgX19uLCBjb25zdCBfVHAmIF9fdmFsKSB7CisgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2ZpcnN0KQorICBmb3IgKCA7IF9fbiA+IDA7IC0tX19uLCArK19fZmlyc3QpCisgICAgKl9fZmlyc3QgPSBfX3ZhbDsKKyAgcmV0dXJuIF9fZmlyc3Q7Cit9CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX091dHB1dEl0ZXIsIGNsYXNzIF9TaXplLCBjbGFzcyBfVHA+CitfU1RMUF9JTkxJTkVfTE9PUAordm9pZCBmaWxsX24oX091dHB1dEl0ZXIgX19maXJzdCwgX1NpemUgX19uLCBjb25zdCBfVHAmIF9fdmFsKSB7CisgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2ZpcnN0KQorICBfU1RMUF9QUklWIF9fZmlsbF9uKF9fZmlyc3QsIF9fbiwgX192YWwpOworfQorCisvLyBTcGVjaWFsaXphdGlvbjogZm9yIG9uZS1ieXRlIHR5cGVzIHdlIGNhbiB1c2UgbWVtc2V0LgoraW5saW5lIHZvaWQgZmlsbCh1bnNpZ25lZCBjaGFyKiBfX2ZpcnN0LCB1bnNpZ25lZCBjaGFyKiBfX2xhc3QsCisgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXImIF9fdmFsKSB7CisgIHVuc2lnbmVkIGNoYXIgX190bXAgPSBfX3ZhbDsKKyAgbWVtc2V0KF9fZmlyc3QsIF9fdG1wLCBfX2xhc3QgLSBfX2ZpcnN0KTsKK30KKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fU0lHTkVEX0JVSUxUSU5TKQoraW5saW5lIHZvaWQgZmlsbChzaWduZWQgY2hhciogX19maXJzdCwgc2lnbmVkIGNoYXIqIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc2lnbmVkIGNoYXImIF9fdmFsKSB7CisgIHNpZ25lZCBjaGFyIF9fdG1wID0gX192YWw7CisgIG1lbXNldChfX2ZpcnN0LCBfX1NUQVRJQ19DQVNUKHVuc2lnbmVkIGNoYXIsX190bXApLCBfX2xhc3QgLSBfX2ZpcnN0KTsKK30KKyNlbmRpZgoraW5saW5lIHZvaWQgZmlsbChjaGFyKiBfX2ZpcnN0LCBjaGFyKiBfX2xhc3QsIGNvbnN0IGNoYXImIF9fdmFsKSB7CisgIGNoYXIgX190bXAgPSBfX3ZhbDsKKyAgbWVtc2V0KF9fZmlyc3QsIF9fU1RBVElDX0NBU1QodW5zaWduZWQgY2hhcixfX3RtcCksIF9fbGFzdCAtIF9fZmlyc3QpOworfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSKQorX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1NpemU+CitpbmxpbmUgdW5zaWduZWQgY2hhciogX19maWxsX24odW5zaWduZWQgY2hhciogX19maXJzdCwgX1NpemUgX19uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyJiBfX3ZhbCkgeworICBmaWxsKF9fZmlyc3QsIF9fZmlyc3QgKyBfX24sIF9fdmFsKTsKKyAgcmV0dXJuIF9fZmlyc3QgKyBfX247Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfU2l6ZT4KK2lubGluZSBzaWduZWQgY2hhciogX19maWxsX24oY2hhciogX19maXJzdCwgX1NpemUgX19uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2lnbmVkIGNoYXImIF9fdmFsKSB7CisgIGZpbGwoX19maXJzdCwgX19maXJzdCArIF9fbiwgX192YWwpOworICByZXR1cm4gX19maXJzdCArIF9fbjsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9TaXplPgoraW5saW5lIGNoYXIqIF9fZmlsbF9uKGNoYXIqIF9fZmlyc3QsIF9TaXplIF9fbiwgY29uc3QgY2hhciYgX192YWwpIHsKKyAgZmlsbChfX2ZpcnN0LCBfX2ZpcnN0ICsgX19uLCBfX3ZhbCk7CisgIHJldHVybiBfX2ZpcnN0ICsgX19uOworfQorCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKyNlbmRpZiAvKiBfU1RMUF9GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIgKi8KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBlcXVhbCBhbmQgbWlzbWF0Y2gKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMj4KK19TVExQX0lOTElORV9MT09QCitwYWlyPF9JbnB1dEl0ZXIxLCBfSW5wdXRJdGVyMj4gbWlzbWF0Y2goX0lucHV0SXRlcjEgX19maXJzdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcjEgX19sYXN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyMiBfX2ZpcnN0MikgeworICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19maXJzdDIpCisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0MSwgX19sYXN0MSkpCisgIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxICYmICpfX2ZpcnN0MSA9PSAqX19maXJzdDIpIHsKKyAgICArK19fZmlyc3QxOworICAgICsrX19maXJzdDI7CisgIH0KKyAgcmV0dXJuIHBhaXI8X0lucHV0SXRlcjEsIF9JbnB1dEl0ZXIyPihfX2ZpcnN0MSwgX19maXJzdDIpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcjEsIGNsYXNzIF9JbnB1dEl0ZXIyLCBjbGFzcyBfQmluYXJ5UHJlZGljYXRlPgorX1NUTFBfSU5MSU5FX0xPT1AKK3BhaXI8X0lucHV0SXRlcjEsIF9JbnB1dEl0ZXIyPiBtaXNtYXRjaChfSW5wdXRJdGVyMSBfX2ZpcnN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyMSBfX2xhc3QxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9CaW5hcnlQcmVkaWNhdGUgX19iaW5hcnlfcHJlZCkgeworICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19maXJzdDIpCisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0MSwgX19sYXN0MSkpCisgIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxICYmIF9fYmluYXJ5X3ByZWQoKl9fZmlyc3QxLCAqX19maXJzdDIpKSB7CisgICAgKytfX2ZpcnN0MTsKKyAgICArK19fZmlyc3QyOworICB9CisgIHJldHVybiBwYWlyPF9JbnB1dEl0ZXIxLCBfSW5wdXRJdGVyMj4oX19maXJzdDEsIF9fZmlyc3QyKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMj4KK19TVExQX0lOTElORV9MT09QCitib29sIGVxdWFsKF9JbnB1dEl0ZXIxIF9fZmlyc3QxLCBfSW5wdXRJdGVyMSBfX2xhc3QxLAorICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcjIgX19maXJzdDIpIHsKKyAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fZmlyc3QxKSBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19sYXN0MSkgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2ZpcnN0MikKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QxLCBfX2xhc3QxKSkKKyAgZm9yICggOyBfX2ZpcnN0MSAhPSBfX2xhc3QxOyArK19fZmlyc3QxLCArK19fZmlyc3QyKQorICAgIGlmICghKCpfX2ZpcnN0MSA9PSAqX19maXJzdDIpKQorICAgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMiwgY2xhc3MgX0JpbmFyeVByZWRpY2F0ZT4KK19TVExQX0lOTElORV9MT09QCitib29sIGVxdWFsKF9JbnB1dEl0ZXIxIF9fZmlyc3QxLCBfSW5wdXRJdGVyMSBfX2xhc3QxLAorICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcjIgX19maXJzdDIsIF9CaW5hcnlQcmVkaWNhdGUgX19iaW5hcnlfcHJlZCkgeworICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19maXJzdDIpCisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0MSwgX19sYXN0MSkpCisgIGZvciAoIDsgX19maXJzdDEgIT0gX19sYXN0MTsgKytfX2ZpcnN0MSwgKytfX2ZpcnN0MikKKyAgICBpZiAoIV9fYmluYXJ5X3ByZWQoKl9fZmlyc3QxLCAqX19maXJzdDIpKQorICAgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUgYW5kIGxleGljb2dyYXBoaWNhbF9jb21wYXJlXzN3YXkuCisvLyAodGhlIGxhdHRlciBpcyBub3QgcGFydCBvZiB0aGUgQysrIHN0YW5kYXJkLikKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMj4KK2Jvb2wgbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoX0lucHV0SXRlcjEgX19maXJzdDEsIF9JbnB1dEl0ZXIxIF9fbGFzdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyLCBfSW5wdXRJdGVyMiBfX2xhc3QyKTsKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMiwgY2xhc3MgX0NvbXBhcmU+Citib29sIGxleGljb2dyYXBoaWNhbF9jb21wYXJlKF9JbnB1dEl0ZXIxIF9fZmlyc3QxLCBfSW5wdXRJdGVyMSBfX2xhc3QxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyMiBfX2ZpcnN0MiwgX0lucHV0SXRlcjIgX19sYXN0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NvbXBhcmUgX19jb21wKTsKKworaW5saW5lIGJvb2wKK2xleGljb2dyYXBoaWNhbF9jb21wYXJlKGNvbnN0IHVuc2lnbmVkIGNoYXIqIF9fZmlyc3QxLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogX19sYXN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIF9fZmlyc3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogX19sYXN0MikgeworICBjb25zdCBzaXplX3QgX19sZW4xID0gX19sYXN0MSAtIF9fZmlyc3QxOworICBjb25zdCBzaXplX3QgX19sZW4yID0gX19sYXN0MiAtIF9fZmlyc3QyOworICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdDEsIF9fbGFzdDEpKQorICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdDIsIF9fbGFzdDIpKQorCisgIGNvbnN0IGludCBfX3Jlc3VsdCA9IG1lbWNtcChfX2ZpcnN0MSwgX19maXJzdDIsIChtaW4pIChfX2xlbjEsIF9fbGVuMikpOworICByZXR1cm4gX19yZXN1bHQgIT0gMCA/IChfX3Jlc3VsdCA8IDApIDogKF9fbGVuMSA8IF9fbGVuMik7Cit9CisKKworI2lmICEoQ0hBUl9NQVggPT0gU0NIQVJfTUFYKQoraW5saW5lIGJvb2wgbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoY29uc3QgY2hhciogX19maXJzdDEsIGNvbnN0IGNoYXIqIF9fbGFzdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBfX2ZpcnN0MiwgY29uc3QgY2hhciogX19sYXN0MikgeworICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdDEsIF9fbGFzdDEpKQorICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdDIsIF9fbGFzdDIpKQorCisgIHJldHVybiBsZXhpY29ncmFwaGljYWxfY29tcGFyZSgoY29uc3QgdW5zaWduZWQgY2hhciopIF9fZmlyc3QxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVuc2lnbmVkIGNoYXIqKSBfX2xhc3QxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVuc2lnbmVkIGNoYXIqKSBfX2ZpcnN0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1bnNpZ25lZCBjaGFyKikgX19sYXN0Mik7Cit9CisjZW5kaWYgLyogQ0hBUl9NQVggPT0gU0NIQVJfTUFYICovCisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMj4KK2ludCBfX2xleGljb2dyYXBoaWNhbF9jb21wYXJlXzN3YXkoX0lucHV0SXRlcjEgX19maXJzdDEsIF9JbnB1dEl0ZXIxIF9fbGFzdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyLCBfSW5wdXRJdGVyMiBfX2xhc3QyKTsKKworaW5saW5lIGludAorX19sZXhpY29ncmFwaGljYWxfY29tcGFyZV8zd2F5KGNvbnN0IHVuc2lnbmVkIGNoYXIqIF9fZmlyc3QxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIF9fbGFzdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogX19maXJzdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogX19sYXN0MikgeworICBjb25zdCBwdHJkaWZmX3QgX19sZW4xID0gX19sYXN0MSAtIF9fZmlyc3QxOworICBjb25zdCBwdHJkaWZmX3QgX19sZW4yID0gX19sYXN0MiAtIF9fZmlyc3QyOworICBjb25zdCBpbnQgX19yZXN1bHQgPSBtZW1jbXAoX19maXJzdDEsIF9fZmlyc3QyLCAobWluKSAoX19sZW4xLCBfX2xlbjIpKTsKKyAgcmV0dXJuIF9fcmVzdWx0ICE9IDAgPyBfX3Jlc3VsdAorICAgICAgICAgICAgICAgICAgICAgICA6IChfX2xlbjEgPT0gX19sZW4yID8gMCA6IChfX2xlbjEgPCBfX2xlbjIgPyAtMSA6IDEpKTsKK30KKworCisjaWYgIShDSEFSX01BWCA9PSBTQ0hBUl9NQVgpCitpbmxpbmUgaW50CitfX2xleGljb2dyYXBoaWNhbF9jb21wYXJlXzN3YXkoY29uc3QgY2hhciogX19maXJzdDEsIGNvbnN0IGNoYXIqIF9fbGFzdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogX19maXJzdDIsIGNvbnN0IGNoYXIqIF9fbGFzdDIpIHsKKyAgcmV0dXJuIF9fbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmVfM3dheSgoY29uc3QgdW5zaWduZWQgY2hhciopIF9fZmlyc3QxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1bnNpZ25lZCBjaGFyKikgX19sYXN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdW5zaWduZWQgY2hhciopIF9fZmlyc3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1bnNpZ25lZCBjaGFyKikgX19sYXN0Mik7Cit9CisjZW5kaWYKKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0SXRlcjI+CitpbnQgbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmVfM3dheShfSW5wdXRJdGVyMSBfX2ZpcnN0MSwgX0lucHV0SXRlcjEgX19sYXN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyLCBfSW5wdXRJdGVyMiBfX2xhc3QyKTsKKworI2VuZGlmIC8qIEVYVEVOU0lPTlMgKi8KKworLy8gY291bnQKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfVHA+CitfU1RMUF9JTkxJTkVfTE9PUCBfU1RMUF9ESUZGRVJFTkNFX1RZUEUoX0lucHV0SXRlcikKK2NvdW50KF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsIGNvbnN0IF9UcCYgX192YWwpIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgIF9TVExQX0RJRkZFUkVOQ0VfVFlQRShfSW5wdXRJdGVyKSBfX24gPSAwOworICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisgICAgaWYgKCpfX2ZpcnN0ID09IF9fdmFsKQorICAgICAgKytfX247CisgIHJldHVybiBfX247Cit9CisKKy8vIGZpbmQgYW5kIGZpbmRfaWYuIE5vdGUgZmluZCBtYXkgYmUgZXhwcmVzc2VkIGluIHRlcm1zIG9mIGZpbmRfaWYgaWYgYXBwcm9wcmlhdGUgYmluZGVyIHdhcyBhdmFpbGFibGUuCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX1RwPgorX0lucHV0SXRlciBmaW5kKF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsIGNvbnN0IF9UcCYgX192YWwpOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX1ByZWRpY2F0ZT4KK19JbnB1dEl0ZXIgZmluZF9pZihfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LCBfUHJlZGljYXRlIF9fcHJlZCk7CisKKy8vIHNlYXJjaC4KK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIxLCBjbGFzcyBfRm9yd2FyZEl0ZXIyLCBjbGFzcyBfQmluYXJ5UHJlZD4KK19Gb3J3YXJkSXRlcjEgc2VhcmNoKF9Gb3J3YXJkSXRlcjEgX19maXJzdDEsIF9Gb3J3YXJkSXRlcjEgX19sYXN0MSwKKyAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlcjIgX19maXJzdDIsIF9Gb3J3YXJkSXRlcjIgX19sYXN0MiwgX0JpbmFyeVByZWQgIF9fcHJlZGljYXRlKTsKKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCisvLyBmaW5kX2ZpcnN0X29mCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfQmluYXJ5UHJlZGljYXRlPgorX0lucHV0SXRlciBfX2ZpbmRfZmlyc3Rfb2YoX0lucHV0SXRlciBfX2ZpcnN0MSwgX0lucHV0SXRlciBfX2xhc3QxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyIF9fZmlyc3QyLCBfRm9yd2FyZEl0ZXIgX19sYXN0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9CaW5hcnlQcmVkaWNhdGUgX19jb21wKTsKKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIxLCBjbGFzcyBfRm9yd2FyZEl0ZXIyLAorICAgICAgICAgIGNsYXNzIF9CaW5hcnlQcmVkaWNhdGU+CitfRm9yd2FyZEl0ZXIxCitmaW5kX2VuZChfRm9yd2FyZEl0ZXIxIF9fZmlyc3QxLCBfRm9yd2FyZEl0ZXIxIF9fbGFzdDEsCisgICAgICAgICBfRm9yd2FyZEl0ZXIyIF9fZmlyc3QyLCBfRm9yd2FyZEl0ZXIyIF9fbGFzdDIsCisgICAgICAgICBfQmluYXJ5UHJlZGljYXRlIF9fY29tcCk7CisKKy8vIHJlcGxhY2UKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9UcD4KK19TVExQX0lOTElORV9MT09QIHZvaWQKK3JlcGxhY2UoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsCisgICAgICAgIGNvbnN0IF9UcCYgX19vbGRfdmFsdWUsIGNvbnN0IF9UcCYgX19uZXdfdmFsdWUpIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKyAgICBpZiAoKl9fZmlyc3QgPT0gX19vbGRfdmFsdWUpCisgICAgICAqX19maXJzdCA9IF9fbmV3X3ZhbHVlOworfQorCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmUxLCBjbGFzcyBfQ29tcGFyZTIsIGNsYXNzIF9EaXN0YW5jZT4KK19Gb3J3YXJkSXRlciBfX2xvd2VyX2JvdW5kKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1RwJiBfX3ZhbCwgX0NvbXBhcmUxIF9fY29tcDEsIF9Db21wYXJlMiBfX2NvbXAyLCBfRGlzdGFuY2UqKTsKKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2lmICFkZWZpbmVkIChfU1RMUF9MSU5LX1RJTUVfSU5TVEFOVElBVElPTikKKyMgIGluY2x1ZGUgPHN0bC9fYWxnb2Jhc2UuYz4KKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfQUxHT0JBU0VfSCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgorCmRpZmYgLS1naXQgYS9zdGwvX2FsbG9jLmMgYi9zdGwvX2FsbG9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ2NjU2YwotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9fYWxsb2MuYwpAQCAtMCwwICsxLDg4IEBACisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworI2lmbmRlZiBfU1RMUF9BTExPQ19DCisjZGVmaW5lIF9TVExQX0FMTE9DX0MKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9BTExPQ19ICisjICBpbmNsdWRlIDxzdGwvX2FsbG9jLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fV0FUQ09NQ19fKQorIyAgcHJhZ21hIHdhcm5pbmcgMTMgOQorIyAgcHJhZ21hIHdhcm5pbmcgMzY3IDkKKyMgIHByYWdtYSB3YXJuaW5nIDM2OCA5CisjZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfQWxsb2M+Cit2b2lkICogX1NUTFBfQ0FMTCBfX2RlYnVnX2FsbG9jPF9BbGxvYz46OmFsbG9jYXRlKHNpemVfdCBfX24pIHsKKyAgc2l6ZV90IF9fdG90YWxfZXh0cmEgPSBfX2V4dHJhX2JlZm9yZV9jaHVuaygpICsgX19leHRyYV9hZnRlcl9jaHVuaygpOworICBzaXplX3QgX19yZWFsX24gPSBfX24gKyBfX3RvdGFsX2V4dHJhOworICBpZiAoX19yZWFsX24gPCBfX24pIHsKKyAgICAvL0l0IG1lYW5zIHRoYXQgd2Ugcm9sbGVkIG9uIHNpemVfdCwgX19uIG11c3QgYmUgdmVyeSBsYXJnZSwgbGV0cyBob3BlCisgICAgLy90aGF0IGFsbG9jYXRpbmcgaXQgd2lsbCByYWlzZWQgYSBiYWRfYWxsb2MgZXhjZXB0aW9uOgorICAgIF9fcmVhbF9uID0gX19uICsgKF9fdG90YWxfZXh0cmEgLSBfX3JlYWxfbiAtIDEpOworICB9CisgIF9fYWxsb2NfaGVhZGVyICpfX3Jlc3VsdCA9IChfX2FsbG9jX2hlYWRlciAqKV9fYWxsb2NhdG9yX3R5cGU6OmFsbG9jYXRlKF9fcmVhbF9uKTsKKyAgbWVtc2V0KChjaGFyKilfX3Jlc3VsdCwgX19zaHJlZF9ieXRlLCBfX3JlYWxfbiAqIHNpemVvZih2YWx1ZV90eXBlKSk7CisgIF9fcmVzdWx0LT5fX21hZ2ljID0gX19tYWdpYzsKKyAgX19yZXN1bHQtPl9fdHlwZV9zaXplID0gc2l6ZW9mKHZhbHVlX3R5cGUpOworICBfX3Jlc3VsdC0+X01fc2l6ZSA9IChfU1RMUF9VSU5UMzJfVClfX247CisgIHJldHVybiAoKGNoYXIqKV9fcmVzdWx0KSArIChsb25nKV9fZXh0cmFfYmVmb3JlOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0FsbG9jPgordm9pZCAgX1NUTFBfQ0FMTAorX19kZWJ1Z19hbGxvYzxfQWxsb2M+OjpkZWFsbG9jYXRlKHZvaWQgKl9fcCwgc2l6ZV90IF9fbikgeworICBfX2FsbG9jX2hlYWRlciAqIF9fcmVhbF9wID0gKF9fYWxsb2NfaGVhZGVyKikoKGNoYXIgKilfX3AgLShsb25nKV9fZXh0cmFfYmVmb3JlKTsKKyAgLy8gY2hlY2sgaW50ZWdyaXR5CisgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKF9fcmVhbF9wLT5fX21hZ2ljICE9IF9fZGVsZXRlZF9tYWdpYywgX1N0bE1zZ19EQkFfREVMRVRFRF9UV0lDRSkKKyAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoX19yZWFsX3AtPl9fbWFnaWMgPT0gX19tYWdpYywgX1N0bE1zZ19EQkFfTkVWRVJfQUxMT0NBVEVEKQorICBfU1RMUF9WRVJCT1NFX0FTU0VSVChfX3JlYWxfcC0+X190eXBlX3NpemUgPT0gMSxfU3RsTXNnX0RCQV9UWVBFX01JU01BVENIKQorICBfU1RMUF9WRVJCT1NFX0FTU0VSVChfX3JlYWxfcC0+X01fc2l6ZSA9PSBfX24sIF9TdGxNc2dfREJBX1NJWkVfTUlTTUFUQ0gpCisgIC8vIGNoZWNrIHBhZHMgb24gYm90aCBzaWRlcworICB1bnNpZ25lZCBjaGFyKiBfX3RtcDsKKyAgZm9yIChfX3RtcCA9ICh1bnNpZ25lZCBjaGFyKikoX19yZWFsX3AgKyAxKTsgX190bXAgPCAodW5zaWduZWQgY2hhciopX19wOyArK19fdG1wKSB7CisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoKl9fdG1wID09IF9fc2hyZWRfYnl0ZSwgX1N0bE1zZ19EQkFfVU5ERVJSVU4pCisgIH0KKworICBzaXplX3QgX19yZWFsX24gPSBfX24gKyBfX2V4dHJhX2JlZm9yZV9jaHVuaygpICsgX19leHRyYV9hZnRlcl9jaHVuaygpOworCisgIGZvciAoX190bXA9ICgodW5zaWduZWQgY2hhciopX19wKSArIF9fbiAqIHNpemVvZih2YWx1ZV90eXBlKTsKKyAgICAgICBfX3RtcCA8ICgodW5zaWduZWQgY2hhciopX19yZWFsX3ApICsgX19yZWFsX24gOyArK19fdG1wKSB7CisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoKl9fdG1wID09IF9fc2hyZWRfYnl0ZSwgX1N0bE1zZ19EQkFfT1ZFUlJVTikKKyAgfQorCisgIC8vIHRoYXQgbWF5IGJlIHVuZm9ydHVuYXRlLCBqdXN0IGluIGNhc2UKKyAgX19yZWFsX3AtPl9fbWFnaWMgPSBfX2RlbGV0ZWRfbWFnaWM7CisgIG1lbXNldCgoY2hhciopX19wLCBfX3NocmVkX2J5dGUsIF9fbiAqIHNpemVvZih2YWx1ZV90eXBlKSk7CisgIF9fYWxsb2NhdG9yX3R5cGU6OmRlYWxsb2NhdGUoX19yZWFsX3AsIF9fcmVhbF9uKTsKK30KKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYgLyogIF9TVExQX0FMTE9DX0MgKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9fYWxsb2MuaCBiL3N0bC9fYWxsb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGE4NzVkCi0tLSAvZGV2L251bGwKKysrIGIvc3RsL19hbGxvYy5oCkBAIC0wLDAgKzEsNjc1IEBACisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisvKiBOT1RFOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBTVEwgaGVhZGVycy4KKyAqICAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuCisgKi8KKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9BTExPQ19ICisjZGVmaW5lIF9TVExQX0lOVEVSTkFMX0FMTE9DX0gKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DU1REREVGCisjICBpbmNsdWRlIDxzdGwvX2NzdGRkZWYuaD4KKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKF9TVExQX0RFQlVHX0gpICYmIChkZWZpbmVkKF9TVExQX0RFQlVHKSB8fCBkZWZpbmVkKF9TVExQX0FTU0VSVElPTlMpIHx8IGRlZmluZWQoX1NUTFBfREVCVUdfQUxMT0MpKQorIyAgaW5jbHVkZSA8c3RsL2RlYnVnL19kZWJ1Zy5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1NURExJQgorIyAgaW5jbHVkZSA8c3RsL19jc3RkbGliLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DU1RSSU5HCisjICBpbmNsdWRlIDxzdGwvX2NzdHJpbmcuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0FMR09CQVNFX0gKKyMgIGluY2x1ZGUgPHN0bC9fYWxnb2Jhc2UuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9fVEhST1dfQkFEX0FMTE9DCisjICBpZiAhZGVmaW5lZChfU1RMUF9VU0VfRVhDRVBUSU9OUykKKyMgICAgaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NTVERJTworIyAgICAgIGluY2x1ZGUgPHN0bC9fY3N0ZGlvLmg+CisjICAgIGVuZGlmCisjICAgIGRlZmluZSBfX1RIUk9XX0JBRF9BTExPQyBwdXRzKCJvdXQgb2YgbWVtb3J5XG4iKTsgZXhpdCgxKQorIyAgZWxzZQorIyAgICBkZWZpbmUgX19USFJPV19CQURfQUxMT0MgdGhyb3cgX1NUTFBfU1REOjpiYWRfYWxsb2MoKQorIyAgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX05FV19IRUFERVIKKyMgIGluY2x1ZGUgPHN0bC9fbmV3Lmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DT05TVFJVQ1RfSAorIyAgaW5jbHVkZSA8c3RsL19jb25zdHJ1Y3QuaD4KKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKF9fQUxMT0MpCisjICBkZWZpbmUgX19BTExPQyBfX3NnaV9hbGxvYworI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1JBV19TR0lfQUxMT0NBVE9SUykKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4gc3RydWN0IF9fYWxsb2NhdG9yOworI2VuZGlmCisKKy8vIE1hbGxvYy1iYXNlZCBhbGxvY2F0b3IuICBUeXBpY2FsbHkgc2xvd2VyIHRoYW4gZGVmYXVsdCBhbGxvYyBiZWxvdy4KKy8vIFR5cGljYWxseSB0aHJlYWQtc2FmZSBhbmQgbW9yZSBzdG9yYWdlIGVmZmljaWVudC4KKworI2lmICFkZWZpbmVkIChfU1RMUF9VU0VfTk9fSU9TVFJFQU1TKQordHlwZWRlZiB2b2lkICgqIF9fb29tX2hhbmRsZXJfdHlwZSkoKTsKKyNlbmRpZgorCitjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBfX21hbGxvY19hbGxvYyB7CitwdWJsaWM6CisgIC8vIHRoaXMgb25lIGlzIG5lZWRlZCBmb3IgcHJvcGVyIHNpbXBsZV9hbGxvYyB3cmFwcGluZworICB0eXBlZGVmIGNoYXIgdmFsdWVfdHlwZTsKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVfQ0xBU1NFUykgJiYgZGVmaW5lZCAoX1NUTFBfVVNFX1JBV19TR0lfQUxMT0NBVE9SUykKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcDE+IHN0cnVjdCByZWJpbmQgeworICAgIHR5cGVkZWYgX19hbGxvY2F0b3I8X1RwMSwgX19tYWxsb2NfYWxsb2M+IG90aGVyOworICB9OworI2VuZGlmCisgIHN0YXRpYyB2b2lkKiBfU1RMUF9DQUxMIGFsbG9jYXRlKHNpemVfdCYgX19uKQorI2lmICFkZWZpbmVkIChfU1RMUF9VU0VfTk9fSU9TVFJFQU1TKQorICA7CisjZWxzZQorICB7CisgICAgdm9pZCAqX19yZXN1bHQgPSBtYWxsb2MoX19uKTsKKyMgIGlmIGRlZmluZWQgKF9TVExQX01BTExPQ19VU0FCTEVfU0laRSkKKyAgICBpZiAoX19yZXN1bHQgIT0gMCkgeworICAgICAgX19uID0gX1NUTFBfTUFMTE9DX1VTQUJMRV9TSVpFKF9fcmVzdWx0KTsKKyAgICB9CisjICBlbmRpZgorICAgIGlmIChfX3Jlc3VsdCA9PSAwKSB7CisgICAgICBfX1RIUk9XX0JBRF9BTExPQzsKKyAgICB9CisgICAgcmV0dXJuIF9fcmVzdWx0OworICB9CisjZW5kaWYKKworICBzdGF0aWMgdm9pZCBfU1RMUF9DQUxMIGRlYWxsb2NhdGUodm9pZCogX19wLCBzaXplX3QgLyogX19uICovKSB7IGZyZWUoKGNoYXIqKV9fcCk7IH0KKyNpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX05PX0lPU1RSRUFNUykKKyAgc3RhdGljIF9fb29tX2hhbmRsZXJfdHlwZSBfU1RMUF9DQUxMIHNldF9tYWxsb2NfaGFuZGxlcihfX29vbV9oYW5kbGVyX3R5cGUgX19mKTsKKyNlbmRpZgorfTsKKworLy8gTmV3LWJhc2VkIGFsbG9jYXRvci4gIFR5cGljYWxseSBzbG93ZXIgdGhhbiBkZWZhdWx0IGFsbG9jIGJlbG93LgorLy8gVHlwaWNhbGx5IHRocmVhZC1zYWZlIGFuZCBtb3JlIHN0b3JhZ2UgZWZmaWNpZW50LgorY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgX19uZXdfYWxsb2MgeworcHVibGljOgorICAvLyB0aGlzIG9uZSBpcyBuZWVkZWQgZm9yIHByb3BlciBzaW1wbGVfYWxsb2Mgd3JhcHBpbmcKKyAgdHlwZWRlZiBjaGFyIHZhbHVlX3R5cGU7CisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFX0NMQVNTRVMpICYmIGRlZmluZWQgKF9TVExQX1VTRV9SQVdfU0dJX0FMTE9DQVRPUlMpCisgIHRlbXBsYXRlIDxjbGFzcyBfVHAxPiBzdHJ1Y3QgcmViaW5kIHsKKyAgICB0eXBlZGVmIF9fYWxsb2NhdG9yPF9UcDEsIF9fbmV3X2FsbG9jID4gb3RoZXI7CisgIH07CisjZW5kaWYKKyAgc3RhdGljIHZvaWQqIF9TVExQX0NBTEwgYWxsb2NhdGUoc2l6ZV90IF9fbikgeyByZXR1cm4gX19zdGxfbmV3KF9fbik7IH0KKyAgc3RhdGljIHZvaWQgX1NUTFBfQ0FMTCBkZWFsbG9jYXRlKHZvaWQqIF9fcCwgc2l6ZV90KSB7IF9fc3RsX2RlbGV0ZShfX3ApOyB9Cit9OworCisKKy8vIEFsbG9jYXRvciBhZGFwdG9yIHRvIGNoZWNrIHNpemUgYXJndW1lbnRzIGZvciBkZWJ1Z2dpbmcuCisvLyBSZXBvcnRzIGVycm9ycyB1c2luZyBhc3NlcnQuICBDaGVja2luZyBjYW4gYmUgZGlzYWJsZWQgd2l0aAorLy8gTkRFQlVHLCBidXQgaXQncyBmYXIgYmV0dGVyIHRvIGp1c3QgdXNlIHRoZSB1bmRlcmx5aW5nIGFsbG9jYXRvcgorLy8gaW5zdGVhZCB3aGVuIG5vIGNoZWNraW5nIGlzIGRlc2lyZWQuCisvLyBUaGVyZSBpcyBzb21lIGV2aWRlbmNlIHRoYXQgdGhpcyBjYW4gY29uZnVzZSBQdXJpZnkuCisvLyBUaGlzIGFkYXB0b3IgY2FuIG9ubHkgYmUgYXBwbGllZCB0byByYXcgYWxsb2NhdG9ycworCit0ZW1wbGF0ZSA8Y2xhc3MgX0FsbG9jPgorY2xhc3MgX19kZWJ1Z19hbGxvYyA6IHB1YmxpYyBfQWxsb2MgeworcHVibGljOgorICB0eXBlZGVmIF9BbGxvYyBfX2FsbG9jYXRvcl90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworcHJpdmF0ZToKKyAgc3RydWN0IF9fYWxsb2NfaGVhZGVyIHsKKyAgICBzaXplX3QgX19tYWdpYzogMTY7CisgICAgc2l6ZV90IF9fdHlwZV9zaXplOjE2OworICAgIF9TVExQX1VJTlQzMl9UIF9NX3NpemU7CisgIH07IC8vIHRoYXQgaXMgOCBieXRlcyBmb3Igc3VyZQorICAvLyBTdW5wcm8gQ0MgaGFzIGJ1ZyBvbiBlbnVtcywgc28gZXh0cmFfYmVmb3JlL2FmdGVyIHNldCBleHBsaWNpdGx5CisgIGVudW0geyBfX3BhZCA9IDgsIF9fbWFnaWMgPSAweGRlYmEsIF9fZGVsZXRlZF9tYWdpYyA9IDB4ZGViZCwKKyAgICAgICAgIF9fc2hyZWRfYnl0ZSA9IF9TVExQX1NIUkVEX0JZVEUgfTsKKworICBlbnVtIHsgX19leHRyYV9iZWZvcmUgPSAxNiwgX19leHRyYV9hZnRlciA9IDggfTsKKyAgLy8gU2l6ZSBvZiBzcGFjZSB1c2VkIHRvIHN0b3JlIHNpemUuICBOb3RlCisgIC8vIHRoYXQgdGhpcyBtdXN0IGJlIGxhcmdlIGVub3VnaCB0byBwcmVzZXJ2ZQorICAvLyBhbGlnbm1lbnQuCisgIHN0YXRpYyBzaXplX3QgX1NUTFBfQ0FMTCBfX2V4dHJhX2JlZm9yZV9jaHVuaygpIHsKKyAgICByZXR1cm4gKGxvbmcpX19leHRyYV9iZWZvcmUgLyBzaXplb2YodmFsdWVfdHlwZSkgKworICAgICAgKHNpemVfdCkoKGxvbmcpX19leHRyYV9iZWZvcmUgJSBzaXplb2YodmFsdWVfdHlwZSkgPiAwKTsKKyAgfQorICBzdGF0aWMgc2l6ZV90IF9TVExQX0NBTEwgX19leHRyYV9hZnRlcl9jaHVuaygpIHsKKyAgICByZXR1cm4gKGxvbmcpX19leHRyYV9hZnRlciAvIHNpemVvZih2YWx1ZV90eXBlKSArCisgICAgICAoc2l6ZV90KSgobG9uZylfX2V4dHJhX2FmdGVyICUgc2l6ZW9mKHZhbHVlX3R5cGUpID4gMCk7CisgIH0KK3B1YmxpYzoKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVfQ0xBU1NFUykgJiYgZGVmaW5lZCAoX1NUTFBfVVNFX1JBV19TR0lfQUxMT0NBVE9SUykKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcDE+IHN0cnVjdCByZWJpbmQgeworICAgIHR5cGVkZWYgX19hbGxvY2F0b3I8IF9UcDEsIF9fZGVidWdfYWxsb2M8X0FsbG9jPiA+IG90aGVyOworICB9OworI2VuZGlmCisgIF9fZGVidWdfYWxsb2MoKSB7fQorICB+X19kZWJ1Z19hbGxvYygpIHt9CisgIHN0YXRpYyB2b2lkKiBfU1RMUF9DQUxMIGFsbG9jYXRlKHNpemVfdCk7CisgIHN0YXRpYyB2b2lkIF9TVExQX0NBTEwgZGVhbGxvY2F0ZSh2b2lkICosIHNpemVfdCk7Cit9OworCisjICBpZiBkZWZpbmVkIChfX09TNDAwX18pIHx8IGRlZmluZWQgKF9XSU42NCkKK2VudW0ge19BTElHTiA9IDE2LCBfQUxJR05fU0hJRlQgPSA0LCBfTUFYX0JZVEVTID0gMjU2fTsKKyMgIGVsc2UKK2VudW0ge19BTElHTiA9IDgsIF9BTElHTl9TSElGVCA9IDMsIF9NQVhfQllURVMgPSAxMjh9OworIyAgZW5kaWYgLyogX19PUzQwMF9fICovCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX05PX0lPU1RSRUFNUykKKworIyAgaWYgIWRlZmluZWQgKF9TVExQX1VTRV9TSU1QTEVfTk9ERV9BTExPQykKKy8vIERlZmF1bHQgbm9kZSBhbGxvY2F0b3IuCisvLyBXaXRoIGEgcmVhc29uYWJsZSBjb21waWxlciwgdGhpcyBzaG91bGQgYmUgcm91Z2hseSBhcyBmYXN0IGFzIHRoZQorLy8gb3JpZ2luYWwgU1RMIGNsYXNzLXNwZWNpZmljIGFsbG9jYXRvcnMsIGJ1dCB3aXRoIGxlc3MgZnJhZ21lbnRhdGlvbi4KKy8vIERlZmluZSBfU1RMUF9VU0VfU0lNUExFX05PREVfQUxMT0MgdG8gdXNlIF9fbmV3X2FsbG9jIGluc3RlYWQsIHdoaWNoCisvLyBjYW4gYmUgaW1wbGVtZW50ZWQgd2l0aG91dCBvdXQtb2YtbGluZSBmdW5jdGlvbnMuCitjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBfX25vZGVfYWxsb2MgeworICBzdGF0aWMgdm9pZCAqIF9TVExQX0NBTEwgX01fYWxsb2NhdGUoc2l6ZV90JiBfX24pOworICAvKiBfX3AgbWF5IG5vdCBiZSAwICovCisgIHN0YXRpYyB2b2lkIF9TVExQX0NBTEwgX01fZGVhbGxvY2F0ZSh2b2lkICpfX3AsIHNpemVfdCBfX24pOworCitwdWJsaWM6CisgIC8vIHRoaXMgb25lIGlzIG5lZWRlZCBmb3IgcHJvcGVyIHNpbXBsZV9hbGxvYyB3cmFwcGluZworICB0eXBlZGVmIGNoYXIgdmFsdWVfdHlwZTsKKyMgIGlmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURV9DTEFTU0VTKSAmJiBkZWZpbmVkIChfU1RMUF9VU0VfUkFXX1NHSV9BTExPQ0FUT1JTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwMT4gc3RydWN0IHJlYmluZCB7CisgICAgdHlwZWRlZiBfX2FsbG9jYXRvcjxfVHAxLCBfX25vZGVfYWxsb2M+IG90aGVyOworICB9OworIyAgZW5kaWYKKyAgLyogX19uIG11c3QgYmUgPiAwICAgICAgKi8KKyAgc3RhdGljIHZvaWQqIF9TVExQX0NBTEwgYWxsb2NhdGUoc2l6ZV90JiBfX24pCisgIHsgcmV0dXJuIChfX24gPiAoc2l6ZV90KV9NQVhfQllURVMpID8gX19zdGxfbmV3KF9fbikgOiBfTV9hbGxvY2F0ZShfX24pOyB9CisgIC8qIF9fcCBtYXkgbm90IGJlIDAgKi8KKyAgc3RhdGljIHZvaWQgX1NUTFBfQ0FMTCBkZWFsbG9jYXRlKHZvaWQgKl9fcCwgc2l6ZV90IF9fbikKKyAgeyBpZiAoX19uID4gKHNpemVfdClfTUFYX0JZVEVTKSBfX3N0bF9kZWxldGUoX19wKTsgZWxzZSBfTV9kZWFsbG9jYXRlKF9fcCwgX19uKTsgfQorfTsKKworIyAgICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUKQorX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIF9fZGVidWdfYWxsb2M8X19ub2RlX2FsbG9jPjsKKyMgICAgZW5kaWYKKworIyAgZWxzZSAvKiBfU1RMUF9VU0VfU0lNUExFX05PREVfQUxMT0MgKi8KKy8vIFVzZSBfX25ld19hbGxvYyBpbnN0ZWFkIG9mIF9fbm9kZV9hbGxvYy4gVGhpcyBwcmV2ZW50cyB0aGUgbmVlZCBmb3IKKy8vIG91dC1vZi1saW5lIF9NX2FsbG9jYXRlIGFuZCBfTV9kZWFsbG9hY3RlIGZ1bmN0aW9ucy4KK3R5cGVkZWYgX19uZXdfYWxsb2MgX19ub2RlX2FsbG9jOworCisjICBlbmRpZiAvKiBfU1RMUF9VU0VfU0lNUExFX05PREVfQUxMT0MgKi8KKworI2VuZGlmIC8qIF9TVExQX1VTRV9OT19JT1NUUkVBTVMgKi8KKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9URU1QTEFURV9FWFBPUlQpCitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgX19kZWJ1Z19hbGxvYzxfX25ld19hbGxvYz47CitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgX19kZWJ1Z19hbGxvYzxfX21hbGxvY19hbGxvYz47CisjZW5kaWYKKworLyogbWFjcm8gdG8gY29udmVydCB0aGUgYWxsb2NhdG9yIGZvciBpbml0aWFsaXphdGlvbgorICogbm90IHVzaW5nIE1FTUJFUl9URU1QTEFURV9DTEFTU0VTIGFzIGl0IHNob3VsZCB3b3JrIGdpdmVuIHRlbXBsYXRlIGNvbnN0cnVjdG9yICAqLworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpIHx8ICEgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikKKy8qIGlmIF9TVExQX05PX1RFTVBMQVRFX0NPTlZFUlNJT05TIGlzIHNldCwgdGhlIG1lbWJlciB0ZW1wbGF0ZSBjb25zdHJ1Y3RvciBpcworICogbm90IHVzZWQgaW1wbGljaXRseSB0byBjb252ZXJ0IGFsbG9jYXRvciBwYXJhbWV0ZXIsIHNvIGxldCB1cyBkbyBpdCBleHBsaWNpdGx5ICovCisjICBpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVfQ0xBU1NFUykgJiYgZGVmaW5lZCAoX1NUTFBfTk9fVEVNUExBVEVfQ09OVkVSU0lPTlMpCisjICAgIGRlZmluZSBfU1RMUF9DT05WRVJUX0FMTE9DQVRPUihfX2EsIF9UcCkgX19zdGxfYWxsb2NfY3JlYXRlKF9fYSwoX1RwKikwKQorIyAgZWxzZQorIyAgICBkZWZpbmUgX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoX19hLCBfVHApIF9fYQorIyAgZW5kaWYKKy8qIGVsc2UgY29udmVydCwgYnV0IG9ubHkgaWYgcGFydGlhbCBzcGVjaWFsaXphdGlvbiB3b3Jrcywgc2luY2UgZWxzZQorICogQ29udGFpbmVyOjphbGxvY2F0b3JfdHlwZSB3b24ndCBiZSBkaWZmZXJlbnQgKi8KKyNlbHNlCisjICBkZWZpbmUgX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoX19hLCBfVHApIF9fc3RsX2FsbG9jX2NyZWF0ZShfX2EsKF9UcCopMCkKKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTIHx8ICFfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OICovCisKKy8vIEFub3RoZXIgYWxsb2NhdG9yIGFkYXB0b3I6IF9BbGxvY190cmFpdHMuICBUaGlzIHNlcnZlcyB0d28KKy8vIHB1cnBvc2VzLiAgRmlyc3QsIG1ha2UgaXQgcG9zc2libGUgdG8gd3JpdGUgY29udGFpbmVycyB0aGF0IGNhbiB1c2UKKy8vIGVpdGhlciBTR0ktc3R5bGUgYWxsb2NhdG9ycyBvciBzdGFuZGFyZC1jb25mb3JtaW5nIGFsbG9jYXRvci4KKworLy8gVGhlIGZ1bGx5IGdlbmVyYWwgdmVyc2lvbi4KK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+CitzdHJ1Y3QgX0FsbG9jX3RyYWl0cyB7CisgIHR5cGVkZWYgX0FsbG9jYXRvciBfT3JpZzsKKyNpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBQT1JUX1JFQklORF9NRU1CRVJfVEVNUExBVEUpCisgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jYXRvcjo6X1NUTFBfVEVNUExBVEUgcmViaW5kPF9UcD4gX1JlYmluZF90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9SZWJpbmRfdHlwZTo6b3RoZXIgIGFsbG9jYXRvcl90eXBlOworICBzdGF0aWMgYWxsb2NhdG9yX3R5cGUgY3JlYXRlX2FsbG9jYXRvcihjb25zdCBfT3JpZyYgX19hKQorICB7IHJldHVybiBhbGxvY2F0b3JfdHlwZShfU1RMUF9DT05WRVJUX0FMTE9DQVRPUihfX2EsIF9UcCkpOyB9CisjZWxzZQorICAvLyB0aGlzIGlzIG5vdCBhY3R1YWxseSB0cnVlLCB1c2VkIG9ubHkgdG8gcGFzcyB0aGlzIHR5cGUgdGhyb3VnaAorICAvLyB0byBkeW5hbWljIG92ZXJsb2FkIHNlbGVjdGlvbiBpbiBfU1RMUF9hbGxvY19wcm94eSBtZXRob2RzCisgIHR5cGVkZWYgX0FsbG9jYXRvciBhbGxvY2F0b3JfdHlwZTsKKyNlbmRpZiAvKiAhX1NUTFBfRE9OVF9TVVBQT1JUX1JFQklORF9NRU1CRVJfVEVNUExBVEUgKi8KK307CisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUEVSVEhSRUFEX0FMTE9DKQorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKy8vIGluY2x1ZGUgYWRkaXRpb25hbCBoZWFkZXIgaGVyZQorIyAgaW5jbHVkZSA8c3RsL19wdGhyZWFkX2FsbG9jLmg+CisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisjICBpZiBkZWZpbmVkIChfU1RMUF9ERUJVR19BTExPQykKK3R5cGVkZWYgX19kZWJ1Z19hbGxvYzxfX3B0aHJlYWRfYWxsb2M+IF9fc2dpX2FsbG9jOworIyAgZWxzZQordHlwZWRlZiBfX3B0aHJlYWRfYWxsb2MgX19zZ2lfYWxsb2M7CisjICBlbmRpZiAvKiBfU1RMUF9ERUJVR19BTExPQyAqLworCit0eXBlZGVmIF9fcHRocmVhZF9hbGxvYyBfX3NpbmdsZV9jbGllbnRfYWxsb2M7Cit0eXBlZGVmIF9fcHRocmVhZF9hbGxvYyBfX211bHRpdGhyZWFkZWRfYWxsb2M7CisKKyNlbHNlIC8qIF9TVExQX1VTRV9QRVJUSFJFQURfQUxMT0MgKi8KKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX05FV0FMTE9DKQorCisjICAgIGlmIGRlZmluZWQgKF9TVExQX0RFQlVHX0FMTE9DKQordHlwZWRlZiBfX2RlYnVnX2FsbG9jPF9fbmV3X2FsbG9jPiBfX3NnaV9hbGxvYzsKKyMgICAgZWxzZQordHlwZWRlZiBfX25ld19hbGxvYyBfX3NnaV9hbGxvYzsKKyMgICAgZW5kaWYgLyogX1NUTFBfREVCVUdfQUxMT0MgKi8KKwordHlwZWRlZiBfX25ld19hbGxvYyBfX3NpbmdsZV9jbGllbnRfYWxsb2M7Cit0eXBlZGVmIF9fbmV3X2FsbG9jIF9fbXVsdGl0aHJlYWRlZF9hbGxvYzsKKworIyAgZWxpZiBkZWZpbmVkIChfU1RMUF9VU0VfTUFMTE9DKQorCisjICAgIGlmIGRlZmluZWQgKF9TVExQX0RFQlVHX0FMTE9DKQordHlwZWRlZiBfX2RlYnVnX2FsbG9jPF9fbWFsbG9jX2FsbG9jPiBfX3NnaV9hbGxvYzsKKyMgICAgZWxzZQordHlwZWRlZiBfX21hbGxvY19hbGxvYyBfX3NnaV9hbGxvYzsKKyMgICAgZW5kaWYgLyogX1NUTFBfREVCVUdfQUxMT0MgKi8KKwordHlwZWRlZiBfX21hbGxvY19hbGxvYyBfX3NpbmdsZV9jbGllbnRfYWxsb2M7Cit0eXBlZGVmIF9fbWFsbG9jX2FsbG9jIF9fbXVsdGl0aHJlYWRlZF9hbGxvYzsKKworIyAgZWxzZQorCisjICAgIGlmIGRlZmluZWQgKF9TVExQX0RFQlVHX0FMTE9DKQordHlwZWRlZiBfX2RlYnVnX2FsbG9jPF9fbm9kZV9hbGxvYz4gX19zZ2lfYWxsb2M7CisjICAgIGVsc2UKK3R5cGVkZWYgX19ub2RlX2FsbG9jIF9fc2dpX2FsbG9jOworIyAgICBlbmRpZgorCit0eXBlZGVmIF9fbm9kZV9hbGxvYyBfX3NpbmdsZV9jbGllbnRfYWxsb2M7Cit0eXBlZGVmIF9fbm9kZV9hbGxvYyBfX211bHRpdGhyZWFkZWRfYWxsb2M7CisKKyMgIGVuZGlmIC8qIF9TVExQX1VTRV9ORVdBTExPQyAqLworI2VuZGlmIC8qIF9TVExQX1VTRV9QRVJUSFJFQURfQUxMT0MgKi8KKworLy8gVGhpcyBpbXBsZW1lbnRzIGFsbG9jYXRvcnMgYXMgc3BlY2lmaWVkIGluIHRoZSBDKysgc3RhbmRhcmQuCisvLworLy8gTm90ZSB0aGF0IHN0YW5kYXJkLWNvbmZvcm1pbmcgYWxsb2NhdG9ycyB1c2UgbWFueSBsYW5ndWFnZSBmZWF0dXJlcworLy8gdGhhdCBhcmUgbm90IHlldCB3aWRlbHkgaW1wbGVtZW50ZWQuICBJbiBwYXJ0aWN1bGFyLCB0aGV5IHJlbHkgb24KKy8vIG1lbWJlciB0ZW1wbGF0ZXMsIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24sIHBhcnRpYWwgb3JkZXJpbmcgb2YgZnVuY3Rpb24KKy8vIHRlbXBsYXRlcywgdGhlIHR5cGVuYW1lIGtleXdvcmQsIGFuZCB0aGUgdXNlIG9mIHRoZSB0ZW1wbGF0ZSBrZXl3b3JkCisvLyB0byByZWZlciB0byBhIHRlbXBsYXRlIG1lbWJlciBvZiBhIGRlcGVuZGVudCB0eXBlLgorCisvKgordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfQWxsb2NhdG9yQXV4IHsKKyAgdHlwZWRlZiBfVHAqICAgICAgIHBvaW50ZXI7CisgIHR5cGVkZWYgY29uc3QgX1RwKiBjb25zdF9wb2ludGVyOworICB0eXBlZGVmIF9UcCYgICAgICAgcmVmZXJlbmNlOworICB0eXBlZGVmIGNvbnN0IF9UcCYgY29uc3RfcmVmZXJlbmNlOworCisgIHBvaW50ZXIgYWRkcmVzcyhyZWZlcmVuY2UgX194KSBjb25zdCB7cmV0dXJuICZfX3g7fQorICBjb25zdF9wb2ludGVyIGFkZHJlc3MoY29uc3RfcmVmZXJlbmNlIF9feCkgY29uc3QgeyByZXR1cm4gJl9feDsgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfQWxsb2NhdG9yQXV4PGNvbnN0IF9UcD4geworICB0eXBlZGVmIF9UcCogICAgICAgcG9pbnRlcjsKKyAgdHlwZWRlZiBjb25zdCBfVHAqIGNvbnN0X3BvaW50ZXI7CisgIHR5cGVkZWYgX1RwJiAgICAgICByZWZlcmVuY2U7CisgIHR5cGVkZWYgY29uc3QgX1RwJiBjb25zdF9yZWZlcmVuY2U7CisKKyAgY29uc3RfcG9pbnRlciBhZGRyZXNzKGNvbnN0X3JlZmVyZW5jZSBfX3gpIGNvbnN0IHsgcmV0dXJuICZfX3g7IH0KK307CisqLworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorY2xhc3MgYWxsb2NhdG9yIC8vOiBwdWJsaWMgX0FsbG9jYXRvckF1eDxfVHA+CisvKiBBIHNtYWxsIGhlbHBlciBzdHJ1Y3QgdG8gcmVjb2duaXplIFNUTHBvcnQgYWxsb2NhdG9yIGltcGxlbWVudGF0aW9uCisgKiBmcm9tIGFueSB1c2VyIHNwZWNpYWxpemF0aW9uIG9uZS4KKyAqLworICAgICAgICAgICAgICAgIDogcHVibGljIF9fc3RscG9ydF9jbGFzczxhbGxvY2F0b3I8X1RwPiA+IHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBfVHAgICAgICAgIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgX1RwKiAgICAgICBwb2ludGVyOworICB0eXBlZGVmIGNvbnN0IF9UcCogY29uc3RfcG9pbnRlcjsKKyAgdHlwZWRlZiBfVHAmICAgICAgIHJlZmVyZW5jZTsKKyAgdHlwZWRlZiBjb25zdCBfVHAmIGNvbnN0X3JlZmVyZW5jZTsKKyAgdHlwZWRlZiBzaXplX3QgICAgIHNpemVfdHlwZTsKKyAgdHlwZWRlZiBwdHJkaWZmX3QgIGRpZmZlcmVuY2VfdHlwZTsKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVfQ0xBU1NFUykKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcDE+IHN0cnVjdCByZWJpbmQgeworICAgIHR5cGVkZWYgYWxsb2NhdG9yPF9UcDE+IG90aGVyOworICB9OworI2VuZGlmCisgIGFsbG9jYXRvcigpIF9TVExQX05PVEhST1cge30KKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwMT4gYWxsb2NhdG9yKGNvbnN0IGFsbG9jYXRvcjxfVHAxPiYpIF9TVExQX05PVEhST1cge30KKyNlbmRpZgorICBhbGxvY2F0b3IoY29uc3QgYWxsb2NhdG9yPF9UcD4mKSBfU1RMUF9OT1RIUk9XIHt9CisgIGFsbG9jYXRvcihfX21vdmVfc291cmNlPGFsbG9jYXRvcjxfVHA+ID4gc3JjKSBfU1RMUF9OT1RIUk9XIHt9CisgIH5hbGxvY2F0b3IoKSBfU1RMUF9OT1RIUk9XIHt9CisgIHBvaW50ZXIgYWRkcmVzcyhyZWZlcmVuY2UgX194KSBjb25zdCB7cmV0dXJuICZfX3g7fQorICBjb25zdF9wb2ludGVyIGFkZHJlc3MoY29uc3RfcmVmZXJlbmNlIF9feCkgY29uc3QgeyByZXR1cm4gJl9feDsgfQorICAvLyBfX24gaXMgcGVybWl0dGVkIHRvIGJlIDAuICBUaGUgQysrIHN0YW5kYXJkIHNheXMgbm90aGluZyBhYm91dCB3aGF0IHRoZSByZXR1cm4gdmFsdWUgaXMgd2hlbiBfX24gPT0gMC4KKyAgX1RwKiBhbGxvY2F0ZShzaXplX3R5cGUgX19uLCBjb25zdCB2b2lkKiA9IDApIHsKKyAgICBpZiAoX19uID4gbWF4X3NpemUoKSkgeworICAgICAgX19USFJPV19CQURfQUxMT0M7CisgICAgfQorICAgIGlmIChfX24gIT0gMCkgeworICAgICAgc2l6ZV90eXBlIF9fYnVmX3NpemUgPSBfX24gKiBzaXplb2YodmFsdWVfdHlwZSk7CisgICAgICBfVHAqIF9fcmV0ID0gX19SRUlOVEVSUFJFVF9DQVNUKF9UcCosIF9fc2dpX2FsbG9jOjphbGxvY2F0ZShfX2J1Zl9zaXplKSk7CisjaWYgZGVmaW5lZCAoX1NUTFBfREVCVUdfVU5JTklUSUFMSVpFRCkgJiYgIWRlZmluZWQgKF9TVExQX0RFQlVHX0FMTE9DKQorICAgICAgaWYgKF9fcmV0ICE9IDApIHsKKyAgICAgICAgbWVtc2V0KChjaGFyKilfX3JldCwgX1NUTFBfU0hSRURfQllURSwgX19idWZfc2l6ZSk7CisgICAgICB9CisjZW5kaWYKKyAgICAgIHJldHVybiBfX3JldDsKKyAgICB9CisgICAgZWxzZQorICAgICAgcmV0dXJuIDA7CisgIH0KKyAgLy8gX19wIGlzIHBlcm1pdHRlZCB0byBiZSBhIG51bGwgcG9pbnRlciwgb25seSBpZiBuPT0wLgorICB2b2lkIGRlYWxsb2NhdGUocG9pbnRlciBfX3AsIHNpemVfdHlwZSBfX24pIHsKKyAgICBfU1RMUF9BU1NFUlQoIChfX3AgPT0gMCkgPT0gKF9fbiA9PSAwKSApCisgICAgaWYgKF9fcCAhPSAwKSB7CisjaWYgZGVmaW5lZCAoX1NUTFBfREVCVUdfVU5JTklUSUFMSVpFRCkgJiYgIWRlZmluZWQgKF9TVExQX0RFQlVHX0FMTE9DKQorICAgICAgbWVtc2V0KChjaGFyKilfX3AsIF9TVExQX1NIUkVEX0JZVEUsIF9fbiAqIHNpemVvZih2YWx1ZV90eXBlKSk7CisjZW5kaWYKKyAgICAgIF9fc2dpX2FsbG9jOjpkZWFsbG9jYXRlKCh2b2lkKilfX3AsIF9fbiAqIHNpemVvZih2YWx1ZV90eXBlKSk7CisgICAgfQorICB9CisgIC8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CisgIHZvaWQgZGVhbGxvY2F0ZShwb2ludGVyIF9fcCkgY29uc3QgeyAgaWYgKF9fcCAhPSAwKSBfX3NnaV9hbGxvYzo6ZGVhbGxvY2F0ZSgodm9pZCopX19wLCBzaXplb2YodmFsdWVfdHlwZSkpOyB9CisgIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IF9TVExQX05PVEhST1cgIHsgcmV0dXJuIHNpemVfdCgtMSkgLyBzaXplb2YodmFsdWVfdHlwZSk7IH0KKyAgdm9pZCBjb25zdHJ1Y3QocG9pbnRlciBfX3AsIGNvbnN0X3JlZmVyZW5jZSBfX3ZhbCkgeyBfU1RMUF9TVEQ6Ol9Db3B5X0NvbnN0cnVjdChfX3AsIF9fdmFsKTsgfQorICB2b2lkIGRlc3Ryb3kocG9pbnRlciBfX3ApIHsgX1NUTFBfU1REOjpfRGVzdHJveShfX3ApOyB9CisjaWYgZGVmaW5lZChfX01SQ19fKXx8KGRlZmluZWQoX19TQ19fKSAmJiAhZGVmaW5lZChfX0RNQ19fKSkKKyAgdGVtcGxhdGUgPGNsYXNzIF9UMj4gYm9vbCBvcGVyYXRvcj09KGNvbnN0IGFsbG9jYXRvcjxfVDI+JikgY29uc3QgX1NUTFBfTk9USFJPVyB7IHJldHVybiB0cnVlOyB9CisgIHRlbXBsYXRlIDxjbGFzcyBfVDI+IGJvb2wgb3BlcmF0b3IhPShjb25zdCBhbGxvY2F0b3I8X1QyPiYpIGNvbnN0IF9TVExQX05PVEhST1cgeyByZXR1cm4gZmFsc2U7IH0KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EKSAmJiAhZGVmaW5lZCAoX1NUTFBfRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSKQorICAvL1RoaXMgaXMganVzdCB0byBtYWtlIHN3YXAgd29ya2Fyb3VuZCBmb3IgY29tcGlsZXIgd2l0aG91dCB0ZW1wbGF0ZSBmdW5jdGlvbiBwYXJ0aWFsCisgIC8vaGFwcHkuCisgIHZvaWQgc3dhcChhbGxvY2F0b3I8X1RwPiYpIHt9CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpCisgIC8qIFNUTHBvcnQgZXh0ZW5zaW9uIGdpdmluZyByb3VuZGVkIHNpemUgb2YgYW4gYWxsb2NhdGVkIG1lbW9yeSBidWZmZXIKKyAgICogVGhpcyBtZXRob2QgZG8gbm90IGhhdmUgdG8gYmUgcGFydCBvZiBhIHVzZXIgZGVmaW5lZCBhbGxvY2F0b3IgaW1wbGVtZW50YXRpb24KKyAgICogYW5kIHdvbid0IGV2ZW4gYmUgY2FsbGVkIGlmIHN1Y2ggYSBmdW5jdGlvbiB3YXMgZ3JhbnRlZC4KKyAgICovCitwcm90ZWN0ZWQ6CisjZW5kaWYKKyAgX1RwKiBhbGxvY2F0ZShzaXplX3R5cGUgX19uLCBzaXplX3R5cGUmIF9fYWxsb2NhdGVkX24pIHsKKyAgICBpZiAoX19uID4gbWF4X3NpemUoKSkgeworICAgICAgX19USFJPV19CQURfQUxMT0M7CisgICAgfQorCisgICAgaWYgKF9fbiAhPSAwKSB7CisgICAgICBzaXplX3R5cGUgX19idWZfc2l6ZSA9IF9fbiAqIHNpemVvZih2YWx1ZV90eXBlKTsKKyAgICAgIF9UcCogX19yZXQgPSBfX1JFSU5URVJQUkVUX0NBU1QoX1RwKiwgX19zZ2lfYWxsb2M6OmFsbG9jYXRlKF9fYnVmX3NpemUpKTsKKyNpZiBkZWZpbmVkIChfU1RMUF9ERUJVR19VTklOSVRJQUxJWkVEKSAmJiAhZGVmaW5lZCAoX1NUTFBfREVCVUdfQUxMT0MpCisgICAgICBpZiAoX19yZXQgIT0gMCkgeworICAgICAgICBtZW1zZXQoKGNoYXIqKV9fcmV0LCBfU1RMUF9TSFJFRF9CWVRFLCBfX2J1Zl9zaXplKTsKKyAgICAgIH0KKyNlbmRpZgorICAgICAgX19hbGxvY2F0ZWRfbiA9IF9fYnVmX3NpemUgLyBzaXplb2YodmFsdWVfdHlwZSk7CisgICAgICByZXR1cm4gX19yZXQ7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHJldHVybiAwOworICB9Cit9OworCitfU1RMUF9URU1QTEFURV9OVUxMCitjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBhbGxvY2F0b3I8dm9pZD4geworcHVibGljOgorICB0eXBlZGVmIHNpemVfdCAgICAgIHNpemVfdHlwZTsKKyAgdHlwZWRlZiBwdHJkaWZmX3QgICBkaWZmZXJlbmNlX3R5cGU7CisgIHR5cGVkZWYgdm9pZCogICAgICAgcG9pbnRlcjsKKyAgdHlwZWRlZiBjb25zdCB2b2lkKiBjb25zdF9wb2ludGVyOworI2lmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pCisgIHR5cGVkZWYgdm9pZCAgICAgICAgdmFsdWVfdHlwZTsKKyNlbmRpZgorI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURV9DTEFTU0VTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwMT4gc3RydWN0IHJlYmluZCB7CisgICAgdHlwZWRlZiBhbGxvY2F0b3I8X1RwMT4gb3RoZXI7CisgIH07CisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fTVJDX18pfHwoZGVmaW5lZChfX1NDX18pJiYhZGVmaW5lZChfX0RNQ19fKSkgIC8vKnR5IDAzLzI0LzIwMDEgLSBNUFcgY29tcGlsZXJzIGdldCBjb25mdXNlZCBvbiB0aGVzZSBvcGVyYXRvciBkZWZpbml0aW9ucworICB0ZW1wbGF0ZSA8Y2xhc3MgX1QyPiBib29sIG9wZXJhdG9yPT0oY29uc3QgYWxsb2NhdG9yPF9UMj4mKSBjb25zdCBfU1RMUF9OT1RIUk9XIHsgcmV0dXJuIHRydWU7IH0KKyAgdGVtcGxhdGUgPGNsYXNzIF9UMj4gYm9vbCBvcGVyYXRvciE9KGNvbnN0IGFsbG9jYXRvcjxfVDI+JikgY29uc3QgX1NUTFBfTk9USFJPVyB7IHJldHVybiBmYWxzZTsgfQorI2VuZGlmCit9OworCisjaWYgIShkZWZpbmVkKF9fTVJDX18pfHwoZGVmaW5lZChfX1NDX18pJiYhZGVmaW5lZChfX0RNQ19fKSkpICAvLyp0eSAwMy8yNC8yMDAxIC0gTVBXIGNvbXBpbGVycyBnZXQgY29uZnVzZWQgb24gdGhlc2Ugb3BlcmF0b3IgZGVmaW5pdGlvbnMKK3RlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMj4gaW5saW5lIGJvb2wgIF9TVExQX0NBTEwgb3BlcmF0b3I9PShjb25zdCBhbGxvY2F0b3I8X1QxPiYsIGNvbnN0IGFsbG9jYXRvcjxfVDI+JikgX1NUTFBfTk9USFJPVyB7IHJldHVybiB0cnVlOyB9Cit0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+IGlubGluZSBib29sICBfU1RMUF9DQUxMIG9wZXJhdG9yIT0oY29uc3QgYWxsb2NhdG9yPF9UMT4mLCBjb25zdCBhbGxvY2F0b3I8X1QyPiYpIF9TVExQX05PVEhST1cgeyByZXR1cm4gZmFsc2U7IH0KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCkKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBhbGxvY2F0b3I8Y2hhcj47CisjICBpZiBkZWZpbmVkIChfU1RMUF9IQVNfV0NIQVJfVCkKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBhbGxvY2F0b3I8d2NoYXJfdD47CisjICBlbmRpZgorIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BUUl9TUEVDSUFMSVpBVElPTlMpCitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgYWxsb2NhdG9yPHZvaWQqPjsKKyMgIGVuZGlmCisjZW5kaWYKKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9fYWxsb2NfdHlwZV90cmFpdHMgeworI2lmICFkZWZpbmVkIChfX0JPUkxBTkRDX18pCisgIHR5cGVkZWYgdHlwZW5hbWUgX0lzU1RMcG9ydENsYXNzPGFsbG9jYXRvcjxfVHA+ID46Ol9SZXQgX1NUTHBvcnRBbGxvYzsKKyNlbHNlCisgIGVudW0geyBfSXMgPSBfSXNTVExwb3J0Q2xhc3M8YWxsb2NhdG9yPF9UcD4gPjo6X0lzIH07CisgIHR5cGVkZWYgdHlwZW5hbWUgX19ib29sMnR5cGU8X0lzPjo6X1JldCBfU1RMcG9ydEFsbG9jOworI2VuZGlmCisgIC8vVGhlIGRlZmF1bHQgYWxsb2NhdG9yIGltcGxlbWVudGF0aW9uIHdoaWNoIGlzIHJlY29nbml6ZSB0aGFua3MgdG8gdGhlCisgIC8vX19zdGxwb3J0X2NsYXNzIGluaGVyaXRhbmNlIGlzIGEgc3RhdGVsZXNzIG9iamVjdCBzbzoKKyAgdHlwZWRlZiBfU1RMcG9ydEFsbG9jIGhhc190cml2aWFsX2RlZmF1bHRfY29uc3RydWN0b3I7CisgIHR5cGVkZWYgX1NUTHBvcnRBbGxvYyBoYXNfdHJpdmlhbF9jb3B5X2NvbnN0cnVjdG9yOworICB0eXBlZGVmIF9TVExwb3J0QWxsb2MgaGFzX3RyaXZpYWxfYXNzaWdubWVudF9vcGVyYXRvcjsKKyAgdHlwZWRlZiBfU1RMcG9ydEFsbG9jIGhhc190cml2aWFsX2Rlc3RydWN0b3I7CisgIHR5cGVkZWYgX1NUTHBvcnRBbGxvYyBpc19QT0RfdHlwZTsKK307CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCisjaWYgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX190eXBlX3RyYWl0czxhbGxvY2F0b3I8X1RwPiA+IDogX1NUTFBfUFJJViBfX2FsbG9jX3R5cGVfdHJhaXRzPF9UcD4ge307CisjZWxzZQorX1NUTFBfVEVNUExBVEVfTlVMTAorc3RydWN0IF9fdHlwZV90cmFpdHM8YWxsb2NhdG9yPGNoYXI+ID4gOiBfU1RMUF9QUklWIF9fYWxsb2NfdHlwZV90cmFpdHM8Y2hhcj4ge307CisjICBpZiBkZWZpbmVkIChfU1RMUF9IQVNfV0NIQVJfVCkKK19TVExQX1RFTVBMQVRFX05VTEwKK3N0cnVjdCBfX3R5cGVfdHJhaXRzPGFsbG9jYXRvcjx3Y2hhcl90PiA+IDogX1NUTFBfUFJJViBfX2FsbG9jX3R5cGVfdHJhaXRzPHdjaGFyX3Q+IHt9OworIyAgZW5kaWYKKyMgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9QVFJfU1BFQ0lBTElaQVRJT05TKQorX1NUTFBfVEVNUExBVEVfTlVMTAorc3RydWN0IF9fdHlwZV90cmFpdHM8YWxsb2NhdG9yPHZvaWQqPiA+IDogX1NUTFBfUFJJViBfX2FsbG9jX3R5cGVfdHJhaXRzPHZvaWQqPiB7fTsKKyMgIGVuZGlmCisjZW5kaWYKKworCisjaWYgIWRlZmluZWQgKF9TVExQX0ZPUkNFX0FMTE9DQVRPUlMpCisjICBkZWZpbmUgX1NUTFBfRk9SQ0VfQUxMT0NBVE9SUyhhLHkpCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pICYmICFkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVfQ0xBU1NFUykKKy8vIFRoZSB2ZXJzaW9uIGZvciB0aGUgZGVmYXVsdCBhbGxvY2F0b3IsIGZvciByYXJlIG9jY2FzaW9uIHdoZW4gd2UgaGF2ZSBwYXJ0aWFsIHNwZWMgdy9vIG1lbWJlciB0ZW1wbGF0ZSBjbGFzc2VzCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVHAxPgorc3RydWN0IF9BbGxvY190cmFpdHM8X1RwLCBhbGxvY2F0b3I8X1RwMT4gPiB7CisgIHR5cGVkZWYgYWxsb2NhdG9yPF9UcDE+IF9PcmlnOworICB0eXBlZGVmIGFsbG9jYXRvcjxfVHA+IGFsbG9jYXRvcl90eXBlOworICBzdGF0aWMgYWxsb2NhdG9yX3R5cGUgY3JlYXRlX2FsbG9jYXRvcihjb25zdCBhbGxvY2F0b3I8X1RwMSA+JiBfX2EpCisgIHsgcmV0dXJuIGFsbG9jYXRvcl90eXBlKF9TVExQX0NPTlZFUlRfQUxMT0NBVE9SKF9fYSwgX1RwKSk7IH0KK307CisjZW5kaWYgLyogX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTiAqLworCisjaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfU1VQUE9SVF9SRUJJTkRfTUVNQkVSX1RFTVBMQVRFKSAmJiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgoraW5saW5lIF9TVExQX1RZUEVOQU1FX09OX1JFVFVSTl9UWVBFIF9BbGxvY190cmFpdHM8X1RwLCBfQWxsb2M+OjphbGxvY2F0b3JfdHlwZSAgX1NUTFBfQ0FMTAorX19zdGxfYWxsb2NfY3JlYXRlKGNvbnN0IF9BbGxvYyYgX19hLCBjb25zdCBfVHAqKSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpfU1RMUF9URU1QTEFURSByZWJpbmQ8X1RwPjo6b3RoZXIgX1JlYm91bmRfdHlwZTsKKyAgcmV0dXJuIF9SZWJvdW5kX3R5cGUoX19hKTsKK30KKyNlbHNlCisvLyBJZiBjdXN0b20gYWxsb2NhdG9ycyBhcmUgYmVpbmcgdXNlZCB3aXRob3V0IG1lbWJlciB0ZW1wbGF0ZSBjbGFzc2VzIHN1cHBvcnQgOgorLy8gdXNlciAob24gcHVycG9zZSkgaXMgZm9yY2VkIHRvIGRlZmluZSByZWJpbmQvZ2V0IG9wZXJhdGlvbnMgISEhCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwMSwgY2xhc3MgX1RwMj4KK2lubGluZSBhbGxvY2F0b3I8X1RwMj4mIF9TVExQX0NBTEwKK19fc3RsX2FsbG9jX3JlYmluZChhbGxvY2F0b3I8X1RwMT4mIF9fYSwgY29uc3QgX1RwMiopIHsgIHJldHVybiAoYWxsb2NhdG9yPF9UcDI+JikoX19hKTsgfQordGVtcGxhdGUgPGNsYXNzIF9UcDEsIGNsYXNzIF9UcDI+CitpbmxpbmUgYWxsb2NhdG9yPF9UcDI+IF9TVExQX0NBTEwKK19fc3RsX2FsbG9jX2NyZWF0ZShjb25zdCBhbGxvY2F0b3I8X1RwMT4mLCBjb25zdCBfVHAyKikgeyByZXR1cm4gYWxsb2NhdG9yPF9UcDI+KCk7IH0KKyNlbmRpZiAvKiBfU1RMUF9ET05UX1NVUFBPUlRfUkVCSU5EX01FTUJFUl9URU1QTEFURSAqLworCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1JBV19TR0lfQUxMT0NBVE9SUykKKy8vIG1vdmUgb2Jzb2xldGUgc3R1ZmYgb3V0IG9mIHRoZSB3YXkKKyMgIGluY2x1ZGUgPHN0bC9fYWxsb2Nfb2xkLmg+CisjZW5kaWYKKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCisvLyBpbmhlcml0YW5jZSBpcyBiZWluZyB1c2VkIGZvciBFQk8gb3B0aW1pemF0aW9uCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfVHAsIGNsYXNzIF9NYXliZVJlYm91bmRBbGxvYz4KK2NsYXNzIF9TVExQX2FsbG9jX3Byb3h5IDogcHVibGljIF9NYXliZVJlYm91bmRBbGxvYyB7Citwcml2YXRlOgorICB0eXBlZGVmIF9NYXliZVJlYm91bmRBbGxvYyBfQmFzZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6c2l6ZV90eXBlIHNpemVfdHlwZTsKKyAgdHlwZWRlZiBfU1RMUF9hbGxvY19wcm94eTxfVmFsdWUsIF9UcCwgX01heWJlUmVib3VuZEFsbG9jPiBfU2VsZjsKK3B1YmxpYzoKKyAgX1ZhbHVlIF9NX2RhdGE7CisKKyAgX1NUTFBfYWxsb2NfcHJveHkgKGNvbnN0IF9NYXliZVJlYm91bmRBbGxvYyYgX19hLCBfVmFsdWUgX19wKSA6CisgICAgX01heWJlUmVib3VuZEFsbG9jKF9fYSksIF9NX2RhdGEoX19wKSB7fQorCisgIF9TVExQX2FsbG9jX3Byb3h5IChfX21vdmVfc291cmNlPF9TZWxmPiBzcmMpIDoKKyAgICBfTWF5YmVSZWJvdW5kQWxsb2MoX1NUTFBfUFJJViBfQXNNb3ZlU291cmNlPF9CYXNlPihzcmMuZ2V0KCkpKSwKKyAgICBfTV9kYXRhKF9TVExQX1BSSVYgX0FzTW92ZVNvdXJjZTxfVmFsdWU+KHNyYy5nZXQoKS5fTV9kYXRhKSkge30KKworcHJpdmF0ZToKKyAgLyogRm9sbG93aW5nIGFyZSBoZWxwZXIgbWV0aG9kcyB0byBkZXRlY3Qgc3RhdGVsZXNzIGFsbG9jYXRvcnMgYW5kIGF2b2lkCisgICAqIHN3YXAgaW4gdGhpcyBjYXNlLiBGb3Igc29tZSBjb21waWxlcnMgKFZDNikgaXQgaXMgYSB3b3JrYXJvdW5kIGZvciBhCisgICAqIGNvbXBpbGVyIGJ1ZyBpbiB0aGUgRW1wdHkgQmFzZSBjbGFzcyBPcHRpbWl6YXRpb24gZmVhdHVyZSwgZm9yIG90aGVycworICAgKiBpdCBpcyBhIHNtYWxsIG9wdGltaXphdGlvbiBvciBub3RoaW5nIGlmIG5vIEVCTy4gKi8KKyAgdm9pZCBfTV9zd2FwX2FsbG9jKF9TZWxmJiwgY29uc3QgX190cnVlX3R5cGUmIC8qX0lzU3RhdGVsZXNzKi8pCisgIHt9CisKKyAgdm9pZCBfTV9zd2FwX2FsbG9jKF9TZWxmJiBfX3gsIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypfSXNTdGF0ZWxlc3MqLykgeworICAgIF9NYXliZVJlYm91bmRBbGxvYyAmX19iYXNlX3RoaXMgPSAqdGhpczsKKyAgICBfTWF5YmVSZWJvdW5kQWxsb2MgJl9fYmFzZV94ID0gX194OworICAgIF9TVExQX1NURDo6c3dhcChfX2Jhc2VfdGhpcywgX19iYXNlX3gpOworICB9CisKK3B1YmxpYzoKKyAgdm9pZCBfTV9zd2FwX2FsbG9jKF9TZWxmJiBfX3gpIHsKKyNpZiAhZGVmaW5lZCAoX19CT1JMQU5EQ19fKQorICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lzU3RhdGVsZXNzPF9NYXliZVJlYm91bmRBbGxvYz46Ol9SZXQgX1N0YXRlbGVzc0FsbG9jOworI2Vsc2UKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fYm9vbDJ0eXBlPF9Jc1N0YXRlbGVzczxfTWF5YmVSZWJvdW5kQWxsb2M+OjpfSXM+OjpfUmV0IF9TdGF0ZWxlc3NBbGxvYzsKKyNlbmRpZgorICAgIF9NX3N3YXBfYWxsb2MoX194LCBfU3RhdGVsZXNzQWxsb2MoKSk7CisgIH0KKworICAvKiBXZSBuZWVkIHRvIGRlZmluZSB0aGUgZm9sbG93aW5nIHN3YXAgaW1wbGVtZW50YXRpb24gZm9yIGFsbG9jYXRvciB3aXRoIHN0YXRlCisgICAqIGFzIHRob3NlIGFsbG9jYXRvcnMgbWlnaHQgaGF2ZSBpbXBsZW1lbnQgYSBzcGVjaWFsIHN3YXAgZnVuY3Rpb24gdG8gY29ycmVjdGx5CisgICAqIG1vdmUgZGF0YXMgZnJvbSBhbiBpbnN0YW5jZSB0byB0aGUgb2hlciwgX1NUTFBfYWxsb2NfcHJveHkgc2hvdWxkIG5vdCBicmVhaworICAgKiB0aGlzIG1lY2FuaXNtLiAqLworICB2b2lkIHN3YXAoX1NlbGYmIF9feCkgeworICAgIF9NX3N3YXBfYWxsb2MoX194KTsKKyAgICBfU1RMUF9TVEQ6OnN3YXAoX01fZGF0YSwgX194Ll9NX2RhdGEpOworICB9CisKKyAgX1RwKiBhbGxvY2F0ZShzaXplX3R5cGUgX19uLCBzaXplX3R5cGUmIF9fYWxsb2NhdGVkX24pIHsKKyNpZiAhZGVmaW5lZCAoX19CT1JMQU5EQ19fKQorICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lzU1RMcG9ydENsYXNzPF9NYXliZVJlYm91bmRBbGxvYz46Ol9SZXQgX1NUTHBvcnRBbGxvYzsKKyNlbHNlCisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2Jvb2wydHlwZTxfSXNTVExwb3J0Q2xhc3M8X01heWJlUmVib3VuZEFsbG9jPjo6X0lzPjo6X1JldCBfU1RMcG9ydEFsbG9jOworI2VuZGlmCisgICAgcmV0dXJuIGFsbG9jYXRlKF9fbiwgX19hbGxvY2F0ZWRfbiwgX1NUTHBvcnRBbGxvYygpKTsKKyAgfQorCisgIC8vIFVuaWZpZWQgaW50ZXJmYWNlIHRvIHBlcmZvcm0gYWxsb2NhdGUoKS9kZWFsbG9jYXRlKCkgd2l0aCBsaW1pdGVkCisgIC8vIGxhbmd1YWdlIHN1cHBvcnQKKyNpZiBkZWZpbmVkIChfU1RMUF9ET05UX1NVUFBPUlRfUkVCSU5EX01FTUJFUl9URU1QTEFURSkKKyAgLy8gZWxzZSBpdCBpcyByZWJvdW5kIGFscmVhZHksIGFuZCBhbGxvY2F0ZSgpIG1lbWJlciBpcyBhY2Nlc3NpYmxlCisgIF9UcCogYWxsb2NhdGUoc2l6ZV90eXBlIF9fbikKKyAgeyByZXR1cm4gX19zdGxfYWxsb2NfcmViaW5kKF9fU1RBVElDX0NBU1QoX0Jhc2UmLCAqdGhpcyksIF9fU1RBVElDX0NBU1QoX1RwKiwgMCkpLmFsbG9jYXRlKF9fbiwgMCk7IH0KKyAgdm9pZCBkZWFsbG9jYXRlKF9UcCogX19wLCBzaXplX3R5cGUgX19uKQorICB7IF9fc3RsX2FsbG9jX3JlYmluZChfX1NUQVRJQ19DQVNUKF9CYXNlJiwgKnRoaXMpLCBfX1NUQVRJQ19DQVNUKF9UcCosIDApKS5kZWFsbG9jYXRlKF9fcCwgX19uKTsgfQorcHJpdmF0ZToKKyAgX1RwKiBhbGxvY2F0ZShzaXplX3R5cGUgX19uLCBzaXplX3R5cGUmIF9fYWxsb2NhdGVkX24sIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKlNUTHBvcnQgYWxsb2NhdG9yKi8pCisgIHsgcmV0dXJuIF9fc3RsX2FsbG9jX3JlYmluZChfX1NUQVRJQ19DQVNUKF9CYXNlJiwgKnRoaXMpLCBfX1NUQVRJQ19DQVNUKF9UcCosIDApKS5hbGxvY2F0ZShfX24sIF9fYWxsb2NhdGVkX24pOyB9CisjZWxzZQorICAvL0V4cG9zZSBTdGFuZGFyZCBhbGxvY2F0ZSBvdmVybG9hZCAodXNpbmcgZXhwcmVzc2lvbiBkbyBub3Qgd29yayBmb3Igc29tZSBjb21waWxlcnMgKEJvcmxhbmQpKQorICBfVHAqIGFsbG9jYXRlKHNpemVfdHlwZSBfX24pCisgIHsgcmV0dXJuIF9CYXNlOjphbGxvY2F0ZShfX24pOyB9Citwcml2YXRlOgorICBfVHAqIGFsbG9jYXRlKHNpemVfdHlwZSBfX24sIHNpemVfdHlwZSYgX19hbGxvY2F0ZWRfbiwgY29uc3QgX190cnVlX3R5cGUmIC8qU1RMcG9ydCBhbGxvY2F0b3IqLykKKyAgeyByZXR1cm4gX0Jhc2U6OmFsbG9jYXRlKF9fbiwgX19hbGxvY2F0ZWRfbik7IH0KKyNlbmRpZgorCisgIF9UcCogYWxsb2NhdGUoc2l6ZV90eXBlIF9fbiwgc2l6ZV90eXBlJiBfX2FsbG9jYXRlZF9uLCBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qU1RMcG9ydCBhbGxvY2F0b3IqLykKKyAgeyBfX2FsbG9jYXRlZF9uID0gX19uOyByZXR1cm4gYWxsb2NhdGUoX19uKTsgfQorfTsKKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9URU1QTEFURV9FWFBPUlQpCitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgX1NUTFBfYWxsb2NfcHJveHk8Y2hhciosIGNoYXIsIGFsbG9jYXRvcjxjaGFyPiA+OworIyAgaWYgZGVmaW5lZCAoX1NUTFBfSEFTX1dDSEFSX1QpCitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgX1NUTFBfYWxsb2NfcHJveHk8d2NoYXJfdCosIHdjaGFyX3QsIGFsbG9jYXRvcjx3Y2hhcl90PiA+OworIyAgZW5kaWYKKyMgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9QVFJfU1BFQ0lBTElaQVRJT05TKQorX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIF9TVExQX2FsbG9jX3Byb3h5PHZvaWQqKiwgdm9pZCosIGFsbG9jYXRvcjx2b2lkKj4gPjsKKyMgIGVuZGlmCisjZW5kaWYKKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNpZiBkZWZpbmVkIChfU1RMUF9FWFBPU0VfR0xPQkFMU19JTVBMRU1FTlRBVElPTikgJiYgIWRlZmluZWQgKF9TVExQX0xJTktfVElNRV9JTlNUQU5USUFUSU9OKQorIyAgaW5jbHVkZSA8c3RsL19hbGxvYy5jPgorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9BTExPQ19IICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvX2FsbG9jX29sZC5oIGIvc3RsL19hbGxvY19vbGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjI3MjQzCi0tLSAvZGV2L251bGwKKysrIGIvc3RsL19hbGxvY19vbGQuaApAQCAtMCwwICsxLDI4NyBAQAordGVtcGxhdGU8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CitjbGFzcyBfX3NpbXBsZV9hbGxvYyB7CisgIHR5cGVkZWYgX0FsbG9jIF9fYWxsb2NfdHlwZTsKK3B1YmxpYzoKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnZhbHVlX3R5cGUgX19hbGxvY192YWx1ZV90eXBlOworICB0eXBlZGVmIF9UcCB2YWx1ZV90eXBlOworICBzdGF0aWMgc2l6ZV90ICBfU1RMUF9DQUxMIF9fY2h1bmsoc2l6ZV90IF9fbikgeworICAgIHJldHVybiAoc2l6ZW9mKF9fYWxsb2NfdmFsdWVfdHlwZSk9PXNpemVvZih2YWx1ZV90eXBlKSkgPyBfX24gOgorICAgICAgKChfX24qc2l6ZW9mKHZhbHVlX3R5cGUpK3NpemVvZihfX2FsbG9jX3ZhbHVlX3R5cGUpLTEpL3NpemVvZihfX2FsbG9jX3ZhbHVlX3R5cGUpKTsKKyAgfQorICBzdGF0aWMgX1RwKiAgX1NUTFBfQ0FMTCBhbGxvY2F0ZShzaXplX3QgX19uKSB7IHJldHVybiAwID09IF9fbiA/IDAgOiAoX1RwKikgX19hbGxvY190eXBlOjphbGxvY2F0ZShfX2NodW5rKF9fbikpOyB9CisgIHN0YXRpYyB2b2lkICBfU1RMUF9DQUxMIGRlYWxsb2NhdGUoX1RwICogX19wLCBzaXplX3QgX19uKSB7CisgICAgX19hbGxvY190eXBlOjpkZWFsbG9jYXRlKChfX2FsbG9jX3ZhbHVlX3R5cGUqKV9fcCwgX19jaHVuayhfX24pKTsgfQorfTsKKworLy8gQWxsb2NhdG9yIGFkYXB0b3IgdG8gdHVybiBhbiBTR0ktc3R5bGUgYWxsb2NhdG9yIChlLmcuIGFsbG9jLCBtYWxsb2NfYWxsb2MpCisvLyBpbnRvIGEgc3RhbmRhcmQtY29uZm9ybWluZyBhbGxvY2F0b3IuICAgTm90ZSB0aGF0IHRoaXMgYWRhcHRvciBkb2VzCisvLyAqbm90KiBhc3N1bWUgdGhhdCBhbGwgb2JqZWN0cyBvZiB0aGUgdW5kZXJseWluZyBhbGxvYyBjbGFzcyBhcmUKKy8vIGlkZW50aWNhbCwgbm9yIGRvZXMgaXQgYXNzdW1lIHRoYXQgYWxsIG9mIHRoZSB1bmRlcmx5aW5nIGFsbG9jJ3MKKy8vIG1lbWJlciBmdW5jdGlvbnMgYXJlIHN0YXRpYyBtZW1iZXIgZnVuY3Rpb25zLiAgTm90ZSwgYWxzbywgdGhhdAorLy8gX19hbGxvY2F0b3I8X1RwLCBhbGxvYz4gaXMgZXNzZW50aWFsbHkgdGhlIHNhbWUgdGhpbmcgYXMgYWxsb2NhdG9yPF9UcD4uCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK3N0cnVjdCBfX2FsbG9jYXRvciA6IHB1YmxpYyBfQWxsb2MgeworICB0eXBlZGVmIF9BbGxvYyBfX3VuZGVybHlpbmdfYWxsb2M7CisKKyAgdHlwZWRlZiBzaXplX3QgICAgc2l6ZV90eXBlOworICB0eXBlZGVmIHB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7CisgIHR5cGVkZWYgX1RwKiAgICAgICBwb2ludGVyOworICB0eXBlZGVmIGNvbnN0IF9UcCogY29uc3RfcG9pbnRlcjsKKyAgdHlwZWRlZiBfVHAmICAgICAgIHJlZmVyZW5jZTsKKyAgdHlwZWRlZiBjb25zdCBfVHAmIGNvbnN0X3JlZmVyZW5jZTsKKyAgdHlwZWRlZiBfVHAgICAgICAgIHZhbHVlX3R5cGU7CisKKyMgaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFX0NMQVNTRVMpCisgIHRlbXBsYXRlIDxjbGFzcyBfVHAxPiBzdHJ1Y3QgcmViaW5kIHsKKyAgICB0eXBlZGVmIF9fYWxsb2NhdG9yPF9UcDEsIF9BbGxvYz4gb3RoZXI7CisgIH07CisjIGVuZGlmCisgIF9fYWxsb2NhdG9yKCkgX1NUTFBfTk9USFJPVyB7fQorICBfX2FsbG9jYXRvcihjb25zdCBfQWxsb2MmICkgX1NUTFBfTk9USFJPVyB7fQorICBfX2FsbG9jYXRvcihjb25zdCBfX2FsbG9jYXRvcjxfVHAsIF9BbGxvYz4mIF9fYSkgX1NUTFBfTk9USFJPVworICAgIDogX0FsbG9jKF9fYSkge30KKyMgaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykgJiYgZGVmaW5lZCAoX1NUTFBfRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwMT4KKyAgX19hbGxvY2F0b3IoY29uc3QgX19hbGxvY2F0b3I8X1RwMSwgX0FsbG9jPiYgX19hKSBfU1RMUF9OT1RIUk9XCisgICAgOiBfQWxsb2MoX19hKSB7fQorIyBlbmRpZgorIyBpZmRlZiBfU1RMUF9UUklWSUFMX0RFU1RSVUNUT1JfQlVHCisgIH5fX2FsbG9jYXRvcigpIF9TVExQX05PVEhST1cge30KKyMgZW5kaWYKKyAgcG9pbnRlciBhZGRyZXNzKHJlZmVyZW5jZSBfX3gpIGNvbnN0IHsgcmV0dXJuICZfX3g7IH0KKworIyBpZiAhZGVmaW5lZCAoX19XQVRDT01fQ1BMVVNQTFVTX18pCisgIGNvbnN0X3BvaW50ZXIgYWRkcmVzcyhjb25zdF9yZWZlcmVuY2UgX194KSBjb25zdCB7IHJldHVybiAmX194OyB9CisjIGVuZGlmCisKKyAgLy8gX19uIGlzIHBlcm1pdHRlZCB0byBiZSAwLgorICBfVHAqIGFsbG9jYXRlKHNpemVfdHlwZSBfX24sIGNvbnN0IHZvaWQqID0gMCkgeworICAgIGlmIChfX24gPiBtYXhfc2l6ZSgpKQorICAgICAgX19USFJPV19CQURfQUxMT0M7CisgICAgcmV0dXJuIF9fbiAhPSAwCisgICAgICAgID8gX19TVEFUSUNfQ0FTVChfVHAqLF9fdW5kZXJseWluZ19hbGxvYzo6YWxsb2NhdGUoX19uICogc2l6ZW9mKF9UcCkpKQorICAgICAgICA6IDA7CisgIH0KKworICAvLyBfX3AgaXMgbm90IHBlcm1pdHRlZCB0byBiZSBhIG51bGwgcG9pbnRlci4KKyAgdm9pZCBkZWFsbG9jYXRlKHBvaW50ZXIgX19wLCBzaXplX3R5cGUgX19uKQorICAgIHsgaWYgKF9fcCkgX191bmRlcmx5aW5nX2FsbG9jOjpkZWFsbG9jYXRlKF9fcCwgX19uICogc2l6ZW9mKF9UcCkpOyB9CisKKyAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgX1NUTFBfTk9USFJPVworICAgIHsgcmV0dXJuIHNpemVfdCgtMSkgLyBzaXplb2YoX1RwKTsgfQorCisgIHZvaWQgY29uc3RydWN0KHBvaW50ZXIgX19wLCBjb25zdF9yZWZlcmVuY2UgX192YWwpIHsgX1NUTFBfU1REOjpfQ29weV9Db25zdHJ1Y3QoX19wLCBfX3ZhbCk7IH0KKyAgdm9pZCBkZXN0cm95KHBvaW50ZXIgX19wKSB7IF9TVExQX1NURDo6X0Rlc3Ryb3koX19wKTsgfQorCisgIGNvbnN0IF9fdW5kZXJseWluZ19hbGxvYyYgX19nZXRfdW5kZXJseWluZ19hbGxvYygpIGNvbnN0IHsgcmV0dXJuICp0aGlzOyB9Cit9OworCisjaWZkZWYgX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTgordGVtcGxhdGUgPGNsYXNzIF9BbGxvYz4KK2NsYXNzIF9fYWxsb2NhdG9yPHZvaWQsIF9BbGxvYz4geworICB0eXBlZGVmIHNpemVfdCAgICAgIHNpemVfdHlwZTsKKyAgdHlwZWRlZiBwdHJkaWZmX3QgICBkaWZmZXJlbmNlX3R5cGU7CisgIHR5cGVkZWYgdm9pZCogICAgICAgcG9pbnRlcjsKKyAgdHlwZWRlZiBjb25zdCB2b2lkKiBjb25zdF9wb2ludGVyOworICB0eXBlZGVmIHZvaWQgICAgICAgIHZhbHVlX3R5cGU7CisjaWZkZWYgX1NUTFBfTUVNQkVSX1RFTVBMQVRFX0NMQVNTRVMKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcDE+IHN0cnVjdCByZWJpbmQgeworICAgIHR5cGVkZWYgX19hbGxvY2F0b3I8X1RwMSwgX0FsbG9jPiBvdGhlcjsKKyAgfTsKKyNlbmRpZgorfTsKKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgYm9vbCAgX1NUTFBfQ0FMTCBvcGVyYXRvcj09KGNvbnN0IF9fYWxsb2NhdG9yPF9UcCwgX0FsbG9jPiYgX19hMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19hbGxvY2F0b3I8X1RwLCBfQWxsb2M+JiBfX2EyKQoreworICByZXR1cm4gX19hMS5fX2dldF91bmRlcmx5aW5nX2FsbG9jKCkgPT0gX19hMi5fX2dldF91bmRlcmx5aW5nX2FsbG9jKCk7Cit9CisKKyNpZmRlZiBfU1RMUF9VU0VfU0VQQVJBVEVfUkVMT1BTX05BTUVTUEFDRQordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgoraW5saW5lIGJvb2wgIF9TVExQX0NBTEwgb3BlcmF0b3IhPShjb25zdCBfX2FsbG9jYXRvcjxfVHAsIF9BbGxvYz4mIF9fYTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fYWxsb2NhdG9yPF9UcCwgX0FsbG9jPiYgX19hMikKK3sKKyAgcmV0dXJuIF9fYTEuX19nZXRfdW5kZXJseWluZ19hbGxvYygpICE9IF9fYTIuX19nZXRfdW5kZXJseWluZ19hbGxvYygpOworfQorI2VuZGlmIC8qIF9TVExQX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUiAqLworCisKKy8vIENvbXBhcmlzb24gb3BlcmF0b3JzIGZvciBhbGwgb2YgdGhlIHByZWRpZmluZWQgU0dJLXN0eWxlIGFsbG9jYXRvcnMuCisvLyBUaGlzIGVuc3VyZXMgdGhhdCBfX2FsbG9jYXRvcjxtYWxsb2NfYWxsb2M+IChmb3IgZXhhbXBsZSkgd2lsbAorLy8gd29yayBjb3JyZWN0bHkuCisKKyNpZm5kZWYgX1NUTFBfTk9OX1RZUEVfVE1QTF9QQVJBTV9CVUcKK2lubGluZSBib29sICBfU1RMUF9DQUxMIG9wZXJhdG9yPT0oY29uc3QgX19tYWxsb2NfYWxsb2MmLCBjb25zdCBfX21hbGxvY19hbGxvYyYpCit7IHJldHVybiB0cnVlOyB9CisKKyMgIGlmZGVmIF9TVExQX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUgoraW5saW5lIGJvb2wgIF9TVExQX0NBTEwgb3BlcmF0b3IhPShjb25zdCBfX21hbGxvY19hbGxvYyYsIGNvbnN0IF9fbWFsbG9jX2FsbG9jJikKK3sgcmV0dXJuIGZhbHNlOyB9CisjICBlbmRpZgorCitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yPT0oY29uc3QgX19uZXdfYWxsb2MmLCBjb25zdCBfX25ld19hbGxvYyYpIHsgcmV0dXJuIHRydWU7IH0KKworIyAgaWZkZWYgX1NUTFBfVVNFX1NFUEFSQVRFX1JFTE9QU19OQU1FU1BBQ0UKK2lubGluZSBib29sIF9TVExQX0NBTEwgb3BlcmF0b3IhPShjb25zdCBfX25ld19hbGxvYyYsIGNvbnN0IF9fbmV3X2FsbG9jJikgeyByZXR1cm4gZmFsc2U7IH0KKyMgIGVuZGlmCisKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9VU0VfTk9fSU9TVFJFQU1TKQoraW5saW5lIGJvb2wgIF9TVExQX0NBTEwgb3BlcmF0b3I9PShjb25zdCBfX25vZGVfYWxsb2MmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX25vZGVfYWxsb2MmKQoreyByZXR1cm4gdHJ1ZTsgfQorCisjICAgIGlmIGRlZmluZWQoIF9TVExQX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUiApCisKK2lubGluZSBib29sICBfU1RMUF9DQUxMIG9wZXJhdG9yIT0oY29uc3QgX19ub2RlX2FsbG9jJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19ub2RlX2FsbG9jJikKK3sgcmV0dXJuIGZhbHNlOyB9CisjICAgIGVuZGlmCisjICBlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfTk9OX1RZUEVfVE1QTF9QQVJBTV9CVUcgKi8KKwordGVtcGxhdGUgPGNsYXNzIF9BbGxvYz4KK2lubGluZSBib29sICBfU1RMUF9DQUxMIG9wZXJhdG9yPT0oY29uc3QgX19kZWJ1Z19hbGxvYzxfQWxsb2M+JiwgY29uc3QgX19kZWJ1Z19hbGxvYzxfQWxsb2M+JikgeyAgcmV0dXJuIHRydWU7IH0KKyMgaWZkZWYgX1NUTFBfVVNFX1NFUEFSQVRFX1JFTE9QU19OQU1FU1BBQ0UKK3RlbXBsYXRlIDxjbGFzcyBfQWxsb2M+CitpbmxpbmUgYm9vbCAgX1NUTFBfQ0FMTCBvcGVyYXRvciE9KGNvbnN0IF9fZGVidWdfYWxsb2M8X0FsbG9jPiYsIGNvbnN0IF9fZGVidWdfYWxsb2M8X0FsbG9jPiYpIHsgIHJldHVybiBmYWxzZTsgfQorIyBlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikKKworLy8gVmVyc2lvbnMgZm9yIHRoZSBwcmVkZWZpbmVkIFNHSS1zdHlsZSBhbGxvY2F0b3JzLgordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfQWxsb2NfdHJhaXRzPF9UcCwgX19tYWxsb2NfYWxsb2M+IHsKKyAgdHlwZWRlZiBfX2FsbG9jYXRvcjxfVHAsIF9fbWFsbG9jX2FsbG9jPiBhbGxvY2F0b3JfdHlwZTsKK307CisKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9VU0VfTk9fSU9TVFJFQU1TKQordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfQWxsb2NfdHJhaXRzPF9UcCwgX19ub2RlX2FsbG9jPiB7CisgIHR5cGVkZWYgX19hbGxvY2F0b3I8X1RwLCBfX25vZGVfYWxsb2M+IGFsbG9jYXRvcl90eXBlOworfTsKKyMgIGVuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK3N0cnVjdCBfQWxsb2NfdHJhaXRzPF9UcCwgX19kZWJ1Z19hbGxvYzxfQWxsb2M+ID4geworICB0eXBlZGVmIF9fYWxsb2NhdG9yPF9UcCwgX19kZWJ1Z19hbGxvYzxfQWxsb2M+ID4gYWxsb2NhdG9yX3R5cGU7Cit9OworCisvLyBWZXJzaW9ucyBmb3IgdGhlIF9fYWxsb2NhdG9yIGFkYXB0b3IgdXNlZCB3aXRoIHRoZSBwcmVkZWZpbmVkCisvLyBTR0ktc3R5bGUgYWxsb2NhdG9ycy4KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1RwMSwgY2xhc3MgX0FsbG9jPgorc3RydWN0IF9BbGxvY190cmFpdHM8X1RwLCBfX2FsbG9jYXRvcjxfVHAxLCBfQWxsb2MgPiA+IHsKKyAgdHlwZWRlZiBfX2FsbG9jYXRvcjxfVHAsIF9BbGxvYyA+IGFsbG9jYXRvcl90eXBlOworfTsKKworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9ET05UX1NVUFBPUlRfUkVCSU5EX01FTUJFUl9URU1QTEFURSkKKworLy8gVmVyc2lvbnMgZm9yIHRoZSBwcmVkZWZpbmVkIFNHSS1zdHlsZSBhbGxvY2F0b3JzLgorCisKKyMgIGlmIGRlZmluZWQgKF9TVExQX05PTl9UWVBFX1RNUExfUEFSQU1fQlVHKQorCit0eXBlZGVmIF9fbWFsbG9jX2FsbG9jIF9fbWFsbG9jX2FsbG9jX2RmbDsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfX2FsbG9jYXRvcjxfVHAsIF9fbWFsbG9jX2FsbG9jX2RmbCA+JiBfU1RMUF9DQUxMCitfX3N0bF9hbGxvY19yZWJpbmQoX19tYWxsb2NfYWxsb2NfZGZsJiBfX2EsIGNvbnN0IF9UcCopIHsKKyAgcmV0dXJuIChfX2FsbG9jYXRvcjxfVHAsIF9fbWFsbG9jX2FsbG9jX2RmbCA+JilfX2E7Cit9CisKKyMgICAgaWYgIWRlZmluZWQgKF9TVExQX1VTRV9OT19JT1NUUkVBTVMpCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIF9fYWxsb2NhdG9yPF9UcCwgX19ub2RlX2FsbG9jPiYgX1NUTFBfQ0FMTAorX19zdGxfYWxsb2NfcmViaW5kKF9fbm9kZV9hbGxvYyYgX19hLCBjb25zdCBfVHAqKSB7CisgIHJldHVybiAoX19hbGxvY2F0b3I8X1RwLCBfX25vZGVfYWxsb2M+JilfX2E7Cit9CisjICAgIGVuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX19hbGxvY2F0b3I8X1RwLCBfX21hbGxvY19hbGxvY19kZmwgPiBfU1RMUF9DQUxMCitfX3N0bF9hbGxvY19jcmVhdGUoY29uc3QgX19tYWxsb2NfYWxsb2NfZGZsJiwgY29uc3QgX1RwKikgeworICByZXR1cm4gX19hbGxvY2F0b3I8X1RwLCBfX21hbGxvY19hbGxvY19kZmwgPiAoKTsKK30KKworIyAgICBpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX05PX0lPU1RSRUFNUykKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX19hbGxvY2F0b3I8X1RwLCBfX25vZGVfYWxsb2M+IF9TVExQX0NBTEwKK19fc3RsX2FsbG9jX2NyZWF0ZShjb25zdCBfX25vZGVfYWxsb2MmLCBjb25zdCBfVHAqKSB7CisgIHJldHVybiBfX2FsbG9jYXRvcjxfVHAsIF9fbm9kZV9hbGxvYz4oKTsKK30KKworIyAgICBlbmRpZgorCisjICBlbHNlCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX19hbGxvY2F0b3I8X1RwLCBfX21hbGxvY19hbGxvYz4mIF9TVExQX0NBTEwKK19fc3RsX2FsbG9jX3JlYmluZChfX21hbGxvY19hbGxvYyYgX19hLCBjb25zdCBfVHAqKSB7CisgIHJldHVybiAoX19hbGxvY2F0b3I8X1RwLCBfX21hbGxvY19hbGxvYz4mKV9fYTsKK30KKworIyAgICBpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX05PX0lPU1RSRUFNUykKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX19hbGxvY2F0b3I8X1RwLCBfX25vZGVfYWxsb2M+JiBfU1RMUF9DQUxMCitfX3N0bF9hbGxvY19yZWJpbmQoX19ub2RlX2FsbG9jJiBfX2EsIGNvbnN0IF9UcCopIHsKKyAgcmV0dXJuIChfX2FsbG9jYXRvcjxfVHAsIF9fbm9kZV9hbGxvYz4mKV9fYTsKK30KKyMgICAgZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfX2FsbG9jYXRvcjxfVHAsIF9fbWFsbG9jX2FsbG9jPiBfU1RMUF9DQUxMCitfX3N0bF9hbGxvY19jcmVhdGUoY29uc3QgX19tYWxsb2NfYWxsb2MmLCBjb25zdCBfVHAqKSB7CisgIHJldHVybiBfX2FsbG9jYXRvcjxfVHAsIF9fbWFsbG9jX2FsbG9jPigpOworfQorCisjICAgIGlmICFkZWZpbmVkIChfU1RMUF9VU0VfTk9fSU9TVFJFQU1TKQordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfX2FsbG9jYXRvcjxfVHAsIF9fbm9kZV9hbGxvYz4gX1NUTFBfQ0FMTAorX19zdGxfYWxsb2NfY3JlYXRlKGNvbnN0IF9fbm9kZV9hbGxvYyYsIGNvbnN0IF9UcCopIHsKKyAgcmV0dXJuIF9fYWxsb2NhdG9yPF9UcCwgX19ub2RlX2FsbG9jPigpOworfQorIyAgICBlbmRpZgorCisjICBlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgX19hbGxvY2F0b3I8X1RwLCBfX2RlYnVnX2FsbG9jPF9BbGxvYz4gPiBfU1RMUF9DQUxMCitfX3N0bF9hbGxvY19jcmVhdGUoY29uc3QgX19kZWJ1Z19hbGxvYzxfQWxsb2M+JiwgY29uc3QgX1RwKikgeworICByZXR1cm4gX19hbGxvY2F0b3I8X1RwLCBfX2RlYnVnX2FsbG9jPF9BbGxvYz4gPigpOworfQordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgoraW5saW5lIF9fYWxsb2NhdG9yPF9UcCwgX19kZWJ1Z19hbGxvYzxfQWxsb2M+ID4mIF9TVExQX0NBTEwKK19fc3RsX2FsbG9jX3JlYmluZChfX2RlYnVnX2FsbG9jPF9BbGxvYz4mIF9fYSwgY29uc3QgX1RwKikgeworICByZXR1cm4gKF9fYWxsb2NhdG9yPF9UcCwgX19kZWJ1Z19hbGxvYzxfQWxsb2M+ID4mKV9fYTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfX2FsbG9jYXRvcjxfVHAsIF9fbmV3X2FsbG9jID4gX1NUTFBfQ0FMTAorX19zdGxfYWxsb2NfY3JlYXRlKGNvbnN0IF9fbmV3X2FsbG9jJiwgY29uc3QgX1RwKikgeworICByZXR1cm4gX19hbGxvY2F0b3I8X1RwLCBfX25ld19hbGxvYyA+KCk7Cit9Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIF9fYWxsb2NhdG9yPF9UcCwgX19uZXdfYWxsb2MgPiYgIF9TVExQX0NBTEwKK19fc3RsX2FsbG9jX3JlYmluZChfX25ld19hbGxvYyYgX19hLCBjb25zdCBfVHAqKSB7CisgIHJldHVybiAoX19hbGxvY2F0b3I8X1RwLCBfX25ld19hbGxvYyA+JilfX2E7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAxLCBjbGFzcyBfQWxsb2MsIGNsYXNzIF9UcDI+CitpbmxpbmUgX19hbGxvY2F0b3I8X1RwMiwgX0FsbG9jPiYgX1NUTFBfQ0FMTAorX19zdGxfYWxsb2NfcmViaW5kKF9fYWxsb2NhdG9yPF9UcDEsIF9BbGxvYz4mIF9fYSwgY29uc3QgX1RwMiopIHsKKyAgcmV0dXJuIChfX2FsbG9jYXRvcjxfVHAyLCBfQWxsb2M+JilfX2E7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAxLCBjbGFzcyBfQWxsb2MsIGNsYXNzIF9UcDI+CitpbmxpbmUgX19hbGxvY2F0b3I8X1RwMiwgX0FsbG9jPiBfU1RMUF9DQUxMCitfX3N0bF9hbGxvY19jcmVhdGUoY29uc3QgX19hbGxvY2F0b3I8X1RwMSwgX0FsbG9jPiYsIGNvbnN0IF9UcDIqKSB7CisgIHJldHVybiBfX2FsbG9jYXRvcjxfVHAyLCBfQWxsb2M+KCk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3N0bC9fYXV0b19wdHIuaCBiL3N0bC9fYXV0b19wdHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTUxMzBhCi0tLSAvZGV2L251bGwKKysrIGIvc3RsL19hdXRvX3B0ci5oCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk3LTE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfQVVUT19QVFJfSAorIyBkZWZpbmUgX1NUTFBfQVVUT19QVFJfSAorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKy8vIGltcGxlbWVudGF0aW9uIHByaW1pdGl2ZQorY2xhc3MgX19wdHJfYmFzZSB7CitwdWJsaWM6CisgIHZvaWQqIF9NX3A7CisgIHZvaWQgIF9fc2V0KGNvbnN0IHZvaWQqIHApIHsgX01fcCA9IF9fQ09OU1RfQ0FTVCh2b2lkKixwKTsgfQorICB2b2lkICBfX3NldCh2b2lkKiBwKSB7IF9NX3AgPSBwOyB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorY2xhc3MgYXV0b19wdHJfcmVmIHsKK3B1YmxpYzoKKyAgX19wdHJfYmFzZSYgX01fcjsKKyAgX1RwKiBjb25zdCBfTV9wOworCisgIGF1dG9fcHRyX3JlZihfX3B0cl9iYXNlJiBfX3IsIF9UcCogX19wKSA6IF9NX3IoX19yKSwgX01fcChfX3ApIHsgIH0KKworICBfVHAqIHJlbGVhc2UoKSBjb25zdCB7IF9NX3IuX19zZXQoKHZvaWQqKTApOyByZXR1cm4gX01fcDsgfQorCitwcml2YXRlOgorICAvL2V4cGxpY2l0ZWx5IGRlZmluZWQgYXMgcHJpdmF0ZSB0byBhdm9pZCB3YXJuaW5nczoKKyAgdHlwZWRlZiBhdXRvX3B0cl9yZWY8X1RwPiBfU2VsZjsKKyAgX1NlbGYmIG9wZXJhdG9yID0gKF9TZWxmIGNvbnN0Jik7Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBfVHA+CitjbGFzcyBhdXRvX3B0ciA6ICBwdWJsaWMgX19wdHJfYmFzZSB7CitwdWJsaWM6CisgIHR5cGVkZWYgX1RwIGVsZW1lbnRfdHlwZTsKKyAgdHlwZWRlZiBhdXRvX3B0cjxfVHA+IF9TZWxmOworCisgIF9UcCogcmVsZWFzZSgpIF9TVExQX05PVEhST1cgeworICAgIF9UcCogX19weCA9IHRoaXMtPmdldCgpOworICAgIHRoaXMtPl9NX3AgPSAwOworICAgIHJldHVybiBfX3B4OworICB9CisKKyAgdm9pZCByZXNldChfVHAqIF9fcHggPSAwKSBfU1RMUF9OT1RIUk9XIHsKKyAgICBfVHAqIF9fcHQgPSB0aGlzLT5nZXQoKTsKKyAgICBpZiAoX19weCAhPSBfX3B0KQorICAgICAgZGVsZXRlIF9fcHQ7CisgICAgdGhpcy0+X19zZXQoX19weCk7CisgIH0KKworICBfVHAqIGdldCgpIGNvbnN0IF9TVExQX05PVEhST1cKKyAgeyByZXR1cm4gX19SRUlOVEVSUFJFVF9DQVNUKF9UcCosX19DT05TVF9DQVNUKHZvaWQqLF9NX3ApKTsgfQorCisjaWYgIWRlZmluZWQgKF9TVExQX05PX0FSUk9XX09QRVJBVE9SKQorICBfVHAqIG9wZXJhdG9yLT4oKSBjb25zdCBfU1RMUF9OT1RIUk9XIHsKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVChnZXQoKSE9MCwgX1N0bE1zZ19BVVRPX1BUUl9OVUxMKQorICAgIHJldHVybiBnZXQoKTsKKyAgfQorI2VuZGlmCisgIF9UcCYgb3BlcmF0b3IqKCkgY29uc3QgX1NUTFBfTk9USFJPVyB7CisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoZ2V0KCkhPSAwLCBfU3RsTXNnX0FVVE9fUFRSX05VTEwpCisgICAgcmV0dXJuICpnZXQoKTsKKyAgfQorCisgIGV4cGxpY2l0IGF1dG9fcHRyKF9UcCogX19weCA9IDApIF9TVExQX05PVEhST1cgeyB0aGlzLT5fX3NldChfX3B4KTsgfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9OT19URU1QTEFURV9DT05WRVJTSU9OUykKKyAgdGVtcGxhdGU8Y2xhc3MgX1RwMT4gYXV0b19wdHIoYXV0b19wdHI8X1RwMT4mIF9fcikgX1NUTFBfTk9USFJPVyB7CisgICAgX1RwKiBfX2NvbnZlcnNpb25DaGVjayA9IF9fci5yZWxlYXNlKCk7CisgICAgdGhpcy0+X19zZXQoX19jb252ZXJzaW9uQ2hlY2spOworICB9CisjICBlbmRpZgorICB0ZW1wbGF0ZTxjbGFzcyBfVHAxPiBhdXRvX3B0cjxfVHA+JiBvcGVyYXRvcj0oYXV0b19wdHI8X1RwMT4mIF9fcikgX1NUTFBfTk9USFJPVyB7CisgICAgX1RwKiBfX2NvbnZlcnNpb25DaGVjayA9IF9fci5yZWxlYXNlKCk7CisgICAgcmVzZXQoX19jb252ZXJzaW9uQ2hlY2spOworICAgIHJldHVybiAqdGhpczsKKyAgfQorI2VuZGlmCisKKyAgYXV0b19wdHIoX1NlbGYmIF9fcikgX1NUTFBfTk9USFJPVyB7IHRoaXMtPl9fc2V0KF9fci5yZWxlYXNlKCkpOyB9CisKKyAgX1NlbGYmIG9wZXJhdG9yPShfU2VsZiYgX19yKSBfU1RMUF9OT1RIUk9XIHsKKyAgICByZXNldChfX3IucmVsZWFzZSgpKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB+YXV0b19wdHIoKSBfU1RMUF9OT1RIUk9XIHsgLyogYm9yaXMgOiByZXNldCgwKSBtaWdodCBiZSBiZXR0ZXIgKi8gZGVsZXRlIHRoaXMtPmdldCgpOyB9CisKKyAgYXV0b19wdHIoYXV0b19wdHJfcmVmPF9UcD4gX19yKSBfU1RMUF9OT1RIUk9XCisgIHsgdGhpcy0+X19zZXQoX19yLnJlbGVhc2UoKSk7IH0KKworICBfU2VsZiYgb3BlcmF0b3I9KGF1dG9fcHRyX3JlZjxfVHA+IF9fcikgX1NUTFBfTk9USFJPVyB7CisgICAgcmVzZXQoX19yLnJlbGVhc2UoKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyNpZiBkZWZpbmVkKF9TVExQX01FTUJFUl9URU1QTEFURVMpICYmICFkZWZpbmVkKF9TVExQX05PX1RFTVBMQVRFX0NPTlZFUlNJT05TKQorICB0ZW1wbGF0ZTxjbGFzcyBfVHAxPiBvcGVyYXRvciBhdXRvX3B0cl9yZWY8X1RwMT4oKSBfU1RMUF9OT1RIUk9XCisgIHsgcmV0dXJuIGF1dG9fcHRyX3JlZjxfVHAxPigqdGhpcywgdGhpcy0+Z2V0KCkpOyB9CisgIHRlbXBsYXRlPGNsYXNzIF9UcDE+IG9wZXJhdG9yIGF1dG9fcHRyPF9UcDE+KCkgX1NUTFBfTk9USFJPVworICB7IHJldHVybiBhdXRvX3B0cjxfVHAxPihyZWxlYXNlKCkpOyB9CisjZWxzZQorICBvcGVyYXRvciBhdXRvX3B0cl9yZWY8X1RwPigpIF9TVExQX05PVEhST1cKKyAgeyByZXR1cm4gYXV0b19wdHJfcmVmPF9UcD4oKnRoaXMsIHRoaXMtPmdldCgpKTsgfQorI2VuZGlmCit9OworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYgLyogX1NUTFBfQVVUT19QVFJfSCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RsL19iaXRzZXQuYyBiL3N0bC9fYml0c2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJiOTMxMgotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9fYml0c2V0LmMKQEAgLTAsMCArMSwyMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfQklUU0VUX0MKKyNkZWZpbmUgX1NUTFBfQklUU0VUX0MKKworI2lmbmRlZiBfU1RMUF9CSVRTRVRfSAorIyAgaW5jbHVkZSA8c3RsL19iaXRzZXQuaD4KKyNlbmRpZgorCisjZGVmaW5lIF9fQklUU19QRVJfV09SRCAoQ0hBUl9CSVQgKiBzaXplb2YodW5zaWduZWQgbG9uZykpCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisvLworLy8gRGVmaW5pdGlvbnMgb2Ygbm9uLWlubGluZSBmdW5jdGlvbnMgZnJvbSBfQmFzZV9iaXRzZXQuCisvLwordGVtcGxhdGU8c2l6ZV90IF9Odz4KK3ZvaWQgX0Jhc2VfYml0c2V0PF9Odz46Ol9NX2RvX2xlZnRfc2hpZnQoc2l6ZV90IF9fc2hpZnQpIHsKKyAgaWYgKF9fc2hpZnQgIT0gMCkgeworICAgIGNvbnN0IHNpemVfdCBfX3dzaGlmdCA9IF9fc2hpZnQgLyBfX0JJVFNfUEVSX1dPUkQ7CisgICAgY29uc3Qgc2l6ZV90IF9fb2Zmc2V0ID0gX19zaGlmdCAlIF9fQklUU19QRVJfV09SRDsKKworICAgIGlmIChfX29mZnNldCA9PSAwKQorICAgICAgZm9yIChzaXplX3QgX19uID0gX053IC0gMTsgX19uID49IF9fd3NoaWZ0OyAtLV9fbikKKyAgICAgICAgX01fd1tfX25dID0gX01fd1tfX24gLSBfX3dzaGlmdF07CisKKyAgICBlbHNlIHsKKyAgICAgIGNvbnN0IHNpemVfdCBfX3N1Yl9vZmZzZXQgPSBfX0JJVFNfUEVSX1dPUkQgLSBfX29mZnNldDsKKyAgICAgIGZvciAoc2l6ZV90IF9fbiA9IF9OdyAtIDE7IF9fbiA+IF9fd3NoaWZ0OyAtLV9fbikKKyAgICAgICAgX01fd1tfX25dID0gKF9NX3dbX19uIC0gX193c2hpZnRdIDw8IF9fb2Zmc2V0KSB8CisgICAgICAgICAgICAgICAgICAgIChfTV93W19fbiAtIF9fd3NoaWZ0IC0gMV0gPj4gX19zdWJfb2Zmc2V0KTsKKyAgICAgIF9NX3dbX193c2hpZnRdID0gX01fd1swXSA8PCBfX29mZnNldDsKKyAgICB9CisKKyAgICBmaWxsKF9NX3cgKyAwLCBfTV93ICsgX193c2hpZnQsIF9fU1RBVElDX0NBU1QoX1dvcmRULDApKTsKKyAgfQorfQorCit0ZW1wbGF0ZTxzaXplX3QgX053Pgordm9pZCBfQmFzZV9iaXRzZXQ8X053Pjo6X01fZG9fcmlnaHRfc2hpZnQoc2l6ZV90IF9fc2hpZnQpIHsKKyAgaWYgKF9fc2hpZnQgIT0gMCkgeworICAgIGNvbnN0IHNpemVfdCBfX3dzaGlmdCA9IF9fc2hpZnQgLyBfX0JJVFNfUEVSX1dPUkQ7CisgICAgY29uc3Qgc2l6ZV90IF9fb2Zmc2V0ID0gX19zaGlmdCAlIF9fQklUU19QRVJfV09SRDsKKyAgICBjb25zdCBzaXplX3QgX19saW1pdCA9IF9OdyAtIF9fd3NoaWZ0IC0gMTsKKworICAgIGlmIChfX29mZnNldCA9PSAwKQorICAgICAgZm9yIChzaXplX3QgX19uID0gMDsgX19uIDw9IF9fbGltaXQ7ICsrX19uKQorICAgICAgICBfTV93W19fbl0gPSBfTV93W19fbiArIF9fd3NoaWZ0XTsKKworICAgIGVsc2UgeworICAgICAgY29uc3Qgc2l6ZV90IF9fc3ViX29mZnNldCA9IF9fQklUU19QRVJfV09SRCAtIF9fb2Zmc2V0OworICAgICAgZm9yIChzaXplX3QgX19uID0gMDsgX19uIDwgX19saW1pdDsgKytfX24pCisgICAgICAgIF9NX3dbX19uXSA9IChfTV93W19fbiArIF9fd3NoaWZ0XSA+PiBfX29mZnNldCkgfAorICAgICAgICAgICAgICAgICAgICAoX01fd1tfX24gKyBfX3dzaGlmdCArIDFdIDw8IF9fc3ViX29mZnNldCk7CisgICAgICBfTV93W19fbGltaXRdID0gX01fd1tfTnctMV0gPj4gX19vZmZzZXQ7CisgICAgfQorCisgICAgZmlsbChfTV93ICsgX19saW1pdCArIDEsIF9NX3cgKyBfTncsIF9fU1RBVElDX0NBU1QoX1dvcmRULDApKTsKKyAgfQorfQorCit0ZW1wbGF0ZTxzaXplX3QgX053PgordW5zaWduZWQgbG9uZyBfQmFzZV9iaXRzZXQ8X053Pjo6X01fZG9fdG9fdWxvbmcoKSBjb25zdCB7CisgIGZvciAoc2l6ZV90IF9faSA9IDE7IF9faSA8IF9OdzsgKytfX2kpCisgICAgaWYgKF9NX3dbX19pXSkKKyAgICAgIF9fc3RsX3Rocm93X292ZXJmbG93X2Vycm9yKCJiaXRzZXQiKTsKKyAgcmV0dXJuIF9NX3dbMF07Cit9IC8vIEVuZCBfTV9kb190b191bG9uZworCit0ZW1wbGF0ZTxzaXplX3QgX053Pgorc2l6ZV90IF9CYXNlX2JpdHNldDxfTnc+OjpfTV9kb19maW5kX2ZpcnN0KHNpemVfdCBfX25vdF9mb3VuZCkgY29uc3QgeworICBmb3IgKCBzaXplX3QgX19pID0gMDsgX19pIDwgX053OyBfX2krKyApIHsKKyAgICBfV29yZFQgX190aGlzd29yZCA9IF9NX3dbX19pXTsKKyAgICBpZiAoIF9fdGhpc3dvcmQgIT0gX19TVEFUSUNfQ0FTVChfV29yZFQsMCkgKSB7CisgICAgICAvLyBmaW5kIGJ5dGUgd2l0aGluIHdvcmQKKyAgICAgIGZvciAoIHNpemVfdCBfX2ogPSAwOyBfX2ogPCBzaXplb2YoX1dvcmRUKTsgX19qKysgKSB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgX190aGlzX2J5dGUKKyAgICAgICAgICA9IF9fU1RBVElDX0NBU1QodW5zaWduZWQgY2hhciwoX190aGlzd29yZCAmICh+KHVuc2lnbmVkIGNoYXIpMCkpKTsKKyAgICAgICAgaWYgKCBfX3RoaXNfYnl0ZSApCisgICAgICAgICAgcmV0dXJuIF9faSpfX0JJVFNfUEVSX1dPUkQgKyBfX2oqQ0hBUl9CSVQgKworICAgICAgICAgICAgX0JzX0c6Ol9TX2ZpcnN0X29uZShfX3RoaXNfYnl0ZSk7CisKKyAgICAgICAgX190aGlzd29yZCA+Pj0gQ0hBUl9CSVQ7CisgICAgICB9CisgICAgfQorICB9CisgIC8vIG5vdCBmb3VuZCwgc28gcmV0dXJuIGFuIGluZGljYXRpb24gb2YgZmFpbHVyZS4KKyAgcmV0dXJuIF9fbm90X2ZvdW5kOworfQorCit0ZW1wbGF0ZTxzaXplX3QgX053Pgorc2l6ZV90CitfQmFzZV9iaXRzZXQ8X053Pjo6X01fZG9fZmluZF9uZXh0KHNpemVfdCBfX3ByZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBfX25vdF9mb3VuZCkgY29uc3QgeworICAvLyBtYWtlIGJvdW5kIGluY2x1c2l2ZQorICArK19fcHJldjsKKworICAvLyBjaGVjayBvdXQgb2YgYm91bmRzCisgIGlmICggX19wcmV2ID49IF9OdyAqIF9fQklUU19QRVJfV09SRCApCisgICAgcmV0dXJuIF9fbm90X2ZvdW5kOworCisgICAgLy8gc2VhcmNoIGZpcnN0IHdvcmQKKyAgc2l6ZV90IF9faSA9IF9TX3doaWNod29yZChfX3ByZXYpOworICBfV29yZFQgX190aGlzd29yZCA9IF9NX3dbX19pXTsKKworICAgIC8vIG1hc2sgb2ZmIGJpdHMgYmVsb3cgYm91bmQKKyAgX190aGlzd29yZCAmPSAofl9fU1RBVElDX0NBU1QoX1dvcmRULDApKSA8PCBfU193aGljaGJpdChfX3ByZXYpOworCisgIGlmICggX190aGlzd29yZCAhPSBfX1NUQVRJQ19DQVNUKF9Xb3JkVCwwKSApIHsKKyAgICAvLyBmaW5kIGJ5dGUgd2l0aGluIHdvcmQKKyAgICAvLyBnZXQgZmlyc3QgYnl0ZSBpbnRvIHBsYWNlCisgICAgX190aGlzd29yZCA+Pj0gX1Nfd2hpY2hieXRlKF9fcHJldikgKiBDSEFSX0JJVDsKKyAgICBmb3IgKCBzaXplX3QgX19qID0gX1Nfd2hpY2hieXRlKF9fcHJldik7IF9faiA8IHNpemVvZihfV29yZFQpOyArK19faiApIHsKKyAgICAgIHVuc2lnbmVkIGNoYXIgX190aGlzX2J5dGUKKyAgICAgICAgPSBfX1NUQVRJQ19DQVNUKHVuc2lnbmVkIGNoYXIsKF9fdGhpc3dvcmQgJiAofih1bnNpZ25lZCBjaGFyKTApKSk7CisgICAgICBpZiAoIF9fdGhpc19ieXRlICkKKyAgICAgICAgcmV0dXJuIF9faSpfX0JJVFNfUEVSX1dPUkQgKyBfX2oqQ0hBUl9CSVQgKworICAgICAgICAgIF9Cc19HOjpfU19maXJzdF9vbmUoX190aGlzX2J5dGUpOworCisgICAgICBfX3RoaXN3b3JkID4+PSBDSEFSX0JJVDsKKyAgICB9CisgIH0KKworICAvLyBjaGVjayBzdWJzZXF1ZW50IHdvcmRzCisgICsrX19pOworICBmb3IgKCA7IF9faSA8IF9OdzsgKytfX2kgKSB7CisgICAgLyogX1dvcmRUICovIF9fdGhpc3dvcmQgPSBfTV93W19faV07CisgICAgaWYgKCBfX3RoaXN3b3JkICE9IF9fU1RBVElDX0NBU1QoX1dvcmRULDApICkgeworICAgICAgLy8gZmluZCBieXRlIHdpdGhpbiB3b3JkCisgICAgICBmb3IgKCBzaXplX3QgX19qID0gMDsgX19qIDwgc2l6ZW9mKF9Xb3JkVCk7ICsrX19qICkgeworICAgICAgICB1bnNpZ25lZCBjaGFyIF9fdGhpc19ieXRlCisgICAgICAgICAgPSBfX1NUQVRJQ19DQVNUKHVuc2lnbmVkIGNoYXIsKF9fdGhpc3dvcmQgJiAofih1bnNpZ25lZCBjaGFyKTApKSk7CisgICAgICAgIGlmICggX190aGlzX2J5dGUgKQorICAgICAgICAgIHJldHVybiBfX2kqX19CSVRTX1BFUl9XT1JEICsgX19qKkNIQVJfQklUICsKKyAgICAgICAgICAgIF9Cc19HOjpfU19maXJzdF9vbmUoX190aGlzX2J5dGUpOworCisgICAgICAgIF9fdGhpc3dvcmQgPj49IENIQVJfQklUOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIG5vdCBmb3VuZCwgc28gcmV0dXJuIGFuIGluZGljYXRpb24gb2YgZmFpbHVyZS4KKyAgcmV0dXJuIF9fbm90X2ZvdW5kOworfSAvLyBlbmQgX01fZG9fZmluZF9uZXh0CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCisjaWYgIWRlZmluZWQgKF9TVExQX05PTl9UWVBFX1RNUExfUEFSQU1fQlVHKQorCisjICBpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX05PX0lPU1RSRUFNUykKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjaWZuZGVmIF9TVExQX1NUUklOR19JT19ICisjICBpbmNsdWRlIDxzdGwvX3N0cmluZ19pby5oPiAvL2luY2x1ZGVzIF9pc3RyZWFtLmggYW5kIF9vc3RyZWFtLmgKKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgc2l6ZV90IF9OYj4KK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX1NUTFBfQ0FMTAorb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsIGJpdHNldDxfTmI+JiBfX3gpIHsKKyAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cz4gX190bXA7CisgIF9fdG1wLnJlc2VydmUoX05iKTsKKworICAvLyBTa2lwIHdoaXRlc3BhY2UKKyAgdHlwZW5hbWUgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpzZW50cnkgX19zZW50cnkoX19pcyk7CisgIGlmIChfX3NlbnRyeSkgeworICAgIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX2J1ZiA9IF9faXMucmRidWYoKTsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfTmI7ICsrX19pKSB7CisgICAgICBzdGF0aWMgdHlwZW5hbWUgX1RyYWl0czo6aW50X3R5cGUgX19lb2YgPSBfVHJhaXRzOjplb2YoKTsKKworICAgICAgdHlwZW5hbWUgX1RyYWl0czo6aW50X3R5cGUgX19jMSA9IF9fYnVmLT5zYnVtcGMoKTsKKyAgICAgIGlmIChfVHJhaXRzOjplcV9pbnRfdHlwZShfX2MxLCBfX2VvZikpIHsKKyAgICAgICAgX19pcy5zZXRzdGF0ZShpb3NfYmFzZTo6ZW9mYml0KTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgdHlwZW5hbWUgX1RyYWl0czo6Y2hhcl90eXBlIF9fYzIgPSBfVHJhaXRzOjp0b19jaGFyX3R5cGUoX19jMSk7CisgICAgICAgIGNoYXIgX19jID0gX19pcy5uYXJyb3coX19jMiwgJyonKTsKKworICAgICAgICBpZiAoX19jID09ICcwJyB8fCBfX2MgPT0gJzEnKQorICAgICAgICAgIF9fdG1wLnB1c2hfYmFjayhfX2MpOworICAgICAgICBlbHNlIGlmIChfVHJhaXRzOjplcV9pbnRfdHlwZShfX2J1Zi0+c3B1dGJhY2tjKF9fYzIpLCBfX2VvZikpIHsKKyAgICAgICAgICBfX2lzLnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGlmIChfX3RtcC5lbXB0eSgpKQorICAgICAgX19pcy5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7CisgICAgZWxzZQorICAgICAgX194Ll9NX2NvcHlfZnJvbV9zdHJpbmcoX190bXAsIF9fU1RBVElDX0NBU1Qoc2l6ZV90LDApLCBfTmIpOworICB9CisKKyAgcmV0dXJuIF9faXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIHNpemVfdCBfTmI+CitiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9TVExQX0NBTEwKK29wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorICAgICAgICAgICBjb25zdCBiaXRzZXQ8X05iPiYgX194KSB7CisgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHM+IF9fdG1wOworICBfX3guX01fY29weV90b19zdHJpbmcoX190bXApOworICByZXR1cm4gX19vcyA8PCBfX3RtcDsKK30KKworIyAgZW5kaWYgLyogIV9TVExQX1VTRV9OT19JT1NUUkVBTVMgKi8KKworI2VuZGlmIC8qIF9TVExQX05PTl9UWVBFX1RNUExfUEFSQU1fQlVHICovCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI3VuZGVmIF9fQklUU19QRVJfV09SRAorI3VuZGVmIGJpdHNldAorCisjZW5kaWYgLyogIF9TVExQX0JJVFNFVF9DICovCmRpZmYgLS1naXQgYS9zdGwvX2JpdHNldC5oIGIvc3RsL19iaXRzZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODk0MzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc3RsL19iaXRzZXQuaApAQCAtMCwwICsxLDg4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OAorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmbmRlZiBfU1RMUF9CSVRTRVRfSAorI2RlZmluZSBfU1RMUF9CSVRTRVRfSAorCisvLyBBIGJpdHNldCBvZiBzaXplIE4gaGFzIE4gJSAoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogQ0hBUl9CSVQpIHVudXNlZAorLy8gYml0cy4gIChUaGV5IGFyZSB0aGUgaGlnaC0gb3JkZXIgYml0cyBpbiB0aGUgaGlnaGVzdCB3b3JkLikgIEl0IGlzCisvLyBhIGNsYXNzIGludmFyaWFudCBvZiBjbGFzcyBiaXRzZXQ8PiB0aGF0IHRob3NlIHVudXNlZCBiaXRzIGFyZQorLy8gYWx3YXlzIHplcm8uCisKKy8vIE1vc3Qgb2YgdGhlIGFjdHVhbCBjb2RlIGlzbid0IGNvbnRhaW5lZCBpbiBiaXRzZXQ8PiBpdHNlbGYsIGJ1dCBpbiB0aGUKKy8vIGJhc2UgY2xhc3MgX0Jhc2VfYml0c2V0LiAgVGhlIGJhc2UgY2xhc3Mgd29ya3Mgd2l0aCB3aG9sZSB3b3Jkcywgbm90IHdpdGgKKy8vIGluZGl2aWR1YWwgYml0cy4gIFRoaXMgYWxsb3dzIHVzIHRvIHNwZWNpYWxpemUgX0Jhc2VfYml0c2V0IGZvciB0aGUKKy8vIGltcG9ydGFudCBzcGVjaWFsIGNhc2Ugd2hlcmUgdGhlIGJpdHNldCBpcyBvbmx5IGEgc2luZ2xlIHdvcmQuCisKKy8vIFRoZSBDKysgc3RhbmRhcmQgZG9lcyBub3QgZGVmaW5lIHRoZSBwcmVjaXNlIHNlbWFudGljcyBvZiBvcGVyYXRvcltdLgorLy8gSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiB0aGUgY29uc3QgdmVyc2lvbiBvZiBvcGVyYXRvcltdIGlzIGVxdWl2YWxlbnQKKy8vIHRvIHRlc3QoKSwgZXhjZXB0IHRoYXQgaXQgZG9lcyBubyByYW5nZSBjaGVja2luZy4gIFRoZSBub24tY29uc3QgdmVyc2lvbgorLy8gcmV0dXJucyBhIHJlZmVyZW5jZSB0byBhIGJpdCwgYWdhaW4gd2l0aG91dCBkb2luZyBhbnkgcmFuZ2UgY2hlY2tpbmcuCisKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9BTEdPQkFTRV9ICisjICBpbmNsdWRlIDxzdGwvX2FsZ29iYXNlLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9BTExPQ19ICisjICBpbmNsdWRlIDxzdGwvX2FsbG9jLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9JVEVSQVRPUl9ICisjICBpbmNsdWRlIDxzdGwvX2l0ZXJhdG9yLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9VTklOSVRJQUxJWkVEX0gKKyMgIGluY2x1ZGUgPHN0bC9fdW5pbml0aWFsaXplZC5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfUkFOR0VfRVJST1JTX0gKKyMgIGluY2x1ZGUgPHN0bC9fcmFuZ2VfZXJyb3JzLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9TVFJJTkdfSAorIyAgaW5jbHVkZSA8c3RsL19zdHJpbmcuaD4KKyNlbmRpZgorCisjZGVmaW5lIF9fQklUU19QRVJfV09SRCAoQ0hBUl9CSVQqc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKQorI2RlZmluZSBfX0JJVFNFVF9XT1JEUyhfX24pICgoX19uICsgX19CSVRTX1BFUl9XT1JEIC0gMSkvX19CSVRTX1BFUl9XT1JEKQorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCisvLyBzdHJ1Y3R1cmUgdG8gYWlkIGluIGNvdW50aW5nIGJpdHMKK2NsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIF9Cc19HCit7CisgIHB1YmxpYzoKKyAgICAvL3JldHVybnMgdGhlIG51bWJlciBvZiBiaXQgc2V0IHdpdGhpbiB0aGUgYnVmZmVyIGJldHdlZW4gX19iZWcgYW5kIF9fZW5kLgorICAgIHN0YXRpYyBzaXplX3QgX1NfY291bnQoY29uc3QgdW5zaWduZWQgY2hhciAqX19iZWcsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKl9fZW5kKQorI2lmIGRlZmluZWQgKF9TVExQX1VTRV9OT19JT1NUUkVBTVMpCisgICAgeworICAgICAgc2l6ZV90IF9fcmVzdWx0ID0gMDsKKyAgICAgIGZvciAoOyBfX2JlZyAhPSBfX2VuZDsgKytfX2JlZykgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IChzaXplb2YodW5zaWduZWQgY2hhcikgKiA4KTsgKytpKSB7CisgICAgICAgICAgaWYgKCgqX19iZWcgJiAoMSA8PCBpKSkgIT0gMCkgeyArK19fcmVzdWx0OyB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgICB9CisjZWxzZQorICAgICAgOworI2VuZGlmCisgICAgLy8gTWFwcGluZyBmcm9tIDggYml0IHVuc2lnbmVkIGludGVnZXJzIHRvIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgb25lIGJpdCBzZXQ6CisgICAgc3RhdGljIHVuc2lnbmVkIGNoYXIgX1NfZmlyc3Rfb25lKHVuc2lnbmVkIGNoYXIgX194KQorI2lmIGRlZmluZWQgKF9TVExQX1VTRV9OT19JT1NUUkVBTVMpCisgICAgeworICAgICAgZm9yICh1bnNpZ25lZCBjaGFyIGkgPSAwOyBpIDwgKHNpemVvZih1bnNpZ25lZCBjaGFyKSAqIDgpOyArK2kpIHsKKyAgICAgICAgaWYgKChfX3ggJiAoMSA8PCBpKSkgIT0gMCkgeyByZXR1cm4gaTsgfQorICAgICAgfQorICAgICAgcmV0dXJuIDA7CisgICAgfQorI2Vsc2UKKyAgICAgIDsKKyNlbmRpZgorfTsKKworLy8KKy8vIEJhc2UgY2xhc3M6IGdlbmVyYWwgY2FzZS4KKy8vCisKK3RlbXBsYXRlPHNpemVfdCBfTnc+CitzdHJ1Y3QgX0Jhc2VfYml0c2V0IHsKKyAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIF9Xb3JkVDsKKworICBfV29yZFQgX01fd1tfTnddOyAgICAgICAgICAgICAgICAvLyAwIGlzIHRoZSBsZWFzdCBzaWduaWZpY2FudCB3b3JkLgorCisgIF9CYXNlX2JpdHNldCgpIHsgX01fZG9fcmVzZXQoKTsgfQorCisgIF9CYXNlX2JpdHNldCh1bnNpZ25lZCBsb25nIF9fdmFsKSB7CisgICAgX01fZG9fcmVzZXQoKTsKKyAgICBfTV93WzBdID0gX192YWw7CisgIH0KKworICBzdGF0aWMgc2l6ZV90IF9TVExQX0NBTEwgX1Nfd2hpY2h3b3JkKCBzaXplX3QgX19wb3MgKSB7CisgICAgcmV0dXJuIF9fcG9zIC8gX19CSVRTX1BFUl9XT1JEOworICB9CisgIHN0YXRpYyBzaXplX3QgX1NUTFBfQ0FMTCBfU193aGljaGJ5dGUoIHNpemVfdCBfX3BvcyApIHsKKyAgICByZXR1cm4gKF9fcG9zICUgX19CSVRTX1BFUl9XT1JEKSAvIENIQVJfQklUOworICB9CisgIHN0YXRpYyBzaXplX3QgX1NUTFBfQ0FMTCBfU193aGljaGJpdCggc2l6ZV90IF9fcG9zICkgeworICAgIHJldHVybiBfX3BvcyAlIF9fQklUU19QRVJfV09SRDsKKyAgfQorICBzdGF0aWMgX1dvcmRUIF9TVExQX0NBTEwgX1NfbWFza2JpdCggc2l6ZV90IF9fcG9zICkgeworICAgIHJldHVybiBfX1NUQVRJQ19DQVNUKF9Xb3JkVCwxKSA8PCBfU193aGljaGJpdChfX3Bvcyk7CisgIH0KKworICBfV29yZFQmIF9NX2dldHdvcmQoc2l6ZV90IF9fcG9zKSAgICAgICB7IHJldHVybiBfTV93W19TX3doaWNod29yZChfX3BvcyldOyB9CisgIF9Xb3JkVCAgX01fZ2V0d29yZChzaXplX3QgX19wb3MpIGNvbnN0IHsgcmV0dXJuIF9NX3dbX1Nfd2hpY2h3b3JkKF9fcG9zKV07IH0KKworICBfV29yZFQmIF9NX2hpd29yZCgpICAgICAgIHsgcmV0dXJuIF9NX3dbX053IC0gMV07IH0KKyAgX1dvcmRUICBfTV9oaXdvcmQoKSBjb25zdCB7IHJldHVybiBfTV93W19OdyAtIDFdOyB9CisKKyAgdm9pZCBfTV9kb19hbmQoY29uc3QgX0Jhc2VfYml0c2V0PF9Odz4mIF9feCkgeworICAgIGZvciAoIHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfTnc7IF9faSsrICkgeworICAgICAgX01fd1tfX2ldICY9IF9feC5fTV93W19faV07CisgICAgfQorICB9CisKKyAgdm9pZCBfTV9kb19vcihjb25zdCBfQmFzZV9iaXRzZXQ8X053PiYgX194KSB7CisgICAgZm9yICggc2l6ZV90IF9faSA9IDA7IF9faSA8IF9OdzsgX19pKysgKSB7CisgICAgICBfTV93W19faV0gfD0gX194Ll9NX3dbX19pXTsKKyAgICB9CisgIH0KKworICB2b2lkIF9NX2RvX3hvcihjb25zdCBfQmFzZV9iaXRzZXQ8X053PiYgX194KSB7CisgICAgZm9yICggc2l6ZV90IF9faSA9IDA7IF9faSA8IF9OdzsgX19pKysgKSB7CisgICAgICBfTV93W19faV0gXj0gX194Ll9NX3dbX19pXTsKKyAgICB9CisgIH0KKworICB2b2lkIF9NX2RvX2xlZnRfc2hpZnQoc2l6ZV90IF9fc2hpZnQpOworCisgIHZvaWQgX01fZG9fcmlnaHRfc2hpZnQoc2l6ZV90IF9fc2hpZnQpOworCisgIHZvaWQgX01fZG9fZmxpcCgpIHsKKyAgICBmb3IgKCBzaXplX3QgX19pID0gMDsgX19pIDwgX053OyBfX2krKyApIHsKKyAgICAgIF9NX3dbX19pXSA9IH5fTV93W19faV07CisgICAgfQorICB9CisKKyAgdm9pZCBfTV9kb19zZXQoKSB7CisgICAgZm9yICggc2l6ZV90IF9faSA9IDA7IF9faSA8IF9OdzsgX19pKysgKSB7CisgICAgICBfTV93W19faV0gPSB+X19TVEFUSUNfQ0FTVChfV29yZFQsMCk7CisgICAgfQorICB9CisKKyAgdm9pZCBfTV9kb19yZXNldCgpIHsgbWVtc2V0KF9NX3csIDAsIF9OdyAqIHNpemVvZihfV29yZFQpKTsgfQorCisgIGJvb2wgX01faXNfZXF1YWwoY29uc3QgX0Jhc2VfYml0c2V0PF9Odz4mIF9feCkgY29uc3QgeworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9OdzsgKytfX2kpIHsKKyAgICAgIGlmIChfTV93W19faV0gIT0gX194Ll9NX3dbX19pXSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGJvb2wgX01faXNfYW55KCkgY29uc3QgeworICAgIGZvciAoIHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfTncgOyBfX2krKyApIHsKKyAgICAgIGlmICggX01fd1tfX2ldICE9IF9fU1RBVElDX0NBU1QoX1dvcmRULDApICkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHNpemVfdCBfTV9kb19jb3VudCgpIGNvbnN0IHsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBfX2J5dGVfcHRyID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIqKV9NX3c7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciogX19lbmRfcHRyID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIqKShfTV93K19Odyk7CisKKyAgICByZXR1cm4gX0JzX0c6Ol9TX2NvdW50KF9fYnl0ZV9wdHIsIF9fZW5kX3B0cik7CisgIH0KKworICB1bnNpZ25lZCBsb25nIF9NX2RvX3RvX3Vsb25nKCkgY29uc3Q7CisKKyAgLy8gZmluZCBmaXJzdCAib24iIGJpdAorICBzaXplX3QgX01fZG9fZmluZF9maXJzdChzaXplX3QgX19ub3RfZm91bmQpIGNvbnN0OworCisgIC8vIGZpbmQgdGhlIG5leHQgIm9uIiBiaXQgdGhhdCBmb2xsb3dzICJwcmV2IgorICBzaXplX3QgX01fZG9fZmluZF9uZXh0KHNpemVfdCBfX3ByZXYsIHNpemVfdCBfX25vdF9mb3VuZCkgY29uc3Q7Cit9OworCisvLworLy8gQmFzZSBjbGFzczogc3BlY2lhbGl6YXRpb24gZm9yIGEgc2luZ2xlIHdvcmQuCisvLworX1NUTFBfVEVNUExBVEVfTlVMTAorc3RydWN0IF9CYXNlX2JpdHNldDwxVUw+IHsKKyAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIF9Xb3JkVDsKKyAgdHlwZWRlZiBfQmFzZV9iaXRzZXQ8MVVMPiBfU2VsZjsKKworICBfV29yZFQgX01fdzsKKworICBfQmFzZV9iaXRzZXQoIHZvaWQgKSA6IF9NX3coMCkge30KKyAgX0Jhc2VfYml0c2V0KHVuc2lnbmVkIGxvbmcgX192YWwpIDogX01fdyhfX3ZhbCkge30KKworICBzdGF0aWMgc2l6ZV90IF9TVExQX0NBTEwgX1Nfd2hpY2h3b3JkKCBzaXplX3QgX19wb3MgKSB7CisgICAgcmV0dXJuIF9fcG9zIC8gX19CSVRTX1BFUl9XT1JEIDsKKyAgfQorICBzdGF0aWMgc2l6ZV90IF9TVExQX0NBTEwgX1Nfd2hpY2hieXRlKCBzaXplX3QgX19wb3MgKSB7CisgICAgcmV0dXJuIChfX3BvcyAlIF9fQklUU19QRVJfV09SRCkgLyBDSEFSX0JJVDsKKyAgfQorICBzdGF0aWMgc2l6ZV90IF9TVExQX0NBTEwgX1Nfd2hpY2hiaXQoIHNpemVfdCBfX3BvcyApIHsKKyAgICByZXR1cm4gX19wb3MgJSBfX0JJVFNfUEVSX1dPUkQ7CisgIH0KKyAgc3RhdGljIF9Xb3JkVCBfU1RMUF9DQUxMIF9TX21hc2tiaXQoIHNpemVfdCBfX3BvcyApIHsKKyAgICByZXR1cm4gKF9fU1RBVElDX0NBU1QoX1dvcmRULDEpKSA8PCBfU193aGljaGJpdChfX3Bvcyk7CisgIH0KKworICBfV29yZFQmIF9NX2dldHdvcmQoc2l6ZV90KSAgICAgICB7IHJldHVybiBfTV93OyB9CisgIF9Xb3JkVCAgX01fZ2V0d29yZChzaXplX3QpIGNvbnN0IHsgcmV0dXJuIF9NX3c7IH0KKworICBfV29yZFQmIF9NX2hpd29yZCgpICAgICAgIHsgcmV0dXJuIF9NX3c7IH0KKyAgX1dvcmRUICBfTV9oaXdvcmQoKSBjb25zdCB7IHJldHVybiBfTV93OyB9CisKKyAgdm9pZCBfTV9kb19hbmQoY29uc3QgX1NlbGYmIF9feCkgeyBfTV93ICY9IF9feC5fTV93OyB9CisgIHZvaWQgX01fZG9fb3IoY29uc3QgX1NlbGYmIF9feCkgIHsgX01fdyB8PSBfX3guX01fdzsgfQorICB2b2lkIF9NX2RvX3hvcihjb25zdCBfU2VsZiYgX194KSB7IF9NX3cgXj0gX194Ll9NX3c7IH0KKyAgdm9pZCBfTV9kb19sZWZ0X3NoaWZ0KHNpemVfdCBfX3NoaWZ0KSAgICAgeyBfTV93IDw8PSBfX3NoaWZ0OyB9CisgIHZvaWQgX01fZG9fcmlnaHRfc2hpZnQoc2l6ZV90IF9fc2hpZnQpICAgIHsgX01fdyA+Pj0gX19zaGlmdDsgfQorICB2b2lkIF9NX2RvX2ZsaXAoKSAgICAgICAgICAgICAgICAgICAgICAgeyBfTV93ID0gfl9NX3c7IH0KKyAgdm9pZCBfTV9kb19zZXQoKSAgICAgICAgICAgICAgICAgICAgICAgIHsgX01fdyA9IH5fX1NUQVRJQ19DQVNUKF9Xb3JkVCwwKTsgfQorICB2b2lkIF9NX2RvX3Jlc2V0KCkgICAgICAgICAgICAgICAgICAgICAgeyBfTV93ID0gMDsgfQorCisgIGJvb2wgX01faXNfZXF1YWwoY29uc3QgX1NlbGYmIF9feCkgY29uc3QgeworICAgIHJldHVybiBfTV93ID09IF9feC5fTV93OworICB9CisgIGJvb2wgX01faXNfYW55KCkgY29uc3QgeworICAgIHJldHVybiBfTV93ICE9IDA7CisgIH0KKworICBzaXplX3QgX01fZG9fY291bnQoKSBjb25zdCB7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciogX19ieXRlX3B0ciA9IChjb25zdCB1bnNpZ25lZCBjaGFyKikmX01fdzsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBfX2VuZF9wdHIgPSAoKGNvbnN0IHVuc2lnbmVkIGNoYXIqKSZfTV93KStzaXplb2YoX01fdyk7CisgICAgcmV0dXJuIF9Cc19HOjpfU19jb3VudChfX2J5dGVfcHRyLCBfX2VuZF9wdHIpOworICB9CisKKyAgdW5zaWduZWQgbG9uZyBfTV9kb190b191bG9uZygpIGNvbnN0IHsgcmV0dXJuIF9NX3c7IH0KKworICBpbmxpbmUgc2l6ZV90IF9NX2RvX2ZpbmRfZmlyc3Qoc2l6ZV90IF9fbm90X2ZvdW5kKSBjb25zdDsKKworICAvLyBmaW5kIHRoZSBuZXh0ICJvbiIgYml0IHRoYXQgZm9sbG93cyAicHJldiIKKyAgaW5saW5lIHNpemVfdCBfTV9kb19maW5kX25leHQoc2l6ZV90IF9fcHJldiwgc2l6ZV90IF9fbm90X2ZvdW5kKSBjb25zdDsKK307CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRGVmaW5pdGlvbnMgb2Ygc2hvdWxkLWJlLW5vbi1pbmxpbmUgZnVuY3Rpb25zIGZyb20gdGhlIHNpbmdsZS13b3JkIHZlcnNpb24gb2YKKy8vICBfQmFzZV9iaXRzZXQuCisvLworaW5saW5lIHNpemVfdAorX0Jhc2VfYml0c2V0PDFVTD46Ol9NX2RvX2ZpbmRfZmlyc3Qoc2l6ZV90IF9fbm90X2ZvdW5kKSBjb25zdCB7CisgIC8vICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgX1dvcmRUOworICBfV29yZFQgX190aGlzd29yZCA9IF9NX3c7CisKKyAgaWYgKCBfX3RoaXN3b3JkICE9IF9fU1RBVElDX0NBU1QoX1dvcmRULDApICkgeworICAgIC8vIGZpbmQgYnl0ZSB3aXRoaW4gd29yZAorICAgIGZvciAoIHNpemVfdCBfX2ogPSAwOyBfX2ogPCBzaXplb2YoX1dvcmRUKTsgX19qKysgKSB7CisgICAgICB1bnNpZ25lZCBjaGFyIF9fdGhpc19ieXRlCisgICAgICAgID0gX19TVEFUSUNfQ0FTVCh1bnNpZ25lZCBjaGFyLChfX3RoaXN3b3JkICYgKH4odW5zaWduZWQgY2hhcikwKSkpOworICAgICAgaWYgKCBfX3RoaXNfYnl0ZSApCisgICAgICAgIHJldHVybiBfX2oqQ0hBUl9CSVQgKyBfQnNfRzo6X1NfZmlyc3Rfb25lKF9fdGhpc19ieXRlKTsKKworICAgICAgX190aGlzd29yZCA+Pj0gQ0hBUl9CSVQ7CisgICAgfQorICB9CisgIC8vIG5vdCBmb3VuZCwgc28gcmV0dXJuIGEgdmFsdWUgdGhhdCBpbmRpY2F0ZXMgZmFpbHVyZS4KKyAgcmV0dXJuIF9fbm90X2ZvdW5kOworfQorCitpbmxpbmUgc2l6ZV90CitfQmFzZV9iaXRzZXQ8MVVMPjo6X01fZG9fZmluZF9uZXh0KHNpemVfdCBfX3ByZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBfX25vdF9mb3VuZCApIGNvbnN0IHsKKyAgLy8gbWFrZSBib3VuZCBpbmNsdXNpdmUKKyAgKytfX3ByZXY7CisKKyAgLy8gY2hlY2sgb3V0IG9mIGJvdW5kcworICBpZiAoIF9fcHJldiA+PSBfX0JJVFNfUEVSX1dPUkQgKQorICAgIHJldHVybiBfX25vdF9mb3VuZDsKKworICAgIC8vIHNlYXJjaCBmaXJzdCAoYW5kIG9ubHkpIHdvcmQKKyAgX1dvcmRUIF9fdGhpc3dvcmQgPSBfTV93OworCisgIC8vIG1hc2sgb2ZmIGJpdHMgYmVsb3cgYm91bmQKKyAgX190aGlzd29yZCAmPSAofl9fU1RBVElDX0NBU1QoX1dvcmRULDApKSA8PCBfU193aGljaGJpdChfX3ByZXYpOworCisgIGlmICggX190aGlzd29yZCAhPSBfX1NUQVRJQ19DQVNUKF9Xb3JkVCwwKSApIHsKKyAgICAvLyBmaW5kIGJ5dGUgd2l0aGluIHdvcmQKKyAgICAvLyBnZXQgZmlyc3QgYnl0ZSBpbnRvIHBsYWNlCisgICAgX190aGlzd29yZCA+Pj0gX1Nfd2hpY2hieXRlKF9fcHJldikgKiBDSEFSX0JJVDsKKyAgICBmb3IgKCBzaXplX3QgX19qID0gX1Nfd2hpY2hieXRlKF9fcHJldik7IF9faiA8IHNpemVvZihfV29yZFQpOyBfX2orKyApIHsKKyAgICAgIHVuc2lnbmVkIGNoYXIgX190aGlzX2J5dGUKKyAgICAgICAgPSBfX1NUQVRJQ19DQVNUKHVuc2lnbmVkIGNoYXIsKF9fdGhpc3dvcmQgJiAofih1bnNpZ25lZCBjaGFyKTApKSk7CisgICAgICBpZiAoIF9fdGhpc19ieXRlICkKKyAgICAgICAgcmV0dXJuIF9faipDSEFSX0JJVCArIF9Cc19HOjpfU19maXJzdF9vbmUoX190aGlzX2J5dGUpOworCisgICAgICBfX3RoaXN3b3JkID4+PSBDSEFSX0JJVDsKKyAgICB9CisgIH0KKworICAvLyBub3QgZm91bmQsIHNvIHJldHVybiBhIHZhbHVlIHRoYXQgaW5kaWNhdGVzIGZhaWx1cmUuCisgIHJldHVybiBfX25vdF9mb3VuZDsKK30gLy8gZW5kIF9NX2RvX2ZpbmRfbmV4dAorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSGVscGVyIGNsYXNzIHRvIHplcm8gb3V0IHRoZSB1bnVzZWQgaGlnaC1vcmRlciBiaXRzIGluIHRoZSBoaWdoZXN0IHdvcmQuCisKK3RlbXBsYXRlIDxzaXplX3QgX0V4dHJhYml0cz4gc3RydWN0IF9TYW5pdGl6ZSB7CisgIHN0YXRpYyB2b2lkIF9TVExQX0NBTEwgX01fZG9fc2FuaXRpemUodW5zaWduZWQgbG9uZyYgX192YWwpCisgIHsgX192YWwgJj0gfigofl9fU1RBVElDX0NBU1QodW5zaWduZWQgbG9uZywwKSkgPDwgX0V4dHJhYml0cyk7IH0KK307CisKK19TVExQX1RFTVBMQVRFX05VTEwgc3RydWN0IF9TYW5pdGl6ZTwwVUw+IHsKKyAgc3RhdGljIHZvaWQgX1NUTFBfQ0FMTCBfTV9kb19zYW5pdGl6ZSh1bnNpZ25lZCBsb25nKSB7fQorfTsKKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ2xhc3MgYml0c2V0LgorLy8gICBfTmIgbWF5IGJlIGFueSBub256ZXJvIG51bWJlciBvZiB0eXBlIHNpemVfdC4KK3RlbXBsYXRlPHNpemVfdCBfTmI+CitjbGFzcyBiaXRzZXQgOiBwdWJsaWMgX1NUTFBfUFJJViBfQmFzZV9iaXRzZXQ8X19CSVRTRVRfV09SRFMoX05iKSA+IHsKK3B1YmxpYzoKKyAgZW51bSB7IF9Xb3JkcyA9IF9fQklUU0VUX1dPUkRTKF9OYikgfSA7CisKK3ByaXZhdGU6CisgIHR5cGVkZWYgX1NUTFBfUFJJViBfQmFzZV9iaXRzZXQ8IF9Xb3JkcyA+IF9CYXNlOworCisgIHZvaWQgX01fZG9fc2FuaXRpemUoKSB7CisgICAgX1NUTFBfUFJJViBfU2FuaXRpemU8X05iJV9fQklUU19QRVJfV09SRCA+OjpfTV9kb19zYW5pdGl6ZSh0aGlzLT5fTV9oaXdvcmQoKSk7CisgIH0KK3B1YmxpYzoKKyAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIF9Xb3JkVDsKKyAgc3RydWN0IHJlZmVyZW5jZTsKKyAgZnJpZW5kIHN0cnVjdCByZWZlcmVuY2U7CisKKyAgLy8gYml0IHJlZmVyZW5jZToKKyAgc3RydWN0IHJlZmVyZW5jZSB7CisgIHR5cGVkZWYgX1NUTFBfUFJJViBfQmFzZV9iaXRzZXQ8X1dvcmRzID4gX0JpdHNldF9iYXNlOworICB0eXBlZGVmIGJpdHNldDxfTmI+IF9CaXRzZXQ7CisgICAgLy8gICAgZnJpZW5kIF9CaXRzZXQ7CisgICAgX1dvcmRUICpfTV93cDsKKyAgICBzaXplX3QgX01fYnBvczsKKworICAgIC8vIHNob3VsZCBiZSBsZWZ0IHVuZGVmaW5lZAorICAgIHJlZmVyZW5jZSgpIHt9CisKKyAgICByZWZlcmVuY2UoIF9CaXRzZXQmIF9fYiwgc2l6ZV90IF9fcG9zICkgeworICAgICAgX01fd3AgPSAmX19iLl9NX2dldHdvcmQoX19wb3MpOworICAgICAgX01fYnBvcyA9IF9CaXRzZXRfYmFzZTo6X1Nfd2hpY2hiaXQoX19wb3MpOworICAgIH0KKworICBwdWJsaWM6CisgICAgfnJlZmVyZW5jZSgpIHt9CisKKyAgICAvLyBmb3IgYltpXSA9IF9feDsKKyAgICByZWZlcmVuY2UmIG9wZXJhdG9yPShib29sIF9feCkgeworICAgICAgaWYgKCBfX3ggKQorICAgICAgICAqX01fd3AgfD0gX0JpdHNldF9iYXNlOjpfU19tYXNrYml0KF9NX2Jwb3MpOworICAgICAgZWxzZQorICAgICAgICAqX01fd3AgJj0gfl9CaXRzZXRfYmFzZTo6X1NfbWFza2JpdChfTV9icG9zKTsKKworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIC8vIGZvciBiW2ldID0gYltfX2pdOworICAgIHJlZmVyZW5jZSYgb3BlcmF0b3I9KGNvbnN0IHJlZmVyZW5jZSYgX19qKSB7CisgICAgICBpZiAoICgqKF9fai5fTV93cCkgJiBfQml0c2V0X2Jhc2U6Ol9TX21hc2tiaXQoX19qLl9NX2Jwb3MpKSApCisgICAgICAgICpfTV93cCB8PSBfQml0c2V0X2Jhc2U6Ol9TX21hc2tiaXQoX01fYnBvcyk7CisgICAgICBlbHNlCisgICAgICAgICpfTV93cCAmPSB+X0JpdHNldF9iYXNlOjpfU19tYXNrYml0KF9NX2Jwb3MpOworCisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgLy8gZmxpcHMgdGhlIGJpdAorICAgIGJvb2wgb3BlcmF0b3J+KCkgY29uc3QgeyByZXR1cm4gKCooX01fd3ApICYgX0JpdHNldF9iYXNlOjpfU19tYXNrYml0KF9NX2Jwb3MpKSA9PSAwOyB9CisKKyAgICAvLyBmb3IgX194ID0gYltpXTsKKyAgICBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gKCooX01fd3ApICYgX0JpdHNldF9iYXNlOjpfU19tYXNrYml0KF9NX2Jwb3MpKSAhPSAwOyB9CisKKyAgICAvLyBmb3IgYltpXS5mbGlwKCk7CisgICAgcmVmZXJlbmNlJiBmbGlwKCkgeworICAgICAgKl9NX3dwIF49IF9CaXRzZXRfYmFzZTo6X1NfbWFza2JpdChfTV9icG9zKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgIH07CisKKyAgLy8gMjMuMy41LjEgY29uc3RydWN0b3JzOgorICBiaXRzZXQoKSB7fQorCisgIGJpdHNldCh1bnNpZ25lZCBsb25nIF9fdmFsKSA6IF9TVExQX1BSSVYgX0Jhc2VfYml0c2V0PF9Xb3Jkcz4oX192YWwpIHsgX01fZG9fc2FuaXRpemUoKTsgfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CisgIGV4cGxpY2l0IGJpdHNldChjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiYgX19zLAorICAgICAgICAgICAgICAgICAgc2l6ZV90IF9fcG9zID0gMCkKKyAgICA6IF9TVExQX1BSSVYgX0Jhc2VfYml0c2V0PF9Xb3JkcyA+KCkgeworICAgIGlmIChfX3BvcyA+IF9fcy5zaXplKCkpCisgICAgICBfX3N0bF90aHJvd19vdXRfb2ZfcmFuZ2UoImJpdHNldCIpOworICAgIF9NX2NvcHlfZnJvbV9zdHJpbmcoX19zLCBfX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46Om5wb3MpOworICB9CisgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorICBiaXRzZXQoY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX19zLAorICAgICAgICAgIHNpemVfdCBfX3BvcywKKyAgICAgICAgICBzaXplX3QgX19uKQorICA6IF9TVExQX1BSSVYgX0Jhc2VfYml0c2V0PF9Xb3JkcyA+KCkgeworICAgIGlmIChfX3BvcyA+IF9fcy5zaXplKCkpCisgICAgICBfX3N0bF90aHJvd19vdXRfb2ZfcmFuZ2UoImJpdHNldCIpOworICAgIF9NX2NvcHlfZnJvbV9zdHJpbmcoX19zLCBfX3BvcywgX19uKTsKKyAgfQorI2Vsc2UgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworICBleHBsaWNpdCBiaXRzZXQoY29uc3Qgc3RyaW5nJiBfX3MsCisgICAgICAgICAgICAgICAgICBzaXplX3QgX19wb3MgPSAwLAorICAgICAgICAgICAgICAgICAgc2l6ZV90IF9fbiA9IChzaXplX3QpLTEpCisgICAgOiBfU1RMUF9QUklWIF9CYXNlX2JpdHNldDxfV29yZHMgPigpIHsKKyAgICBpZiAoX19wb3MgPiBfX3Muc2l6ZSgpKQorICAgICAgX19zdGxfdGhyb3dfb3V0X29mX3JhbmdlKCJiaXRzZXQiKTsKKyAgICBfTV9jb3B5X2Zyb21fc3RyaW5nKF9fcywgX19wb3MsIF9fbik7CisgIH0KKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisKKyAgLy8gMjMuMy41LjIgYml0c2V0IG9wZXJhdGlvbnM6CisgIGJpdHNldDxfTmI+JiBvcGVyYXRvciY9KGNvbnN0IGJpdHNldDxfTmI+JiBfX3JocykgeworICAgIHRoaXMtPl9NX2RvX2FuZChfX3Jocyk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgYml0c2V0PF9OYj4mIG9wZXJhdG9yfD0oY29uc3QgYml0c2V0PF9OYj4mIF9fcmhzKSB7CisgICAgdGhpcy0+X01fZG9fb3IoX19yaHMpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGJpdHNldDxfTmI+JiBvcGVyYXRvcl49KGNvbnN0IGJpdHNldDxfTmI+JiBfX3JocykgeworICAgIHRoaXMtPl9NX2RvX3hvcihfX3Jocyk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgYml0c2V0PF9OYj4mIG9wZXJhdG9yPDw9KHNpemVfdCBfX3BvcykgeworICAgIHRoaXMtPl9NX2RvX2xlZnRfc2hpZnQoX19wb3MpOworICAgIHRoaXMtPl9NX2RvX3Nhbml0aXplKCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgYml0c2V0PF9OYj4mIG9wZXJhdG9yPj49KHNpemVfdCBfX3BvcykgeworICAgIHRoaXMtPl9NX2RvX3JpZ2h0X3NoaWZ0KF9fcG9zKTsKKyAgICB0aGlzLT5fTV9kb19zYW5pdGl6ZSgpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vCisgIC8vIEV4dGVuc2lvbjoKKyAgLy8gVmVyc2lvbnMgb2Ygc2luZ2xlLWJpdCBzZXQsIHJlc2V0LCBmbGlwLCB0ZXN0IHdpdGggbm8gcmFuZ2UgY2hlY2tpbmcuCisgIC8vCisKKyAgYml0c2V0PF9OYj4mIF9VbmNoZWNrZWRfc2V0KHNpemVfdCBfX3BvcykgeworICAgIHRoaXMtPl9NX2dldHdvcmQoX19wb3MpIHw9IF9TVExQX1BSSVYgX0Jhc2VfYml0c2V0PF9Xb3JkcyA+IDo6X1NfbWFza2JpdChfX3Bvcyk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgYml0c2V0PF9OYj4mIF9VbmNoZWNrZWRfc2V0KHNpemVfdCBfX3BvcywgaW50IF9fdmFsKSB7CisgICAgaWYgKF9fdmFsKQorICAgICAgdGhpcy0+X01fZ2V0d29yZChfX3BvcykgfD0gdGhpcy0+X1NfbWFza2JpdChfX3Bvcyk7CisgICAgZWxzZQorICAgICAgdGhpcy0+X01fZ2V0d29yZChfX3BvcykgJj0gfiB0aGlzLT5fU19tYXNrYml0KF9fcG9zKTsKKworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGJpdHNldDxfTmI+JiBfVW5jaGVja2VkX3Jlc2V0KHNpemVfdCBfX3BvcykgeworICAgIHRoaXMtPl9NX2dldHdvcmQoX19wb3MpICY9IH4gdGhpcy0+X1NfbWFza2JpdChfX3Bvcyk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgYml0c2V0PF9OYj4mIF9VbmNoZWNrZWRfZmxpcChzaXplX3QgX19wb3MpIHsKKyAgICB0aGlzLT5fTV9nZXR3b3JkKF9fcG9zKSBePSB0aGlzLT5fU19tYXNrYml0KF9fcG9zKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBib29sIF9VbmNoZWNrZWRfdGVzdChzaXplX3QgX19wb3MpIGNvbnN0IHsKKyAgICByZXR1cm4gKHRoaXMtPl9NX2dldHdvcmQoX19wb3MpICYgdGhpcy0+X1NfbWFza2JpdChfX3BvcykpICE9IF9fU1RBVElDX0NBU1QoX1dvcmRULDApOworICB9CisKKyAgLy8gU2V0LCByZXNldCwgYW5kIGZsaXAuCisKKyAgYml0c2V0PF9OYj4mIHNldCgpIHsKKyAgICB0aGlzLT5fTV9kb19zZXQoKTsKKyAgICB0aGlzLT5fTV9kb19zYW5pdGl6ZSgpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGJpdHNldDxfTmI+JiBzZXQoc2l6ZV90IF9fcG9zKSB7CisgICAgaWYgKF9fcG9zID49IF9OYikKKyAgICAgIF9fc3RsX3Rocm93X291dF9vZl9yYW5nZSgiYml0c2V0Iik7CisgICAgcmV0dXJuIF9VbmNoZWNrZWRfc2V0KF9fcG9zKTsKKyAgfQorCisgIGJpdHNldDxfTmI+JiBzZXQoc2l6ZV90IF9fcG9zLCBpbnQgX192YWwpIHsKKyAgICBpZiAoX19wb3MgPj0gX05iKQorICAgICAgX19zdGxfdGhyb3dfb3V0X29mX3JhbmdlKCJiaXRzZXQiKTsKKyAgICByZXR1cm4gX1VuY2hlY2tlZF9zZXQoX19wb3MsIF9fdmFsKTsKKyAgfQorCisgIGJpdHNldDxfTmI+JiByZXNldCgpIHsKKyAgICB0aGlzLT5fTV9kb19yZXNldCgpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGJpdHNldDxfTmI+JiByZXNldChzaXplX3QgX19wb3MpIHsKKyAgICBpZiAoX19wb3MgPj0gX05iKQorICAgICAgX19zdGxfdGhyb3dfb3V0X29mX3JhbmdlKCJiaXRzZXQiKTsKKworICAgIHJldHVybiBfVW5jaGVja2VkX3Jlc2V0KF9fcG9zKTsKKyAgfQorCisgIGJpdHNldDxfTmI+JiBmbGlwKCkgeworICAgIHRoaXMtPl9NX2RvX2ZsaXAoKTsKKyAgICB0aGlzLT5fTV9kb19zYW5pdGl6ZSgpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGJpdHNldDxfTmI+JiBmbGlwKHNpemVfdCBfX3BvcykgeworICAgIGlmIChfX3BvcyA+PSBfTmIpCisgICAgICBfX3N0bF90aHJvd19vdXRfb2ZfcmFuZ2UoImJpdHNldCIpOworCisgICAgcmV0dXJuIF9VbmNoZWNrZWRfZmxpcChfX3Bvcyk7CisgIH0KKworICBiaXRzZXQ8X05iPiBvcGVyYXRvcn4oKSBjb25zdCB7CisgICAgcmV0dXJuIGJpdHNldDxfTmI+KCp0aGlzKS5mbGlwKCk7CisgIH0KKworICAvLyBlbGVtZW50IGFjY2VzczoKKyAgLy9mb3IgYltpXTsKKyAgcmVmZXJlbmNlIG9wZXJhdG9yW10oc2l6ZV90IF9fcG9zKSB7IHJldHVybiByZWZlcmVuY2UoKnRoaXMsX19wb3MpOyB9CisgIGJvb2wgb3BlcmF0b3JbXShzaXplX3QgX19wb3MpIGNvbnN0IHsgcmV0dXJuIF9VbmNoZWNrZWRfdGVzdChfX3Bvcyk7IH0KKworICB1bnNpZ25lZCBsb25nIHRvX3Vsb25nKCkgY29uc3QgeyByZXR1cm4gdGhpcy0+X01fZG9fdG9fdWxvbmcoKTsgfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykgJiYgIWRlZmluZWQgKF9TVExQX05PX0VYUExJQ0lUX0ZVTkNUSU9OX1RNUExfQVJHUykKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+IHRvX3N0cmluZygpIGNvbnN0IHsKKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+IF9fcmVzdWx0OworICAgIF9NX2NvcHlfdG9fc3RyaW5nKF9fcmVzdWx0KTsKKyAgICByZXR1cm4gX19yZXN1bHQ7CisgIH0KKyNlbHNlCisgIHN0cmluZyB0b19zdHJpbmcoKSBjb25zdCB7CisgICAgc3RyaW5nIF9fcmVzdWx0OworICAgIF9NX2NvcHlfdG9fc3RyaW5nKF9fcmVzdWx0KTsKKyAgICByZXR1cm4gX19yZXN1bHQ7CisgIH0KKyNlbmRpZiAvKiBfU1RMUF9FWFBMSUNJVF9GVU5DVElPTl9UTVBMX0FSR1MgKi8KKworICBzaXplX3QgY291bnQoKSBjb25zdCB7IHJldHVybiB0aGlzLT5fTV9kb19jb3VudCgpOyB9CisKKyAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBfTmI7IH0KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgYml0c2V0PF9OYj4mIF9fcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHRoaXMtPl9NX2lzX2VxdWFsKF9fcmhzKTsKKyAgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3QgYml0c2V0PF9OYj4mIF9fcmhzKSBjb25zdCB7CisgICAgcmV0dXJuICF0aGlzLT5fTV9pc19lcXVhbChfX3Jocyk7CisgIH0KKworICBib29sIHRlc3Qoc2l6ZV90IF9fcG9zKSBjb25zdCB7CisgICAgaWYgKF9fcG9zID49IF9OYikKKyAgICAgIF9fc3RsX3Rocm93X291dF9vZl9yYW5nZSgiYml0c2V0Iik7CisKKyAgICByZXR1cm4gX1VuY2hlY2tlZF90ZXN0KF9fcG9zKTsKKyAgfQorCisgIGJvb2wgYW55KCkgY29uc3QgeyByZXR1cm4gdGhpcy0+X01faXNfYW55KCk7IH0KKyAgYm9vbCBub25lKCkgY29uc3QgeyByZXR1cm4gIXRoaXMtPl9NX2lzX2FueSgpOyB9CisKKyAgYml0c2V0PF9OYj4gb3BlcmF0b3I8PChzaXplX3QgX19wb3MpIGNvbnN0IHsKKyAgICBiaXRzZXQ8X05iPiBfX3Jlc3VsdCgqdGhpcyk7CisgICAgX19yZXN1bHQgPDw9IF9fcG9zIDsgIHJldHVybiBfX3Jlc3VsdDsKKyAgfQorICBiaXRzZXQ8X05iPiBvcGVyYXRvcj4+KHNpemVfdCBfX3BvcykgY29uc3QgeworICAgIGJpdHNldDxfTmI+IF9fcmVzdWx0KCp0aGlzKTsKKyAgICBfX3Jlc3VsdCA+Pj0gX19wb3MgOyAgcmV0dXJuIF9fcmVzdWx0OworICB9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKKyAgLy8KKyAgLy8gRVhURU5TSU9OUzogYml0LWZpbmQgb3BlcmF0aW9ucy4gIFRoZXNlIG9wZXJhdGlvbnMgYXJlCisgIC8vIGV4cGVyaW1lbnRhbCwgYW5kIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBvciByZW1vdmFsIGluIGZ1dHVyZQorICAvLyB2ZXJzaW9ucy4KKyAgLy8KKworICAvLyBmaW5kIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgIm9uIiBiaXQKKyAgc2l6ZV90IF9GaW5kX2ZpcnN0KCkgY29uc3QKKyAgICB7IHJldHVybiB0aGlzLT5fTV9kb19maW5kX2ZpcnN0KF9OYik7IH0KKworICAvLyBmaW5kIHRoZSBpbmRleCBvZiB0aGUgbmV4dCAib24iIGJpdCBhZnRlciBwcmV2CisgIHNpemVfdCBfRmluZF9uZXh0KCBzaXplX3QgX19wcmV2ICkgY29uc3QKKyAgICB7IHJldHVybiB0aGlzLT5fTV9kb19maW5kX25leHQoX19wcmV2LCBfTmIpOyB9CisjZW5kaWYKKworLy8KKy8vIERlZmluaXRpb25zIG9mIHNob3VsZC1iZSBub24taW5saW5lIG1lbWJlciBmdW5jdGlvbnMuCisvLworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorICB2b2lkIF9NX2NvcHlfZnJvbV9zdHJpbmcoY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz4mIF9fcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBfX3Bvcywgc2l6ZV90IF9fbikgeworI2Vsc2UKKyAgdm9pZCBfTV9jb3B5X2Zyb21fc3RyaW5nKGNvbnN0IHN0cmluZyYgX19zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IF9fcG9zLCBzaXplX3QgX19uKSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBzdHJpbmc6OnRyYWl0c190eXBlIF9UcmFpdHM7CisjZW5kaWYKKyAgICByZXNldCgpOworICAgIHNpemVfdCBfX3RtcCA9IF9OYjsKKyAgICBjb25zdCBzaXplX3QgX19OYml0cyA9IChtaW4pIChfX3RtcCwgKG1pbikgKF9fbiwgX19zLnNpemUoKSAtIF9fcG9zKSk7CisgICAgZm9yICggc2l6ZV90IF9faT0gMDsgX19pIDwgX19OYml0czsgKytfX2kpIHsKKyAgICAgIHR5cGVuYW1lIF9UcmFpdHM6OmludF90eXBlIF9fayA9IF9UcmFpdHM6OnRvX2ludF90eXBlKF9fc1tfX3BvcyArIF9fTmJpdHMgLSBfX2kgLSAxXSk7CisgICAgICAvLyBib3JpcyA6IHdpZGVuKCkgPworICAgICAgaWYgKF9fayA9PSAnMScpCisgICAgICAgIHNldChfX2kpOworICAgICAgZWxzZSBpZiAoX19rICE9ICcwJykKKyAgICAgICAgX19zdGxfdGhyb3dfaW52YWxpZF9hcmd1bWVudCgiYml0c2V0Iik7CisgICAgfQorICB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CisgIHZvaWQgX01fY29weV90b19zdHJpbmcoYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX19zKSBjb25zdAorI2Vsc2UKKyAgdm9pZCBfTV9jb3B5X3RvX3N0cmluZyhzdHJpbmcmIF9fcykgY29uc3QKKyNlbmRpZgorICB7CisgICAgX19zLmFzc2lnbihfTmIsICcwJyk7CisKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfTmI7ICsrX19pKSB7CisgICAgICBpZiAoX1VuY2hlY2tlZF90ZXN0KF9faSkpCisgICAgICAgIF9fc1tfTmIgLSAxIC0gX19pXSA9ICcxJzsKKyAgICB9CisgIH0KKworI2lmICFkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkKKyAgdm9pZCBfTV9jb3B5X3RvX3N0cmluZyh3c3RyaW5nJiBfX3MpIGNvbnN0IHsKKyAgICBfX3MuYXNzaWduKF9OYiwgJzAnKTsKKworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9OYjsgKytfX2kpIHsKKyAgICAgIGlmIChfVW5jaGVja2VkX3Rlc3QoX19pKSkKKyAgICAgICAgX19zW19OYiAtIDEgLSBfX2ldID0gJzEnOworICAgIH0KKyAgfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9OT05fVFlQRV9UTVBMX1BBUkFNX0JVRykKKyAgYml0c2V0PF9OYj4gb3BlcmF0b3ImKGNvbnN0IGJpdHNldDxfTmI+JiBfX3kpIGNvbnN0IHsKKyAgICBiaXRzZXQ8X05iPiBfX3Jlc3VsdCgqdGhpcyk7CisgICAgX19yZXN1bHQgJj0gX195OworICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgfQorICBiaXRzZXQ8X05iPiBvcGVyYXRvcnwoY29uc3QgYml0c2V0PF9OYj4mIF9feSkgY29uc3QgeworICAgIGJpdHNldDxfTmI+IF9fcmVzdWx0KCp0aGlzKTsKKyAgICBfX3Jlc3VsdCB8PSBfX3k7CisgICAgcmV0dXJuIF9fcmVzdWx0OworICB9CisgIGJpdHNldDxfTmI+IG9wZXJhdG9yXihjb25zdCBiaXRzZXQ8X05iPiYgX195KSBjb25zdCB7CisgICAgYml0c2V0PF9OYj4gX19yZXN1bHQoKnRoaXMpOworICAgIF9fcmVzdWx0IF49IF9feTsKKyAgICByZXR1cm4gX19yZXN1bHQ7CisgIH0KKyNlbmRpZgorfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gMjMuMy41LjMgYml0c2V0IG9wZXJhdGlvbnM6CisvLworI2lmICEgZGVmaW5lZCAoX1NUTFBfTk9OX1RZUEVfVE1QTF9QQVJBTV9CVUcpCit0ZW1wbGF0ZSA8c2l6ZV90IF9OYj4KK2lubGluZSBiaXRzZXQ8X05iPiAgX1NUTFBfQ0FMTAorb3BlcmF0b3ImKGNvbnN0IGJpdHNldDxfTmI+JiBfX3gsCisgICAgICAgICAgY29uc3QgYml0c2V0PF9OYj4mIF9feSkgeworICBiaXRzZXQ8X05iPiBfX3Jlc3VsdChfX3gpOworICBfX3Jlc3VsdCAmPSBfX3k7CisgIHJldHVybiBfX3Jlc3VsdDsKK30KKworCit0ZW1wbGF0ZSA8c2l6ZV90IF9OYj4KK2lubGluZSBiaXRzZXQ8X05iPiAgX1NUTFBfQ0FMTAorb3BlcmF0b3J8KGNvbnN0IGJpdHNldDxfTmI+JiBfX3gsCisgICAgICAgICAgY29uc3QgYml0c2V0PF9OYj4mIF9feSkgeworICBiaXRzZXQ8X05iPiBfX3Jlc3VsdChfX3gpOworICBfX3Jlc3VsdCB8PSBfX3k7CisgIHJldHVybiBfX3Jlc3VsdDsKK30KKwordGVtcGxhdGUgPHNpemVfdCBfTmI+CitpbmxpbmUgYml0c2V0PF9OYj4gIF9TVExQX0NBTEwKK29wZXJhdG9yXihjb25zdCBiaXRzZXQ8X05iPiYgX194LAorICAgICAgICAgIGNvbnN0IGJpdHNldDxfTmI+JiBfX3kpIHsKKyAgYml0c2V0PF9OYj4gX19yZXN1bHQoX194KTsKKyAgX19yZXN1bHQgXj0gX195OworICByZXR1cm4gX19yZXN1bHQ7Cit9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX05PX0lPU1RSRUFNUykKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjICBpZiAhKGRlZmluZWQgKF9TVExQX01TVkMpICYmIChfU1RMUF9NU1ZDIDwgMTMwMCkpICYmIFwKKyAgICAgICEoZGVmaW5lZChfX1NVTlBST19DQykgJiYgKF9fU1VOUFJPX0NDIDwgMHg1MDApKQorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0lPU0ZXRAorIyAgaW5jbHVkZSA8c3RsL19pb3Nmd2QuaD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgc2l6ZV90IF9OYj4KK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgIF9TVExQX0NBTEwKK29wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLCBiaXRzZXQ8X05iPiYgX194KTsKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgc2l6ZV90IF9OYj4KK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX1NUTFBfQ0FMTAorb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsIGNvbnN0IGJpdHNldDxfTmI+JiBfX3gpOworCisjICBlbHNlCisKKyNpZm5kZWYgX1NUTFBfU1RSSU5HX0lPX0gKKyMgIGluY2x1ZGUgPHN0bC9fc3RyaW5nX2lvLmg+IC8vaW5jbHVkZXMgX2lzdHJlYW0uaCBhbmQgX29zdHJlYW0uaAorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8c2l6ZV90IF9OYj4KK2lzdHJlYW0mICBfU1RMUF9DQUxMCitvcGVyYXRvcj4+KGlzdHJlYW0mIF9faXMsIGJpdHNldDxfTmI+JiBfX3gpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBzdHJpbmc6OnRyYWl0c190eXBlIF9UcmFpdHM7CisgIHN0cmluZyBfX3RtcDsKKyAgX190bXAucmVzZXJ2ZShfTmIpOworCisgIC8vIFNraXAgd2hpdGVzcGFjZQorICB0eXBlbmFtZSBpc3RyZWFtOjpzZW50cnkgX19zZW50cnkoX19pcyk7CisgIGlmIChfX3NlbnRyeSkgeworICAgIHN0cmVhbWJ1ZiogX19idWYgPSBfX2lzLnJkYnVmKCk7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX05iOyArK19faSkgeworICAgICAgc3RhdGljIHR5cGVuYW1lIF9UcmFpdHM6OmludF90eXBlIF9fZW9mID0gX1RyYWl0czo6ZW9mKCk7CisKKyAgICAgIHR5cGVuYW1lIF9UcmFpdHM6OmludF90eXBlIF9fYzEgPSBfX2J1Zi0+c2J1bXBjKCk7CisgICAgICBpZiAoX1RyYWl0czo6ZXFfaW50X3R5cGUoX19jMSwgX19lb2YpKSB7CisgICAgICAgIF9faXMuc2V0c3RhdGUoaW9zX2Jhc2U6OmVvZmJpdCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHR5cGVuYW1lIF9UcmFpdHM6OmNoYXJfdHlwZSBfX2MyID0gX1RyYWl0czo6dG9fY2hhcl90eXBlKF9fYzEpOworICAgICAgICBjaGFyIF9fYyAgPSBfX2lzLm5hcnJvdyhfX2MyLCAnKicpOworCisgICAgICAgIGlmIChfX2MgPT0gJzAnIHx8IF9fYyA9PSAnMScpCisgICAgICAgICAgX190bXAucHVzaF9iYWNrKF9fYyk7CisgICAgICAgIGVsc2UgaWYgKF9UcmFpdHM6OmVxX2ludF90eXBlKF9fYnVmLT5zcHV0YmFja2MoX19jMiksIF9fZW9mKSkgeworICAgICAgICAgIF9faXMuc2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgaWYgKF9fdG1wLmVtcHR5KCkpCisgICAgICBfX2lzLnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKKyAgICBlbHNlCisgICAgICBfX3guX01fY29weV9mcm9tX3N0cmluZyhfX3RtcCwgX19TVEFUSUNfQ0FTVChzaXplX3QsMCksIF9OYik7CisgIH0KKworICByZXR1cm4gX19pczsKK30KKwordGVtcGxhdGUgPHNpemVfdCBfTmI+Citvc3RyZWFtJiBfU1RMUF9DQUxMCitvcGVyYXRvcjw8KG9zdHJlYW0mIF9fb3MsIGNvbnN0IGJpdHNldDxfTmI+JiBfX3gpIHsKKyAgc3RyaW5nIF9fdG1wOworICBfX3guX01fY29weV90b19zdHJpbmcoX190bXApOworICByZXR1cm4gX19vcyA8PCBfX3RtcDsKK30KKworIyAgICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkKKwordGVtcGxhdGUgPHNpemVfdCBfTmI+Cit3aXN0cmVhbSYgIF9TVExQX0NBTEwKK29wZXJhdG9yPj4od2lzdHJlYW0mIF9faXMsIGJpdHNldDxfTmI+JiBfX3gpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSB3c3RyaW5nOjp0cmFpdHNfdHlwZSBfVHJhaXRzOworICB3c3RyaW5nIF9fdG1wOworICBfX3RtcC5yZXNlcnZlKF9OYik7CisKKyAgLy8gU2tpcCB3aGl0ZXNwYWNlCisgIHR5cGVuYW1lIHdpc3RyZWFtOjpzZW50cnkgX19zZW50cnkoX19pcyk7CisgIGlmIChfX3NlbnRyeSkgeworICAgIHdzdHJlYW1idWYqIF9fYnVmID0gX19pcy5yZGJ1ZigpOworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9OYjsgKytfX2kpIHsKKyAgICAgIHN0YXRpYyB0eXBlbmFtZSBfVHJhaXRzOjppbnRfdHlwZSBfX2VvZiA9IF9UcmFpdHM6OmVvZigpOworCisgICAgICB0eXBlbmFtZSBfVHJhaXRzOjppbnRfdHlwZSBfX2MxID0gX19idWYtPnNidW1wYygpOworICAgICAgaWYgKF9UcmFpdHM6OmVxX2ludF90eXBlKF9fYzEsIF9fZW9mKSkgeworICAgICAgICBfX2lzLnNldHN0YXRlKGlvc19iYXNlOjplb2ZiaXQpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICB0eXBlbmFtZSBfVHJhaXRzOjpjaGFyX3R5cGUgX19jMiA9IF9UcmFpdHM6OnRvX2NoYXJfdHlwZShfX2MxKTsKKyAgICAgICAgY2hhciBfX2MgID0gX19pcy5uYXJyb3coX19jMiwgJyonKTsKKworICAgICAgICBpZiAoX19jID09ICcwJyB8fCBfX2MgPT0gJzEnKQorICAgICAgICAgIF9fdG1wLnB1c2hfYmFjayhfX2MpOworICAgICAgICBlbHNlIGlmIChfVHJhaXRzOjplcV9pbnRfdHlwZShfX2J1Zi0+c3B1dGJhY2tjKF9fYzIpLCBfX2VvZikpIHsKKyAgICAgICAgICBfX2lzLnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGlmIChfX3RtcC5lbXB0eSgpKQorICAgICAgX19pcy5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7CisgICAgZWxzZQorICAgICAgX194Ll9NX2NvcHlfZnJvbV9zdHJpbmcoX190bXAsIF9fU1RBVElDX0NBU1Qoc2l6ZV90LDApLCBfTmIpOworICB9CisKKyAgcmV0dXJuIF9faXM7Cit9CisKK3RlbXBsYXRlIDxzaXplX3QgX05iPgord29zdHJlYW0mIF9TVExQX0NBTEwKK29wZXJhdG9yPDwod29zdHJlYW0mIF9fb3MsIGNvbnN0IGJpdHNldDxfTmI+JiBfX3gpIHsKKyAgd3N0cmluZyBfX3RtcDsKKyAgX194Ll9NX2NvcHlfdG9fc3RyaW5nKF9fdG1wKTsKKyAgcmV0dXJuIF9fb3MgPDwgX190bXA7Cit9CisKKyMgICAgZW5kaWYgLyogX1NUTFBfTk9fV0NIQVJfVCAqLworIyAgZW5kaWYKKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfTk9OX1RZUEVfVE1QTF9QQVJBTV9CVUcgKi8KKworI3VuZGVmICBiaXRzZXQKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjdW5kZWYgX19CSVRTX1BFUl9XT1JECisjdW5kZWYgX19CSVRTRVRfV09SRFMKKworI2lmICFkZWZpbmVkIChfU1RMUF9MSU5LX1RJTUVfSU5TVEFOVElBVElPTikKKyMgIGluY2x1ZGUgPHN0bC9fYml0c2V0LmM+CisjZW5kaWYKKworI2VuZGlmIC8qIF9TVExQX0JJVFNFVF9IICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvX2J2ZWN0b3IuaCBiL3N0bC9fYnZlY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NDNlZGEKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvX2J2ZWN0b3IuaApAQCAtMCwwICsxLDgzNyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKy8qIE5PVEU6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIFNUTCBoZWFkZXJzLgorICogICBZb3Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4KKyAqLworCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0JWRUNUT1JfSAorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9CVkVDVE9SX0gKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9WRUNUT1JfSAorIyAgaW5jbHVkZSA8c3RsL192ZWN0b3IuaD4KKyNlbmRpZgorCisjZGVmaW5lIF9TVExQX1dPUkRfQklUIChpbnQoQ0hBUl9CSVQqc2l6ZW9mKHVuc2lnbmVkIGludCkpKQorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKworc3RydWN0IF9CaXRfcmVmZXJlbmNlIHsKKyAgdW5zaWduZWQgaW50KiBfTV9wOworICB1bnNpZ25lZCBpbnQgX01fbWFzazsKKyAgX0JpdF9yZWZlcmVuY2UodW5zaWduZWQgaW50KiBfX3gsIHVuc2lnbmVkIGludCBfX3kpCisgICAgOiBfTV9wKF9feCksIF9NX21hc2soX195KSB7fQorCitwdWJsaWM6CisgIF9CaXRfcmVmZXJlbmNlKCkgOiBfTV9wKDApLCBfTV9tYXNrKDApIHt9CisKKyAgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gISghKCpfTV9wICYgX01fbWFzaykpOworICB9CisgIF9CaXRfcmVmZXJlbmNlJiBvcGVyYXRvciA9IChib29sIF9feCkgeworICAgIGlmIChfX3gpICAqX01fcCB8PSBfTV9tYXNrOworICAgIGVsc2UgICAgICAqX01fcCAmPSB+X01fbWFzazsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgX0JpdF9yZWZlcmVuY2UmIG9wZXJhdG9yID0gKGNvbnN0IF9CaXRfcmVmZXJlbmNlJiBfX3gpIHsKKyAgICByZXR1cm4gKnRoaXMgPSBib29sKF9feCk7CisgIH0KKyAgYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgX0JpdF9yZWZlcmVuY2UmIF9feCkgY29uc3QgeworICAgIHJldHVybiBib29sKCp0aGlzKSA9PSBib29sKF9feCk7CisgIH0KKyAgYm9vbCBvcGVyYXRvciA8IChjb25zdCBfQml0X3JlZmVyZW5jZSYgX194KSBjb25zdCB7CisgICAgcmV0dXJuICFib29sKCp0aGlzKSAmJiBib29sKF9feCk7CisgIH0KKworICBfQml0X3JlZmVyZW5jZSYgb3BlcmF0b3IgfD0gKGJvb2wgX194KSB7CisgICAgaWYgKF9feCkKKyAgICAgICpfTV9wIHw9IF9NX21hc2s7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIF9CaXRfcmVmZXJlbmNlJiBvcGVyYXRvciAmPSAoYm9vbCBfX3gpIHsKKyAgICBpZiAoIV9feCkKKyAgICAgICpfTV9wICY9IH5fTV9tYXNrOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICB2b2lkIGZsaXAoKSB7ICpfTV9wIF49IF9NX21hc2s7IH0KK307CisKKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK2lubGluZSB2b2lkIHN3YXAoX1NUTFBfUFJJViBfQml0X3JlZmVyZW5jZSYgX194LCBfU1RMUF9QUklWIF9CaXRfcmVmZXJlbmNlJiBfX3kpIHsKKyAgYm9vbCBfX3RtcCA9IChib29sKV9feDsKKyAgX194ID0gX195OworICBfX3kgPSBfX3RtcDsKK30KKworLy8gTWlnaHQgbm90IGJlIHZlcnkgdXNlZnVsIGJ1dCBjb3N0cyBub3RoaW5nIQorX1NUTFBfVEVNUExBVEVfTlVMTAorc3RydWN0IF9fdHlwZV90cmFpdHM8X1NUTFBfUFJJViBfQml0X3JlZmVyZW5jZT4geworICB0eXBlZGVmIF9fZmFsc2VfdHlwZSAgICBoYXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yOworICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgICBoYXNfdHJpdmlhbF9jb3B5X2NvbnN0cnVjdG9yOworICB0eXBlZGVmIF9fZmFsc2VfdHlwZSAgICBoYXNfdHJpdmlhbF9hc3NpZ25tZW50X29wZXJhdG9yOworICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgICBoYXNfdHJpdmlhbF9kZXN0cnVjdG9yOworICB0eXBlZGVmIF9fZmFsc2VfdHlwZSAgICBpc19QT0RfdHlwZTsKK307CisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKworc3RydWN0IF9CaXRfaXRlcmF0b3JfYmFzZSB7CisgIHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKKworICB1bnNpZ25lZCBpbnQqIF9NX3A7CisgIHVuc2lnbmVkIGludCAgX01fb2Zmc2V0OworCisgIHZvaWQgX01fYnVtcF91cCgpIHsKKyAgICBpZiAoX01fb2Zmc2V0KysgPT0gX1NUTFBfV09SRF9CSVQgLSAxKSB7CisgICAgICBfTV9vZmZzZXQgPSAwOworICAgICAgKytfTV9wOworICAgIH0KKyAgfQorCisgIHZvaWQgX01fYnVtcF9kb3duKCkgeworICAgIGlmIChfTV9vZmZzZXQtLSA9PSAwKSB7CisgICAgICBfTV9vZmZzZXQgPSBfU1RMUF9XT1JEX0JJVCAtIDE7CisgICAgICAtLV9NX3A7CisgICAgfQorICB9CisKKyAgX0JpdF9pdGVyYXRvcl9iYXNlKCkgOiBfTV9wKDApLCBfTV9vZmZzZXQoMCkge30KKyAgX0JpdF9pdGVyYXRvcl9iYXNlKHVuc2lnbmVkIGludCogX194LCB1bnNpZ25lZCBpbnQgX195KSA6IF9NX3AoX194KSwgX01fb2Zmc2V0KF9feSkge30KKy8vIHNlZSBjb21tZW50IGluIGRvYy9SRUFETUUuZXZjNCBhbmQgZG9jL1JFQURNRS5ldmM4CisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgX01TQ19WRVI8PTE0MDEgJiYgZGVmaW5lZChNSVBTKSAmJiBkZWZpbmVkKE5ERUJVRykKKyAgX0JpdF9pdGVyYXRvcl9iYXNlKCBjb25zdCBfQml0X2l0ZXJhdG9yX2Jhc2UmIF9feCkgOiBfTV9wKF9feC5fTV9wKSwgX01fb2Zmc2V0KF9feC5fTV9vZmZzZXQpIHt9CisjZW5kaWYKKyAgLy8gIF9CaXRfaXRlcmF0b3JfYmFzZSYgb3BlcmF0b3IgPSAoIGNvbnN0IF9CaXRfaXRlcmF0b3JfYmFzZSYgX194KSB7IF9NX3AgPSBfX3guX01fcCA7IF9NX29mZnNldCA9IF9feC5fTV9vZmZzZXQgOyByZXR1cm4gKnRoaXM7IH0KKworICB2b2lkIF9NX2FkdmFuY2UgKGRpZmZlcmVuY2VfdHlwZSBfX2kpIHsKKyAgICBkaWZmZXJlbmNlX3R5cGUgX19uID0gX19pICsgX01fb2Zmc2V0OworICAgIF9NX3AgKz0gX19uIC8gX1NUTFBfV09SRF9CSVQ7CisgICAgX19uID0gX19uICUgX1NUTFBfV09SRF9CSVQ7CisgICAgaWYgKF9fbiA8IDApIHsKKyAgICAgIF9NX29mZnNldCA9ICh1bnNpZ25lZCBpbnQpIF9fbiArIF9TVExQX1dPUkRfQklUOworICAgICAgLS1fTV9wOworICAgIH0gZWxzZQorICAgICAgX01fb2Zmc2V0ID0gKHVuc2lnbmVkIGludCkgX19uOworICB9CisKKyAgZGlmZmVyZW5jZV90eXBlIF9NX3N1YnRyYWN0KGNvbnN0IF9CaXRfaXRlcmF0b3JfYmFzZSYgX194KSBjb25zdCB7CisgICAgcmV0dXJuIF9TVExQX1dPUkRfQklUICogKF9NX3AgLSBfX3guX01fcCkgKyBfTV9vZmZzZXQgLSBfX3guX01fb2Zmc2V0OworICB9Cit9OworCitpbmxpbmUgYm9vbCAgX1NUTFBfQ0FMTCBvcGVyYXRvcj09KGNvbnN0IF9CaXRfaXRlcmF0b3JfYmFzZSYgX194LCBjb25zdCBfQml0X2l0ZXJhdG9yX2Jhc2UmIF9feSkgeworICByZXR1cm4gX195Ll9NX3AgPT0gX194Ll9NX3AgJiYgX195Ll9NX29mZnNldCA9PSBfX3guX01fb2Zmc2V0OworfQoraW5saW5lIGJvb2wgIF9TVExQX0NBTEwgb3BlcmF0b3IhPShjb25zdCBfQml0X2l0ZXJhdG9yX2Jhc2UmIF9feCwgY29uc3QgX0JpdF9pdGVyYXRvcl9iYXNlJiBfX3kpIHsKKyAgcmV0dXJuIF9feS5fTV9wICE9IF9feC5fTV9wIHx8IF9feS5fTV9vZmZzZXQgIT0gX194Ll9NX29mZnNldDsKK30KKworaW5saW5lIGJvb2wgX1NUTFBfQ0FMTCBvcGVyYXRvcjwoY29uc3QgX0JpdF9pdGVyYXRvcl9iYXNlJiBfX3gsIGNvbnN0IF9CaXRfaXRlcmF0b3JfYmFzZSYgX195KSB7CisgIHJldHVybiBfX3guX01fcCA8IF9feS5fTV9wIHx8IChfX3guX01fcCA9PSBfX3kuX01fcCAmJiBfX3guX01fb2Zmc2V0IDwgX195Ll9NX29mZnNldCk7Cit9CisKK2lubGluZSBib29sIF9TVExQX0NBTEwgb3BlcmF0b3I+KGNvbnN0IF9CaXRfaXRlcmF0b3JfYmFzZSYgX194LCBjb25zdCBfQml0X2l0ZXJhdG9yX2Jhc2UmIF9feSkgIHsKKyAgcmV0dXJuIG9wZXJhdG9yIDwoX195ICwgX194KTsKK30KK2lubGluZSBib29sIF9TVExQX0NBTEwgb3BlcmF0b3I8PShjb25zdCBfQml0X2l0ZXJhdG9yX2Jhc2UmIF9feCwgY29uc3QgX0JpdF9pdGVyYXRvcl9iYXNlJiBfX3kpIHsKKyAgcmV0dXJuICEoX195IDwgX194KTsKK30KK2lubGluZSBib29sIF9TVExQX0NBTEwgb3BlcmF0b3I+PShjb25zdCBfQml0X2l0ZXJhdG9yX2Jhc2UmIF9feCwgY29uc3QgX0JpdF9pdGVyYXRvcl9iYXNlJiBfX3kpIHsKKyAgcmV0dXJuICEoX194IDwgX195KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9SZWYsIGNsYXNzIF9QdHI+CitzdHJ1Y3QgX0JpdF9pdGVyIDogcHVibGljIF9CaXRfaXRlcmF0b3JfYmFzZSB7CisgIHR5cGVkZWYgX1JlZiAgcmVmZXJlbmNlOworICB0eXBlZGVmIF9QdHIgIHBvaW50ZXI7CisgIHR5cGVkZWYgX0JpdF9pdGVyPF9SZWYsIF9QdHI+IF9TZWxmOworICB0eXBlZGVmIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OworICB0eXBlZGVmIGJvb2wgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiBwdHJkaWZmX3QgZGlmZmVyZW5jZV90eXBlOworICB0eXBlZGVmIHNpemVfdCBzaXplX3R5cGU7CisKKyAgX0JpdF9pdGVyKHVuc2lnbmVkIGludCogX194LCB1bnNpZ25lZCBpbnQgX195KSA6IF9CaXRfaXRlcmF0b3JfYmFzZShfX3gsIF9feSkge30KKyAgX0JpdF9pdGVyKCkge30KKworICBfQml0X2l0ZXIoY29uc3QgX0JpdF9pdGVyPF9CaXRfcmVmZXJlbmNlLCBfQml0X3JlZmVyZW5jZSo+JiBfX3gpOgorICAgIF9CaXRfaXRlcmF0b3JfYmFzZSgoY29uc3QgX0JpdF9pdGVyYXRvcl9iYXNlJilfX3gpIHt9CisKKyAgLy8gIF9TZWxmJiBvcGVyYXRvciA9IChjb25zdCBfQml0X2l0ZXI8X0JpdF9yZWZlcmVuY2UsIF9CaXRfcmVmZXJlbmNlKj4mIF9feCkKKyAgLy8gICB7IChfQml0X2l0ZXJhdG9yX2Jhc2UmKSp0aGlzID0gKGNvbnN0IF9CaXRfaXRlcmF0b3JfYmFzZSYpX194OyByZXR1cm4gKnRoaXM7IH0KKworICByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3QgeworICAgIHJldHVybiBfQml0X3JlZmVyZW5jZShfTV9wLCAxVUwgPDwgX01fb2Zmc2V0KTsKKyAgfQorICBfU2VsZiYgb3BlcmF0b3IrKygpIHsKKyAgICBfTV9idW1wX3VwKCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIF9TZWxmIG9wZXJhdG9yKysoaW50KSB7CisgICAgX1NlbGYgX190bXAgPSAqdGhpczsKKyAgICBfTV9idW1wX3VwKCk7CisgICAgcmV0dXJuIF9fdG1wOworICB9CisgIF9TZWxmJiBvcGVyYXRvci0tKCkgeworICAgIF9NX2J1bXBfZG93bigpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBfU2VsZiBvcGVyYXRvci0tKGludCkgeworICAgIF9TZWxmIF9fdG1wID0gKnRoaXM7CisgICAgX01fYnVtcF9kb3duKCk7CisgICAgcmV0dXJuIF9fdG1wOworICB9CisgIF9TZWxmJiBvcGVyYXRvcis9KGRpZmZlcmVuY2VfdHlwZSBfX2kpIHsKKyAgICBfTV9hZHZhbmNlKF9faSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIF9TZWxmJiBvcGVyYXRvci09KGRpZmZlcmVuY2VfdHlwZSBfX2kpIHsKKyAgICAqdGhpcyArPSAtX19pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBfU2VsZiBvcGVyYXRvcisoZGlmZmVyZW5jZV90eXBlIF9faSkgY29uc3QgeworICAgIF9TZWxmIF9fdG1wID0gKnRoaXM7CisgICAgcmV0dXJuIF9fdG1wICs9IF9faTsKKyAgfQorICBfU2VsZiBvcGVyYXRvci0oZGlmZmVyZW5jZV90eXBlIF9faSkgY29uc3QgeworICAgIF9TZWxmIF9fdG1wID0gKnRoaXM7CisgICAgcmV0dXJuIF9fdG1wIC09IF9faTsKKyAgfQorICBkaWZmZXJlbmNlX3R5cGUgb3BlcmF0b3ItKGNvbnN0IF9TZWxmJiBfX3gpIGNvbnN0IHsKKyAgICByZXR1cm4gX01fc3VidHJhY3QoX194KTsKKyAgfQorICByZWZlcmVuY2Ugb3BlcmF0b3JbXShkaWZmZXJlbmNlX3R5cGUgX19pKSB7IHJldHVybiAqKCp0aGlzICsgX19pKTsgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9SZWYsIGNsYXNzIF9QdHI+CitpbmxpbmUgX0JpdF9pdGVyPF9SZWYsX1B0cj4gIF9TVExQX0NBTEwKK29wZXJhdG9yKyhwdHJkaWZmX3QgX19uLCBjb25zdCBfQml0X2l0ZXI8X1JlZiwgX1B0cj4mIF9feCkgeworICAgcmV0dXJuIF9feCArIF9fbjsKK30KKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKKyNpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQordGVtcGxhdGUgPGNsYXNzIF9SZWYsIGNsYXNzIF9QdHI+CitzdHJ1Y3QgX190eXBlX3RyYWl0czwgX1NUTFBfUFJJViBfQml0X2l0ZXI8X1JlZiwgX1B0cj4gPiB7CisgIHR5cGVkZWYgX19mYWxzZV90eXBlICAgaGFzX3RyaXZpYWxfZGVmYXVsdF9jb25zdHJ1Y3RvcjsKKyAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9jb3B5X2NvbnN0cnVjdG9yOworICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3I7CisgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjsKKyAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgICBpc19QT0RfdHlwZTsKK307CisjZW5kaWYgLyogX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTiAqLworCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX09MRF9IUF9JVEVSQVRPUl9RVUVSSUVTKQoraW5saW5lIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5KGNvbnN0IF9TVExQX1BSSVYgX0JpdF9pdGVyYXRvcl9iYXNlJikKK3sgcmV0dXJuIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKCk7IH0KK2lubGluZSBwdHJkaWZmX3QqIGRpc3RhbmNlX3R5cGUoY29uc3QgX1NUTFBfUFJJViBfQml0X2l0ZXJhdG9yX2Jhc2UmKQoreyByZXR1cm4gKHB0cmRpZmZfdCopMDsgfQoraW5saW5lIGJvb2wqIHZhbHVlX3R5cGUoY29uc3QgX1NUTFBfUFJJViBfQml0X2l0ZXI8X1NUTFBfUFJJViBfQml0X3JlZmVyZW5jZSwgX1NUTFBfUFJJViBfQml0X3JlZmVyZW5jZSo+JikKK3sgcmV0dXJuIChib29sKikwOyB9CitpbmxpbmUgYm9vbCogdmFsdWVfdHlwZShjb25zdCBfU1RMUF9QUklWIF9CaXRfaXRlcjxib29sLCBjb25zdCBib29sKj4mKQoreyByZXR1cm4gKGJvb2wqKTA7IH0KKyNlbmRpZgorCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3R5cGVkZWYgX0JpdF9pdGVyPGJvb2wsIGNvbnN0IGJvb2wqPiBfQml0X2NvbnN0X2l0ZXJhdG9yOwordHlwZWRlZiBfQml0X2l0ZXI8X0JpdF9yZWZlcmVuY2UsIF9CaXRfcmVmZXJlbmNlKj4gX0JpdF9pdGVyYXRvcjsKKworLy8gQml0LXZlY3RvciBiYXNlIGNsYXNzLCB3aGljaCBlbmNhcHN1bGF0ZXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbgorLy8gIG9sZCBTR0ktc3R5bGUgYWxsb2NhdG9ycyBhbmQgc3RhbmRhcmQtY29uZm9ybWluZyBhbGxvY2F0b3JzLgordGVtcGxhdGUgPGNsYXNzIF9BbGxvYz4KK2NsYXNzIF9CdmVjdG9yX2Jhc2UgeworICB0eXBlZGVmIF9CdmVjdG9yX2Jhc2U8X0FsbG9jPiBfU2VsZjsKK3B1YmxpYzoKKyAgX1NUTFBfRk9SQ0VfQUxMT0NBVE9SUyhib29sLCBfQWxsb2MpCisgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jX3RyYWl0czxib29sLCBfQWxsb2M+OjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKKyAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgX19jaHVua190eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY190cmFpdHM8X19jaHVua190eXBlLAorICAgICAgICAgIF9BbGxvYz46OmFsbG9jYXRvcl90eXBlIF9fY2h1bmtfYWxsb2NhdG9yX3R5cGU7CisgIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuIF9TVExQX0NPTlZFUlRfQUxMT0NBVE9SKChjb25zdCBfX2NodW5rX2FsbG9jYXRvcl90eXBlJilfTV9lbmRfb2Zfc3RvcmFnZSwgYm9vbCk7CisgIH0KKyAgc3RhdGljIGFsbG9jYXRvcl90eXBlIF9fZ2V0X2RmbF9hbGxvY2F0b3IoKSB7IHJldHVybiBhbGxvY2F0b3JfdHlwZSgpOyB9CisKKyAgX0J2ZWN0b3JfYmFzZShjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgIDogX01fc3RhcnQoKSwgX01fZmluaXNoKCksIF9NX2VuZF9vZl9zdG9yYWdlKF9TVExQX0NPTlZFUlRfQUxMT0NBVE9SKF9fYSwgX19jaHVua190eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19jaHVua190eXBlKikwKQorICB7fQorICBfQnZlY3Rvcl9iYXNlKF9fbW92ZV9zb3VyY2U8X1NlbGY+IHNyYykKKyAgICA6IF9NX3N0YXJ0KHNyYy5nZXQoKS5fTV9zdGFydCksIF9NX2ZpbmlzaChzcmMuZ2V0KCkuX01fZmluaXNoKSwKKyAgICAgIF9NX2VuZF9vZl9zdG9yYWdlKHNyYy5nZXQoKS5fTV9lbmRfb2Zfc3RvcmFnZSkgeworICAgIC8vTWFrZSB0aGUgc291cmNlIGRlc3Ryb3lhYmxlCisgICAgc3JjLmdldCgpLl9NX3N0YXJ0Ll9NX3AgPSAwOworICB9CisKKyAgfl9CdmVjdG9yX2Jhc2UoKSB7CisgICAgX01fZGVhbGxvY2F0ZSgpOworICB9CisKK3Byb3RlY3RlZDoKKworICB1bnNpZ25lZCBpbnQqIF9NX2JpdF9hbGxvYyhzaXplX3QgX19uKSB7CisgICAgcmV0dXJuIF9NX2VuZF9vZl9zdG9yYWdlLmFsbG9jYXRlKChfX24gKyBfU1RMUF9XT1JEX0JJVCAtIDEpL19TVExQX1dPUkRfQklUKTsKKyAgfQorICB2b2lkIF9NX2RlYWxsb2NhdGUoKSB7CisgICAgaWYgKF9NX3N0YXJ0Ll9NX3ApCisgICAgICBfTV9lbmRfb2Zfc3RvcmFnZS5kZWFsbG9jYXRlKF9NX3N0YXJ0Ll9NX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NX2VuZF9vZl9zdG9yYWdlLl9NX2RhdGEgLSBfTV9zdGFydC5fTV9wKTsKKyAgfQorCisgIF9CaXRfaXRlcmF0b3IgX01fc3RhcnQ7CisgIF9CaXRfaXRlcmF0b3IgX01fZmluaXNoOworICBfU1RMUF9hbGxvY19wcm94eTxfX2NodW5rX3R5cGUqLCBfX2NodW5rX3R5cGUsIF9fY2h1bmtfYWxsb2NhdG9yX3R5cGU+IF9NX2VuZF9vZl9zdG9yYWdlOworfTsKKworCisvLyBUaGUgbmV4dCBmZXcgbGluZXMgYXJlIGNvbmZ1c2luZy4gIFdoYXQgd2UncmUgZG9pbmcgaXMgZGVjbGFyaW5nIGEKKy8vICBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIG9mIHZlY3RvcjxULCBBbGxvYz4gaWYgd2UgaGF2ZSB0aGUgbmVjZXNzYXJ5CisvLyAgY29tcGlsZXIgc3VwcG9ydC4gIE90aGVyd2lzZSwgd2UgZGVmaW5lIGEgY2xhc3MgYml0X3ZlY3RvciB3aGljaCB1c2VzCisvLyAgdGhlIGRlZmF1bHQgYWxsb2NhdG9yLgorCisjaWYgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikgJiYgIWRlZmluZWQgKF9TVExQX05PX0JPT0wpICYmICFkZWZpbmVkIChfX1NVTlBST19DQykKKyMgIGRlZmluZSBfU1RMUF9WRUNCT09MX1RFTVBMQVRFCisjICBkZWZpbmUgX19CVkVDX1RNUExfSEVBREVSIHRlbXBsYXRlIDxjbGFzcyBfQWxsb2M+CisjZWxzZQorIyAgdW5kZWYgX1NUTFBfVkVDQk9PTF9URU1QTEFURQorIyAgaWZkZWYgX1NUTFBfTk9fQk9PTAorIyAgICBkZWZpbmUgX19CVkVDX1RNUExfSEVBREVSCisjICBlbHNlCisjICAgIGRlZmluZSBfX0JWRUNfVE1QTF9IRUFERVIgX1NUTFBfVEVNUExBVEVfTlVMTAorIyAgZW5kaWYKKyMgIGlmICEoZGVmaW5lZChfX01SQ19fKXx8KGRlZmluZWQoX19TQ19fKSYmIWRlZmluZWQoX19ETUNfXykpKSAgICAgIC8vKlRZIDEyLzE3LzIwMDAgLQorIyAgICBkZWZpbmUgX0FsbG9jIF9TVExQX0RFRkFVTFRfQUxMT0NBVE9SKGJvb2wpCisjICBlbHNlCisjICAgIGRlZmluZSBfQWxsb2MgYWxsb2NhdG9yPGJvb2w+CisjICBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9ERUJVRykKKyMgIGRlZmluZSB2ZWN0b3IgX1NUTFBfTk9OX0RCR19OQU1FKHZlY3RvcikKKyNlbmRpZgorCisjaWZkZWYgX1NUTFBfTk9fQk9PTAorIyAgZGVmaW5lIF9fQlZFQ1RPUl9RVUFMSUZJRUQgYml0X3ZlY3RvcgorIyAgZGVmaW5lIF9fQlZFQ1RPUiAgICAgICAgICAgYml0X3ZlY3RvcgorI2Vsc2UKKyMgIGlmZGVmIF9TVExQX1ZFQ0JPT0xfVEVNUExBVEUKKyMgICAgZGVmaW5lIF9fQlZFQ1RPUl9RVUFMSUZJRUQgdmVjdG9yPGJvb2wsIF9BbGxvYz4KKyMgIGVsc2UKKyMgICAgZGVmaW5lIF9fQlZFQ1RPUl9RVUFMSUZJRUQgdmVjdG9yPGJvb2wsIGFsbG9jYXRvcjxib29sPiA+CisjICBlbmRpZgorIyAgaWYgZGVmaW5lZCAoX1NUTFBfUEFSVElBTF9TUEVDX05FRURTX1RFTVBMQVRFX0FSR1MpCisjICAgIGRlZmluZSBfX0JWRUNUT1IgX19CVkVDVE9SX1FVQUxJRklFRAorIyAgZWxzZQorIyAgICBkZWZpbmUgX19CVkVDVE9SIHZlY3RvcgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKF9TVExQX0RFQlVHKSB8fCBkZWZpbmVkIChfU1RMUF9OT19CT09MKQorX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisjZW5kaWYKKworX19CVkVDX1RNUExfSEVBREVSCitjbGFzcyBfX0JWRUNUT1JfUVVBTElGSUVEIDogcHVibGljIF9TVExQX1BSSVYgX0J2ZWN0b3JfYmFzZTxfQWxsb2MgPgorI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QQVJUSUFMX1NQRUNfV09SS0FST1VORCkgJiYgIWRlZmluZWQgKF9TVExQX0RFQlVHKQorICAgICAgICAgICAgICAgICAgICAgICAgICAsIHB1YmxpYyBfX3N0bHBvcnRfY2xhc3M8IF9fQlZFQ1RPUl9RVUFMSUZJRUQgPgorI2VuZGlmCit7CisgIHR5cGVkZWYgX1NUTFBfUFJJViBfQnZlY3Rvcl9iYXNlPF9BbGxvYyA+IF9CYXNlOworICB0eXBlZGVmIF9fQlZFQ1RPUl9RVUFMSUZJRUQgX1NlbGY7CitwdWJsaWM6CisgIHR5cGVkZWYgYm9vbCB2YWx1ZV90eXBlOworICB0eXBlZGVmIHNpemVfdCBzaXplX3R5cGU7CisgIHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9CaXRfcmVmZXJlbmNlIHJlZmVyZW5jZTsKKyAgdHlwZWRlZiBib29sIGNvbnN0X3JlZmVyZW5jZTsKKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9CaXRfcmVmZXJlbmNlKiBwb2ludGVyOworICB0eXBlZGVmIGNvbnN0IGJvb2wqIGNvbnN0X3BvaW50ZXI7CisgIHR5cGVkZWYgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgX0l0ZXJhdG9yX2NhdGVnb3J5OworCisgIHR5cGVkZWYgX1NUTFBfUFJJViBfQml0X2l0ZXJhdG9yICAgICAgICAgIGl0ZXJhdG9yOworICB0eXBlZGVmIF9TVExQX1BSSVYgX0JpdF9jb25zdF9pdGVyYXRvciAgICBjb25zdF9pdGVyYXRvcjsKKworICBfU1RMUF9ERUNMQVJFX1JBTkRPTV9BQ0NFU1NfUkVWRVJTRV9JVEVSQVRPUlM7CisKKyNpZmRlZiBfU1RMUF9WRUNCT09MX1RFTVBMQVRFCisgIHR5cGVkZWYgdHlwZW5hbWUgX1NUTFBfUFJJViBfQnZlY3Rvcl9iYXNlPF9BbGxvYyA+OjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfU1RMUF9QUklWIF9CdmVjdG9yX2Jhc2U8X0FsbG9jID46Ol9fY2h1bmtfdHlwZSBfX2NodW5rX3R5cGU7CisjZWxzZQorICB0eXBlZGVmIF9TVExQX1BSSVYgX0J2ZWN0b3JfYmFzZTxfQWxsb2MgPjo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7CisgIHR5cGVkZWYgX1NUTFBfUFJJViBfQnZlY3Rvcl9iYXNlPF9BbGxvYyA+OjpfX2NodW5rX3R5cGUgX19jaHVua190eXBlOworI2VuZGlmCisKK3Byb3RlY3RlZDoKKworICB2b2lkIF9NX2luaXRpYWxpemUoc2l6ZV90eXBlIF9fbikgeworICAgIHVuc2lnbmVkIGludCogX19xID0gdGhpcy0+X01fYml0X2FsbG9jKF9fbik7CisgICAgdGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuX01fZGF0YSA9IF9fcSArIChfX24gKyBfU1RMUF9XT1JEX0JJVCAtIDEpL19TVExQX1dPUkRfQklUOworICAgIHRoaXMtPl9NX3N0YXJ0ID0gaXRlcmF0b3IoX19xLCAwKTsKKyAgICB0aGlzLT5fTV9maW5pc2ggPSB0aGlzLT5fTV9zdGFydCArIGRpZmZlcmVuY2VfdHlwZShfX24pOworICB9CisgIHZvaWQgX01faW5zZXJ0X2F1eChpdGVyYXRvciBfX3Bvc2l0aW9uLCBib29sIF9feCkgeworICAgIGlmICh0aGlzLT5fTV9maW5pc2guX01fcCAhPSB0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5fTV9kYXRhKSB7CisgICAgICBfU1RMUF9QUklWIF9fY29weV9iYWNrd2FyZChfX3Bvc2l0aW9uLCB0aGlzLT5fTV9maW5pc2gsIHRoaXMtPl9NX2ZpbmlzaCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZygpLCAoZGlmZmVyZW5jZV90eXBlKikwICk7CisgICAgICAqX19wb3NpdGlvbiA9IF9feDsKKyAgICAgICsrdGhpcy0+X01fZmluaXNoOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHNpemVfdHlwZSBfX2xlbiA9IHNpemUoKSA/IDIgKiBzaXplKCkgOiBfU1RMUF9XT1JEX0JJVDsKKyAgICAgIHVuc2lnbmVkIGludCogX19xID0gdGhpcy0+X01fYml0X2FsbG9jKF9fbGVuKTsKKyAgICAgIGl0ZXJhdG9yIF9faSA9IGNvcHkoYmVnaW4oKSwgX19wb3NpdGlvbiwgaXRlcmF0b3IoX19xLCAwKSk7CisgICAgICAqX19pKysgPSBfX3g7CisgICAgICB0aGlzLT5fTV9maW5pc2ggPSBjb3B5KF9fcG9zaXRpb24sIGVuZCgpLCBfX2kpOworICAgICAgdGhpcy0+X01fZGVhbGxvY2F0ZSgpOworICAgICAgdGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuX01fZGF0YSA9IF9fcSArIChfX2xlbiArIF9TVExQX1dPUkRfQklUIC0gMSkvX1NUTFBfV09SRF9CSVQ7CisgICAgICB0aGlzLT5fTV9zdGFydCA9IGl0ZXJhdG9yKF9fcSwgMCk7CisgICAgfQorICB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZvaWQgX01faW5pdGlhbGl6ZV9yYW5nZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnB1dF9pdGVyYXRvcl90YWcgJikgeworICAgIHRoaXMtPl9NX3N0YXJ0ID0gaXRlcmF0b3IoKTsKKyAgICB0aGlzLT5fTV9maW5pc2ggPSBpdGVyYXRvcigpOworICAgIHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLl9NX2RhdGEgPSAwOworICAgIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKyAgICAgIHB1c2hfYmFjaygqX19maXJzdCk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KKyAgdm9pZCBfTV9pbml0aWFsaXplX3JhbmdlKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3J3YXJkX2l0ZXJhdG9yX3RhZyAmKSB7CisgICAgc2l6ZV90eXBlIF9fbiA9IGRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgX01faW5pdGlhbGl6ZShfX24pOworICAgIGNvcHkoX19maXJzdCwgX19sYXN0LCB0aGlzLT5fTV9zdGFydCk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZvaWQgX01faW5zZXJ0X3JhbmdlKGl0ZXJhdG9yIF9fcG9zLAorICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0X2l0ZXJhdG9yX3RhZyAmKSB7CisgICAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KSB7CisgICAgICBfX3BvcyA9IGluc2VydChfX3BvcywgKl9fZmlyc3QpOworICAgICAgKytfX3BvczsKKyAgICB9CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KKyAgdm9pZCBfTV9pbnNlcnRfcmFuZ2UoaXRlcmF0b3IgX19wb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9yd2FyZF9pdGVyYXRvcl90YWcgJikgeworICAgIGlmIChfX2ZpcnN0ICE9IF9fbGFzdCkgeworICAgICAgc2l6ZV90eXBlIF9fbiA9IGRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICBpZiAoY2FwYWNpdHkoKSAtIHNpemUoKSA+PSBfX24pIHsKKyAgICAgICAgX1NUTFBfUFJJViBfX2NvcHlfYmFja3dhcmQoX19wb3NpdGlvbiwgZW5kKCksIHRoaXMtPl9NX2ZpbmlzaCArIGRpZmZlcmVuY2VfdHlwZShfX24pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZygpLCAoZGlmZmVyZW5jZV90eXBlKikwICk7CisgICAgICAgIGNvcHkoX19maXJzdCwgX19sYXN0LCBfX3Bvc2l0aW9uKTsKKyAgICAgICAgdGhpcy0+X01fZmluaXNoICs9IGRpZmZlcmVuY2VfdHlwZShfX24pOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHNpemVfdHlwZSBfX2xlbiA9IHNpemUoKSArIChtYXgpKHNpemUoKSwgX19uKTsKKyAgICAgICAgdW5zaWduZWQgaW50KiBfX3EgPSB0aGlzLT5fTV9iaXRfYWxsb2MoX19sZW4pOworICAgICAgICBpdGVyYXRvciBfX2kgPSBjb3B5KGJlZ2luKCksIF9fcG9zaXRpb24sIGl0ZXJhdG9yKF9fcSwgMCkpOworICAgICAgICBfX2kgPSBjb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19pKTsKKyAgICAgICAgdGhpcy0+X01fZmluaXNoID0gY29weShfX3Bvc2l0aW9uLCBlbmQoKSwgX19pKTsKKyAgICAgICAgdGhpcy0+X01fZGVhbGxvY2F0ZSgpOworICAgICAgICB0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5fTV9kYXRhID0gX19xICsgKF9fbGVuICsgX1NUTFBfV09SRF9CSVQgLSAxKS9fU1RMUF9XT1JEX0JJVDsKKyAgICAgICAgdGhpcy0+X01fc3RhcnQgPSBpdGVyYXRvcihfX3EsIDApOworICAgICAgfQorICAgIH0KKyAgfQorCisjZW5kaWYgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworCitwdWJsaWM6CisgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gdGhpcy0+X01fc3RhcnQ7IH0KKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiB0aGlzLT5fTV9zdGFydDsgfQorICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiB0aGlzLT5fTV9maW5pc2g7IH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gdGhpcy0+X01fZmluaXNoOyB9CisKKyAgcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7CisgIH0KKyAgcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7CisgIH0KKworICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHNpemVfdHlwZShlbmQoKSAtIGJlZ2luKCkpOyB9CisgIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHNpemVfdHlwZSgtMSk7IH0KKyAgc2l6ZV90eXBlIGNhcGFjaXR5KCkgY29uc3QgeworICAgIHJldHVybiBzaXplX3R5cGUoY29uc3RfaXRlcmF0b3IodGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuX01fZGF0YSwgMCkgLSBiZWdpbigpKTsKKyAgfQorICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gYmVnaW4oKSA9PSBlbmQoKTsgfQorICByZWZlcmVuY2Ugb3BlcmF0b3JbXShzaXplX3R5cGUgX19uKQorICB7IHJldHVybiAqKGJlZ2luKCkgKyBkaWZmZXJlbmNlX3R5cGUoX19uKSk7IH0KKyAgY29uc3RfcmVmZXJlbmNlIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgeyByZXR1cm4gKihiZWdpbigpICsgZGlmZmVyZW5jZV90eXBlKF9fbikpOyB9CisKKyAgdm9pZCBfTV9yYW5nZV9jaGVjayhzaXplX3R5cGUgX19uKSBjb25zdCB7CisgICAgaWYgKF9fbiA+PSB0aGlzLT5zaXplKCkpCisgICAgICBfX3N0bF90aHJvd19yYW5nZV9lcnJvcigidmVjdG9yPGJvb2w+Iik7CisgIH0KKworICByZWZlcmVuY2UgYXQoc2l6ZV90eXBlIF9fbikKKyAgICB7IF9NX3JhbmdlX2NoZWNrKF9fbik7IHJldHVybiAoKnRoaXMpW19fbl07IH0KKyAgY29uc3RfcmVmZXJlbmNlIGF0KHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgeyBfTV9yYW5nZV9jaGVjayhfX24pOyByZXR1cm4gKCp0aGlzKVtfX25dOyB9CisKKyAgZXhwbGljaXQgX19CVkVDVE9SKGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX1NUTFBfUFJJViBfQnZlY3Rvcl9iYXNlPF9BbGxvYyA+KF9fYSkge30KKworICBfX0JWRUNUT1Ioc2l6ZV90eXBlIF9fbiwgYm9vbCBfX3ZhbCwKKyAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX1NUTFBfUFJJViBfQnZlY3Rvcl9iYXNlPF9BbGxvYyA+KF9fYSkgeworICAgIF9NX2luaXRpYWxpemUoX19uKTsKKyAgICBmaWxsKHRoaXMtPl9NX3N0YXJ0Ll9NX3AsIChfX2NodW5rX3R5cGUqKSh0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5fTV9kYXRhKSwgX192YWwgPyB+MCA6IDApOworICB9CisKKyAgZXhwbGljaXQgX19CVkVDVE9SKHNpemVfdHlwZSBfX24pCisgICAgOiBfU1RMUF9QUklWIF9CdmVjdG9yX2Jhc2U8X0FsbG9jID4oYWxsb2NhdG9yX3R5cGUoKSkgeworICAgIF9NX2luaXRpYWxpemUoX19uKTsKKyAgICBmaWxsKHRoaXMtPl9NX3N0YXJ0Ll9NX3AsIChfX2NodW5rX3R5cGUqKSh0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5fTV9kYXRhKSwgMCk7CisgIH0KKworICBfX0JWRUNUT1IoY29uc3QgX1NlbGYmIF9feCkKKyAgICA6IF9TVExQX1BSSVYgX0J2ZWN0b3JfYmFzZTxfQWxsb2MgPihfX3guZ2V0X2FsbG9jYXRvcigpKSB7CisgICAgX01faW5pdGlhbGl6ZShfX3guc2l6ZSgpKTsKKyAgICBjb3B5KF9feC5iZWdpbigpLCBfX3guZW5kKCksIHRoaXMtPl9NX3N0YXJ0KTsKKyAgfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnRlZ2VyPgorICB2b2lkIF9NX2luaXRpYWxpemVfZGlzcGF0Y2goX0ludGVnZXIgX19uLCBfSW50ZWdlciBfX3gsIGNvbnN0IF9fdHJ1ZV90eXBlJikgeworICAgIF9NX2luaXRpYWxpemUoX19uKTsKKyAgICBmaWxsKHRoaXMtPl9NX3N0YXJ0Ll9NX3AsIHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLl9NX2RhdGEsIF9feCA/IH4wIDogMCk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZvaWQgX01faW5pdGlhbGl6ZV9kaXNwYXRjaChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX2ZhbHNlX3R5cGUmKSB7CisgICAgX01faW5pdGlhbGl6ZV9yYW5nZShfX2ZpcnN0LCBfX2xhc3QsIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yKSk7CisgIH0KKyMgIGlmIGRlZmluZWQgKF9TVExQX05FRURTX0VYVFJBX1RFTVBMQVRFX0NPTlNUUlVDVE9SUykKKyAgLy8gQ2hlY2sgd2hldGhlciBpdCdzIGFuIGludGVncmFsIHR5cGUuICBJZiBzbywgaXQncyBub3QgYW4gaXRlcmF0b3IuCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgX19CVkVDVE9SKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgICA6IF9TVExQX1BSSVYgX0J2ZWN0b3JfYmFzZTxfQWxsb2MgPihhbGxvY2F0b3JfdHlwZSgpKSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXNJbnRlZ3JhbDxfSW5wdXRJdGVyYXRvcj46Ol9SZXQgX0ludGVncmFsOworICAgIF9NX2luaXRpYWxpemVfZGlzcGF0Y2goX19maXJzdCwgX19sYXN0LCBfSW50ZWdyYWwoKSk7CisgIH0KKyMgIGVuZGlmCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgX19CVkVDVE9SKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgX1NUTFBfQUxMT0NBVE9SX1RZUEVfREZMKQorICAgIDogX1NUTFBfUFJJViBfQnZlY3Rvcl9iYXNlPF9BbGxvYyA+KF9fYSkgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lzSW50ZWdyYWw8X0lucHV0SXRlcmF0b3I+OjpfUmV0IF9JbnRlZ3JhbDsKKyAgICBfTV9pbml0aWFsaXplX2Rpc3BhdGNoKF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOworICB9CisjZWxzZSAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisgIF9fQlZFQ1RPUihjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9TVExQX1BSSVYgX0J2ZWN0b3JfYmFzZTxfQWxsb2MgPihfX2EpIHsKKyAgICBzaXplX3R5cGUgX19uID0gZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KTsKKyAgICBfTV9pbml0aWFsaXplKF9fbik7CisgICAgY29weShfX2ZpcnN0LCBfX2xhc3QsIHRoaXMtPl9NX3N0YXJ0KTsKKyAgfQorICBfX0JWRUNUT1IoY29uc3QgYm9vbCogX19maXJzdCwgY29uc3QgYm9vbCogX19sYXN0LAorICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfU1RMUF9QUklWIF9CdmVjdG9yX2Jhc2U8X0FsbG9jID4oX19hKSB7CisgICAgc2l6ZV90eXBlIF9fbiA9IGRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgX01faW5pdGlhbGl6ZShfX24pOworICAgIGNvcHkoX19maXJzdCwgX19sYXN0LCB0aGlzLT5fTV9zdGFydCk7CisgIH0KKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisKKyAgX19CVkVDVE9SKF9fbW92ZV9zb3VyY2U8X1NlbGY+IHNyYykKKyAgICA6IF9TVExQX1BSSVYgX0J2ZWN0b3JfYmFzZTxfQWxsb2MgPihfX21vdmVfc291cmNlPF9CYXNlPihzcmMuZ2V0KCkpKSB7fQorCisgIH5fX0JWRUNUT1IoKSB7fQorCisgIF9fQlZFQ1RPUl9RVUFMSUZJRUQmIG9wZXJhdG9yPShjb25zdCBfX0JWRUNUT1JfUVVBTElGSUVEJiBfX3gpIHsKKyAgICBpZiAoJl9feCA9PSB0aGlzKSByZXR1cm4gKnRoaXM7CisgICAgaWYgKF9feC5zaXplKCkgPiBjYXBhY2l0eSgpKSB7CisgICAgICB0aGlzLT5fTV9kZWFsbG9jYXRlKCk7CisgICAgICBfTV9pbml0aWFsaXplKF9feC5zaXplKCkpOworICAgIH0KKyAgICBjb3B5KF9feC5iZWdpbigpLCBfX3guZW5kKCksIGJlZ2luKCkpOworICAgIHRoaXMtPl9NX2ZpbmlzaCA9IGJlZ2luKCkgKyBkaWZmZXJlbmNlX3R5cGUoX194LnNpemUoKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8gYXNzaWduKCksIGEgZ2VuZXJhbGl6ZWQgYXNzaWdubWVudCBtZW1iZXIgZnVuY3Rpb24uICBUd28KKyAgLy8gdmVyc2lvbnM6IG9uZSB0aGF0IHRha2VzIGEgY291bnQsIGFuZCBvbmUgdGhhdCB0YWtlcyBhIHJhbmdlLgorICAvLyBUaGUgcmFuZ2UgdmVyc2lvbiBpcyBhIG1lbWJlciB0ZW1wbGF0ZSwgc28gd2UgZGlzcGF0Y2ggb24gd2hldGhlcgorICAvLyBvciBub3QgdGhlIHR5cGUgaXMgYW4gaW50ZWdlci4KKworICB2b2lkIF9NX2ZpbGxfYXNzaWduKHNpemVfdCBfX24sIGJvb2wgX194KSB7CisgICAgaWYgKF9fbiA+IHNpemUoKSkgeworICAgICAgZmlsbCh0aGlzLT5fTV9zdGFydC5fTV9wLCAoX19jaHVua190eXBlKikodGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuX01fZGF0YSksIF9feCA/IH4wIDogMCk7CisgICAgICBpbnNlcnQoZW5kKCksIF9fbiAtIHNpemUoKSwgX194KTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBlcmFzZShiZWdpbigpICsgX19uLCBlbmQoKSk7CisgICAgICBmaWxsKHRoaXMtPl9NX3N0YXJ0Ll9NX3AsIChfX2NodW5rX3R5cGUqKSh0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5fTV9kYXRhKSwgX194ID8gfjAgOiAwKTsKKyAgICB9CisgIH0KKyAgdm9pZCBhc3NpZ24oc2l6ZV90IF9fbiwgYm9vbCBfX3gpIHsgX01fZmlsbF9hc3NpZ24oX19uLCBfX3gpOyB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZvaWQgYXNzaWduKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lzSW50ZWdyYWw8X0lucHV0SXRlcmF0b3I+OjpfUmV0IF9JbnRlZ3JhbDsKKyAgICBfTV9hc3NpZ25fZGlzcGF0Y2goX19maXJzdCwgX19sYXN0LCBfSW50ZWdyYWwoKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0ludGVnZXI+CisgIHZvaWQgX01fYXNzaWduX2Rpc3BhdGNoKF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX192YWwsIGNvbnN0IF9fdHJ1ZV90eXBlJikKKyAgICB7IF9NX2ZpbGxfYXNzaWduKChzaXplX3QpIF9fbiwgKGJvb2wpIF9fdmFsKTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgorICB2b2lkIF9NX2Fzc2lnbl9kaXNwYXRjaChfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LCBjb25zdCBfX2ZhbHNlX3R5cGUmKQorICAgIHsgX01fYXNzaWduX2F1eChfX2ZpcnN0LCBfX2xhc3QsIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9fZmlyc3QsIF9JbnB1dEl0ZXIpKTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgdm9pZCBfTV9hc3NpZ25fYXV4KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0X2l0ZXJhdG9yX3RhZyAmKSB7CisgICAgaXRlcmF0b3IgX19jdXIgPSBiZWdpbigpOworICAgIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3QgJiYgX19jdXIgIT0gZW5kKCk7ICsrX19jdXIsICsrX19maXJzdCkKKyAgICAgICpfX2N1ciA9ICpfX2ZpcnN0OworICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKyAgICAgIGVyYXNlKF9fY3VyLCBlbmQoKSk7CisgICAgZWxzZQorICAgICAgaW5zZXJ0KGVuZCgpLCBfX2ZpcnN0LCBfX2xhc3QpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CisgIHZvaWQgX01fYXNzaWduX2F1eChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9yd2FyZF9pdGVyYXRvcl90YWcgJikgeworICAgIHNpemVfdHlwZSBfX2xlbiA9IGRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgaWYgKF9fbGVuIDwgc2l6ZSgpKQorICAgICAgZXJhc2UoY29weShfX2ZpcnN0LCBfX2xhc3QsIGJlZ2luKCkpLCBlbmQoKSk7CisgICAgZWxzZSB7CisgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbWlkID0gX19maXJzdDsKKyAgICAgIGFkdmFuY2UoX19taWQsIHNpemUoKSk7CisgICAgICBjb3B5KF9fZmlyc3QsIF9fbWlkLCBiZWdpbigpKTsKKyAgICAgIGluc2VydChlbmQoKSwgX19taWQsIF9fbGFzdCk7CisgICAgfQorICB9CisjZW5kaWYgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworCisgIHZvaWQgcmVzZXJ2ZShzaXplX3R5cGUgX19uKSB7CisgICAgaWYgKGNhcGFjaXR5KCkgPCBfX24pIHsKKyAgICAgIGlmIChtYXhfc2l6ZSgpIDwgX19uKQorICAgICAgICBfX3N0bF90aHJvd19sZW5ndGhfZXJyb3IoInZlY3Rvcjxib29sPiIpOworICAgICAgdW5zaWduZWQgaW50KiBfX3EgPSB0aGlzLT5fTV9iaXRfYWxsb2MoX19uKTsKKyAgICAgIF9TVExQX1BSSVYgX0JpdF9pdGVyYXRvciBfX3ooX19xLCAwKTsKKyAgICAgIHRoaXMtPl9NX2ZpbmlzaCA9IGNvcHkoYmVnaW4oKSwgZW5kKCksIF9feik7CisgICAgICB0aGlzLT5fTV9kZWFsbG9jYXRlKCk7CisgICAgICB0aGlzLT5fTV9zdGFydCA9IGl0ZXJhdG9yKF9fcSwgMCk7CisgICAgICB0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5fTV9kYXRhID0gX19xICsgKF9fbiArIF9TVExQX1dPUkRfQklUIC0gMSkvX1NUTFBfV09SRF9CSVQ7CisgICAgfQorICB9CisKKyAgcmVmZXJlbmNlIGZyb250KCkgeyByZXR1cm4gKmJlZ2luKCk7IH0KKyAgY29uc3RfcmVmZXJlbmNlIGZyb250KCkgY29uc3QgeyByZXR1cm4gKmJlZ2luKCk7IH0KKyAgcmVmZXJlbmNlIGJhY2soKSB7IHJldHVybiAqKGVuZCgpIC0gMSk7IH0KKyAgY29uc3RfcmVmZXJlbmNlIGJhY2soKSBjb25zdCB7IHJldHVybiAqKGVuZCgpIC0gMSk7IH0KKyAgdm9pZCBwdXNoX2JhY2soYm9vbCBfX3gpIHsKKyAgICBpZiAodGhpcy0+X01fZmluaXNoLl9NX3AgIT0gdGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuX01fZGF0YSkgeworICAgICAgKih0aGlzLT5fTV9maW5pc2gpID0gX194OworICAgICAgKyt0aGlzLT5fTV9maW5pc2g7CisgICAgfQorICAgIGVsc2UKKyAgICAgIF9NX2luc2VydF9hdXgoZW5kKCksIF9feCk7CisgIH0KKyAgdm9pZCBzd2FwKF9fQlZFQ1RPUl9RVUFMSUZJRUQmIF9feCkgeworICAgIF9TVExQX1NURDo6c3dhcCh0aGlzLT5fTV9zdGFydCwgX194Ll9NX3N0YXJ0KTsKKyAgICBfU1RMUF9TVEQ6OnN3YXAodGhpcy0+X01fZmluaXNoLCBfX3guX01fZmluaXNoKTsKKyAgICB0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5zd2FwKF9feC5fTV9lbmRfb2Zfc3RvcmFnZSk7CisgIH0KKyAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIGJvb2wgX194ID0gYm9vbCgpKSB7CisgICAgZGlmZmVyZW5jZV90eXBlIF9fbiA9IF9fcG9zaXRpb24gLSBiZWdpbigpOworICAgIGlmICh0aGlzLT5fTV9maW5pc2guX01fcCAhPSB0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5fTV9kYXRhICYmIF9fcG9zaXRpb24gPT0gZW5kKCkpIHsKKyAgICAgICoodGhpcy0+X01fZmluaXNoKSA9IF9feDsKKyAgICAgICsrdGhpcy0+X01fZmluaXNoOworICAgIH0KKyAgICBlbHNlCisgICAgICBfTV9pbnNlcnRfYXV4KF9fcG9zaXRpb24sIF9feCk7CisgICAgcmV0dXJuIGJlZ2luKCkgKyBfX247CisgIH0KKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnRlZ2VyPgorICB2b2lkIF9NX2luc2VydF9kaXNwYXRjaChpdGVyYXRvciBfX3BvcywgX0ludGVnZXIgX19uLCBfSW50ZWdlciBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fdHJ1ZV90eXBlJikgeworICAgIF9NX2ZpbGxfaW5zZXJ0KF9fcG9zLCAoc2l6ZV90eXBlKSBfX24sIChib29sKSBfX3gpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICB2b2lkIF9NX2luc2VydF9kaXNwYXRjaChpdGVyYXRvciBfX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX2ZhbHNlX3R5cGUmKSB7CisgICAgX01faW5zZXJ0X3JhbmdlKF9fcG9zLCBfX2ZpcnN0LCBfX2xhc3QsIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yKSk7CisgIH0KKworICAvLyBDaGVjayB3aGV0aGVyIGl0J3MgYW4gaW50ZWdyYWwgdHlwZS4gIElmIHNvLCBpdCdzIG5vdCBhbiBpdGVyYXRvci4KKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICB2b2lkIGluc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLAorICAgICAgICAgICAgICBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Jc0ludGVncmFsPF9JbnB1dEl0ZXJhdG9yPjo6X1JldCBfSW50ZWdyYWw7CisgICAgX01faW5zZXJ0X2Rpc3BhdGNoKF9fcG9zaXRpb24sIF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOworICB9CisjZWxzZSAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisgIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sCisgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkgeworICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkgcmV0dXJuOworICAgIHNpemVfdHlwZSBfX24gPSBkaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QpOworICAgIGlmIChjYXBhY2l0eSgpIC0gc2l6ZSgpID49IF9fbikgeworICAgICAgX1NUTFBfUFJJViBfX2NvcHlfYmFja3dhcmQoX19wb3NpdGlvbiwgZW5kKCksIHRoaXMtPl9NX2ZpbmlzaCArIF9fbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKCksIChkaWZmZXJlbmNlX3R5cGUqKTAgKTsKKyAgICAgIGNvcHkoX19maXJzdCwgX19sYXN0LCBfX3Bvc2l0aW9uKTsKKyAgICAgIHRoaXMtPl9NX2ZpbmlzaCArPSBfX247CisgICAgfQorICAgIGVsc2UgeworICAgICAgc2l6ZV90eXBlIF9fbGVuID0gc2l6ZSgpICsgKG1heCkoc2l6ZSgpLCBfX24pOworICAgICAgdW5zaWduZWQgaW50KiBfX3EgPSB0aGlzLT5fTV9iaXRfYWxsb2MoX19sZW4pOworICAgICAgaXRlcmF0b3IgX19pID0gY29weShiZWdpbigpLCBfX3Bvc2l0aW9uLCBpdGVyYXRvcihfX3EsIDApKTsKKyAgICAgIF9faSA9IGNvcHkoX19maXJzdCwgX19sYXN0LCBfX2kpOworICAgICAgdGhpcy0+X01fZmluaXNoID0gY29weShfX3Bvc2l0aW9uLCBlbmQoKSwgX19pKTsKKyAgICAgIHRoaXMtPl9NX2RlYWxsb2NhdGUoKTsKKyAgICAgIHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLl9NX2RhdGEgPSBfX3EgKyAoX19sZW4gKyBfU1RMUF9XT1JEX0JJVCAtIDEpL19TVExQX1dPUkRfQklUOworICAgICAgdGhpcy0+X01fc3RhcnQgPSBpdGVyYXRvcihfX3EsIDApOworICAgIH0KKyAgfQorCisgIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIGNvbnN0IGJvb2wqIF9fZmlyc3QsIGNvbnN0IGJvb2wqIF9fbGFzdCkgeworICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkgcmV0dXJuOworICAgIHNpemVfdHlwZSBfX24gPSBkaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QpOworICAgIGlmIChjYXBhY2l0eSgpIC0gc2l6ZSgpID49IF9fbikgeworICAgICAgX1NUTFBfUFJJViBfX2NvcHlfYmFja3dhcmQoX19wb3NpdGlvbiwgZW5kKCksIHRoaXMtPl9NX2ZpbmlzaCArIF9fbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKCksIChkaWZmZXJlbmNlX3R5cGUqKTAgKTsKKyAgICAgIGNvcHkoX19maXJzdCwgX19sYXN0LCBfX3Bvc2l0aW9uKTsKKyAgICAgIHRoaXMtPl9NX2ZpbmlzaCArPSBfX247CisgICAgfQorICAgIGVsc2UgeworICAgICAgc2l6ZV90eXBlIF9fbGVuID0gc2l6ZSgpICsgKG1heCkoc2l6ZSgpLCBfX24pOworICAgICAgdW5zaWduZWQgaW50KiBfX3EgPSB0aGlzLT5fTV9iaXRfYWxsb2MoX19sZW4pOworICAgICAgaXRlcmF0b3IgX19pID0gY29weShiZWdpbigpLCBfX3Bvc2l0aW9uLCBpdGVyYXRvcihfX3EsIDApKTsKKyAgICAgIF9faSA9IGNvcHkoX19maXJzdCwgX19sYXN0LCBfX2kpOworICAgICAgdGhpcy0+X01fZmluaXNoID0gY29weShfX3Bvc2l0aW9uLCBlbmQoKSwgX19pKTsKKyAgICAgIHRoaXMtPl9NX2RlYWxsb2NhdGUoKTsKKyAgICAgIHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLl9NX2RhdGEgPSBfX3EgKyAoX19sZW4gKyBfU1RMUF9XT1JEX0JJVCAtIDEpL19TVExQX1dPUkRfQklUOworICAgICAgdGhpcy0+X01fc3RhcnQgPSBpdGVyYXRvcihfX3EsIDApOworICAgIH0KKyAgfQorI2VuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKworICB2b2lkIF9NX2ZpbGxfaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIHNpemVfdHlwZSBfX24sIGJvb2wgX194KSB7CisgICAgaWYgKF9fbiA9PSAwKSByZXR1cm47CisgICAgaWYgKGNhcGFjaXR5KCkgLSBzaXplKCkgPj0gX19uKSB7CisgICAgICBfU1RMUF9QUklWIF9fY29weV9iYWNrd2FyZChfX3Bvc2l0aW9uLCBlbmQoKSwgdGhpcy0+X01fZmluaXNoICsgZGlmZmVyZW5jZV90eXBlKF9fbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZygpLCAoZGlmZmVyZW5jZV90eXBlKikwICk7CisgICAgICBmaWxsKF9fcG9zaXRpb24sIF9fcG9zaXRpb24gKyBkaWZmZXJlbmNlX3R5cGUoX19uKSwgX194KTsKKyAgICAgIHRoaXMtPl9NX2ZpbmlzaCArPSBkaWZmZXJlbmNlX3R5cGUoX19uKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBzaXplX3R5cGUgX19sZW4gPSBzaXplKCkgKyAobWF4KShzaXplKCksIF9fbik7CisgICAgICB1bnNpZ25lZCBpbnQqIF9fcSA9IHRoaXMtPl9NX2JpdF9hbGxvYyhfX2xlbik7CisgICAgICBpdGVyYXRvciBfX2kgPSBjb3B5KGJlZ2luKCksIF9fcG9zaXRpb24sIGl0ZXJhdG9yKF9fcSwgMCkpOworICAgICAgZmlsbF9uKF9faSwgX19uLCBfX3gpOworICAgICAgdGhpcy0+X01fZmluaXNoID0gY29weShfX3Bvc2l0aW9uLCBlbmQoKSwgX19pICsgZGlmZmVyZW5jZV90eXBlKF9fbikpOworICAgICAgdGhpcy0+X01fZGVhbGxvY2F0ZSgpOworICAgICAgdGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuX01fZGF0YSA9IF9fcSArIChfX2xlbiArIF9TVExQX1dPUkRfQklUIC0gMSkvX1NUTFBfV09SRF9CSVQ7CisgICAgICB0aGlzLT5fTV9zdGFydCA9IGl0ZXJhdG9yKF9fcSwgMCk7CisgICAgfQorICB9CisKKyAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgc2l6ZV90eXBlIF9fbiwgYm9vbCBfX3gpIHsKKyAgICBfTV9maWxsX2luc2VydChfX3Bvc2l0aW9uLCBfX24sIF9feCk7CisgIH0KKworICB2b2lkIHBvcF9iYWNrKCkgeworICAgIC0tdGhpcy0+X01fZmluaXNoOworICB9CisgIGl0ZXJhdG9yIGVyYXNlKGl0ZXJhdG9yIF9fcG9zaXRpb24pIHsKKyAgICBpZiAoX19wb3NpdGlvbiArIDEgIT0gZW5kKCkpCisgICAgICBjb3B5KF9fcG9zaXRpb24gKyAxLCBlbmQoKSwgX19wb3NpdGlvbik7CisgICAgICAtLXRoaXMtPl9NX2ZpbmlzaDsKKyAgICByZXR1cm4gX19wb3NpdGlvbjsKKyAgfQorICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpIHsKKyAgICB0aGlzLT5fTV9maW5pc2ggPSBjb3B5KF9fbGFzdCwgZW5kKCksIF9fZmlyc3QpOworICAgIHJldHVybiBfX2ZpcnN0OworICB9CisgIHZvaWQgcmVzaXplKHNpemVfdHlwZSBfX25ld19zaXplLCBib29sIF9feCA9IGJvb2woKSkgeworICAgIGlmIChfX25ld19zaXplIDwgc2l6ZSgpKQorICAgICAgZXJhc2UoYmVnaW4oKSArIGRpZmZlcmVuY2VfdHlwZShfX25ld19zaXplKSwgZW5kKCkpOworICAgIGVsc2UKKyAgICAgIGluc2VydChlbmQoKSwgX19uZXdfc2l6ZSAtIHNpemUoKSwgX194KTsKKyAgfQorICB2b2lkIGZsaXAoKSB7CisgICAgZm9yICh1bnNpZ25lZCBpbnQqIF9fcCA9IHRoaXMtPl9NX3N0YXJ0Ll9NX3A7IF9fcCAhPSB0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5fTV9kYXRhOyArK19fcCkKKyAgICAgICpfX3AgPSB+Kl9fcDsKKyAgfQorCisgIHZvaWQgY2xlYXIoKSB7IGVyYXNlKGJlZ2luKCksIGVuZCgpKTsgfQorfTsKKworI2lmIGRlZmluZWQgIChfU1RMUF9OT19CT09MKSB8fCBkZWZpbmVkIChfX0hQX2FDQykgLy8gZml4ZWQgc29vbiAoMDMvMTcvMjAwMCkKKyMgIGRlZmluZSBfU1RMUF9URU1QTEFURV9IRUFERVIgX19CVkVDX1RNUExfSEVBREVSCisjICBkZWZpbmUgX1NUTFBfVEVNUExBVEVfQ09OVEFJTkVSIF9fQlZFQ1RPUl9RVUFMSUZJRUQKKyMgIGluY2x1ZGUgPHN0bC9fcmVsb3BzX2NvbnQuaD4KKyMgIHVuZGVmIF9TVExQX1RFTVBMQVRFX0NPTlRBSU5FUgorIyAgdW5kZWYgX1NUTFBfVEVNUExBVEVfSEVBREVSCisjZW5kaWYgLyogTk9fQk9PTCAqLworCisjaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpICYmICFkZWZpbmVkIChfU1RMUF9OT19CT09MKQorX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisjZW5kaWYKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjdW5kZWYgdmVjdG9yCisjdW5kZWYgX0FsbG9jCisjdW5kZWYgX1NUTFBfVkVDQk9PTF9URU1QTEFURQorI3VuZGVmIF9fQlZFQ1RPUgorI3VuZGVmIF9fQlZFQ1RPUl9RVUFMSUZJRUQKKyN1bmRlZiBfX0JWRUNfVE1QTF9IRUFERVIKKworI3VuZGVmIF9TVExQX1dPUkRfQklUCisKKyNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9CVkVDVE9SX0ggKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9fY2FycmF5LmggYi9zdGwvX2NhcnJheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MGJhYjIKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvX2NhcnJheS5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUKKyAqIEZyYW5jb2lzIER1bW9udAorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisvKiBOT1RFOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBTVEwgaGVhZGVycy4KKyAqICAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuCisgKi8KKworI2lmbmRlZiBfU1RMUF9DQVJSQVlfSAorI2RlZmluZSBfU1RMUF9DQVJSQVlfSAorCisvKiBQdXJwb3NlOiBNaW1pYyBhIHB1ciBDIGFycmF5IHdpdGggdGhlIGFkZGl0aW9ubmFsIGZlYXR1cmUgb2YKKyAqIGJlaW5nIGFibGUgdG8gYmUgdXNlZCB3aXRoIHR5cGUgbm90IGRlZmF1bHQgY29uc3RydWN0aWJsZS4KKyAqLworCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NPTlNUUlVDVF9ICisjICBpbmNsdWRlIDxzdGwvX2NvbnN0cnVjdC5oPgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIHNpemVfdCBfTmI+CitzdHJ1Y3QgX0NBcnJheSB7CisgIF9DQXJyYXkgKGNvbnN0IF9UcCYgX192YWwpIHsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfTmI7ICsrX19pKSB7CisgICAgICBfQ29weV9Db25zdHJ1Y3QoX19SRUlOVEVSUFJFVF9DQVNUKF9UcCosIF9NX2RhdGEgKyBfX2kgKiBzaXplb2YoX1RwKSksIF9fdmFsKTsKKyAgICB9CisgIH0KKworICB+X0NBcnJheSgpIHsKKyAgICBfRGVzdHJveV9SYW5nZShfX1JFSU5URVJQUkVUX0NBU1QoX1RwKiwgX01fZGF0YSArIDApLAorICAgICAgICAgICAgICAgICAgIF9fUkVJTlRFUlBSRVRfQ0FTVChfVHAqLCBfTV9kYXRhICsgX05iICogc2l6ZW9mKF9UcCkpKTsKKyAgfQorCisgIF9UcCYgb3BlcmF0b3IgW10gKHNpemVfdCBfX2kpIHsKKyAgICBfU1RMUF9BU1NFUlQoX19pIDwgX05iKQorICAgIHJldHVybiAqX19SRUlOVEVSUFJFVF9DQVNUKF9UcCosIF9NX2RhdGEgKyBfX2kgKiBzaXplb2YoX1RwKSk7CisgIH0KKworcHJpdmF0ZToKKyAgY2hhciBfTV9kYXRhW3NpemVvZihfVHApICogX05iXTsKK307CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNlbmRpZiAvL19TVExQX0NBUlJBWV9ICmRpZmYgLS1naXQgYS9zdGwvX2NjdHlwZS5oIGIvc3RsL19jY3R5cGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzVjOTM2Ci0tLSAvZGV2L251bGwKKysrIGIvc3RsL19jY3R5cGUuaApAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DQ1RZUEUKKyNkZWZpbmUgX1NUTFBfSU5URVJOQUxfQ0NUWVBFCisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfTkVXX0NfSEVBREVSUykKKyMgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9DX0hFQURFUihjY3R5cGUpCisjZWxzZQorIyAgaW5jbHVkZSA8Y3R5cGUuaD4KKyNlbmRpZiAvKiBfU1RMUF9VU0VfTkVXX0NfSEVBREVSUyAqLworCisjaWYgISBkZWZpbmVkIChfU1RMUF9OT19DU1REX0ZVTkNUSU9OX0lNUE9SVFMpCisjICBpZiBkZWZpbmVkICggX1NUTFBfSU1QT1JUX1ZFTkRPUl9DU1REICkKK19TVExQX0JFR0lOX05BTUVTUEFDRQordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmlzYWxudW07Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6aXNhbHBoYTsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjppc2NudHJsOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmlzZGlnaXQ7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6aXNncmFwaDsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjppc2xvd2VyOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmlzcHJpbnQ7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6aXNwdW5jdDsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjppc3NwYWNlOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmlzdXBwZXI7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6aXN4ZGlnaXQ7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6dG9sb3dlcjsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjp0b3VwcGVyOworX1NUTFBfRU5EX05BTUVTUEFDRQorIyAgZW5kaWYgLyogX1NUTFBfSU1QT1JUX1ZFTkRPUl9DU1REKi8KKyNlbmRpZiAvKiBfU1RMUF9OT19DU1REX0ZVTkNUSU9OX0lNUE9SVFMgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zdGwvX2NoZWNrX2NvbmZpZy5oIGIvc3RsL19jaGVja19jb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGFiM2NhCi0tLSAvZGV2L251bGwKKysrIGIvc3RsL19jaGVja19jb25maWcuaApAQCAtMCwwICsxLDI0IEBACisvLyBUaGlzIGZpbGUgaXMgcmVzZXJ2ZWQgdG8gc2l0ZSBjb25maWd1cmF0aW9uIHB1cnBvc2UKKy8vIGFuZCBzaG91bGQgTkVWRVIgYmUgb3ZlcnJpZGRlbiBieSB1c2VyCisKKy8qCisgKiAgQ29uc2lzdGVuY3kgY2hlY2sgOiBpZiB3ZSB1c2UgU0dJIGlvc3RyZWFtcywgd2UgaGF2ZSB0byB1c2UgY29uc2lzdGVudAorICogIHRocmVhZCBtb2RlbCAoc2luZ2xlLXRocmVhZGVkIG9yIG11bHRpLXRocmVhZGVkKSB3aXRoIHRoZSBjb21waWxlZCBsaWJyYXJ5CisgKgorICogIERlZmF1bHQgaXMgbXVsdGl0aHJlYWRlZCBidWlsZC4gSWYgeW91IHdhbnQgdG8gYnVpbGQgYW5kIHVzZSBzaW5nbGUtdGhyZWFkZWQKKyAqICBTVExwb3J0LCBwbGVhc2UgY2hhbmdlIF9TVExQX05PVEhSRUFEUyBjb25maWd1cmF0aW9uIHNldHRpbmcgYWJvdmUgYW5kIHJlYnVpbGQgdGhlIGxpYnJhcnkKKyAqCisgKi8KKworIyBpZiAhZGVmaW5lZChfU1RMUF9VU0VfTk9fSU9TVFJFQU1TKSAmJiAhZGVmaW5lZChfU1RMUF9OT19USFJFQURTKSAmJiAhZGVmaW5lZChfUkVFTlRSQU5UKQorCisjICBpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAhZGVmaW5lZChfX01XRVJLU19fKSAmJiAhZGVmaW5lZCAoX19DT01PX18pICYmICFkZWZpbmVkKF9NVCkKKyMgICBlcnJvciAiT25seSBtdWx0aS10aHJlYWRlZCBydW50aW1lIGxpYnJhcnkgbWF5IGJlIGxpbmtlZCB3aXRoIFNUTHBvcnQhIgorIyAgZW5kaWYKKworLy8gYm9yaXMgOiB5b3UgbWF5IGNoYW5nZSB0aGF0IHRvIGJ1aWxkIG5vbi10aHJlYWRzYWZlIFNUTHBvcnQgbGlicmFyeQorIyAgaWYgZGVmaW5lZCAoX19CVUlMRElOR19TVExQT1JUKSAvKiB8fCBkZWZpbmVkIChfU1RMUF9ERUJVRykgKi8KKyMgICBkZWZpbmUgX1JFRU5UUkFOVCAxCisjICBlbmRpZgorCisjIGVuZGlmCmRpZmYgLS1naXQgYS9zdGwvX2Nsb2NhbGUuaCBiL3N0bC9fY2xvY2FsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlY2RlZTgKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvX2Nsb2NhbGUuaApAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DTE9DQUxFCisjZGVmaW5lIF9TVExQX0lOVEVSTkFMX0NMT0NBTEUKKworI2lmICFkZWZpbmVkIChfU1RMUF9XQ0VfRVZDMykKKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX05FV19DX0hFQURFUlMpCisjICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9DX0hFQURFUihjbG9jYWxlKQorIyAgZWxzZQorIyAgICBpbmNsdWRlIF9TVExQX05BVElWRV9DX0hFQURFUihsb2NhbGUuaCkKKyMgIGVuZGlmCisKKyMgIGlmIGRlZmluZWQgKF9TVExQX0lNUE9SVF9WRU5ET1JfQ1NURCkKK19TVExQX0JFR0lOX05BTUVTUEFDRQordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6Omxjb252OworIyAgICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fQ1NURF9GVU5DVElPTl9JTVBPUlRTKQordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmxvY2FsZWNvbnY7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6c2V0bG9jYWxlOworIyAgICBlbmRpZgorX1NUTFBfRU5EX05BTUVTUEFDRQorIyAgZW5kaWYKKworI2VuZGlmIC8qICFfU1RMUF9XQ0VfRVZDMyAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N0bC9fY21hdGguaCBiL3N0bC9fY21hdGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzE1ZjAwCi0tLSAvZGV2L251bGwKKysrIGIvc3RsL19jbWF0aC5oCkBAIC0wLDAgKzEsNTYwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DTUFUSAorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9DTUFUSAorCisvKiBnY2MgZG8gbm90IGxpa2Ugd2hlbiBhIHVzaW5nIGRpcmVjdGl2ZSBhcHBlYXIgYWZ0ZXIgYSBmdW5jdGlvbgorICogZGVjbGFyYXRpb24uIGNtYXRoIGhhdmUgYWJzIG92ZXJsb2FkcyBhbmQgY3N0ZGxpYiBhIHVzaW5nIGRpcmVjdGl2ZQorICogc28gY3N0ZGxpYiBoYXMgdG8gYmUgaW5jbHVkZWQgZmlyc3QuCisgKi8KKyNpZiBkZWZpbmVkIChfX0dOVUNfXykgJiYgZGVmaW5lZCAoX1NUTFBfVVNFX05FV19DX0hFQURFUlMpCisjICBpbmNsdWRlIF9TVExQX05BVElWRV9DUFBfQ19IRUFERVIoY3N0ZGxpYikKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX05FV19DX0hFQURFUlMpCisjICBpZiBkZWZpbmVkIChfU1RMUF9IQVNfTk9fTkFNRVNQQUNFUykgJiYgIWRlZmluZWQgKGV4Y2VwdGlvbikKKyMgICAgZGVmaW5lIGV4Y2VwdGlvbiBfX21hdGhfZXhjZXB0aW9uCisjICBlbmRpZgorIyAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ1BQX0NfSEVBREVSKGNtYXRoKQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfSEFTX05PX05BTUVTUEFDRVMpCisjICAgIHVuZGVmIGV4Y2VwdGlvbgorIyAgZW5kaWYKKyNlbHNlCisjICBpbmNsdWRlIDxtYXRoLmg+CisjZW5kaWYKKworI2lmIChkZWZpbmVkIChfX1NVTlBST19DQykgJiYgKF9fU1VOUFJPX0NDID4gMHg1MDApKSB8fCBcCisgICAgICEoZGVmaW5lZCAoX19JQk1DUFBfXykgJiYgKF9fSUJNQ1BQX18gPj0gNTAwKSB8fCAhKGRlZmluZWQoX19IUF9hQ0MpICYmIChfX0hQX2FDQyA+PSAzMDAwMCkgKSkKKyMgIGlmbmRlZiBfU1RMUF9IQVNfTk9fTkFNRVNQQUNFUworbmFtZXNwYWNlIHN0ZCB7CisjICBlbmRpZgorZXh0ZXJuICJDIiBkb3VibGUgaHlwb3QoZG91YmxlIHgsIGRvdWJsZSB5KTsKKyMgIGlmbmRlZiBfU1RMUF9IQVNfTk9fTkFNRVNQQUNFUworfQorIyAgZW5kaWYKKworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX3N1bikgJiYgZGVmaW5lZCAoX19HTlVDX18pCitleHRlcm4gIkMiIHsKKyAgZmxvYXQgX19jb3NmKGZsb2F0IHYpOworICBmbG9hdCBfX3NpbmYoZmxvYXQgdik7CisgIGZsb2F0IF9fYXRhbjJmKGZsb2F0LCBmbG9hdCk7CisgIGZsb2F0IF9fY29zaGYoZmxvYXQgdik7CisgIGZsb2F0IF9fc2luaGYoZmxvYXQgdik7CisgIGZsb2F0IF9fc3FydGYoZmxvYXQgdik7CisgIGZsb2F0IF9fZXhwZihmbG9hdCB2KTsKKyAgZmxvYXQgX19sb2dmKGZsb2F0IHYpOworICBmbG9hdCBfX2xvZzEwZihmbG9hdCB2KTsKKworICBsb25nIGRvdWJsZSBfX2Nvc2wobG9uZyBkb3VibGUgdik7CisgIGxvbmcgZG91YmxlIF9fc2lubChsb25nIGRvdWJsZSB2KTsKKyAgbG9uZyBkb3VibGUgX19hdGFuMmwobG9uZyBkb3VibGUsIGxvbmcgZG91YmxlKTsKKyAgbG9uZyBkb3VibGUgX19jb3NobChsb25nIGRvdWJsZSB2KTsKKyAgbG9uZyBkb3VibGUgX19zaW5obChsb25nIGRvdWJsZSB2KTsKKyAgbG9uZyBkb3VibGUgX19zcXJ0bChsb25nIGRvdWJsZSB2KTsKKyAgbG9uZyBkb3VibGUgX19leHBsKGxvbmcgZG91YmxlIHYpOworICBsb25nIGRvdWJsZSBfX2xvZ2wobG9uZyBkb3VibGUgdik7CisgIGxvbmcgZG91YmxlIF9fbG9nMTBsKGxvbmcgZG91YmxlIHYpOworfQorCitleHRlcm4gIkMiIHsKKyAgaW5saW5lIGZsb2F0IGNvc2YoZmxvYXQgdikgeyByZXR1cm4gX19jb3NmKHYpOyB9CisgIGlubGluZSBmbG9hdCBzaW5mKGZsb2F0IHYpIHsgcmV0dXJuIF9fc2luZih2KTsgfQorICBpbmxpbmUgZmxvYXQgYXRhbjJmKGZsb2F0IHYxLCBmbG9hdCB2MikgeyByZXR1cm4gX19hdGFuMmYodjEsdjIpOyB9CisgIGlubGluZSBmbG9hdCBjb3NoZihmbG9hdCB2KSB7IHJldHVybiBfX2Nvc2hmKHYpOyB9CisgIGlubGluZSBmbG9hdCBzaW5oZihmbG9hdCB2KSB7IHJldHVybiBfX3NpbmhmKHYpOyB9CisgIGlubGluZSBmbG9hdCBzcXJ0ZihmbG9hdCB2KSB7IHJldHVybiBfX3NxcnRmKHYpOyB9CisgIGlubGluZSBmbG9hdCBleHBmKGZsb2F0IHYpIHsgcmV0dXJuIF9fZXhwZih2KTsgfQorICBpbmxpbmUgZmxvYXQgbG9nZihmbG9hdCB2KSB7IHJldHVybiBfX2xvZ2Yodik7IH0KKyAgaW5saW5lIGZsb2F0IGxvZzEwZihmbG9hdCB2KSB7IHJldHVybiBfX2xvZzEwZih2KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZSBjb3NsKGxvbmcgZG91YmxlIHYpIHsgcmV0dXJuIF9fY29zbCh2KTsgfQorICBpbmxpbmUgbG9uZyBkb3VibGUgc2lubChsb25nIGRvdWJsZSB2KSB7IHJldHVybiBfX3Npbmwodik7IH0KKyAgaW5saW5lIGxvbmcgZG91YmxlIGF0YW4ybChsb25nIGRvdWJsZSB2MSwgbG9uZyBkb3VibGUgdjIpIHsgcmV0dXJuIF9fYXRhbjJsKHYxLHYyKTsgfQorICBpbmxpbmUgbG9uZyBkb3VibGUgY29zaGwobG9uZyBkb3VibGUgdikgeyByZXR1cm4gX19jb3NobCh2KTsgfQorICBpbmxpbmUgbG9uZyBkb3VibGUgc2luaGwobG9uZyBkb3VibGUgdikgeyByZXR1cm4gX19zaW5obCh2KTsgfQorICBpbmxpbmUgbG9uZyBkb3VibGUgc3FydGwobG9uZyBkb3VibGUgdikgeyByZXR1cm4gX19zcXJ0bCh2KTsgfQorICBpbmxpbmUgbG9uZyBkb3VibGUgZXhwbChsb25nIGRvdWJsZSB2KSB7IHJldHVybiBfX2V4cGwodik7IH0KKyAgaW5saW5lIGxvbmcgZG91YmxlIGxvZ2wobG9uZyBkb3VibGUgdikgeyByZXR1cm4gX19sb2dsKHYpOyB9CisgIGlubGluZSBsb25nIGRvdWJsZSBsb2cxMGwobG9uZyBkb3VibGUgdikgeyByZXR1cm4gX19sb2cxMGwodik7IH0KK30KKyNlbmRpZiAvLyBfX3N1biAmJiBfX0dOVUNfXworCisjaWYgZGVmaW5lZCAoX19zdW4pCitleHRlcm4gIkMiIHsKK2V4dGVybiBmbG9hdCBfX2Fjb3NmKGZsb2F0KTsKK2V4dGVybiBmbG9hdCBfX2FzaW5mKGZsb2F0KTsKK2V4dGVybiBmbG9hdCBfX2F0YW5mKGZsb2F0KTsKK2V4dGVybiBmbG9hdCBfX2F0YW4yZihmbG9hdCwgZmxvYXQpOworZXh0ZXJuIGZsb2F0IF9fY2VpbGYoZmxvYXQpOworZXh0ZXJuIGZsb2F0IF9fY29zZihmbG9hdCk7CitleHRlcm4gZmxvYXQgX19jb3NoZihmbG9hdCk7CitleHRlcm4gZmxvYXQgX19leHBmKGZsb2F0KTsKK2V4dGVybiBmbG9hdCBfX2ZhYnNmKGZsb2F0KTsKK2V4dGVybiBmbG9hdCBfX2Zsb29yZihmbG9hdCk7CitleHRlcm4gZmxvYXQgX19mbW9kZihmbG9hdCwgZmxvYXQpOworZXh0ZXJuIGZsb2F0IF9fZnJleHBmKGZsb2F0LCBpbnQgKik7CitleHRlcm4gZmxvYXQgX19sZGV4cGYoZmxvYXQsIGludCk7CitleHRlcm4gZmxvYXQgX19sb2dmKGZsb2F0KTsKK2V4dGVybiBmbG9hdCBfX2xvZzEwZihmbG9hdCk7CitleHRlcm4gZmxvYXQgX19tb2RmZihmbG9hdCwgZmxvYXQgKik7CitleHRlcm4gZmxvYXQgX19wb3dmKGZsb2F0LCBmbG9hdCk7CitleHRlcm4gZmxvYXQgX19zaW5mKGZsb2F0KTsKK2V4dGVybiBmbG9hdCBfX3NpbmhmKGZsb2F0KTsKK2V4dGVybiBmbG9hdCBfX3NxcnRmKGZsb2F0KTsKK2V4dGVybiBmbG9hdCBfX3RhbmYoZmxvYXQpOworZXh0ZXJuIGZsb2F0IF9fdGFuaGYoZmxvYXQpOworCitleHRlcm4gbG9uZyBkb3VibGUgX19hY29zbChsb25nIGRvdWJsZSk7CitleHRlcm4gbG9uZyBkb3VibGUgX19hc2lubChsb25nIGRvdWJsZSk7CitleHRlcm4gbG9uZyBkb3VibGUgX19hdGFubChsb25nIGRvdWJsZSk7CitleHRlcm4gbG9uZyBkb3VibGUgX19hdGFuMmwobG9uZyBkb3VibGUsIGxvbmcgZG91YmxlKTsKK2V4dGVybiBsb25nIGRvdWJsZSBfX2NlaWxsKGxvbmcgZG91YmxlKTsKK2V4dGVybiBsb25nIGRvdWJsZSBfX2Nvc2wobG9uZyBkb3VibGUpOworZXh0ZXJuIGxvbmcgZG91YmxlIF9fY29zaGwobG9uZyBkb3VibGUpOworZXh0ZXJuIGxvbmcgZG91YmxlIF9fZXhwbChsb25nIGRvdWJsZSk7CitleHRlcm4gbG9uZyBkb3VibGUgX19mYWJzbChsb25nIGRvdWJsZSk7CitleHRlcm4gbG9uZyBkb3VibGUgX19mbG9vcmwobG9uZyBkb3VibGUpOworZXh0ZXJuIGxvbmcgZG91YmxlIF9fZm1vZGwobG9uZyBkb3VibGUsIGxvbmcgZG91YmxlKTsKK2V4dGVybiBsb25nIGRvdWJsZSBfX2ZyZXhwbChsb25nIGRvdWJsZSwgaW50ICopOworZXh0ZXJuIGxvbmcgZG91YmxlIF9fbGRleHBsKGxvbmcgZG91YmxlLCBpbnQpOworZXh0ZXJuIGxvbmcgZG91YmxlIF9fbG9nbChsb25nIGRvdWJsZSk7CitleHRlcm4gbG9uZyBkb3VibGUgX19sb2cxMGwobG9uZyBkb3VibGUpOworZXh0ZXJuIGxvbmcgZG91YmxlIF9fbW9kZmwobG9uZyBkb3VibGUsIGxvbmcgZG91YmxlICopOworZXh0ZXJuIGxvbmcgZG91YmxlIF9fcG93bChsb25nIGRvdWJsZSwgbG9uZyBkb3VibGUpOworZXh0ZXJuIGxvbmcgZG91YmxlIF9fc2lubChsb25nIGRvdWJsZSk7CitleHRlcm4gbG9uZyBkb3VibGUgX19zaW5obChsb25nIGRvdWJsZSk7CitleHRlcm4gbG9uZyBkb3VibGUgX19zcXJ0bChsb25nIGRvdWJsZSk7CitleHRlcm4gbG9uZyBkb3VibGUgX190YW5sKGxvbmcgZG91YmxlKTsKK2V4dGVybiBsb25nIGRvdWJsZSBfX3RhbmhsKGxvbmcgZG91YmxlKTsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKQorIyAgZGVmaW5lIF9TVExQX0NNQVRIX0ZVTkNfTkFNRVNQQUNFIF9TVExQX1ZFTkRPUl9DU1RECisjZWxzZQorIyAgZGVmaW5lIF9TVExQX0NNQVRIX0ZVTkNfTkFNRVNQQUNFCisjZW5kaWYKKworI2lmICFkZWZpbmVkIChfX3N1bikgfHwgZGVmaW5lZCAoX19HTlVDX18pCisjICBkZWZpbmUgX1NUTFBfTUFUSF9JTkxJTkUoZmxvYXRfdHlwZSwgZnVuYywgY2Z1bmMpIFwKKyAgICAgaW5saW5lIGZsb2F0X3R5cGUgZnVuYyAoZmxvYXRfdHlwZSB4KSB7IHJldHVybiBfU1RMUF9DTUFUSF9GVU5DX05BTUVTUEFDRTo6Y2Z1bmMoeCk7IH0KKyMgIGRlZmluZSBfU1RMUF9NQVRIX0lOTElORTIoZmxvYXRfdHlwZSwgdHlwZSwgZnVuYywgY2Z1bmMpIFwKKyAgICAgaW5saW5lIGZsb2F0X3R5cGUgZnVuYyAoZmxvYXRfdHlwZSB4LCB0eXBlIHkpIHsgcmV0dXJuIF9TVExQX0NNQVRIX0ZVTkNfTkFNRVNQQUNFOjpjZnVuYyh4LCB5KTsgfQorIyAgZGVmaW5lIF9TVExQX01BVEhfSU5MSU5FX0QoZmxvYXRfdHlwZSwgZnVuYywgY2Z1bmMpCisjICBkZWZpbmUgX1NUTFBfTUFUSF9JTkxJTkUyX0QoZmxvYXRfdHlwZSwgdHlwZSwgZnVuYywgY2Z1bmMpCisjZWxzZQorIyAgaWZkZWYgX19TVU5QUk9fQ0MKKyMgICAgZGVmaW5lIF9TVExQX01BVEhfSU5MSU5FKGZsb2F0X3R5cGUsIGZ1bmMsIGNmdW5jKSBcCisgICAgICAgaW5saW5lIGZsb2F0X3R5cGUgZnVuYyAoZmxvYXRfdHlwZSB4KSB7IHJldHVybiBfU1RMUF9WRU5ET1JfQ1NURDo6X18jI2NmdW5jKHgpOyB9CisjICAgIGRlZmluZSBfU1RMUF9NQVRIX0lOTElORV9EKGZsb2F0X3R5cGUsIGZ1bmMsIGNmdW5jKSBcCisgICAgICAgaW5saW5lIGZsb2F0X3R5cGUgZnVuYyAoZmxvYXRfdHlwZSB4KSB7IHJldHVybiBfU1RMUF9WRU5ET1JfQ1NURDo6Y2Z1bmMoeCk7IH0KKyMgICAgZGVmaW5lIF9TVExQX01BVEhfSU5MSU5FMihmbG9hdF90eXBlLCB0eXBlLCBmdW5jLCBjZnVuYykgXAorICAgICAgIGlubGluZSBmbG9hdF90eXBlIGZ1bmMgKGZsb2F0X3R5cGUgeCwgdHlwZSB5KSB7IHJldHVybiBfU1RMUF9WRU5ET1JfQ1NURDo6X18jI2NmdW5jKHgseSk7IH0KKyMgICAgZGVmaW5lIF9TVExQX01BVEhfSU5MSU5FMl9EKGZsb2F0X3R5cGUsIHR5cGUsIGZ1bmMsIGNmdW5jKSBcCisgICAgICAgaW5saW5lIGZsb2F0X3R5cGUgZnVuYyAoZmxvYXRfdHlwZSB4LCB0eXBlIHkpIHsgcmV0dXJuIF9TVExQX1ZFTkRPUl9DU1REOjpjZnVuYyh4LHkpOyB9CisjICBlbHNlCisjICAgIGVycm9yIFVua25vd24gY29tcGlsZXIgZm9yIHRoZSBTdW4gcGxhdGZvcm0KKyMgIGVuZGlmCisjZW5kaWYKKworLyoqIG1hY3JvcyB0byBkZWZpbmUgbWF0aCBmdW5jdGlvbnMKK1RoZXNlIG1hY3JvcyAoaGF2aW5nIGFuIFggc29tZXdoZXJlIGluIHRoZSBuYW1lKSBmb3J3YXJkIHRvIHRoZSBDIGxpYnJhcnkncworZG91YmxlIGZ1bmN0aW9ucyBidXQgY2FzdCB0aGUgYXJndW1lbnRzIGFuZCByZXR1cm4gdmFsdWVzIHRvIHRoZSBnaXZlbiB0eXBlLiAqLworCisjZGVmaW5lIF9TVExQX01BVEhfSU5MSU5FWChfX3R5cGUsZnVuYyxjZnVuYykgXAorICBpbmxpbmUgX190eXBlIGZ1bmMgKF9fdHlwZSB4KSBcCisgIHsgcmV0dXJuIF9fU1RBVElDX0NBU1QoX190eXBlLCBfU1RMUF9DTUFUSF9GVU5DX05BTUVTUEFDRTo6Y2Z1bmMoKGRvdWJsZSl4KSk7IH0KKyNkZWZpbmUgX1NUTFBfTUFUSF9JTkxJTkUyWChfX3R5cGUxLF9fdHlwZTIsZnVuYyxjZnVuYykgXAorICBpbmxpbmUgX190eXBlMSBmdW5jIChfX3R5cGUxIHgsIF9fdHlwZTIgeSkgXAorICB7IHJldHVybiBfX1NUQVRJQ19DQVNUKF9fdHlwZTEsIF9TVExQX0NNQVRIX0ZVTkNfTkFNRVNQQUNFOjpjZnVuYygoZG91YmxlKXgsIHkpKTsgfQorI2RlZmluZSBfU1RMUF9NQVRIX0lOTElORTJQWChfX3R5cGUsZnVuYyxjZnVuYykgXAorICBpbmxpbmUgX190eXBlIGZ1bmMgKF9fdHlwZSB4LCBfX3R5cGUgKnkpIHsgXAorICAgIGRvdWJsZSB0bXAxLCB0bXAyOyBcCisgICAgdG1wMSA9IF9TVExQX0NNQVRIX0ZVTkNfTkFNRVNQQUNFOjpjZnVuYyhfX1NUQVRJQ19DQVNUKGRvdWJsZSwgeCksICZ0bXAyKTsgXAorICAgICp5ID0gX19TVEFUSUNfQ0FTVChfX3R5cGUsIHRtcDIpOyBcCisgICAgcmV0dXJuIF9fU1RBVElDX0NBU1QoX190eXBlLCB0bXAxKTsgXAorICB9CisjZGVmaW5lIF9TVExQX01BVEhfSU5MSU5FMlhYKF9fdHlwZSxmdW5jLGNmdW5jKSBcCisgIGlubGluZSBfX3R5cGUgZnVuYyAoX190eXBlIHgsIF9fdHlwZSB5KSBcCisgIHsgcmV0dXJuIF9fU1RBVElDX0NBU1QoX190eXBlLCBfU1RMUF9DTUFUSF9GVU5DX05BTUVTUEFDRTo6Y2Z1bmMoKGRvdWJsZSl4LCAoZG91YmxlKXkpKTsgfQorCisKKy8qKiByb3VnaCBjaGFyYWN0ZXJpemF0aW9uIG9mIGNvbXBpbGVyIGFuZCBuYXRpdmUgQyBsaWJyYXJ5CitGb3IgdGhlIGNvbXBpbGVyLCBpdCBjYW4gZWl0aGVyIHN1cHBvcnQgbG9uZyBkb3VibGUgb3Igbm90LiBJZiBpdCBkb2Vzbid0LCB0aGUKK21hY3JvIF9TVExQX05PX0xPTkdfRE9VQkxFIGlzIG5vdCBkZWZpbmVkIGFuZCB3ZSBkb24ndCBkZWZpbmUgYW55IGxvbmcgZG91YmxlCitvdmVybG9hZHMuCitGb3IgdGhlIG5hdGl2ZSBDIGxpYnJhcnkgdGhlIHF1ZXN0aW9uIGlzIHdoZXRoZXIgaXQgaGFzIHZhcmlhbnRzIHdpdGggYW4gJ2YnCitzdWZmaXggKGZvciBmbG9hdCBhcyBvcHBvc2VkIHRvIGRvdWJsZSkgb3IgYW4gJ2wnIHN1ZmZpeCAoZm9yIGxvbmcgZG91YmxlKS4gSWYKK3RoZSBmbG9hdCB2YXJpYW50cyBhcmUgbWlzc2luZywgX1NUTFBfTk9fVkVORE9SX01BVEhfRiBpcyBkZWZpbmVkLCB3aGVuIHRoZQorbG9uZyBkb3VibGUgdmFyaWFudHMgYXJlIG1pc3NpbmcsIF9TVExQX05PX1ZFTkRPUl9NQVRIX0wgaXMgZGVmaW5lZC4gT2YgY291cnNlCit0aGUgbGF0dGVyIGRvZXNuJ3QgbWFrZSBzZW5zZSBhbnl3YXkgd2hlbiB0aGUgY29tcGlsZXIgYWxyZWFkeSBoYXMgbm8gbG9uZworZG91YmxlIHN1cHBvcnQuCisKK1Rob3NlIHR3byB0cmFpdHMgZGV0ZXJtaW5lIGEpIHdoaWNoIG92ZXJsb2FkcyBnZXQgZGVmaW5lZCBhbmQgYikgaG93IHRoZXkgYXJlCitkZWZpbmVkLgorCitNZWFuaW5nIG9mIHN1ZmZpeGVzOgorIiIgICA6IGZ1bmN0aW9uIHJldHVybmluZyBhbmQgdGFraW5nIGEgZmxvYXRfdHlwZQorIjIiICA6IGZ1bmN0aW9uIHJldHVybmluZyBhIGZsb2F0X3R5cGUgYW5kIHRha2luZyB0byBmbG9hdF90eXBlcworIjJQIiA6IGZ1bmN0aW9uIHJldHVybmluZyBhIGZsb2F0X3R5cGUgYW5kIHRha2luZyBhIGZsb2F0X3R5cGUgYW5kIGEgZmxvYXRfdHlwZSoKKyIyUEkiOiBmdW5jdGlvbiByZXR1cm5pbmcgYSBmbG9hdF90eXBlIGFuZCB0YWtpbmcgYSBmbG9hdF90eXBlIGFuZCBhbiBpbnQqCisiMkkiIDogZnVuY3Rpb24gcmV0dXJuaW5nIGEgZmxvYXRfdHlwZSBhbmQgdGFraW5nIGEgZmxvYXRfVHlwZSBhbmQgYW4gaW50CisqLworCisjaWYgIWRlZmluZWQgKF9TVExQX05PX0xPTkdfRE9VQkxFKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fVkVORE9SX01BVEhfTCkgJiYgIWRlZmluZWQgKF9TVExQX05PX1ZFTkRPUl9NQVRIX0YpCisgICAvLyBsb25nIGRvdWJsZSBzdXBwb3J0IGFuZCBib3RoIGUuZy4gc2lubChsb25nIGRvdWJsZSkgYW5kIHNpbmYoZmxvYXQpCisgICAvLyBUaGlzIGlzIHRoZSBkZWZhdWx0IGZvciBhIGNvcnJlY3QgYW5kIGNvbXBsZXRlIG5hdGl2ZSBsaWJyYXJ5LgorIyAgZGVmaW5lIF9TVExQX0RFRl9NQVRIX0lOTElORShmdW5jLGNmKSBcCisgIF9TVExQX01BVEhfSU5MSU5FKGZsb2F0LGZ1bmMsY2YjI2YpIFwKKyAgX1NUTFBfTUFUSF9JTkxJTkVfRChkb3VibGUsZnVuYyxjZikgXAorICBfU1RMUF9NQVRIX0lOTElORShsb25nIGRvdWJsZSxmdW5jLGNmIyNsKQorIyAgZGVmaW5lIF9TVExQX0RFRl9NQVRIX0lOTElORTIoZnVuYyxjZikgXAorICBfU1RMUF9NQVRIX0lOTElORTIoZmxvYXQsZmxvYXQsZnVuYyxjZiMjZikgXAorICBfU1RMUF9NQVRIX0lOTElORTJfRChkb3VibGUsZG91YmxlLGZ1bmMsY2YpIFwKKyAgX1NUTFBfTUFUSF9JTkxJTkUyKGxvbmcgZG91YmxlLGxvbmcgZG91YmxlLGZ1bmMsY2YjI2wpCisjICBkZWZpbmUgX1NUTFBfREVGX01BVEhfSU5MSU5FMlAoZnVuYyxjZikgXAorICBfU1RMUF9NQVRIX0lOTElORTIoZmxvYXQsZmxvYXQgKixmdW5jLGNmIyNmKSBcCisgIF9TVExQX01BVEhfSU5MSU5FMl9EKGRvdWJsZSxkb3VibGUgKixmdW5jLGNmKSBcCisgIF9TVExQX01BVEhfSU5MSU5FMihsb25nIGRvdWJsZSxsb25nIGRvdWJsZSAqLGZ1bmMsY2YjI2wpCisjICBkZWZpbmUgX1NUTFBfREVGX01BVEhfSU5MSU5FMlBJKGZ1bmMsY2YpIFwKKyAgX1NUTFBfTUFUSF9JTkxJTkUyKGZsb2F0LGludCAqLGZ1bmMsY2YjI2YpIFwKKyAgX1NUTFBfTUFUSF9JTkxJTkUyX0QoZG91YmxlLGludCAqLGZ1bmMsY2YpIFwKKyAgX1NUTFBfTUFUSF9JTkxJTkUyKGxvbmcgZG91YmxlLGludCAqLGZ1bmMsY2YjI2wpCisjICBkZWZpbmUgX1NUTFBfREVGX01BVEhfSU5MSU5FMkkoZnVuYyxjZikgXAorICBfU1RMUF9NQVRIX0lOTElORTIoZmxvYXQsaW50LGZ1bmMsY2YjI2YpIFwKKyAgX1NUTFBfTUFUSF9JTkxJTkUyX0QoZG91YmxlLGludCxmdW5jLGNmKSBcCisgIF9TVExQX01BVEhfSU5MSU5FMihsb25nIGRvdWJsZSxpbnQsZnVuYyxjZiMjbCkKKyNlbHNlCisjICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTE9OR19ET1VCTEUpCisjICAgIGlmICFkZWZpbmVkIChfU1RMUF9OT19WRU5ET1JfTUFUSF9GKQorICAgICAgIC8vIGxvbmcgZG91YmxlIHN1cHBvcnQgYW5kIGUuZy4gc2luZihmbG9hdCkgYnV0IG5vdCBlLmcuIHNpbmwobG9uZyBkb3VibGUpCisjICAgICAgZGVmaW5lIF9TVExQX0RFRl9NQVRIX0lOTElORShmdW5jLGNmKSBcCisgICAgICBfU1RMUF9NQVRIX0lOTElORShmbG9hdCxmdW5jLGNmIyNmKSBcCisgICAgICBfU1RMUF9NQVRIX0lOTElORVgobG9uZyBkb3VibGUsZnVuYyxjZikKKyMgICAgICBkZWZpbmUgX1NUTFBfREVGX01BVEhfSU5MSU5FMihmdW5jLGNmKSBcCisgICAgICBfU1RMUF9NQVRIX0lOTElORTIoZmxvYXQsZmxvYXQsZnVuYyxjZiMjZikgXAorICAgICAgX1NUTFBfTUFUSF9JTkxJTkUyWFgobG9uZyBkb3VibGUsZnVuYyxjZikKKyMgICAgICBkZWZpbmUgX1NUTFBfREVGX01BVEhfSU5MSU5FMlAoZnVuYyxjZikgXAorICAgICAgX1NUTFBfTUFUSF9JTkxJTkUyKGZsb2F0LGZsb2F0ICosZnVuYyxjZiMjZikgXAorICAgICAgX1NUTFBfTUFUSF9JTkxJTkUyUFgobG9uZyBkb3VibGUsZnVuYyxjZikKKyMgICAgICBkZWZpbmUgX1NUTFBfREVGX01BVEhfSU5MSU5FMlBJKGZ1bmMsY2YpIFwKKyAgICAgIF9TVExQX01BVEhfSU5MSU5FMihmbG9hdCxpbnQgKixmdW5jLGNmIyNmKSBcCisgICAgICBfU1RMUF9NQVRIX0lOTElORTJYKGxvbmcgZG91YmxlLGludCAqLGZ1bmMsY2YpCisjICAgICAgZGVmaW5lIF9TVExQX0RFRl9NQVRIX0lOTElORTJJKGZ1bmMsY2YpIFwKKyAgICAgIF9TVExQX01BVEhfSU5MSU5FMihmbG9hdCxpbnQsZnVuYyxjZiMjZikgXAorICAgICAgX1NUTFBfTUFUSF9JTkxJTkUyWChsb25nIGRvdWJsZSxpbnQsZnVuYyxjZikKKyMgICAgZWxpZiAhZGVmaW5lZCAoX1NUTFBfTk9fVkVORE9SX01BVEhfTCkKKyAgICAgICAvLyBsb25nIGRvdWJsZSBzdXBwb3J0IGFuZCBlLmcuIHNpbmwobG9uZyBkb3VibGUpIGJ1dCBub3QgZS5nLiBzaW5mKGZsb2F0KQorIyAgICAgIGRlZmluZSBfU1RMUF9ERUZfTUFUSF9JTkxJTkUoZnVuYyxjZikgXAorICAgICAgX1NUTFBfTUFUSF9JTkxJTkVYKGZsb2F0LGZ1bmMsY2YpIFwKKyAgICAgIF9TVExQX01BVEhfSU5MSU5FKGxvbmcgZG91YmxlLGZ1bmMsY2YjI2wpCisjICAgICAgZGVmaW5lIF9TVExQX0RFRl9NQVRIX0lOTElORTIoZnVuYyxjZikgXAorICAgICAgX1NUTFBfTUFUSF9JTkxJTkUyWFgoZmxvYXQsZnVuYyxjZikgXAorICAgICAgX1NUTFBfTUFUSF9JTkxJTkUyKGxvbmcgZG91YmxlLGxvbmcgZG91YmxlLGZ1bmMsY2YjI2wpCisjICAgICAgZGVmaW5lIF9TVExQX0RFRl9NQVRIX0lOTElORTJQKGZ1bmMsY2YpIFwKKyAgICAgIF9TVExQX01BVEhfSU5MSU5FMlBYKGZsb2F0LGZ1bmMsY2YpIFwKKyAgICAgIF9TVExQX01BVEhfSU5MSU5FMihsb25nIGRvdWJsZSxsb25nIGRvdWJsZSAqLGZ1bmMsY2YjI2wpCisjICAgICAgZGVmaW5lIF9TVExQX0RFRl9NQVRIX0lOTElORTJQSShmdW5jLGNmKSBcCisgICAgICBfU1RMUF9NQVRIX0lOTElORTJYKGZsb2F0LGludCAqLGZ1bmMsY2YpIFwKKyAgICAgIF9TVExQX01BVEhfSU5MSU5FMihsb25nIGRvdWJsZSxpbnQgKixmdW5jLGNmIyNsKQorIyAgICAgIGRlZmluZSBfU1RMUF9ERUZfTUFUSF9JTkxJTkUySShmdW5jLGNmKSBcCisgICAgICBfU1RMUF9NQVRIX0lOTElORTJYKGZsb2F0LGludCxmdW5jLGNmKSBcCisgICAgICBfU1RMUF9NQVRIX0lOTElORTIobG9uZyBkb3VibGUsaW50LGZ1bmMsY2YjI2wpCisjICAgIGVsc2UKKyMgICAgICBkZWZpbmUgX1NUTFBfREVGX01BVEhfSU5MSU5FKGZ1bmMsY2YpIFwKKyAgICAgIF9TVExQX01BVEhfSU5MSU5FWChmbG9hdCxmdW5jLGNmKSBcCisgICAgICBfU1RMUF9NQVRIX0lOTElORVgobG9uZyBkb3VibGUsZnVuYyxjZikKKyMgICAgICBkZWZpbmUgX1NUTFBfREVGX01BVEhfSU5MSU5FMihmdW5jLGNmKSBcCisgICAgICBfU1RMUF9NQVRIX0lOTElORTJYWChmbG9hdCxmdW5jLGNmKSBcCisgICAgICBfU1RMUF9NQVRIX0lOTElORTJYWChsb25nIGRvdWJsZSxmdW5jLGNmKQorIyAgICAgIGRlZmluZSBfU1RMUF9ERUZfTUFUSF9JTkxJTkUyUChmdW5jLGNmKSBcCisgICAgICBfU1RMUF9NQVRIX0lOTElORTJQWChmbG9hdCxmdW5jLGNmKSBcCisgICAgICBfU1RMUF9NQVRIX0lOTElORTJQWChsb25nIGRvdWJsZSxmdW5jLGNmKQorIyAgICAgIGRlZmluZSBfU1RMUF9ERUZfTUFUSF9JTkxJTkUyUEkoZnVuYyxjZikgXAorICAgICAgX1NUTFBfTUFUSF9JTkxJTkUyWChmbG9hdCxpbnQgKixmdW5jLGNmKSBcCisgICAgICBfU1RMUF9NQVRIX0lOTElORTJYKGxvbmcgZG91YmxlLGludCAqLGZ1bmMsY2YpCisjICAgICAgZGVmaW5lIF9TVExQX0RFRl9NQVRIX0lOTElORTJJKGZ1bmMsY2YpIFwKKyAgICAgIF9TVExQX01BVEhfSU5MSU5FMlgoZmxvYXQsaW50LGZ1bmMsY2YpIFwKKyAgICAgIF9TVExQX01BVEhfSU5MSU5FMlgobG9uZyBkb3VibGUsaW50LGZ1bmMsY2YpCisjICAgIGVuZGlmCisjICBlbHNlCisjICAgIGlmICFkZWZpbmVkIChfU1RMUF9OT19WRU5ET1JfTUFUSF9GKQorIyAgICAgIGRlZmluZSBfU1RMUF9ERUZfTUFUSF9JTkxJTkUoZnVuYyxjZikgXAorICAgICAgX1NUTFBfTUFUSF9JTkxJTkUoZmxvYXQsZnVuYyxjZiMjZikKKyMgICAgICBkZWZpbmUgX1NUTFBfREVGX01BVEhfSU5MSU5FMihmdW5jLGNmKSBcCisgICAgICBfU1RMUF9NQVRIX0lOTElORTIoZmxvYXQsZmxvYXQsZnVuYyxjZiMjZikKKyMgICAgICBkZWZpbmUgX1NUTFBfREVGX01BVEhfSU5MSU5FMlAoZnVuYyxjZikgXAorICAgICAgX1NUTFBfTUFUSF9JTkxJTkUyKGZsb2F0LGZsb2F0ICosZnVuYyxjZiMjZikKKyMgICAgICBkZWZpbmUgX1NUTFBfREVGX01BVEhfSU5MSU5FMlBJKGZ1bmMsY2YpIFwKKyAgICAgIF9TVExQX01BVEhfSU5MSU5FMihmbG9hdCxpbnQgKixmdW5jLGNmIyNmKQorIyAgICAgIGRlZmluZSBfU1RMUF9ERUZfTUFUSF9JTkxJTkUySShmdW5jLGNmKSBcCisgICAgICBfU1RMUF9NQVRIX0lOTElORTIoZmxvYXQsaW50LGZ1bmMsY2YjI2YpCisjICAgIGVsc2UgLy8gX1NUTFBfTk9fVkVORE9SX01BVEhfRgorICAgICAgIC8vIG5laXRoZXIgbG9uZyBkb3VibGUgc3VwcG9ydCBub3IgZS5nLiBzaW5mKGZsb2F0KSBmdW5jdGlvbnMKKyMgICAgICBkZWZpbmUgX1NUTFBfREVGX01BVEhfSU5MSU5FKGZ1bmMsY2YpIFwKKyAgICAgIF9TVExQX01BVEhfSU5MSU5FWChmbG9hdCxmdW5jLGNmKQorIyAgICAgIGRlZmluZSBfU1RMUF9ERUZfTUFUSF9JTkxJTkUyKGZ1bmMsY2YpIFwKKyAgICAgIF9TVExQX01BVEhfSU5MSU5FMlhYKGZsb2F0LGZ1bmMsY2YpCisjICAgICAgZGVmaW5lIF9TVExQX0RFRl9NQVRIX0lOTElORTJQKGZ1bmMsY2YpIFwKKyAgICAgIF9TVExQX01BVEhfSU5MSU5FMlBYKGZsb2F0LGZ1bmMsY2YpCisjICAgICAgZGVmaW5lIF9TVExQX0RFRl9NQVRIX0lOTElORTJQSShmdW5jLGNmKSBcCisgICAgICBfU1RMUF9NQVRIX0lOTElORTJYKGZsb2F0LGludCAqLGZ1bmMsY2YpCisjICAgICAgZGVmaW5lIF9TVExQX0RFRl9NQVRIX0lOTElORTJJKGZ1bmMsY2YpIFwKKyAgICAgIF9TVExQX01BVEhfSU5MSU5FMlgoZmxvYXQsaW50LGZ1bmMsY2YpCisjICAgIGVuZGlmIC8vIF9TVExQX05PX1ZFTkRPUl9NQVRIX0YKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX1dDRSkgfHwgXAorICAgKGRlZmluZWQoX1NUTFBfTVNWQykgJiYgKF9TVExQX01TVkMgPD0gMTMwMCkgJiYgZGVmaW5lZCAoX01TQ19FWFRFTlNJT05TKSAvKiAmJiAhZGVmaW5lZChfU1RMUF9XQ0VfTkVUKSAqLykKKy8qCisgKiBkdW1zOiBWQzYgaGFzIGFsbCB0aGUgcmVxdWlyZWQgQysrIGZ1bmN0aW9ucyBidXQgb25seSBkZWZpbmUgdGhlbSBpZgorICogX01TQ19FWFRFTlNJT05TIGlzIG5vdCBkZWZpbmVkIChhIGJ1Zz8pLiBTVExwb3J0IGp1c3QgZG8gdGhlIHNhbWUKKyAqIHRoaW5nIGFsc28gd2hlbiBfTVNDX0VYVEVOU0lPTlMgaXMgZGVmaW5lZC4KKyAqIFRPRE86IGFib3ZlIGNoZWNrIChfU1RMUF9NU1ZDIDw9IDEzMDApIGFsc28gY2F0Y2hlcyBWQzcuMCwgaXMgdGhhdCBpbnRlbmRlZD8KKyAqLworLy9XZSBoYXZlIHRvIHRlbGwgdGhlIGNvbXBpbGVycyB0aGF0IGFicywgYWNvcyAuLi4gbWF0aCBmdW5jdGlvbnMgYXJlIG5vdCBpbnRyaW5zaWMKKy8vb3RoZXJ3aXNlIHdlIGhhdmUgSW50ZXJuYWwgQ29tcGlsZXIgRXJyb3IgaW4gcmVsZWFzZSBtb2RlLi4uCisjICBwcmFnbWEgd2FybmluZyhwdXNoKQorIyAgcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTogNDE2MikgLy8gbm8gZnVuY3Rpb24gd2l0aCBDIGxpbmthZ2UgZm91bmQKKyMgIHByYWdtYSB3YXJuaW5nKGRpc2FibGU6IDQxNjMpIC8vIG5vdCBhdmFpbGFibGUgYXMgYW4gaW50cmluc2ljIGZ1bmN0aW9uCisjICBwcmFnbWEgZnVuY3Rpb24gKGFicywgYWNvcywgYXNpbiwgYXRhbiwgYXRhbjIsIGNvcywgY29zaCwgZXhwLCBmYWJzLCBmbW9kLCBsb2csIGxvZzEwLCBzaW4sIHNpbmgsIHNxcnQsIHRhbiwgdGFuaCkKKyMgIGlmIGRlZmluZWQgKF9TVExQX1dDRSkKKyMgICAgcHJhZ21hIGZ1bmN0aW9uIChjZWlsLCBmbG9vcikKKyMgIGVuZGlmCisjICBkZWZpbmUgX1NUTFBfUkVTVE9SRV9GVU5DVElPTl9JTlRSSU5TSUMKKyNlbmRpZiAvLyBfU1RMUF9NU1ZDICYmIF9TVExQX01TVkMgPD0gMTMwMCAmJiAhX1NUTFBfV0NFICYmIF9NU0NfRVhURU5TSU9OUworCisjaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKSAmJiBkZWZpbmVkIChfU1RMUF9VU0VfTkVXX0NfSEVBREVSUykKKy8qIEluIHRoaXMgY29uZmlnIEJvcmxhbmQgbmF0aXZlIGxpYiBvbmx5IGRlZmluZSBmdW5jdGlvbnMgaW4gc3RkIG5hbWVzcGFjZS4KKyAqIEluIG9yZGVyIHRvIGhhdmUgYWxsIG92ZXJsb2FkcyBpbiBTVExwb3J0IG5hbWVzcGFjZSB3ZSBuZWVkIHRvIGFkZCB0aGUKKyAqIGRvdWJsZSBvdmVybG9hZCBpbiBnbG9iYWwgbmFtZXNwYWNlLiBXZSBkbyBub3QgdXNlIGEgdXNpbmcgc3RhdGVtZW50IHRvIGF2b2lkCisgKiBpbXBvcnQgb2YgaW52YWxpZCBvdmVybG9hZC4KKyAqLworIyAgZGVmaW5lIF9TVExQX0RNQVRIX0lOTElORShmdW5jKSBfU1RMUF9NQVRIX0lOTElORShkb3VibGUsIGZ1bmMsIGZ1bmMpCisjICBkZWZpbmUgX1NUTFBfRE1BVEhfSU5MSU5FMihmdW5jKSBfU1RMUF9NQVRIX0lOTElORTIoZG91YmxlLCBkb3VibGUsIGZ1bmMsIGZ1bmMpCisKK19TVExQX0RNQVRIX0lOTElORShhY29zKQorX1NUTFBfRE1BVEhfSU5MSU5FKGFzaW4pCitfU1RMUF9ETUFUSF9JTkxJTkUoYXRhbikKK19TVExQX0RNQVRIX0lOTElORTIoYXRhbjIpCitfU1RMUF9ETUFUSF9JTkxJTkUoY2VpbCkKK19TVExQX0RNQVRIX0lOTElORShjb3MpCitfU1RMUF9ETUFUSF9JTkxJTkUoY29zaCkKK19TVExQX0RNQVRIX0lOTElORShleHApCitfU1RMUF9ETUFUSF9JTkxJTkUoZmFicykKK19TVExQX0RNQVRIX0lOTElORShmbG9vcikKK19TVExQX0RNQVRIX0lOTElORTIoZm1vZCkKK19TVExQX01BVEhfSU5MSU5FMlgoZG91YmxlLCBpbnQqLCBmcmV4cCwgZnJleHApCitfU1RMUF9NQVRIX0lOTElORTJYKGRvdWJsZSwgaW50LCBsZGV4cCwgbGRleHApCitfU1RMUF9ETUFUSF9JTkxJTkUobG9nKQorX1NUTFBfRE1BVEhfSU5MSU5FKGxvZzEwKQorX1NUTFBfTUFUSF9JTkxJTkUyUFgoZG91YmxlLCBtb2RmLCBtb2RmKQorX1NUTFBfRE1BVEhfSU5MSU5FKHNpbikKK19TVExQX0RNQVRIX0lOTElORShzaW5oKQorX1NUTFBfRE1BVEhfSU5MSU5FKHNxcnQpCitfU1RMUF9ETUFUSF9JTkxJTkUodGFuKQorX1NUTFBfRE1BVEhfSU5MSU5FKHRhbmgpCitfU1RMUF9ETUFUSF9JTkxJTkUyKHBvdykKK19TVExQX0RNQVRIX0lOTElORTIoaHlwb3QpCisKKyMgIHVuZGVmIF9TVExQX0RNQVRIX0lOTElORQorIyAgdW5kZWYgX1NUTFBfRE1BVEhfSU5MSU5FMgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX0RNQ19fKQorIyAgaWYgZGVmaW5lZCAoZmFicykKK2lubGluZSBkb3VibGUgX19zdGxwX2ZhYnMoZG91YmxlIF9feCkgeyByZXR1cm4gZmFicyhfX3gpOyB9CisjICAgIHVuZGVmIGZhYnMKK2lubGluZSBkb3VibGUgZmFicyhkb3VibGUgX194KSB7IHJldHVybiBfX3N0bHBfZmFicyhfX3gpOyB9CisjICBlbmRpZgorIyAgaWYgZGVmaW5lZCAoY29zKQoraW5saW5lIGRvdWJsZSBfX3N0bHBfY29zKGRvdWJsZSBfX3gpIHsgcmV0dXJuIGNvcyhfX3gpOyB9CisjICAgIHVuZGVmIGNvcworaW5saW5lIGRvdWJsZSBjb3MoZG91YmxlIF9feCkgeyByZXR1cm4gX19zdGxwX2NvcyhfX3gpOyB9CisjICBlbmRpZgorIyAgaWYgZGVmaW5lZCAoc2luKQoraW5saW5lIGRvdWJsZSBfX3N0bHBfc2luKGRvdWJsZSBfX3gpIHsgcmV0dXJuIHNpbihfX3gpOyB9CisjICAgIHVuZGVmIHNpbgoraW5saW5lIGRvdWJsZSBzaW4oZG91YmxlIF9feCkgeyByZXR1cm4gX19zdGxwX3NpbihfX3gpOyB9CisjICBlbmRpZgorIyAgaWYgZGVmaW5lZCAoc3FydCkKK2lubGluZSBkb3VibGUgX19zdGxwX3NxcnQoZG91YmxlIF9feCkgeyByZXR1cm4gc3FydChfX3gpOyB9CisjICAgIHVuZGVmIHNxcnQKK2lubGluZSBkb3VibGUgc3FydChkb3VibGUgX194KSB7IHJldHVybiBfX3N0bHBfc3FydChfX3gpOyB9CisjICBlbmRpZgorIyAgaWYgZGVmaW5lZCAobGRleHApCitpbmxpbmUgZG91YmxlIF9fc3RscF9sZGV4cChkb3VibGUgX194LCBpbnQgX195KSB7IHJldHVybiBsZGV4cChfX3gsIF9feSk7IH0KKyMgICAgdW5kZWYgbGRleHAKK2lubGluZSBkb3VibGUgbGRleHAoZG91YmxlIF9feCwgaW50IF9feSkgeyByZXR1cm4gX19zdGxwX2xkZXhwKF9feCwgX195KTsgfQorIyAgZW5kaWYKKyNlbmRpZgorCisvKiBNU1ZDIG5hdGl2ZSBsaWIgc3RhcnRpbmcgd2l0aCAuTmV0IDIwMDMgaGFzIGFscmVhZHkgYWxsIG1hdGggZnVuY3Rpb25zCisgKiBpbiBnbG9iYWwgbmFtZXNwYWNlLgorICogSFAtVVggbmF0aXZlIGxpYiBoYXMgbWF0aCBmdW5jdGlvbnMgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuCisgKi8KKyNpZiAoIWRlZmluZWQgKF9TVExQX01TVkNfTElCKSB8fCAoX1NUTFBfTVNWQ19MSUIgPCAxMzEwKSB8fCBkZWZpbmVkKFVOREVSX0NFKSkgJiYgXAorICAgICghZGVmaW5lZCAoX19IUF9hQ0MpIHx8IChfX0hQX2FDQyA8IDMwMDAwKSkKK2lubGluZSBkb3VibGUgYWJzKGRvdWJsZSBfX3gpCit7IHJldHVybiA6OmZhYnMoX194KTsgfQorIyAgaWYgIWRlZmluZWQgKF9fTVZTX18pCitfU1RMUF9ERUZfTUFUSF9JTkxJTkUoYWJzLCBmYWJzKQorIyAgZWxzZSAvLyBfX01WU19fIGhhcyBuYXRpdmUgbG9uZyBkb3VibGUgYWJzPworaW5saW5lIGZsb2F0IGFicyhmbG9hdCBfX3gpIHsgcmV0dXJuIDo6ZmFic2YoX194KTsgfQorIyAgZW5kaWYKKworX1NUTFBfREVGX01BVEhfSU5MSU5FKGFjb3MsIGFjb3MpCitfU1RMUF9ERUZfTUFUSF9JTkxJTkUoYXNpbiwgYXNpbikKK19TVExQX0RFRl9NQVRIX0lOTElORShhdGFuLCBhdGFuKQorX1NUTFBfREVGX01BVEhfSU5MSU5FMihhdGFuMiwgYXRhbjIpCitfU1RMUF9ERUZfTUFUSF9JTkxJTkUoY2VpbCwgY2VpbCkKK19TVExQX0RFRl9NQVRIX0lOTElORShjb3MsIGNvcykKK19TVExQX0RFRl9NQVRIX0lOTElORShjb3NoLCBjb3NoKQorX1NUTFBfREVGX01BVEhfSU5MSU5FKGV4cCwgZXhwKQorX1NUTFBfREVGX01BVEhfSU5MSU5FKGZhYnMsIGZhYnMpCitfU1RMUF9ERUZfTUFUSF9JTkxJTkUoZmxvb3IsIGZsb29yKQorX1NUTFBfREVGX01BVEhfSU5MSU5FMihmbW9kLCBmbW9kKQorX1NUTFBfREVGX01BVEhfSU5MSU5FMlBJKGZyZXhwLCBmcmV4cCkKK19TVExQX0RFRl9NQVRIX0lOTElORTJJKGxkZXhwLCBsZGV4cCkKK19TVExQX0RFRl9NQVRIX0lOTElORShsb2csIGxvZykKK19TVExQX0RFRl9NQVRIX0lOTElORShsb2cxMCwgbG9nMTApCitfU1RMUF9ERUZfTUFUSF9JTkxJTkUyUChtb2RmLCBtb2RmKQorX1NUTFBfREVGX01BVEhfSU5MSU5FKHNpbiwgc2luKQorX1NUTFBfREVGX01BVEhfSU5MSU5FKHNpbmgsIHNpbmgpCitfU1RMUF9ERUZfTUFUSF9JTkxJTkUoc3FydCwgc3FydCkKK19TVExQX0RFRl9NQVRIX0lOTElORSh0YW4sIHRhbikKK19TVExQX0RFRl9NQVRIX0lOTElORSh0YW5oLCB0YW5oKQorX1NUTFBfREVGX01BVEhfSU5MSU5FMihwb3csIHBvdykKKworIyAgaWYgIWRlZmluZWQoX1NUTFBfTVNWQykgLyogfHwgKF9TVExQX01TVkMgPiAxMzAwKSAqLyB8fCBkZWZpbmVkKF9TVExQX1dDRSkgfHwgIWRlZmluZWQgKF9NU0NfRVhURU5TSU9OUykgLyogJiYgIWRlZmluZWQoX1NUTFBfV0NFX05FVCkgKi8KKyMgICAgaWZuZGVmIF9TVExQX05PX1ZFTkRPUl9NQVRIX0YKKyMgICAgICBpZm5kZWYgX19zdW4KK2lubGluZSBmbG9hdCBwb3coZmxvYXQgX194LCBpbnQgX195KSB7IHJldHVybiBfU1RMUF9DTUFUSF9GVU5DX05BTUVTUEFDRTo6cG93ZihfX3gsIF9fU1RBVElDX0NBU1QoZmxvYXQsX195KSk7IH0KKyMgICAgICBlbHNlCitpbmxpbmUgZmxvYXQgcG93KGZsb2F0IF9feCwgaW50IF9feSkgeyByZXR1cm4gOjpfX3Bvd2YoX194LCBfX1NUQVRJQ19DQVNUKGZsb2F0LF9feSkpOyB9CisjICAgICAgZW5kaWYKKyMgICAgZWxzZQoraW5saW5lIGZsb2F0IHBvdyhmbG9hdCBfX3gsIGludCBfX3kpIHsgcmV0dXJuIF9fU1RBVElDX0NBU1QoZmxvYXQsIF9TVExQX0NNQVRIX0ZVTkNfTkFNRVNQQUNFOjpwb3coX194LCBfX1NUQVRJQ19DQVNUKGZsb2F0LF9feSkpKTsgfQorIyAgICBlbmRpZgoraW5saW5lIGRvdWJsZSBwb3coZG91YmxlIF9feCwgaW50IF9feSkgeyByZXR1cm4gX1NUTFBfQ01BVEhfRlVOQ19OQU1FU1BBQ0U6OnBvdyhfX3gsIF9fU1RBVElDX0NBU1QoZG91YmxlLF9feSkpOyB9CisjICAgIGlmICFkZWZpbmVkIChfU1RMUF9OT19MT05HX0RPVUJMRSkKKyMgICAgICBpZiAhZGVmaW5lZChfU1RMUF9OT19WRU5ET1JfTUFUSF9MKQorIyAgICAgICAgaWZuZGVmIF9fc3VuCitpbmxpbmUgbG9uZyBkb3VibGUgcG93KGxvbmcgZG91YmxlIF9feCwgaW50IF9feSkgeyByZXR1cm4gX1NUTFBfQ01BVEhfRlVOQ19OQU1FU1BBQ0U6OnBvd2woX194LCBfX1NUQVRJQ19DQVNUKGxvbmcgZG91YmxlLF9feSkpOyB9CisjICAgICAgICBlbHNlCisjICAgICAgICAgIGlmbmRlZiBfX1NVTlBST19DQworaW5saW5lIGxvbmcgZG91YmxlIHBvdyhsb25nIGRvdWJsZSBfX3gsIGludCBfX3kpIHsgcmV0dXJuIDo6X19wb3dsKF9feCwgX19TVEFUSUNfQ0FTVChsb25nIGRvdWJsZSxfX3kpKTsgfQorIyAgICAgICAgICBlbHNlCitpbmxpbmUgbG9uZyBkb3VibGUgcG93KGxvbmcgZG91YmxlIF9feCwgaW50IF9feSkgeyByZXR1cm4gX1NUTFBfVkVORE9SX0NTVEQ6Ol9fcG93bChfX3gsIF9fU1RBVElDX0NBU1QobG9uZyBkb3VibGUsX195KSk7IH0KKyMgICAgICAgICAgZW5kaWYKKyMgICAgICAgIGVuZGlmCisjICAgICAgZWxzZQoraW5saW5lIGxvbmcgZG91YmxlIHBvdyhsb25nIGRvdWJsZSBfX3gsIGludCBfX3kpIHsgcmV0dXJuIF9fU1RBVElDX0NBU1QobG9uZyBkb3VibGUsIF9TVExQX0NNQVRIX0ZVTkNfTkFNRVNQQUNFOjpwb3coX194LCBfX1NUQVRJQ19DQVNUKGxvbmcgZG91YmxlLF9feSkpKTsgfQorIyAgICAgIGVuZGlmCisjICAgIGVuZGlmCisjICBlbHNlCisvL1RoZSBNUyBuYXRpdmUgcG93IHZlcnNpb24gaGFzIGEgYnVnZ2VkIG92ZXJsb2FkIHNvIGl0IGlzIG5vdCBpbXBvcnRlZAorLy9pbiB0aGUgU1RMcG9ydCBuYW1lc3BhY2UuCisvL0hlcmUgaXMgdGhlIGJ1Z2dlZCB2ZXJzaW9uOgorLy9pbmxpbmUgZG91YmxlIHBvdyhpbnQgX194LCBpbnQgX195KSAgICAgICAgICAgIHsgcmV0dXJuIChfUG93X2ludChfX3gsIF9feSkpOyB9CitpbmxpbmUgZG91YmxlICAgICAgcG93KGRvdWJsZSBfX3gsIGludCBfX3kpICAgICAgeyByZXR1cm4gKF9Qb3dfaW50KF9feCwgX195KSk7IH0KK2lubGluZSBmbG9hdCAgICAgICBwb3coZmxvYXQgX194LCBpbnQgX195KSAgICAgICB7IHJldHVybiAoX1Bvd19pbnQoX194LCBfX3kpKTsgfQoraW5saW5lIGxvbmcgZG91YmxlIHBvdyhsb25nIGRvdWJsZSBfX3gsIGludCBfX3kpIHsgcmV0dXJuIChfUG93X2ludChfX3gsIF9feSkpOyB9CisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAoZGVmaW5lZCAoX1NUTFBfTVNWQykgJiYgIWRlZmluZWQgKF9TVExQX1dDRSkpIHx8IGRlZmluZWQgKF9fSUNMKSB8fCBkZWZpbmVkIChfX3N1bikKKyMgIGlmIGRlZmluZWQgKF9TVExQX01TVkMpICYmIChfU1RMUF9NU1ZDID49IDE0MDApCisjICAgIHByYWdtYSB3YXJuaW5nIChwdXNoKQorIyAgICBwcmFnbWEgd2FybmluZyAoZGlzYWJsZSA6IDQ5OTYpIC8vIGh5cG90IGlzIGRlcHJlY2F0ZWQuCisjICBlbmRpZgorX1NUTFBfTUFUSF9JTkxJTkUyWFgoZmxvYXQsIGh5cG90LCBoeXBvdCkKK2lubGluZSBsb25nIGRvdWJsZSBoeXBvdChsb25nIGRvdWJsZSB4LCBsb25nIGRvdWJsZSB5KSB7IHJldHVybiBzcXJ0KHggKiB4ICsgeSAqIHkpOyB9CisjICBpZiBkZWZpbmVkIChfU1RMUF9NU1ZDKSAmJiAoX1NUTFBfTVNWQyA+PSAxNDAwKQorIyAgICBwcmFnbWEgd2FybmluZyAocG9wKQorIyAgZW5kaWYKKyNlbHNlCisjICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfVUNMSUJDKQoraW5saW5lIGRvdWJsZSBoeXBvdChkb3VibGUgeCwgZG91YmxlIHkpIHsgcmV0dXJuIHNxcnQoeCAqIHggKyB5ICogeSk7IH0KK19TVExQX0RFRl9NQVRIX0lOTElORTIoaHlwb3QsIGh5cG90KQorIyAgZWxpZiBkZWZpbmVkIChfU1RMUF9XQ0UpCisgICAvKiBDRSBoYXMgYSBkb3VibGUgX2h5cG90KGRvdWJsZSxkb3VibGUpIHdoaWNoIHdlIHVzZSAqLworaW5saW5lIGRvdWJsZSBoeXBvdChkb3VibGUgX194LCBkb3VibGUgX195KSB7IHJldHVybiBfaHlwb3QoX194LF9feSk7IH0KK19TVExQX0RFRl9NQVRIX0lOTElORTIoaHlwb3QsIF9oeXBvdCkKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX1JFU1RPUkVfRlVOQ1RJT05fSU5UUklOU0lDKQorLy9yZXN0b3JhdGlvbiBvZiB0aGUgZGVmYXVsdCBpbnRyaW5zaWMgc3RhdHVzIG9mIHRob3NlIGZ1bmN0aW9uczoKKyMgIHByYWdtYSBpbnRyaW5zaWMgKGFicywgYWNvcywgYXNpbiwgYXRhbiwgYXRhbjIsIGNvcywgY29zaCwgZXhwLCBmYWJzLCBmbW9kLCBsb2csIGxvZzEwLCBzaW4sIHNpbmgsIHNxcnQsIHRhbiwgdGFuaCkKKyMgIGlmIGRlZmluZWQgKF9TVExQX1dDRSkKKyMgICAgcHJhZ21hIGludHJpbnNpYyAoY2VpbCwgZmxvb3IpCisjICBlbmRpZgorIyAgcHJhZ21hIHdhcm5pbmcocG9wKQorIyAgdW5kZWYgX1NUTFBfUkVTVE9SRV9GVU5DVElPTl9JTlRSSU5TSUMKKyNlbmRpZiAvLyBfU1RMUF9NU1ZDICYmIF9TVExQX01TVkMgPD0gMTMwMCAmJiAhX1NUTFBfV0NFICYmIF9NU0NfRVhURU5TSU9OUworCisvKiBDKysgU3RhbmRhcmQgaXMgdW5jbGVhciBhYm91dCBzZXZlcmFsIGNhbGwgdG8gJ3VzaW5nIDo6ZnVuYycgaWYgbmV3IG92ZXJsb2FkcworICogb2YgOjpmdW5jIGFwcGVhcnMgYmV0d2VlbiAyIHN1Y2Nlc3NpdmUgJ3VzaW5nJyBjYWxscy4gVG8gYXZvaWQgdGhpcyBwb3RlbnRpYWwKKyAqIHByb2JsZW0gd2UgcHJvdmlkZSBhbGwgYWJzIG92ZXJsb2FkIGJlZm9yZSB0aGUgJ3VzaW5nJyBjYWxsLgorICogQmV3YXJlOiBUaGlzIGhlYWRlciBpbmNsdXNpb24gaGFzIHRvIGJlIGFmdGVyIGFsbCBhYnMgb3ZlcmxvYWQgb2YgdGhpcyBmaWxlLgorICogICAgICAgICBUaGUgZmlyc3QgJ3VzaW5nIDo6YWJzJyBjYWxsIGlzIGdvaW5nIHRvIGJlIGluIHRoZSBvdGhlciBoZWFkZXIuCisgKi8KKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1NURExJQgorIyAgaW5jbHVkZSA8c3RsL19jc3RkbGliLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX0lNUE9SVF9WRU5ET1JfQ1NURCkgJiYgIWRlZmluZWQgKF9TVExQX05PX0NTVERfRlVOQ1RJT05fSU1QT1JUUykKK19TVExQX0JFR0lOX05BTUVTUEFDRQordXNpbmcgOjphYnM7Cit1c2luZyA6OmFjb3M7Cit1c2luZyA6OmFzaW47Cit1c2luZyA6OmF0YW47Cit1c2luZyA6OmF0YW4yOwordXNpbmcgOjpjZWlsOwordXNpbmcgOjpjb3M7Cit1c2luZyA6OmNvc2g7Cit1c2luZyA6OmV4cDsKK3VzaW5nIDo6ZmFiczsKK3VzaW5nIDo6Zmxvb3I7Cit1c2luZyA6OmZtb2Q7Cit1c2luZyA6OmZyZXhwOwordXNpbmcgOjpoeXBvdDsKK3VzaW5nIDo6bGRleHA7Cit1c2luZyA6OmxvZzsKK3VzaW5nIDo6bG9nMTA7Cit1c2luZyA6Om1vZGY7Cit1c2luZyA6OnBvdzsKK3VzaW5nIDo6c2luOwordXNpbmcgOjpzaW5oOwordXNpbmcgOjpzcXJ0OwordXNpbmcgOjp0YW47Cit1c2luZyA6OnRhbmg7CitfU1RMUF9FTkRfTkFNRVNQQUNFCisjICBpZiBkZWZpbmVkIChfX0JPUkxBTkRDX18pICYmIChfX0JPUkxBTkRDX18gPj0gMHg1NjApCit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6X2VjdnQ7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6X2ZjdnQ7CisjICBlbmRpZgorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9DTUFUSCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RsL19jb2RlY3Z0LmggYi9zdGwvX2NvZGVjdnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWVlN2YzCi0tLSAvZGV2L251bGwKKysrIGIvc3RsL19jb2RlY3Z0LmgKQEAgLTAsMCArMSw0MjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisvLyBXQVJOSU5HOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBDKysKKy8vIHN0YW5kYXJkIGxpYnJhcnkgaGVhZGVycy4gIFlvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gdXNlIHRoaXMgaGVhZGVyCisvLyBmaWxlIGRpcmVjdGx5LgorCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ09ERUNWVF9ICisjZGVmaW5lIF9TVExQX0lOVEVSTkFMX0NPREVDVlRfSAorCisjaWZuZGVmIF9TVExQX0NfTE9DQUxFX0gKKyMgIGluY2x1ZGUgPHN0bC9jX2xvY2FsZS5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfTE9DQUxFX0gKKyMgIGluY2x1ZGUgPHN0bC9fbG9jYWxlLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9BTEdPQkFTRV9ICisjICBpbmNsdWRlIDxzdGwvX2FsZ29iYXNlLmg+CisjZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKK2NsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIGNvZGVjdnRfYmFzZSB7CitwdWJsaWM6CisgIGVudW0gcmVzdWx0IHtvaywgcGFydGlhbCwgZXJyb3IsIG5vY29udn07Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0ludGVyblQsIGNsYXNzIF9FeHRlcm5ULCBjbGFzcyBfU3RhdGVUPgorY2xhc3MgY29kZWN2dCA6IHB1YmxpYyBsb2NhbGU6OmZhY2V0LCBwdWJsaWMgY29kZWN2dF9iYXNlIHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBfSW50ZXJuVCBpbnRlcm5fdHlwZTsKKyAgdHlwZWRlZiBfRXh0ZXJuVCBleHRlcm5fdHlwZTsKKyAgdHlwZWRlZiBfU3RhdGVUIHN0YXRlX3R5cGU7CisKKyNpZiBkZWZpbmVkIChfU1RMUF9NU1ZDKSAmJiAoX1NUTFBfTVNWQyA8IDEzMDApCisgIC8qIEZvciB0aGUgbW9tZW50IFZDNiBkbyBub3Qgc3VwcG9ydCB0aGlzIGZhY2V0IGRlZmF1bHQgaW1wbGVtZW50YXRpb24KKyAgICogYmVjYXVzZSBvZiB0aGUgc3RhdGljIGxvY2FsZTo6aWQgaW5zdGFuY2UuIFdoZW4gVkM2IHNlZSB0aGlzIGRlZmluaXRpb24KKyAgICogaXQgZ29lcyBjcmFzeSB3aXRoIGxvY2FsZTo6aWQgc3RhdGljIGluc3RhbmNlcyBhbmQgYWxsIHRoZSBoYXNfZmFjZXQgdGVzdHMKKyAgICogdW5pdCB0ZXN0cyBhcmUgZmFpbGluZy4KKyAgICovCit9OworI2Vsc2UKKyAgZXhwbGljaXQgY29kZWN2dChzaXplX3QgX19yZWZzID0gMCkgOiBsb2NhbGU6OmZhY2V0KF9fcmVmcykge30KKworICByZXN1bHQgb3V0KHN0YXRlX3R5cGUmICAgICAgICAgIF9fc3RhdGUsCisgICAgICAgICAgICAgY29uc3QgaW50ZXJuX3R5cGUqICAgX19mcm9tLAorICAgICAgICAgICAgIGNvbnN0IGludGVybl90eXBlKiAgIF9fZnJvbV9lbmQsCisgICAgICAgICAgICAgY29uc3QgaW50ZXJuX3R5cGUqJiAgX19mcm9tX25leHQsCisgICAgICAgICAgICAgZXh0ZXJuX3R5cGUqICAgICAgICAgX190bywKKyAgICAgICAgICAgICBleHRlcm5fdHlwZSogICAgICAgICBfX3RvX2xpbWl0LAorICAgICAgICAgICAgIGV4dGVybl90eXBlKiYgICAgICAgIF9fdG9fbmV4dCkgY29uc3QgeworICAgIHJldHVybiBkb19vdXQoX19zdGF0ZSwKKyAgICAgICAgICAgICAgICAgIF9fZnJvbSwgX19mcm9tX2VuZCwgX19mcm9tX25leHQsCisgICAgICAgICAgICAgICAgICBfX3RvLCAgIF9fdG9fbGltaXQsIF9fdG9fbmV4dCk7CisgIH0KKworICByZXN1bHQgdW5zaGlmdChzdGF0ZV90eXBlJiAgICBfX3N0YXRlLAorICAgICAgICAgICAgICAgICBleHRlcm5fdHlwZSogICBfX3RvLAorICAgICAgICAgICAgICAgICBleHRlcm5fdHlwZSogICBfX3RvX2xpbWl0LAorICAgICAgICAgICAgICAgICBleHRlcm5fdHlwZSomICBfX3RvX25leHQpIGNvbnN0IHsKKyAgICByZXR1cm4gZG9fdW5zaGlmdChfX3N0YXRlLCBfX3RvLCBfX3RvX2xpbWl0LCBfX3RvX25leHQpOworICB9CisKKyAgcmVzdWx0IGluKHN0YXRlX3R5cGUmICAgICAgICAgX19zdGF0ZSwKKyAgICAgICAgICAgIGNvbnN0IGV4dGVybl90eXBlKiAgX19mcm9tLAorICAgICAgICAgICAgY29uc3QgZXh0ZXJuX3R5cGUqICBfX2Zyb21fZW5kLAorICAgICAgICAgICAgY29uc3QgZXh0ZXJuX3R5cGUqJiBfX2Zyb21fbmV4dCwKKyAgICAgICAgICAgIGludGVybl90eXBlKiAgICAgICAgX190bywKKyAgICAgICAgICAgIGludGVybl90eXBlKiAgICAgICAgX190b19saW1pdCwKKyAgICAgICAgICAgIGludGVybl90eXBlKiYgICAgICAgX190b19uZXh0KSBjb25zdCB7CisgICAgcmV0dXJuIGRvX2luKF9fc3RhdGUsCisgICAgICAgICAgICAgICAgIF9fZnJvbSwgX19mcm9tX2VuZCwgX19mcm9tX25leHQsCisgICAgICAgICAgICAgICAgIF9fdG8sICBfX3RvX2xpbWl0LCBfX3RvX25leHQpOworICB9CisKKyAgaW50IGVuY29kaW5nKCkgY29uc3QgX1NUTFBfTk9USFJPVyB7IHJldHVybiBkb19lbmNvZGluZygpOyB9CisKKyAgYm9vbCBhbHdheXNfbm9jb252KCkgY29uc3QgX1NUTFBfTk9USFJPVyB7IHJldHVybiBkb19hbHdheXNfbm9jb252KCk7IH0KKworICBpbnQgbGVuZ3RoKGNvbnN0IHN0YXRlX3R5cGUmICBfX3N0YXRlLAorICAgICAgICAgICAgIGNvbnN0IGV4dGVybl90eXBlKiBfX2Zyb20sCisgICAgICAgICAgICAgY29uc3QgZXh0ZXJuX3R5cGUqIF9fZW5kLAorICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICBfX21heCkgY29uc3QgeworICAgIHJldHVybiBkb19sZW5ndGgoX19zdGF0ZSwgX19mcm9tLCBfX2VuZCwgX19tYXgpOworICB9CisKKyAgaW50IG1heF9sZW5ndGgoKSBjb25zdCBfU1RMUF9OT1RIUk9XIHsgcmV0dXJuIGRvX21heF9sZW5ndGgoKTsgfQorCisgIHN0YXRpYyBfU1RMUF9TVEFUSUNfTUVNQkVSX0RFQ0xTUEVDIGxvY2FsZTo6aWQgaWQ7CisKK3Byb3RlY3RlZDoKKyAgfmNvZGVjdnQoKSB7fQorCisgIHZpcnR1YWwgcmVzdWx0IGRvX291dChzdGF0ZV90eXBlJiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludGVybl90eXBlKiAgX19mcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ZXJuX3R5cGUqLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ZXJuX3R5cGUqJiBfX2Zyb21fbmV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybl90eXBlKiAgICAgICAgX190bywKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybl90eXBlKiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybl90eXBlKiYgICAgICAgX190b19uZXh0KSBjb25zdAorICB7IF9fZnJvbV9uZXh0ID0gX19mcm9tOyBfX3RvX25leHQgICA9IF9fdG87IHJldHVybiBub2NvbnY7IH0KKworICB2aXJ0dWFsIHJlc3VsdCBkb19pbiAoc3RhdGVfdHlwZSYsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleHRlcm5fdHlwZSogIF9fZnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4dGVybl90eXBlKiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4dGVybl90eXBlKiYgX19mcm9tX25leHQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5fdHlwZSogICAgICAgIF9fdG8sCisgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5fdHlwZSosCisgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5fdHlwZSomICAgICAgIF9fdG9fbmV4dCkgY29uc3QKKyAgeyBfX2Zyb21fbmV4dCA9IF9fZnJvbTsgX190b19uZXh0ID0gX190bzsgcmV0dXJuIG5vY29udjsgfQorCisgIHZpcnR1YWwgcmVzdWx0IGRvX3Vuc2hpZnQoc3RhdGVfdHlwZSYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuX3R5cGUqIF9fdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuX3R5cGUqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybl90eXBlKiYgX190b19uZXh0KSBjb25zdAorICB7IF9fdG9fbmV4dCA9IF9fdG87IHJldHVybiBub2NvbnY7IH0KKworICB2aXJ0dWFsIGludCBkb19lbmNvZGluZygpIGNvbnN0IF9TVExQX05PVEhST1cKKyAgeyByZXR1cm4gMTsgfQorCisgIHZpcnR1YWwgYm9vbCBkb19hbHdheXNfbm9jb252KCkgY29uc3QgX1NUTFBfTk9USFJPVworICB7IHJldHVybiB0cnVlOyB9CisKKyAgdmlydHVhbCBpbnQgZG9fbGVuZ3RoKGNvbnN0IHN0YXRlX3R5cGUmLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXh0ZXJuX3R5cGUqIF9fZnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4dGVybl90eXBlKiBfX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBfX21heCkgY29uc3QKKyAgeyByZXR1cm4gKGludCkobWluKSAoIF9fU1RBVElDX0NBU1Qoc2l6ZV90LCAoX19lbmQgLSBfX2Zyb20pKSwgX19tYXgpOyB9CisKKyAgdmlydHVhbCBpbnQgZG9fbWF4X2xlbmd0aCgpIGNvbnN0IF9TVExQX05PVEhST1cKKyAgeyByZXR1cm4gMTsgfQorCitwcml2YXRlOgorICBjb2RlY3Z0KGNvbnN0IGNvZGVjdnQ8aW50ZXJuX3R5cGUsIGV4dGVybl90eXBlLCBzdGF0ZV90eXBlPiYpOworICBjb2RlY3Z0PGludGVybl90eXBlLCBleHRlcm5fdHlwZSwgc3RhdGVfdHlwZT4mIG9wZXJhdG9yID0gKGNvbnN0IGNvZGVjdnQ8aW50ZXJuX3R5cGUsIGV4dGVybl90eXBlLCBzdGF0ZV90eXBlPiYpOworfTsKKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfRVhQT1NFX1NUUkVBTV9JTVBMRU1FTlRBVElPTikgJiYgIWRlZmluZWQgKF9TVExQX0xJTktfVElNRV9JTlNUQU5USUFUSU9OKQorIyAgICBpZiAoX1NUTFBfU1RBVElDX1RFTVBMQVRFX0RBVEEgPiAwKQorIyAgICAgIGlmICFkZWZpbmVkIChfX0JPUkxBTkRDX18pCit0ZW1wbGF0ZSA8Y2xhc3MgX0ludGVyblQsIGNsYXNzIF9FeHRlcm5ULCBjbGFzcyBfU3RhdGVUPgorbG9jYWxlOjppZCBjb2RlY3Z0PF9JbnRlcm5ULCBfRXh0ZXJuVCwgX1N0YXRlVD46OmlkOworIyAgICAgIGVuZGlmCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfSW50ZXJuVCwgY2xhc3MgX0V4dGVyblQsIGNsYXNzIF9TdGF0ZVQ+CitjbGFzcyBjb2RlY3Z0X2J5bmFtZSA6IHB1YmxpYyBjb2RlY3Z0PF9JbnRlcm5ULCBfRXh0ZXJuVCwgX1N0YXRlVD4ge307CisKK19TVExQX1RFTVBMQVRFX05VTEwKK2NsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIGNvZGVjdnQ8Y2hhciwgY2hhciwgbWJzdGF0ZV90PgorICA6IHB1YmxpYyBsb2NhbGU6OmZhY2V0LCBwdWJsaWMgY29kZWN2dF9iYXNlCit7CisgIGZyaWVuZCBjbGFzcyBfTG9jYWxlX2ltcGw7CisKK3B1YmxpYzoKKyAgdHlwZWRlZiBjaGFyICAgICAgIGludGVybl90eXBlOworICB0eXBlZGVmIGNoYXIgICAgICAgZXh0ZXJuX3R5cGU7CisgIHR5cGVkZWYgbWJzdGF0ZV90ICBzdGF0ZV90eXBlOworCisgIGV4cGxpY2l0IGNvZGVjdnQoc2l6ZV90IF9fcmVmcyA9IDApIDogbG9jYWxlOjpmYWNldChfX3JlZnMpIHt9CisKKyAgcmVzdWx0IG91dChtYnN0YXRlX3QmICAgX19zdGF0ZSwKKyAgICAgICAgICAgICBjb25zdCBjaGFyKiAgX19mcm9tLAorICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBfX2Zyb21fZW5kLAorICAgICAgICAgICAgIGNvbnN0IGNoYXIqJiBfX2Zyb21fbmV4dCwKKyAgICAgICAgICAgICBjaGFyKiAgICAgICAgX190bywKKyAgICAgICAgICAgICBjaGFyKiAgICAgICAgX190b19saW1pdCwKKyAgICAgICAgICAgICBjaGFyKiYgICAgICAgX190b19uZXh0KSBjb25zdCB7CisgICAgcmV0dXJuIGRvX291dChfX3N0YXRlLAorICAgICAgICAgICAgICAgICAgX19mcm9tLCBfX2Zyb21fZW5kLCBfX2Zyb21fbmV4dCwKKyAgICAgICAgICAgICAgICAgIF9fdG8sICAgX190b19saW1pdCwgX190b19uZXh0KTsKKyAgfQorCisgIHJlc3VsdCB1bnNoaWZ0KG1ic3RhdGVfdCYgX19zdGF0ZSwKKyAgICAgICAgICAgICAgICAgY2hhciogX190bywgY2hhciogX190b19saW1pdCwgY2hhciomIF9fdG9fbmV4dCkgY29uc3QKKyAgICB7IHJldHVybiBkb191bnNoaWZ0KF9fc3RhdGUsIF9fdG8sIF9fdG9fbGltaXQsIF9fdG9fbmV4dCk7IH0KKworICByZXN1bHQgaW4oc3RhdGVfdHlwZSYgICBfX3N0YXRlLAorICAgICAgICAgICAgY29uc3QgY2hhciogIF9fZnJvbSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqICBfX2Zyb21fZW5kLAorICAgICAgICAgICAgY29uc3QgY2hhciomIF9fZnJvbV9uZXh0LAorICAgICAgICAgICAgY2hhciogICAgICAgIF9fdG8sCisgICAgICAgICAgICBjaGFyKiAgICAgICAgX190b19saW1pdCwKKyAgICAgICAgICAgIGNoYXIqJiAgICAgICBfX3RvX25leHQpIGNvbnN0IHsKKyAgICByZXR1cm4gZG9faW4oX19zdGF0ZSwKKyAgICAgICAgICAgICAgICAgX19mcm9tLCBfX2Zyb21fZW5kLCBfX2Zyb21fbmV4dCwKKyAgICAgICAgICAgICAgICAgX190bywgICBfX3RvX2xpbWl0LCBfX3RvX25leHQpOworICB9CisKKyAgaW50IGVuY29kaW5nKCkgY29uc3QgX1NUTFBfTk9USFJPVyB7IHJldHVybiBkb19lbmNvZGluZygpOyB9CisKKyAgYm9vbCBhbHdheXNfbm9jb252KCkgY29uc3QgX1NUTFBfTk9USFJPVyB7IHJldHVybiBkb19hbHdheXNfbm9jb252KCk7IH0KKworICBpbnQgbGVuZ3RoKGNvbnN0IHN0YXRlX3R5cGUmIF9fc3RhdGUsCisgICAgICAgICAgICAgY29uc3QgY2hhciogX19mcm9tLCBjb25zdCBjaGFyKiBfX2VuZCwKKyAgICAgICAgICAgICBzaXplX3QgX19tYXgpIGNvbnN0CisgICAgeyByZXR1cm4gZG9fbGVuZ3RoKF9fc3RhdGUsIF9fZnJvbSwgX19lbmQsIF9fbWF4KTsgfQorCisgIGludCBtYXhfbGVuZ3RoKCkgY29uc3QgX1NUTFBfTk9USFJPVyB7IHJldHVybiBkb19tYXhfbGVuZ3RoKCk7IH0KKworICBzdGF0aWMgX1NUTFBfU1RBVElDX01FTUJFUl9ERUNMU1BFQyBsb2NhbGU6OmlkIGlkOworCitwcm90ZWN0ZWQ6CisgIH5jb2RlY3Z0KCk7CisKKyAgdmlydHVhbCByZXN1bHQgZG9fb3V0KG1ic3RhdGVfdCYgICAvKiBfX3N0YXRlICovLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIF9fZnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAvKiBfX2Zyb21fZW5kICovLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciomIF9fZnJvbV9uZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogICAgICAgIF9fdG8sCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiAgICAgICAgLyogX190b19saW1pdCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqJiAgICAgICBfX3RvX25leHQpIGNvbnN0OworCisgIHZpcnR1YWwgcmVzdWx0IGRvX2luIChtYnN0YXRlX3QmICAgLyogX19zdGF0ZSAqLyAsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgX19mcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIC8qIF9fZnJvbV9lbmQgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiYgX19mcm9tX25leHQsCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiAgICAgICAgX190bywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqICAgICAgICAvKiBfX3RvX2VuZCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqJiAgICAgICBfX3RvX25leHQpIGNvbnN0OworCisgIHZpcnR1YWwgcmVzdWx0IGRvX3Vuc2hpZnQobWJzdGF0ZV90JiAvKiBfX3N0YXRlICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqICAgICAgX190bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiAgICAgIC8qIF9fdG9fbGltaXQgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciomICAgICBfX3RvX25leHQpIGNvbnN0OworCisgIHZpcnR1YWwgaW50IGRvX2VuY29kaW5nKCkgY29uc3QgX1NUTFBfTk9USFJPVzsKKyAgdmlydHVhbCBib29sIGRvX2Fsd2F5c19ub2NvbnYoKSBjb25zdCBfU1RMUF9OT1RIUk9XOworICB2aXJ0dWFsIGludCBkb19sZW5ndGgoY29uc3QgbWJzdGF0ZV90JiAgICAgICAgIF9fc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgY2hhciogX19mcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgIGNoYXIqIF9fZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IF9fbWF4KSBjb25zdDsKKyAgdmlydHVhbCBpbnQgZG9fbWF4X2xlbmd0aCgpIGNvbnN0IF9TVExQX05PVEhST1c7Citwcml2YXRlOgorICBjb2RlY3Z0KGNvbnN0IGNvZGVjdnQ8Y2hhciwgY2hhciwgbWJzdGF0ZV90PiYpOworICBjb2RlY3Z0PGNoYXIsIGNoYXIsIG1ic3RhdGVfdD4mIG9wZXJhdG9yID0oY29uc3QgY29kZWN2dDxjaGFyLCBjaGFyLCBtYnN0YXRlX3Q+Jik7Cit9OworCisjIGlmbmRlZiBfU1RMUF9OT19XQ0hBUl9UCisKK19TVExQX1RFTVBMQVRFX05VTEwKK2NsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIGNvZGVjdnQ8d2NoYXJfdCwgY2hhciwgbWJzdGF0ZV90PgorICA6IHB1YmxpYyBsb2NhbGU6OmZhY2V0LCBwdWJsaWMgY29kZWN2dF9iYXNlCit7CisgIGZyaWVuZCBjbGFzcyBfTG9jYWxlX2ltcGw7CitwdWJsaWM6CisgIHR5cGVkZWYgd2NoYXJfdCAgICBpbnRlcm5fdHlwZTsKKyAgdHlwZWRlZiBjaGFyICAgICAgIGV4dGVybl90eXBlOworICB0eXBlZGVmIG1ic3RhdGVfdCAgc3RhdGVfdHlwZTsKKworICBleHBsaWNpdCBjb2RlY3Z0KHNpemVfdCBfX3JlZnMgPSAwKSA6IGxvY2FsZTo6ZmFjZXQoX19yZWZzKSB7fQorCisgIHJlc3VsdCBvdXQobWJzdGF0ZV90JiAgICAgIF9fc3RhdGUsCisgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogIF9fZnJvbSwKKyAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiAgX19mcm9tX2VuZCwKKyAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiYgX19mcm9tX25leHQsCisgICAgICAgICAgICAgY2hhciogICAgICAgICAgIF9fdG8sCisgICAgICAgICAgICAgY2hhciogICAgICAgICAgIF9fdG9fbGltaXQsCisgICAgICAgICAgICAgY2hhciomICAgICAgICAgIF9fdG9fbmV4dCkgY29uc3QgeworICAgIHJldHVybiBkb19vdXQoX19zdGF0ZSwKKyAgICAgICAgICAgICAgICAgIF9fZnJvbSwgX19mcm9tX2VuZCwgX19mcm9tX25leHQsCisgICAgICAgICAgICAgICAgICBfX3RvLCAgIF9fdG9fbGltaXQsIF9fdG9fbmV4dCk7CisgIH0KKworICByZXN1bHQgdW5zaGlmdChtYnN0YXRlX3QmIF9fc3RhdGUsCisgICAgICAgICAgICAgICAgIGNoYXIqICBfX3RvLCBjaGFyKiAgX190b19saW1pdCwgY2hhciomIF9fdG9fbmV4dCkgY29uc3QgeworICAgIHJldHVybiBkb191bnNoaWZ0KF9fc3RhdGUsIF9fdG8sIF9fdG9fbGltaXQsIF9fdG9fbmV4dCk7CisgIH0KKworICByZXN1bHQgaW4obWJzdGF0ZV90JiAgIF9fc3RhdGUsCisgICAgICAgICAgICBjb25zdCBjaGFyKiAgX19mcm9tLAorICAgICAgICAgICAgY29uc3QgY2hhciogIF9fZnJvbV9lbmQsCisgICAgICAgICAgICBjb25zdCBjaGFyKiYgX19mcm9tX25leHQsCisgICAgICAgICAgICB3Y2hhcl90KiAgICAgX190bywKKyAgICAgICAgICAgIHdjaGFyX3QqICAgICBfX3RvX2xpbWl0LAorICAgICAgICAgICAgd2NoYXJfdComICAgIF9fdG9fbmV4dCkgY29uc3QgeworICAgIHJldHVybiBkb19pbihfX3N0YXRlLAorICAgICAgICAgICAgICAgICBfX2Zyb20sIF9fZnJvbV9lbmQsIF9fZnJvbV9uZXh0LAorICAgICAgICAgICAgICAgICBfX3RvLCAgIF9fdG9fbGltaXQsIF9fdG9fbmV4dCk7CisgIH0KKworICBpbnQgZW5jb2RpbmcoKSBjb25zdCBfU1RMUF9OT1RIUk9XIHsgcmV0dXJuIGRvX2VuY29kaW5nKCk7IH0KKworICBib29sIGFsd2F5c19ub2NvbnYoKSBjb25zdCBfU1RMUF9OT1RIUk9XIHsgcmV0dXJuIGRvX2Fsd2F5c19ub2NvbnYoKTsgfQorCisgIGludCBsZW5ndGgoY29uc3QgbWJzdGF0ZV90JiBfX3N0YXRlLAorICAgICAgICAgICAgIGNvbnN0IGNoYXIqIF9fZnJvbSwgY29uc3QgY2hhciogX19lbmQsCisgICAgICAgICAgICAgc2l6ZV90IF9fbWF4KSBjb25zdAorICAgIHsgcmV0dXJuIGRvX2xlbmd0aChfX3N0YXRlLCBfX2Zyb20sIF9fZW5kLCBfX21heCk7IH0KKworICBpbnQgbWF4X2xlbmd0aCgpIGNvbnN0IF9TVExQX05PVEhST1cgeyByZXR1cm4gZG9fbWF4X2xlbmd0aCgpOyB9CisKKyAgc3RhdGljIF9TVExQX1NUQVRJQ19NRU1CRVJfREVDTFNQRUMgbG9jYWxlOjppZCBpZDsKKworcHJvdGVjdGVkOgorICB+Y29kZWN2dCgpOworCisgIHZpcnR1YWwgcmVzdWx0IGRvX291dChtYnN0YXRlX3QmICAgICAgICAgX19zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqICBfX2Zyb20sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiAgX19mcm9tX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqJiBfX2Zyb21fbmV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqICAgICAgICBfX3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogICAgICAgIF9fdG9fbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiYgICAgICAgX190b19uZXh0KSBjb25zdDsKKworICB2aXJ0dWFsIHJlc3VsdCBkb19pbiAobWJzdGF0ZV90JiAgICAgICAgIF9fc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgX19mcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIF9fZnJvbV9lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiYgX19mcm9tX25leHQsCisgICAgICAgICAgICAgICAgICAgICAgICB3Y2hhcl90KiAgICAgICAgX190bywKKyAgICAgICAgICAgICAgICAgICAgICAgIHdjaGFyX3QqICAgICAgICBfX3RvX2xpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgd2NoYXJfdComICAgICAgIF9fdG9fbmV4dCkgY29uc3Q7CisKKyAgdmlydHVhbCByZXN1bHQgZG9fdW5zaGlmdChtYnN0YXRlX3QmICAgX19zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiAgX190bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiAgX190b19saW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiYgX190b19uZXh0KSBjb25zdDsKKworICB2aXJ0dWFsIGludCBkb19lbmNvZGluZygpIGNvbnN0IF9TVExQX05PVEhST1c7CisKKyAgdmlydHVhbCBib29sIGRvX2Fsd2F5c19ub2NvbnYoKSBjb25zdCBfU1RMUF9OT1RIUk9XOworCisgIHZpcnR1YWwgaW50IGRvX2xlbmd0aChjb25zdCBtYnN0YXRlX3QmIF9fc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgY2hhciogX19mcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgIGNoYXIqIF9fZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IF9fbWF4KSBjb25zdDsKKworICB2aXJ0dWFsIGludCBkb19tYXhfbGVuZ3RoKCkgY29uc3QgX1NUTFBfTk9USFJPVzsKKworcHJpdmF0ZToKKyAgY29kZWN2dChjb25zdCBjb2RlY3Z0PHdjaGFyX3QsIGNoYXIsIG1ic3RhdGVfdD4mKTsKKyAgY29kZWN2dDx3Y2hhcl90LCBjaGFyLCBtYnN0YXRlX3Q+JiBvcGVyYXRvciA9IChjb25zdCBjb2RlY3Z0PHdjaGFyX3QsIGNoYXIsIG1ic3RhdGVfdD4mKTsKK307CisKKyMgZW5kaWYKKworX1NUTFBfVEVNUExBVEVfTlVMTAorY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgY29kZWN2dF9ieW5hbWU8Y2hhciwgY2hhciwgbWJzdGF0ZV90PgorICA6IHB1YmxpYyBjb2RlY3Z0PGNoYXIsIGNoYXIsIG1ic3RhdGVfdD4geworcHVibGljOgorICBleHBsaWNpdCBjb2RlY3Z0X2J5bmFtZShjb25zdCBjaGFyKiBfX25hbWUsIHNpemVfdCBfX3JlZnMgPSAwKTsKKyAgfmNvZGVjdnRfYnluYW1lKCk7Citwcml2YXRlOgorICBjb2RlY3Z0X2J5bmFtZShjb25zdCBjb2RlY3Z0X2J5bmFtZTxjaGFyLCBjaGFyLCBtYnN0YXRlX3Q+Jik7CisgIGNvZGVjdnRfYnluYW1lPGNoYXIsIGNoYXIsIG1ic3RhdGVfdD4mIG9wZXJhdG9yID0oY29uc3QgY29kZWN2dF9ieW5hbWU8Y2hhciwgY2hhciwgbWJzdGF0ZV90PiYpOworfTsKKworIyBpZm5kZWYgX1NUTFBfTk9fV0NIQVJfVAorX1NUTFBfVEVNUExBVEVfTlVMTAorY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgY29kZWN2dF9ieW5hbWU8d2NoYXJfdCwgY2hhciwgbWJzdGF0ZV90PgorICA6IHB1YmxpYyBjb2RlY3Z0PHdjaGFyX3QsIGNoYXIsIG1ic3RhdGVfdD4KK3sKK3B1YmxpYzoKKyAgZXhwbGljaXQgY29kZWN2dF9ieW5hbWUoY29uc3QgY2hhciAqIF9fbmFtZSwgc2l6ZV90IF9fcmVmcyA9IDAsIF9Mb2NhbGVfbmFtZV9oaW50KiBfX2hpbnQgPSAwKTsKKworcHJvdGVjdGVkOgorICB+Y29kZWN2dF9ieW5hbWUoKTsKKworICB2aXJ0dWFsIHJlc3VsdCBkb19vdXQobWJzdGF0ZV90JiAgICAgICAgIF9fc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiAgX19mcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogIF9fZnJvbV9lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiYgX19mcm9tX25leHQsCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiAgICAgICAgX190bywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqICAgICAgICBfX3RvX2xpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhciomICAgICAgIF9fdG9fbmV4dCkgY29uc3Q7CisKKyAgdmlydHVhbCByZXN1bHQgZG9faW4gKG1ic3RhdGVfdCYgICAgICAgICBfX3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIF9fZnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBfX2Zyb21fZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciomIF9fZnJvbV9uZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgd2NoYXJfdCogICAgICAgIF9fdG8sCisgICAgICAgICAgICAgICAgICAgICAgICB3Y2hhcl90KiAgICAgICAgX190b19saW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHdjaGFyX3QqJiAgICAgICBfX3RvX25leHQpIGNvbnN0OworCisgIHZpcnR1YWwgcmVzdWx0IGRvX3Vuc2hpZnQobWJzdGF0ZV90JiAgIF9fc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogIF9fdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogIF9fdG9fbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciomIF9fdG9fbmV4dCkgY29uc3Q7CisKKyAgdmlydHVhbCBpbnQgZG9fZW5jb2RpbmcoKSBjb25zdCBfU1RMUF9OT1RIUk9XOworCisgIHZpcnR1YWwgYm9vbCBkb19hbHdheXNfbm9jb252KCkgY29uc3QgX1NUTFBfTk9USFJPVzsKKworICB2aXJ0dWFsIGludCBkb19sZW5ndGgoY29uc3QgbWJzdGF0ZV90JiAgICAgICAgIF9fc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgY2hhciogX19mcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgIGNoYXIqIF9fZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IF9fbWF4KSBjb25zdDsKKworICB2aXJ0dWFsIGludCBkb19tYXhfbGVuZ3RoKCkgY29uc3QgX1NUTFBfTk9USFJPVzsKKworcHJpdmF0ZToKKyAgX0xvY2FsZV9jdHlwZSogX01fY3R5cGU7CisgIGNvZGVjdnRfYnluYW1lKGNvbnN0IGNvZGVjdnRfYnluYW1lPHdjaGFyX3QsIGNoYXIsIG1ic3RhdGVfdD4mKTsKKyAgY29kZWN2dF9ieW5hbWU8d2NoYXJfdCwgY2hhciwgbWJzdGF0ZV90PiYgb3BlcmF0b3IgPShjb25zdCBjb2RlY3Z0X2J5bmFtZTx3Y2hhcl90LCBjaGFyLCBtYnN0YXRlX3Q+Jik7Cit9OworCisjIGVuZGlmCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2VuZGlmIC8qIF9TVExQX0lOVEVSTkFMX0NPREVDVlRfSCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgorCmRpZmYgLS1naXQgYS9zdGwvX2NvbGxhdGUuaCBiL3N0bC9fY29sbGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZThmNjcKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvX2NvbGxhdGUuaApAQCAtMCwwICsxLDE3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKy8vIFdBUk5JTkc6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIEMrKworLy8gc3RhbmRhcmQgbGlicmFyeSBoZWFkZXJzLiAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgdGhpcyBoZWFkZXIKKy8vIGZpbGUgZGlyZWN0bHkuCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ09MTEFURV9ICisjZGVmaW5lIF9TVExQX0lOVEVSTkFMX0NPTExBVEVfSAorCisjaWZuZGVmIF9TVExQX0NfTE9DQUxFX0gKKyMgaW5jbHVkZSA8c3RsL2NfbG9jYWxlLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9MT0NBTEVfSAorIyBpbmNsdWRlIDxzdGwvX2xvY2FsZS5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfU1RSSU5HX0gKKyMgaW5jbHVkZSA8c3RsL19zdHJpbmcuaD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4gY2xhc3MgY29sbGF0ZSB7fTsKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+IGNsYXNzIGNvbGxhdGVfYnluYW1lIHt9OworCitfU1RMUF9URU1QTEFURV9OVUxMCitjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBjb2xsYXRlPGNoYXI+IDogcHVibGljIGxvY2FsZTo6ZmFjZXQKK3sKKyAgZnJpZW5kIGNsYXNzIF9Mb2NhbGVfaW1wbDsKKworcHVibGljOgorICB0eXBlZGVmIGNoYXIgICBjaGFyX3R5cGU7CisgIHR5cGVkZWYgc3RyaW5nIHN0cmluZ190eXBlOworCisgIGV4cGxpY2l0IGNvbGxhdGUoc2l6ZV90IF9fcmVmcyA9IDApIDogbG9jYWxlOjpmYWNldChfX3JlZnMpIHt9CisKKyAgaW50IGNvbXBhcmUoY29uc3QgY2hhciogX19sb3cxLCBjb25zdCBjaGFyKiBfX2hpZ2gxLAorICAgICAgICAgICAgICBjb25zdCBjaGFyKiBfX2xvdzIsIGNvbnN0IGNoYXIqIF9faGlnaDIpIGNvbnN0IHsKKyAgICByZXR1cm4gZG9fY29tcGFyZSggX19sb3cxLCBfX2hpZ2gxLCBfX2xvdzIsIF9faGlnaDIpOworICB9CisKKyAgc3RyaW5nX3R5cGUgdHJhbnNmb3JtKGNvbnN0IGNoYXIqIF9fbG93LCBjb25zdCBjaGFyKiBfX2hpZ2gpIGNvbnN0IHsKKyAgICByZXR1cm4gZG9fdHJhbnNmb3JtKF9fbG93LCBfX2hpZ2gpOworICB9CisKKyAgbG9uZyBoYXNoKGNvbnN0IGNoYXIqIF9fbG93LCBjb25zdCBjaGFyKiBfX2hpZ2gpIGNvbnN0CisgICAgeyByZXR1cm4gZG9faGFzaChfX2xvdywgX19oaWdoKTsgfQorCisgIHN0YXRpYyBfU1RMUF9TVEFUSUNfTUVNQkVSX0RFQ0xTUEVDIGxvY2FsZTo6aWQgaWQ7CisKK3Byb3RlY3RlZDoKKyAgfmNvbGxhdGUoKTsKKworICB2aXJ0dWFsIGludCBkb19jb21wYXJlKGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopIGNvbnN0OworICB2aXJ0dWFsIHN0cmluZ190eXBlIGRvX3RyYW5zZm9ybShjb25zdCBjaGFyKiwgY29uc3QgY2hhciopIGNvbnN0OworICB2aXJ0dWFsIGxvbmcgZG9faGFzaChjb25zdCBjaGFyKiwgY29uc3QgY2hhciopIGNvbnN0OworcHJpdmF0ZToKKyAgY29sbGF0ZShjb25zdCBjb2xsYXRlPGNoYXI+Jik7CisgIGNvbGxhdGU8Y2hhcj4mIG9wZXJhdG9yID0oY29uc3QgY29sbGF0ZTxjaGFyPiYpOworfTsKKworIyBpZm5kZWYgX1NUTFBfTk9fV0NIQVJfVAorCitfU1RMUF9URU1QTEFURV9OVUxMCitjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBjb2xsYXRlPHdjaGFyX3Q+IDogcHVibGljIGxvY2FsZTo6ZmFjZXQKK3sKKyAgZnJpZW5kIGNsYXNzIF9Mb2NhbGVfaW1wbDsKKworcHVibGljOgorICB0eXBlZGVmIHdjaGFyX3QgY2hhcl90eXBlOworICB0eXBlZGVmIHdzdHJpbmcgc3RyaW5nX3R5cGU7CisKKyAgZXhwbGljaXQgY29sbGF0ZShzaXplX3QgX19yZWZzID0gMCkgOiBsb2NhbGU6OmZhY2V0KF9fcmVmcykge30KKworICBpbnQgY29tcGFyZShjb25zdCB3Y2hhcl90KiBfX2xvdzEsIGNvbnN0IHdjaGFyX3QqIF9faGlnaDEsCisgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIF9fbG93MiwgY29uc3Qgd2NoYXJfdCogX19oaWdoMikgY29uc3QgeworICAgIHJldHVybiBkb19jb21wYXJlKCBfX2xvdzEsIF9faGlnaDEsIF9fbG93MiwgX19oaWdoMik7CisgIH0KKworICBzdHJpbmdfdHlwZSB0cmFuc2Zvcm0oY29uc3Qgd2NoYXJfdCogX19sb3csIGNvbnN0IHdjaGFyX3QqIF9faGlnaCkgY29uc3QgeworICAgIHJldHVybiBkb190cmFuc2Zvcm0oX19sb3csIF9faGlnaCk7CisgIH0KKworICBsb25nIGhhc2goY29uc3Qgd2NoYXJfdCogX19sb3csIGNvbnN0IHdjaGFyX3QqIF9faGlnaCkgY29uc3QKKyAgICB7IHJldHVybiBkb19oYXNoKF9fbG93LCBfX2hpZ2gpOyB9CisKKyAgc3RhdGljIF9TVExQX1NUQVRJQ19NRU1CRVJfREVDTFNQRUMgbG9jYWxlOjppZCBpZDsKKworcHJvdGVjdGVkOgorICB+Y29sbGF0ZSgpOworCisgIHZpcnR1YWwgaW50IGRvX2NvbXBhcmUoY29uc3Qgd2NoYXJfdCosIGNvbnN0IHdjaGFyX3QqLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqLCBjb25zdCB3Y2hhcl90KikgY29uc3Q7CisgIHZpcnR1YWwgc3RyaW5nX3R5cGUgZG9fdHJhbnNmb3JtKGNvbnN0IHdjaGFyX3QqLCBjb25zdCB3Y2hhcl90KikgY29uc3Q7CisgIHZpcnR1YWwgbG9uZyBkb19oYXNoKGNvbnN0IHdjaGFyX3QqIF9fbG93LCBjb25zdCB3Y2hhcl90KiBfX2hpZ2gpIGNvbnN0OworcHJpdmF0ZToKKyAgY29sbGF0ZShjb25zdCBjb2xsYXRlPHdjaGFyX3Q+Jik7CisgIGNvbGxhdGU8d2NoYXJfdD4mIG9wZXJhdG9yID0gKGNvbnN0IGNvbGxhdGU8d2NoYXJfdD4mKTsKK307CisKKyMgZW5kaWYgLyogTk9fV0NIQVJfVCAqLworCitfU1RMUF9URU1QTEFURV9OVUxMCitjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBjb2xsYXRlX2J5bmFtZTxjaGFyPjogcHVibGljIGNvbGxhdGU8Y2hhcj4KK3sKK3B1YmxpYzoKKyAgZXhwbGljaXQgY29sbGF0ZV9ieW5hbWUoY29uc3QgY2hhciogX19uYW1lLCBzaXplX3QgX19yZWZzID0gMCwgX0xvY2FsZV9uYW1lX2hpbnQqIF9faGludCA9IDApOworCitwcm90ZWN0ZWQ6CisgIH5jb2xsYXRlX2J5bmFtZSgpOworCisgIHZpcnR1YWwgaW50IGRvX2NvbXBhcmUoY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKikgY29uc3Q7CisgIHZpcnR1YWwgc3RyaW5nX3R5cGUgZG9fdHJhbnNmb3JtKGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKikgY29uc3Q7CisKK3ByaXZhdGU6CisgIF9Mb2NhbGVfY29sbGF0ZSogX01fY29sbGF0ZTsKKyAgY29sbGF0ZV9ieW5hbWUoY29uc3QgY29sbGF0ZV9ieW5hbWU8Y2hhcj4mKTsKKyAgY29sbGF0ZV9ieW5hbWU8Y2hhcj4mIG9wZXJhdG9yID0oY29uc3QgY29sbGF0ZV9ieW5hbWU8Y2hhcj4mKTsKKyAgZnJpZW5kIF9Mb2NhbGVfbmFtZV9oaW50KiBfTG9jYWxlX2V4dHJhY3RfaGludChjb2xsYXRlX2J5bmFtZTxjaGFyPiopOworfTsKKworIyBpZm5kZWYgX1NUTFBfTk9fV0NIQVJfVAorCitfU1RMUF9URU1QTEFURV9OVUxMCitjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBjb2xsYXRlX2J5bmFtZTx3Y2hhcl90PjogcHVibGljIGNvbGxhdGU8d2NoYXJfdD4KK3sKK3B1YmxpYzoKKyAgZXhwbGljaXQgY29sbGF0ZV9ieW5hbWUoY29uc3QgY2hhciAqIF9fbmFtZSwgc2l6ZV90IF9fcmVmcyA9IDAsIF9Mb2NhbGVfbmFtZV9oaW50KiBfX2hpbnQgPSAwKTsKKworcHJvdGVjdGVkOgorICB+Y29sbGF0ZV9ieW5hbWUoKTsKKworICB2aXJ0dWFsIGludCBkb19jb21wYXJlKGNvbnN0IHdjaGFyX3QqLCBjb25zdCB3Y2hhcl90KiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiwgY29uc3Qgd2NoYXJfdCopIGNvbnN0OworICB2aXJ0dWFsIHN0cmluZ190eXBlIGRvX3RyYW5zZm9ybShjb25zdCB3Y2hhcl90KiwgY29uc3Qgd2NoYXJfdCopIGNvbnN0OworCitwcml2YXRlOgorICBfTG9jYWxlX2NvbGxhdGUqIF9NX2NvbGxhdGU7CisgIGNvbGxhdGVfYnluYW1lKGNvbnN0IGNvbGxhdGVfYnluYW1lPHdjaGFyX3Q+Jik7CisgIGNvbGxhdGVfYnluYW1lPHdjaGFyX3Q+JiBvcGVyYXRvciA9KGNvbnN0IGNvbGxhdGVfYnluYW1lPHdjaGFyX3Q+Jik7Cit9OworCisjIGVuZGlmIC8qIE5PX1dDSEFSX1QgKi8KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorYm9vbAorX19sb2NhbGVfZG9fb3BlcmF0b3JfY2FsbCAoY29uc3QgbG9jYWxlJiBfX2xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9feSkgeworICBjb2xsYXRlPF9DaGFyVD4gY29uc3QmIF9fY29sbCA9IHVzZV9mYWNldDxjb2xsYXRlPF9DaGFyVD4gPihfX2xvYyk7CisgIHJldHVybiBfX2NvbGwuY29tcGFyZShfX3guZGF0YSgpLCBfX3guZGF0YSgpICsgX194LnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9feS5kYXRhKCksIF9feS5kYXRhKCkgKyBfX3kuc2l6ZSgpKSA8IDA7Cit9CisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2VuZGlmIC8qIF9TVExQX0lOVEVSTkFMX0NPTExBVEVfSCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RsL19jb21wbGV4LmMgYi9zdGwvX2NvbXBsZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTMyNjBiCi0tLSAvZGV2L251bGwKKysrIGIvc3RsL19jb21wbGV4LmMKQEAgLTAsMCArMSwxNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisjaWZuZGVmIF9TVExQX0NPTVBMRVhfQworI2RlZmluZSBfU1RMUF9DT01QTEVYX0MKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DT01QTEVYCisjICBpbmNsdWRlIDxzdGwvX2NvbXBsZXguaD4KKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKF9TVExQX1VTRV9OT19JT1NUUkVBTVMpCisjICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfSVNUUkVBTQorIyAgICBpbmNsdWRlIDxzdGwvX2lzdHJlYW0uaD4KKyMgIGVuZGlmCisKKyMgIGlmbmRlZiBfU1RMUF9JTlRFUk5BTF9TU1RSRUFNCisjICAgIGluY2x1ZGUgPHN0bC9fc3N0cmVhbS5oPgorIyAgZW5kaWYKKworIyAgaWZuZGVmIF9TVExQX1NUUklOR19JT19ICisjICAgIGluY2x1ZGUgPHN0bC9fc3RyaW5nX2lvLmg+CisjICBlbmRpZgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisvLyBOb24taW5saW5lIG1lbWJlciBmdW5jdGlvbnMuCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+Cit2b2lkIGNvbXBsZXg8X1RwPjo6X2Rpdihjb25zdCBfVHAmIF9fejFfciwgY29uc3QgX1RwJiBfX3oxX2ksCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfVHAmIF9fejJfciwgY29uc3QgX1RwJiBfX3oyX2ksCisgICAgICAgICAgICAgICAgICAgICAgICBfVHAmIF9fcmVzX3IsIF9UcCYgX19yZXNfaSkgeworICBfVHAgX19hciA9IF9fejJfciA+PSAwID8gX196Ml9yIDogLV9fejJfcjsKKyAgX1RwIF9fYWkgPSBfX3oyX2kgPj0gMCA/IF9fejJfaSA6IC1fX3oyX2k7CisKKyAgaWYgKF9fYXIgPD0gX19haSkgeworICAgIF9UcCBfX3JhdGlvID0gX196Ml9yIC8gX196Ml9pOworICAgIF9UcCBfX2Rlbm9tID0gX196Ml9pICogKDEgKyBfX3JhdGlvICogX19yYXRpbyk7CisgICAgX19yZXNfciA9IChfX3oxX3IgKiBfX3JhdGlvICsgX196MV9pKSAvIF9fZGVub207CisgICAgX19yZXNfaSA9IChfX3oxX2kgKiBfX3JhdGlvIC0gX196MV9yKSAvIF9fZGVub207CisgIH0KKyAgZWxzZSB7CisgICAgX1RwIF9fcmF0aW8gPSBfX3oyX2kgLyBfX3oyX3I7CisgICAgX1RwIF9fZGVub20gPSBfX3oyX3IgKiAoMSArIF9fcmF0aW8gKiBfX3JhdGlvKTsKKyAgICBfX3Jlc19yID0gKF9fejFfciArIF9fejFfaSAqIF9fcmF0aW8pIC8gX19kZW5vbTsKKyAgICBfX3Jlc19pID0gKF9fejFfaSAtIF9fejFfciAqIF9fcmF0aW8pIC8gX19kZW5vbTsKKyAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgordm9pZCBjb21wbGV4PF9UcD46Ol9kaXYoY29uc3QgX1RwJiBfX3oxX3IsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfVHAmIF9fejJfciwgY29uc3QgX1RwJiBfX3oyX2ksCisgICAgICAgICAgICAgICAgICAgICAgICBfVHAmIF9fcmVzX3IsIF9UcCYgX19yZXNfaSkgeworICBfVHAgX19hciA9IF9fejJfciA+PSAwID8gX196Ml9yIDogLV9fejJfcjsKKyAgX1RwIF9fYWkgPSBfX3oyX2kgPj0gMCA/IF9fejJfaSA6IC1fX3oyX2k7CisKKyAgaWYgKF9fYXIgPD0gX19haSkgeworICAgIF9UcCBfX3JhdGlvID0gX196Ml9yIC8gX196Ml9pOworICAgIF9UcCBfX2Rlbm9tID0gX196Ml9pICogKDEgKyBfX3JhdGlvICogX19yYXRpbyk7CisgICAgX19yZXNfciA9IChfX3oxX3IgKiBfX3JhdGlvKSAvIF9fZGVub207CisgICAgX19yZXNfaSA9IC0gX196MV9yIC8gX19kZW5vbTsKKyAgfQorICBlbHNlIHsKKyAgICBfVHAgX19yYXRpbyA9IF9fejJfaSAvIF9fejJfcjsKKyAgICBfVHAgX19kZW5vbSA9IF9fejJfciAqICgxICsgX19yYXRpbyAqIF9fcmF0aW8pOworICAgIF9fcmVzX3IgPSBfX3oxX3IgLyBfX2Rlbm9tOworICAgIF9fcmVzX2kgPSAtIChfX3oxX3IgKiBfX3JhdGlvKSAvIF9fZGVub207CisgIH0KK30KKworLy8gSS9PLgorI2lmICFkZWZpbmVkIChfU1RMUF9VU0VfTk9fSU9TVFJFQU1TKQorCisvLyBDb21wbGV4IG91dHB1dCwgaW4gdGhlIGZvcm0gKHJlLGltKS4gIFdlIHVzZSBhIHR3by1zdGVwIHByb2Nlc3MKKy8vIGludm9sdmluZyBzdHJpbmdzdHJlYW0gc28gdGhhdCB3ZSBnZXQgdGhlIHBhZGRpbmcgcmlnaHQuCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9TVExQX0NBTEwKK29wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLCBjb25zdCBjb21wbGV4PF9UcD4mIF9feikgeworICBiYXNpY19vc3RyaW5nc3RyZWFtPF9DaGFyVCwgX1RyYWl0cywgYWxsb2NhdG9yPF9DaGFyVD4gPiBfX3RtcDsKKyAgX190bXAuZmxhZ3MoX19vcy5mbGFncygpKTsKKyAgX190bXAuaW1idWUoX19vcy5nZXRsb2MoKSk7CisgIF9fdG1wLnByZWNpc2lvbihfX29zLnByZWNpc2lvbigpKTsKKyAgX190bXAgPDwgJygnIDw8IF9fei5yZWFsKCkgPDwgJywnIDw8IF9fei5pbWFnKCkgPDwgJyknOworICByZXR1cm4gX19vcyA8PCBfX3RtcC5zdHIoKTsKK30KKworLy8gQ29tcGxleCBpbnB1dCBmcm9tIGFyYml0cmFyeSBzdHJlYW1zLiAgTm90ZSB0aGF0IHJlc3VsdHMgaW4gc29tZQorLy8gbG9jYWxlcyBtYXkgYmUgY29uZnVzaW5nLCBzaW5jZSB0aGUgZGVjaW1hbCBjaGFyYWN0ZXIgdmFyaWVzIHdpdGgKKy8vIGxvY2FsZSBhbmQgdGhlIHNlcGFyYXRvciBiZXR3ZWVuIHJlYWwgYW5kIGltYWdpbmFyeSBwYXJ0cyBkb2VzIG5vdC4KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfU1RMUF9DQUxMCitvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywgY29tcGxleDxfVHA+JiBfX3opIHsKKyAgX1RwICBfX3JlID0gMDsKKyAgX1RwICBfX2ltID0gMDsKKworICAvLyB0eXBlZGVmIGN0eXBlPF9DaGFyVD4gX0N0eXBlOworICAvLyAgbG9jYWxlIF9fbG9jID0gX19pcy5nZXRsb2MoKTsKKyAgLy9jb25zdCBfQ3R5cGUmICBfX2NfdHlwZSAgPSB1c2VfZmFjZXQ8X0N0eXBlPihfX2xvYyk7CisgIGNvbnN0IGN0eXBlPF9DaGFyVD4mIF9fY190eXBlID0gKl9fU1RBVElDX0NBU1QoY29uc3QgY3R5cGU8X0NoYXJUPiosIF9faXMuX01fY3R5cGVfZmFjZXQoKSk7CisKKyAgY29uc3QgY2hhciBfX3B1bmN0WzRdID0gIigsKSI7CisgIF9DaGFyVCBfX3dwdW5jdFszXTsKKyAgX19jX3R5cGUud2lkZW4oX19wdW5jdCwgX19wdW5jdCArIDMsIF9fd3B1bmN0KTsKKworICBfQ2hhclQgX19jOworCisgIF9faXMgPj4gX19jOworICBpZiAoX1RyYWl0czo6ZXEoX19jLCBfX3dwdW5jdFswXSkpIHsgIC8vIExlZnQgcGFyZW4KKyAgICBfX2lzID4+IF9fcmUgPj4gX19jOworICAgIGlmIChfVHJhaXRzOjplcShfX2MsIF9fd3B1bmN0WzFdKSkgIC8vIENvbW1hCisgICAgICBfX2lzID4+IF9faW0gPj4gX19jOworICAgIGlmICghX1RyYWl0czo6ZXEoX19jLCBfX3dwdW5jdFsyXSkpIC8vIFJpZ2h0IHBhcmVuCisgICAgICBfX2lzLnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKKyAgfQorICBlbHNlIHsKKyAgICBfX2lzLnB1dGJhY2soX19jKTsKKyAgICBfX2lzID4+IF9fcmU7CisgIH0KKworICBpZiAoX19pcykKKyAgICBfX3ogPSBjb21wbGV4PF9UcD4oX19yZSwgX19pbSk7CisgIHJldHVybiBfX2lzOworfQorCisjZW5kaWYgLyogX1NUTFBfVVNFX05PX0lPU1RSRUFNUyAqLworCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNlbmRpZiAvKiBfU1RMUF9DT01QTEVYX0MgKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9fY29tcGxleC5oIGIvc3RsL19jb21wbGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMyMDgwNQotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9fY29tcGxleC5oCkBAIC0wLDAgKzEsOTQ3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DT01QTEVYCisjZGVmaW5lIF9TVExQX0lOVEVSTkFMX0NPTVBMRVgKKworLy8gVGhpcyBoZWFkZXIgZGVjbGFyZXMgdGhlIHRlbXBsYXRlIGNsYXNzIGNvbXBsZXgsIGFzIGRlc2NyaWJlZCBpbgorLy8gaW4gdGhlIGRyYWZ0IEMrKyBzdGFuZGFyZC4gIFNpbmdsZS1wcmVjaXNpb24gY29tcGxleCBudW1iZXJzCisvLyBhcmUgY29tcGxleDxmbG9hdD4sIGRvdWJsZS1wcmVjaXNpb24gYXJlIGNvbXBsZXg8ZG91YmxlPiwgYW5kCisvLyBxdWFkIHByZWNpc2lvbiBhcmUgY29tcGxleDxsb25nIGRvdWJsZT4uCisKKy8vIE5vdGUgdGhhdCB0aGUgdGVtcGxhdGUgY2xhc3MgY29tcGxleCBpcyBkZWNsYXJlZCB3aXRoaW4gbmFtZXNwYWNlCisvLyBzdGQsIGFzIGNhbGxlZCBmb3IgYnkgdGhlIGRyYWZ0IEMrKyBzdGFuZGFyZC4KKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DTUFUSAorIyAgaW5jbHVkZSA8c3RsL19jbWF0aC5oPgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisjaWYgIWRlZmluZWQgKF9TVExQX05PX0NPTVBMRVhfU1BFQ0lBTElaQVRJT05TKSAgICAvLypUWSAwMi8yNS8yMDAwIC0gYWRkZWQgZm9yIE1QVyBjb21waWxlciB3b3JrYXJvdW5kCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCBjb21wbGV4OworCitfU1RMUF9URU1QTEFURV9OVUxMIHN0cnVjdCBjb21wbGV4PGZsb2F0PjsKK19TVExQX1RFTVBMQVRFX05VTEwgc3RydWN0IGNvbXBsZXg8ZG91YmxlPjsKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9OT19MT05HX0RPVUJMRSkKK19TVExQX1RFTVBMQVRFX05VTEwgc3RydWN0IGNvbXBsZXg8bG9uZyBkb3VibGU+OworIyAgZW5kaWYKKyNlbmRpZiAvKiBfU1RMUF9OT19DT01QTEVYX1NQRUNJQUxJWkFUSU9OUyAqLworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IGNvbXBsZXggeworICB0eXBlZGVmIF9UcCB2YWx1ZV90eXBlOworICB0eXBlZGVmIGNvbXBsZXg8X1RwPiBfU2VsZjsKKworICAvLyBDb25zdHJ1Y3RvcnMsIGRlc3RydWN0b3IsIGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgIGNvbXBsZXgoKSA6IF9NX3JlKDApLCBfTV9pbSgwKSB7fQorICBjb21wbGV4KGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICA6IF9NX3JlKF9feCksIF9NX2ltKDApIHt9CisgIGNvbXBsZXgoY29uc3QgdmFsdWVfdHlwZSYgX194LCBjb25zdCB2YWx1ZV90eXBlJiBfX3kpCisgICAgOiBfTV9yZShfX3gpLCBfTV9pbShfX3kpIHt9CisgIGNvbXBsZXgoY29uc3QgX1NlbGYmIF9feikKKyAgICA6IF9NX3JlKF9fei5fTV9yZSksIF9NX2ltKF9fei5fTV9pbSkge30KKworICBfU2VsZiYgb3BlcmF0b3I9KGNvbnN0IF9TZWxmJiBfX3opIHsKKyAgICBfTV9yZSA9IF9fei5fTV9yZTsKKyAgICBfTV9pbSA9IF9fei5fTV9pbTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpICYmIChkZWZpbmVkIChfU1RMUF9GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIpIHx8IGRlZmluZWQoX1NUTFBfTk9fQ09NUExFWF9TUEVDSUFMSVpBVElPTlMpKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwMj4KKyAgZXhwbGljaXQgY29tcGxleChjb25zdCBjb21wbGV4PF9UcDI+JiBfX3opCisgICAgOiBfTV9yZShfX3ouX01fcmUpLCBfTV9pbShfX3ouX01faW0pIHt9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcDI+CisgIF9TZWxmJiBvcGVyYXRvcj0oY29uc3QgY29tcGxleDxfVHAyPiYgX196KSB7CisgICAgX01fcmUgPSBfX3ouX01fcmU7CisgICAgX01faW0gPSBfX3ouX01faW07CisgICAgcmV0dXJuICp0aGlzOworICB9CisjZW5kaWYgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworCisgIC8vIEVsZW1lbnQgYWNjZXNzLgorICB2YWx1ZV90eXBlIHJlYWwoKSBjb25zdCB7IHJldHVybiBfTV9yZTsgfQorICB2YWx1ZV90eXBlIGltYWcoKSBjb25zdCB7IHJldHVybiBfTV9pbTsgfQorCisgIC8vIEFyaXRobWV0aWMgb3A9IG9wZXJhdGlvbnMgaW52b2x2aW5nIG9uZSByZWFsIGFyZ3VtZW50LgorCisgIF9TZWxmJiBvcGVyYXRvcj0gKGNvbnN0IHZhbHVlX3R5cGUmIF9feCkgeworICAgIF9NX3JlID0gX194OworICAgIF9NX2ltID0gMDsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgX1NlbGYmIG9wZXJhdG9yKz0gKGNvbnN0IHZhbHVlX3R5cGUmIF9feCkgeworICAgIF9NX3JlICs9IF9feDsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgX1NlbGYmIG9wZXJhdG9yLT0gKGNvbnN0IHZhbHVlX3R5cGUmIF9feCkgeworICAgIF9NX3JlIC09IF9feDsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgX1NlbGYmIG9wZXJhdG9yKj0gKGNvbnN0IHZhbHVlX3R5cGUmIF9feCkgeworICAgIF9NX3JlICo9IF9feDsKKyAgICBfTV9pbSAqPSBfX3g7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIF9TZWxmJiBvcGVyYXRvci89IChjb25zdCB2YWx1ZV90eXBlJiBfX3gpIHsKKyAgICBfTV9yZSAvPSBfX3g7CisgICAgX01faW0gLz0gX194OworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vIEFyaXRobWV0aWMgb3A9IG9wZXJhdGlvbnMgaW52b2x2aW5nIHR3byBjb21wbGV4IGFyZ3VtZW50cy4KKworICBzdGF0aWMgdm9pZCAgX1NUTFBfQ0FMTCBfZGl2KGNvbnN0IHZhbHVlX3R5cGUmIF9fejFfciwgY29uc3QgdmFsdWVfdHlwZSYgX196MV9pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlX3R5cGUmIF9fejJfciwgY29uc3QgdmFsdWVfdHlwZSYgX196Ml9pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGUmIF9fcmVzX3IsIHZhbHVlX3R5cGUmIF9fcmVzX2kpOworCisgIHN0YXRpYyB2b2lkIF9TVExQX0NBTEwgX2Rpdihjb25zdCB2YWx1ZV90eXBlJiBfX3oxX3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZV90eXBlJiBfX3oyX3IsIGNvbnN0IHZhbHVlX3R5cGUmIF9fejJfaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGUmIF9fcmVzX3IsIHZhbHVlX3R5cGUmIF9fcmVzX2kpOworCisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykgLy8gJiYgZGVmaW5lZCAoX1NUTFBfRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSKQorCisgIHRlbXBsYXRlIDxjbGFzcyBfVHAyPiBfU2VsZiYgb3BlcmF0b3IrPSAoY29uc3QgY29tcGxleDxfVHAyPiYgX196KSB7CisgICAgX01fcmUgKz0gX196Ll9NX3JlOworICAgIF9NX2ltICs9IF9fei5fTV9pbTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwMj4gX1NlbGYmIG9wZXJhdG9yLT0gKGNvbnN0IGNvbXBsZXg8X1RwMj4mIF9feikgeworICAgIF9NX3JlIC09IF9fei5fTV9yZTsKKyAgICBfTV9pbSAtPSBfX3ouX01faW07CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcDI+IF9TZWxmJiBvcGVyYXRvcio9IChjb25zdCBjb21wbGV4PF9UcDI+JiBfX3opIHsKKyAgICB2YWx1ZV90eXBlIF9fciA9IF9NX3JlICogX196Ll9NX3JlIC0gX01faW0gKiBfX3ouX01faW07CisgICAgdmFsdWVfdHlwZSBfX2kgPSBfTV9yZSAqIF9fei5fTV9pbSArIF9NX2ltICogX196Ll9NX3JlOworICAgIF9NX3JlID0gX19yOworICAgIF9NX2ltID0gX19pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfVHAyPiBfU2VsZiYgb3BlcmF0b3IvPSAoY29uc3QgY29tcGxleDxfVHAyPiYgX196KSB7CisgICAgdmFsdWVfdHlwZSBfX3I7CisgICAgdmFsdWVfdHlwZSBfX2k7CisgICAgX2RpdihfTV9yZSwgX01faW0sIF9fei5fTV9yZSwgX196Ll9NX2ltLCBfX3IsIF9faSk7CisgICAgX01fcmUgPSBfX3I7CisgICAgX01faW0gPSBfX2k7CisgICAgcmV0dXJuICp0aGlzOworICB9CisjZW5kaWYgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworCisgIF9TZWxmJiBvcGVyYXRvcis9IChjb25zdCBfU2VsZiYgX196KSB7CisgICAgX01fcmUgKz0gX196Ll9NX3JlOworICAgIF9NX2ltICs9IF9fei5fTV9pbTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBfU2VsZiYgb3BlcmF0b3ItPSAoY29uc3QgX1NlbGYmIF9feikgeworICAgIF9NX3JlIC09IF9fei5fTV9yZTsKKyAgICBfTV9pbSAtPSBfX3ouX01faW07CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgX1NlbGYmIG9wZXJhdG9yKj0gKGNvbnN0IF9TZWxmJiBfX3opIHsKKyAgICB2YWx1ZV90eXBlIF9fciA9IF9NX3JlICogX196Ll9NX3JlIC0gX01faW0gKiBfX3ouX01faW07CisgICAgdmFsdWVfdHlwZSBfX2kgPSBfTV9yZSAqIF9fei5fTV9pbSArIF9NX2ltICogX196Ll9NX3JlOworICAgIF9NX3JlID0gX19yOworICAgIF9NX2ltID0gX19pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIF9TZWxmJiBvcGVyYXRvci89IChjb25zdCBfU2VsZiYgX196KSB7CisgICAgdmFsdWVfdHlwZSBfX3I7CisgICAgdmFsdWVfdHlwZSBfX2k7CisgICAgX2RpdihfTV9yZSwgX01faW0sIF9fei5fTV9yZSwgX196Ll9NX2ltLCBfX3IsIF9faSk7CisgICAgX01fcmUgPSBfX3I7CisgICAgX01faW0gPSBfX2k7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8gRGF0YSBtZW1iZXJzLgorICB2YWx1ZV90eXBlIF9NX3JlOworICB2YWx1ZV90eXBlIF9NX2ltOworfTsKKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19DT01QTEVYX1NQRUNJQUxJWkFUSU9OUykgICAgLy8qVFkgMDIvMjUvMjAwMCAtIGFkZGVkIGZvciBNUFcgY29tcGlsZXIgd29ya2Fyb3VuZAorLy8gRXhwbGljaXQgc3BlY2lhbGl6YXRpb25zIGZvciBmbG9hdCwgZG91YmxlLCBsb25nIGRvdWJsZS4gIFRoZSBvbmx5CisvLyByZWFzb24gZm9yIHRoZXNlIHNwZWNpYWxpemF0aW9ucyBpcyB0byBlbmFibGUgYXV0b21hdGljIGNvbnZlcnNpb25zCisvLyBmcm9tIGNvbXBsZXg8ZmxvYXQ+IHRvIGNvbXBsZXg8ZG91YmxlPiwgYW5kIGNvbXBsZXg8ZG91YmxlPiB0bworLy8gY29tcGxleDxsb25nIGRvdWJsZT4uCisKK19TVExQX1RFTVBMQVRFX05VTEwKK3N0cnVjdCBfU1RMUF9DTEFTU19ERUNMU1BFQyBjb21wbGV4PGZsb2F0PiB7CisgIHR5cGVkZWYgZmxvYXQgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiBjb21wbGV4PGZsb2F0PiBfU2VsZjsKKyAgLy8gQ29uc3RydWN0b3JzLCBkZXN0cnVjdG9yLCBhc3NpZ25tZW50IG9wZXJhdG9yLgorCisgIGNvbXBsZXgodmFsdWVfdHlwZSBfX3ggPSAwLjBmLCB2YWx1ZV90eXBlIF9feSA9IDAuMGYpCisgICAgOiBfTV9yZShfX3gpLCBfTV9pbShfX3kpIHt9CisKKyAgY29tcGxleChjb25zdCBjb21wbGV4PGZsb2F0PiYgX196KSAgICA6IF9NX3JlKF9fei5fTV9yZSksIF9NX2ltKF9fei5fTV9pbSkge30KKworICBpbmxpbmUgZXhwbGljaXQgY29tcGxleChjb25zdCBjb21wbGV4PGRvdWJsZT4mIF9feik7CisjICBpZm5kZWYgX1NUTFBfTk9fTE9OR19ET1VCTEUKKyAgaW5saW5lIGV4cGxpY2l0IGNvbXBsZXgoY29uc3QgY29tcGxleDxsb25nIGRvdWJsZT4mIF9feik7CisjICBlbmRpZgorICAvLyBFbGVtZW50IGFjY2Vzcy4KKyAgdmFsdWVfdHlwZSByZWFsKCkgY29uc3QgeyByZXR1cm4gX01fcmU7IH0KKyAgdmFsdWVfdHlwZSBpbWFnKCkgY29uc3QgeyByZXR1cm4gX01faW07IH0KKworICAvLyBBcml0aG1ldGljIG9wPSBvcGVyYXRpb25zIGludm9sdmluZyBvbmUgcmVhbCBhcmd1bWVudC4KKworICBfU2VsZiYgb3BlcmF0b3I9ICh2YWx1ZV90eXBlIF9feCkgeworICAgIF9NX3JlID0gX194OworICAgIF9NX2ltID0gMC4wZjsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgX1NlbGYmIG9wZXJhdG9yKz0gKHZhbHVlX3R5cGUgX194KSB7CisgICAgX01fcmUgKz0gX194OworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBfU2VsZiYgb3BlcmF0b3ItPSAodmFsdWVfdHlwZSBfX3gpIHsKKyAgICBfTV9yZSAtPSBfX3g7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIF9TZWxmJiBvcGVyYXRvcio9ICh2YWx1ZV90eXBlIF9feCkgeworICAgIF9NX3JlICo9IF9feDsKKyAgICBfTV9pbSAqPSBfX3g7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIF9TZWxmJiBvcGVyYXRvci89ICh2YWx1ZV90eXBlIF9feCkgeworICAgIF9NX3JlIC89IF9feDsKKyAgICBfTV9pbSAvPSBfX3g7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8gQXJpdGhtZXRpYyBvcD0gb3BlcmF0aW9ucyBpbnZvbHZpbmcgdHdvIGNvbXBsZXggYXJndW1lbnRzLgorCisgIHN0YXRpYyB2b2lkIF9TVExQX0NBTEwgX2Rpdihjb25zdCBmbG9hdCYgX196MV9yLCBjb25zdCBmbG9hdCYgX196MV9pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQmIF9fejJfciwgY29uc3QgZmxvYXQmIF9fejJfaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0JiBfX3Jlc19yLCBmbG9hdCYgX19yZXNfaSk7CisKKyAgc3RhdGljIHZvaWQgX1NUTFBfQ0FMTCBfZGl2KGNvbnN0IGZsb2F0JiBfX3oxX3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCYgX196Ml9yLCBjb25zdCBmbG9hdCYgX196Ml9pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQmIF9fcmVzX3IsIGZsb2F0JiBfX3Jlc19pKTsKKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcDI+CisgIGNvbXBsZXg8ZmxvYXQ+JiBvcGVyYXRvcj0oY29uc3QgY29tcGxleDxfVHAyPiYgX196KSB7CisgICAgX01fcmUgPSBfX3ouX01fcmU7CisgICAgX01faW0gPSBfX3ouX01faW07CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcDI+CisgIGNvbXBsZXg8ZmxvYXQ+JiBvcGVyYXRvcis9IChjb25zdCBjb21wbGV4PF9UcDI+JiBfX3opIHsKKyAgICBfTV9yZSArPSBfX3ouX01fcmU7CisgICAgX01faW0gKz0gX196Ll9NX2ltOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfVHAyPgorICBjb21wbGV4PGZsb2F0PiYgb3BlcmF0b3ItPSAoY29uc3QgY29tcGxleDxfVHAyPiYgX196KSB7CisgICAgX01fcmUgLT0gX196Ll9NX3JlOworICAgIF9NX2ltIC09IF9fei5fTV9pbTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwMj4KKyAgY29tcGxleDxmbG9hdD4mIG9wZXJhdG9yKj0gKGNvbnN0IGNvbXBsZXg8X1RwMj4mIF9feikgeworICAgIGZsb2F0IF9fciA9IF9NX3JlICogX196Ll9NX3JlIC0gX01faW0gKiBfX3ouX01faW07CisgICAgZmxvYXQgX19pID0gX01fcmUgKiBfX3ouX01faW0gKyBfTV9pbSAqIF9fei5fTV9yZTsKKyAgICBfTV9yZSA9IF9fcjsKKyAgICBfTV9pbSA9IF9faTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwMj4KKyAgY29tcGxleDxmbG9hdD4mIG9wZXJhdG9yLz0gKGNvbnN0IGNvbXBsZXg8X1RwMj4mIF9feikgeworICAgIGZsb2F0IF9fcjsKKyAgICBmbG9hdCBfX2k7CisgICAgX2RpdihfTV9yZSwgX01faW0sIF9fei5fTV9yZSwgX196Ll9NX2ltLCBfX3IsIF9faSk7CisgICAgX01fcmUgPSBfX3I7CisgICAgX01faW0gPSBfX2k7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyMgIGVuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKworICBfU2VsZiYgb3BlcmF0b3I9KGNvbnN0IF9TZWxmJiBfX3opIHsKKyAgICBfTV9yZSA9IF9fei5fTV9yZTsKKyAgICBfTV9pbSA9IF9fei5fTV9pbTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBfU2VsZiYgb3BlcmF0b3IrPSAoY29uc3QgX1NlbGYmIF9feikgeworICAgIF9NX3JlICs9IF9fei5fTV9yZTsKKyAgICBfTV9pbSArPSBfX3ouX01faW07CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgX1NlbGYmIG9wZXJhdG9yLT0gKGNvbnN0IF9TZWxmJiBfX3opIHsKKyAgICBfTV9yZSAtPSBfX3ouX01fcmU7CisgICAgX01faW0gLT0gX196Ll9NX2ltOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIF9TZWxmJiBvcGVyYXRvcio9IChjb25zdCBfU2VsZiYgX196KSB7CisgICAgdmFsdWVfdHlwZSBfX3IgPSBfTV9yZSAqIF9fei5fTV9yZSAtIF9NX2ltICogX196Ll9NX2ltOworICAgIHZhbHVlX3R5cGUgX19pID0gX01fcmUgKiBfX3ouX01faW0gKyBfTV9pbSAqIF9fei5fTV9yZTsKKyAgICBfTV9yZSA9IF9fcjsKKyAgICBfTV9pbSA9IF9faTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBfU2VsZiYgb3BlcmF0b3IvPSAoY29uc3QgX1NlbGYmIF9feikgeworICAgIHZhbHVlX3R5cGUgX19yOworICAgIHZhbHVlX3R5cGUgX19pOworICAgIF9kaXYoX01fcmUsIF9NX2ltLCBfX3ouX01fcmUsIF9fei5fTV9pbSwgX19yLCBfX2kpOworICAgIF9NX3JlID0gX19yOworICAgIF9NX2ltID0gX19pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vIERhdGEgbWVtYmVycy4KKyAgdmFsdWVfdHlwZSBfTV9yZTsKKyAgdmFsdWVfdHlwZSBfTV9pbTsKK307CisKK19TVExQX1RFTVBMQVRFX05VTEwKK3N0cnVjdCBfU1RMUF9DTEFTU19ERUNMU1BFQyBjb21wbGV4PGRvdWJsZT4geworICB0eXBlZGVmIGRvdWJsZSB2YWx1ZV90eXBlOworICB0eXBlZGVmIGNvbXBsZXg8ZG91YmxlPiBfU2VsZjsKKworICAvLyBDb25zdHJ1Y3RvcnMsIGRlc3RydWN0b3IsIGFzc2lnbm1lbnQgb3BlcmF0b3IuCisKKyAgY29tcGxleCh2YWx1ZV90eXBlIF9feCA9IDAuMCwgdmFsdWVfdHlwZSBfX3kgPSAwLjApCisgICAgOiBfTV9yZShfX3gpLCBfTV9pbShfX3kpIHt9CisKKyAgY29tcGxleChjb25zdCBjb21wbGV4PGRvdWJsZT4mIF9feikKKyAgICA6IF9NX3JlKF9fei5fTV9yZSksIF9NX2ltKF9fei5fTV9pbSkge30KKyAgaW5saW5lIGNvbXBsZXgoY29uc3QgY29tcGxleDxmbG9hdD4mIF9feik7CisjICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTE9OR19ET1VCTEUpCisgIGV4cGxpY2l0IGlubGluZSBjb21wbGV4KGNvbnN0IGNvbXBsZXg8bG9uZyBkb3VibGU+JiBfX3opOworIyAgZW5kaWYKKyAgLy8gRWxlbWVudCBhY2Nlc3MuCisgIHZhbHVlX3R5cGUgcmVhbCgpIGNvbnN0IHsgcmV0dXJuIF9NX3JlOyB9CisgIHZhbHVlX3R5cGUgaW1hZygpIGNvbnN0IHsgcmV0dXJuIF9NX2ltOyB9CisKKyAgLy8gQXJpdGhtZXRpYyBvcD0gb3BlcmF0aW9ucyBpbnZvbHZpbmcgb25lIHJlYWwgYXJndW1lbnQuCisKKyAgX1NlbGYmIG9wZXJhdG9yPSAodmFsdWVfdHlwZSBfX3gpIHsKKyAgICBfTV9yZSA9IF9feDsKKyAgICBfTV9pbSA9IDAuMDsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgX1NlbGYmIG9wZXJhdG9yKz0gKHZhbHVlX3R5cGUgX194KSB7CisgICAgX01fcmUgKz0gX194OworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBfU2VsZiYgb3BlcmF0b3ItPSAodmFsdWVfdHlwZSBfX3gpIHsKKyAgICBfTV9yZSAtPSBfX3g7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIF9TZWxmJiBvcGVyYXRvcio9ICh2YWx1ZV90eXBlIF9feCkgeworICAgIF9NX3JlICo9IF9feDsKKyAgICBfTV9pbSAqPSBfX3g7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIF9TZWxmJiBvcGVyYXRvci89ICh2YWx1ZV90eXBlIF9feCkgeworICAgIF9NX3JlIC89IF9feDsKKyAgICBfTV9pbSAvPSBfX3g7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8gQXJpdGhtZXRpYyBvcD0gb3BlcmF0aW9ucyBpbnZvbHZpbmcgdHdvIGNvbXBsZXggYXJndW1lbnRzLgorCisgIHN0YXRpYyB2b2lkIF9TVExQX0NBTEwgX2Rpdihjb25zdCBkb3VibGUmIF9fejFfciwgY29uc3QgZG91YmxlJiBfX3oxX2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUmIF9fejJfciwgY29uc3QgZG91YmxlJiBfX3oyX2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUmIF9fcmVzX3IsIGRvdWJsZSYgX19yZXNfaSk7CisgIHN0YXRpYyB2b2lkIF9TVExQX0NBTEwgX2Rpdihjb25zdCBkb3VibGUmIF9fejFfciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSYgX196Ml9yLCBjb25zdCBkb3VibGUmIF9fejJfaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSYgX19yZXNfciwgZG91YmxlJiBfX3Jlc19pKTsKKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykgJiYgZGVmaW5lZCAoX1NUTFBfRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwMj4KKyAgY29tcGxleDxkb3VibGU+JiBvcGVyYXRvcj0oY29uc3QgY29tcGxleDxfVHAyPiYgX196KSB7CisgICAgX01fcmUgPSBfX3ouX01fcmU7CisgICAgX01faW0gPSBfX3ouX01faW07CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcDI+CisgIGNvbXBsZXg8ZG91YmxlPiYgb3BlcmF0b3IrPSAoY29uc3QgY29tcGxleDxfVHAyPiYgX196KSB7CisgICAgX01fcmUgKz0gX196Ll9NX3JlOworICAgIF9NX2ltICs9IF9fei5fTV9pbTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwMj4KKyAgY29tcGxleDxkb3VibGU+JiBvcGVyYXRvci09IChjb25zdCBjb21wbGV4PF9UcDI+JiBfX3opIHsKKyAgICBfTV9yZSAtPSBfX3ouX01fcmU7CisgICAgX01faW0gLT0gX196Ll9NX2ltOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfVHAyPgorICBjb21wbGV4PGRvdWJsZT4mIG9wZXJhdG9yKj0gKGNvbnN0IGNvbXBsZXg8X1RwMj4mIF9feikgeworICAgIGRvdWJsZSBfX3IgPSBfTV9yZSAqIF9fei5fTV9yZSAtIF9NX2ltICogX196Ll9NX2ltOworICAgIGRvdWJsZSBfX2kgPSBfTV9yZSAqIF9fei5fTV9pbSArIF9NX2ltICogX196Ll9NX3JlOworICAgIF9NX3JlID0gX19yOworICAgIF9NX2ltID0gX19pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfVHAyPgorICBjb21wbGV4PGRvdWJsZT4mIG9wZXJhdG9yLz0gKGNvbnN0IGNvbXBsZXg8X1RwMj4mIF9feikgeworICAgIGRvdWJsZSBfX3I7CisgICAgZG91YmxlIF9faTsKKyAgICBfZGl2KF9NX3JlLCBfTV9pbSwgX196Ll9NX3JlLCBfX3ouX01faW0sIF9fciwgX19pKTsKKyAgICBfTV9yZSA9IF9fcjsKKyAgICBfTV9pbSA9IF9faTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworIyAgZW5kaWYgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworCisgIF9TZWxmJiBvcGVyYXRvcj0oY29uc3QgX1NlbGYmIF9feikgeworICAgIF9NX3JlID0gX196Ll9NX3JlOworICAgIF9NX2ltID0gX196Ll9NX2ltOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIF9TZWxmJiBvcGVyYXRvcis9IChjb25zdCBfU2VsZiYgX196KSB7CisgICAgX01fcmUgKz0gX196Ll9NX3JlOworICAgIF9NX2ltICs9IF9fei5fTV9pbTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBfU2VsZiYgb3BlcmF0b3ItPSAoY29uc3QgX1NlbGYmIF9feikgeworICAgIF9NX3JlIC09IF9fei5fTV9yZTsKKyAgICBfTV9pbSAtPSBfX3ouX01faW07CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgX1NlbGYmIG9wZXJhdG9yKj0gKGNvbnN0IF9TZWxmJiBfX3opIHsKKyAgICB2YWx1ZV90eXBlIF9fciA9IF9NX3JlICogX196Ll9NX3JlIC0gX01faW0gKiBfX3ouX01faW07CisgICAgdmFsdWVfdHlwZSBfX2kgPSBfTV9yZSAqIF9fei5fTV9pbSArIF9NX2ltICogX196Ll9NX3JlOworICAgIF9NX3JlID0gX19yOworICAgIF9NX2ltID0gX19pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIF9TZWxmJiBvcGVyYXRvci89IChjb25zdCBfU2VsZiYgX196KSB7CisgICAgdmFsdWVfdHlwZSBfX3I7CisgICAgdmFsdWVfdHlwZSBfX2k7CisgICAgX2RpdihfTV9yZSwgX01faW0sIF9fei5fTV9yZSwgX196Ll9NX2ltLCBfX3IsIF9faSk7CisgICAgX01fcmUgPSBfX3I7CisgICAgX01faW0gPSBfX2k7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8gRGF0YSBtZW1iZXJzLgorICB2YWx1ZV90eXBlIF9NX3JlOworICB2YWx1ZV90eXBlIF9NX2ltOworfTsKKworIyAgaWYgIWRlZmluZWQgKF9TVExQX05PX0xPTkdfRE9VQkxFKQorCitfU1RMUF9URU1QTEFURV9OVUxMCitzdHJ1Y3QgX1NUTFBfQ0xBU1NfREVDTFNQRUMgY29tcGxleDxsb25nIGRvdWJsZT4geworICB0eXBlZGVmIGxvbmcgZG91YmxlIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgY29tcGxleDxsb25nIGRvdWJsZT4gX1NlbGY7CisKKyAgLy8gQ29uc3RydWN0b3JzLCBkZXN0cnVjdG9yLCBhc3NpZ25tZW50IG9wZXJhdG9yLgorICBjb21wbGV4KHZhbHVlX3R5cGUgX194ID0gMC4wbCwgdmFsdWVfdHlwZSBfX3kgPSAwLjBsKQorICAgIDogX01fcmUoX194KSwgX01faW0oX195KSB7fQorCisgIGNvbXBsZXgoY29uc3QgY29tcGxleDxsb25nIGRvdWJsZT4mIF9feikKKyAgICA6IF9NX3JlKF9fei5fTV9yZSksIF9NX2ltKF9fei5fTV9pbSkge30KKyAgaW5saW5lIGNvbXBsZXgoY29uc3QgY29tcGxleDxmbG9hdD4mIF9feik7CisgIGlubGluZSBjb21wbGV4KGNvbnN0IGNvbXBsZXg8ZG91YmxlPiYgX196KTsKKworICAvLyBFbGVtZW50IGFjY2Vzcy4KKyAgdmFsdWVfdHlwZSByZWFsKCkgY29uc3QgeyByZXR1cm4gX01fcmU7IH0KKyAgdmFsdWVfdHlwZSBpbWFnKCkgY29uc3QgeyByZXR1cm4gX01faW07IH0KKworICAvLyBBcml0aG1ldGljIG9wPSBvcGVyYXRpb25zIGludm9sdmluZyBvbmUgcmVhbCBhcmd1bWVudC4KKworICBfU2VsZiYgb3BlcmF0b3I9ICh2YWx1ZV90eXBlIF9feCkgeworICAgIF9NX3JlID0gX194OworICAgIF9NX2ltID0gMC4wbDsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgX1NlbGYmIG9wZXJhdG9yKz0gKHZhbHVlX3R5cGUgX194KSB7CisgICAgX01fcmUgKz0gX194OworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBfU2VsZiYgb3BlcmF0b3ItPSAodmFsdWVfdHlwZSBfX3gpIHsKKyAgICBfTV9yZSAtPSBfX3g7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIF9TZWxmJiBvcGVyYXRvcio9ICh2YWx1ZV90eXBlIF9feCkgeworICAgIF9NX3JlICo9IF9feDsKKyAgICBfTV9pbSAqPSBfX3g7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIF9TZWxmJiBvcGVyYXRvci89ICh2YWx1ZV90eXBlIF9feCkgeworICAgIF9NX3JlIC89IF9feDsKKyAgICBfTV9pbSAvPSBfX3g7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8gQXJpdGhtZXRpYyBvcD0gb3BlcmF0aW9ucyBpbnZvbHZpbmcgdHdvIGNvbXBsZXggYXJndW1lbnRzLgorCisgIHN0YXRpYyB2b2lkIF9TVExQX0NBTEwgX2Rpdihjb25zdCBsb25nIGRvdWJsZSYgX196MV9yLCBjb25zdCBsb25nIGRvdWJsZSYgX196MV9pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9uZyBkb3VibGUmIF9fejJfciwgY29uc3QgbG9uZyBkb3VibGUmIF9fejJfaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgZG91YmxlJiBfX3Jlc19yLCBsb25nIGRvdWJsZSYgX19yZXNfaSk7CisKKyAgc3RhdGljIHZvaWQgX1NUTFBfQ0FMTCBfZGl2KGNvbnN0IGxvbmcgZG91YmxlJiBfX3oxX3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb25nIGRvdWJsZSYgX196Ml9yLCBjb25zdCBsb25nIGRvdWJsZSYgX196Ml9pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBkb3VibGUmIF9fcmVzX3IsIGxvbmcgZG91YmxlJiBfX3Jlc19pKTsKKworIyAgICBpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKSAmJiBkZWZpbmVkIChfU1RMUF9GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIpCisKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcDI+CisgIGNvbXBsZXg8bG9uZyBkb3VibGU+JiBvcGVyYXRvcj0oY29uc3QgY29tcGxleDxfVHAyPiYgX196KSB7CisgICAgX01fcmUgPSBfX3ouX01fcmU7CisgICAgX01faW0gPSBfX3ouX01faW07CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcDI+CisgIGNvbXBsZXg8bG9uZyBkb3VibGU+JiBvcGVyYXRvcis9IChjb25zdCBjb21wbGV4PF9UcDI+JiBfX3opIHsKKyAgICBfTV9yZSArPSBfX3ouX01fcmU7CisgICAgX01faW0gKz0gX196Ll9NX2ltOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfVHAyPgorICBjb21wbGV4PGxvbmcgZG91YmxlPiYgb3BlcmF0b3ItPSAoY29uc3QgY29tcGxleDxfVHAyPiYgX196KSB7CisgICAgX01fcmUgLT0gX196Ll9NX3JlOworICAgIF9NX2ltIC09IF9fei5fTV9pbTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwMj4KKyAgY29tcGxleDxsb25nIGRvdWJsZT4mIG9wZXJhdG9yKj0gKGNvbnN0IGNvbXBsZXg8X1RwMj4mIF9feikgeworICAgIGxvbmcgZG91YmxlIF9fciA9IF9NX3JlICogX196Ll9NX3JlIC0gX01faW0gKiBfX3ouX01faW07CisgICAgbG9uZyBkb3VibGUgX19pID0gX01fcmUgKiBfX3ouX01faW0gKyBfTV9pbSAqIF9fei5fTV9yZTsKKyAgICBfTV9yZSA9IF9fcjsKKyAgICBfTV9pbSA9IF9faTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwMj4KKyAgY29tcGxleDxsb25nIGRvdWJsZT4mIG9wZXJhdG9yLz0gKGNvbnN0IGNvbXBsZXg8X1RwMj4mIF9feikgeworICAgIGxvbmcgZG91YmxlIF9fcjsKKyAgICBsb25nIGRvdWJsZSBfX2k7CisgICAgX2RpdihfTV9yZSwgX01faW0sIF9fei5fTV9yZSwgX196Ll9NX2ltLCBfX3IsIF9faSk7CisgICAgX01fcmUgPSBfX3I7CisgICAgX01faW0gPSBfX2k7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyMgICAgZW5kaWYgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworCisgIF9TZWxmJiBvcGVyYXRvcj0oY29uc3QgX1NlbGYmIF9feikgeworICAgIF9NX3JlID0gX196Ll9NX3JlOworICAgIF9NX2ltID0gX196Ll9NX2ltOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIF9TZWxmJiBvcGVyYXRvcis9IChjb25zdCBfU2VsZiYgX196KSB7CisgICAgX01fcmUgKz0gX196Ll9NX3JlOworICAgIF9NX2ltICs9IF9fei5fTV9pbTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBfU2VsZiYgb3BlcmF0b3ItPSAoY29uc3QgX1NlbGYmIF9feikgeworICAgIF9NX3JlIC09IF9fei5fTV9yZTsKKyAgICBfTV9pbSAtPSBfX3ouX01faW07CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgX1NlbGYmIG9wZXJhdG9yKj0gKGNvbnN0IF9TZWxmJiBfX3opIHsKKyAgICB2YWx1ZV90eXBlIF9fciA9IF9NX3JlICogX196Ll9NX3JlIC0gX01faW0gKiBfX3ouX01faW07CisgICAgdmFsdWVfdHlwZSBfX2kgPSBfTV9yZSAqIF9fei5fTV9pbSArIF9NX2ltICogX196Ll9NX3JlOworICAgIF9NX3JlID0gX19yOworICAgIF9NX2ltID0gX19pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIF9TZWxmJiBvcGVyYXRvci89IChjb25zdCBfU2VsZiYgX196KSB7CisgICAgdmFsdWVfdHlwZSBfX3I7CisgICAgdmFsdWVfdHlwZSBfX2k7CisgICAgX2RpdihfTV9yZSwgX01faW0sIF9fei5fTV9yZSwgX196Ll9NX2ltLCBfX3IsIF9faSk7CisgICAgX01fcmUgPSBfX3I7CisgICAgX01faW0gPSBfX2k7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8gRGF0YSBtZW1iZXJzLgorICB2YWx1ZV90eXBlIF9NX3JlOworICB2YWx1ZV90eXBlIF9NX2ltOworfTsKKworIyAgZW5kaWYgLyogX1NUTFBfTk9fTE9OR19ET1VCTEUgKi8KKworLy8gQ29udmVydGluZyBjb25zdHJ1Y3RvcnMgZnJvbSBvbmUgb2YgdGhlc2UgdGhyZWUgc3BlY2lhbGl6ZWQgdHlwZXMKKy8vIHRvIGFub3RoZXIuCisKK2lubGluZSBjb21wbGV4PGZsb2F0Pjo6Y29tcGxleChjb25zdCBjb21wbGV4PGRvdWJsZT4mIF9feikKKyAgOiBfTV9yZSgoZmxvYXQpX196Ll9NX3JlKSwgX01faW0oKGZsb2F0KV9fei5fTV9pbSkge30KK2lubGluZSBjb21wbGV4PGRvdWJsZT46OmNvbXBsZXgoY29uc3QgY29tcGxleDxmbG9hdD4mIF9feikKKyAgOiBfTV9yZShfX3ouX01fcmUpLCBfTV9pbShfX3ouX01faW0pIHt9CisjICBpZm5kZWYgX1NUTFBfTk9fTE9OR19ET1VCTEUKK2lubGluZSBjb21wbGV4PGZsb2F0Pjo6Y29tcGxleChjb25zdCBjb21wbGV4PGxvbmcgZG91YmxlPiYgX196KQorICA6IF9NX3JlKChmbG9hdClfX3ouX01fcmUpLCBfTV9pbSgoZmxvYXQpX196Ll9NX2ltKSB7fQoraW5saW5lIGNvbXBsZXg8ZG91YmxlPjo6Y29tcGxleChjb25zdCBjb21wbGV4PGxvbmcgZG91YmxlPiYgX196KQorICA6IF9NX3JlKChkb3VibGUpX196Ll9NX3JlKSwgX01faW0oKGRvdWJsZSlfX3ouX01faW0pIHt9CitpbmxpbmUgY29tcGxleDxsb25nIGRvdWJsZT46OmNvbXBsZXgoY29uc3QgY29tcGxleDxmbG9hdD4mIF9feikKKyAgOiBfTV9yZShfX3ouX01fcmUpLCBfTV9pbShfX3ouX01faW0pIHt9CitpbmxpbmUgY29tcGxleDxsb25nIGRvdWJsZT46OmNvbXBsZXgoY29uc3QgY29tcGxleDxkb3VibGU+JiBfX3opCisgIDogX01fcmUoX196Ll9NX3JlKSwgX01faW0oX196Ll9NX2ltKSB7fQorIyAgZW5kaWYKKworI2VuZGlmIC8qIFNQRUNJQUxJWkFUSU9OUyAqLworCisvLyBVbmFyeSBub24tbWVtYmVyIGFyaXRobWV0aWMgb3BlcmF0b3JzLgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIGNvbXBsZXg8X1RwPiBfU1RMUF9DQUxMIG9wZXJhdG9yKyhjb25zdCBjb21wbGV4PF9UcD4mIF9feikKK3sgcmV0dXJuIF9fejsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIGNvbXBsZXg8X1RwPiBfU1RMUF9DQUxMICBvcGVyYXRvci0oY29uc3QgY29tcGxleDxfVHA+JiBfX3opCit7IHJldHVybiBjb21wbGV4PF9UcD4oLV9fei5fTV9yZSwgLV9fei5fTV9pbSk7IH0KKworLy8gTm9uLW1lbWJlciBhcml0aG1ldGljIG9wZXJhdGlvbnMgaW52b2x2aW5nIG9uZSByZWFsIGFyZ3VtZW50LgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIGNvbXBsZXg8X1RwPiBfU1RMUF9DQUxMIG9wZXJhdG9yKyhjb25zdCBfVHAmIF9feCwgY29uc3QgY29tcGxleDxfVHA+JiBfX3opCit7IHJldHVybiBjb21wbGV4PF9UcD4oX194ICsgX196Ll9NX3JlLCBfX3ouX01faW0pOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgY29tcGxleDxfVHA+IF9TVExQX0NBTEwgb3BlcmF0b3IrKGNvbnN0IGNvbXBsZXg8X1RwPiYgX196LCBjb25zdCBfVHAmIF9feCkKK3sgcmV0dXJuIGNvbXBsZXg8X1RwPihfX3ouX01fcmUgKyBfX3gsIF9fei5fTV9pbSk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBjb21wbGV4PF9UcD4gX1NUTFBfQ0FMTCBvcGVyYXRvci0oY29uc3QgX1RwJiBfX3gsIGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KQoreyByZXR1cm4gY29tcGxleDxfVHA+KF9feCAtIF9fei5fTV9yZSwgLV9fei5fTV9pbSk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBjb21wbGV4PF9UcD4gX1NUTFBfQ0FMTCBvcGVyYXRvci0oY29uc3QgY29tcGxleDxfVHA+JiBfX3osIGNvbnN0IF9UcCYgX194KQoreyByZXR1cm4gY29tcGxleDxfVHA+KF9fei5fTV9yZSAtIF9feCwgX196Ll9NX2ltKTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIGNvbXBsZXg8X1RwPiBfU1RMUF9DQUxMIG9wZXJhdG9yKihjb25zdCBfVHAmIF9feCwgY29uc3QgY29tcGxleDxfVHA+JiBfX3opCit7IHJldHVybiBjb21wbGV4PF9UcD4oX194ICogX196Ll9NX3JlLCBfX3ggKiBfX3ouX01faW0pOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgY29tcGxleDxfVHA+IF9TVExQX0NBTEwgb3BlcmF0b3IqKGNvbnN0IGNvbXBsZXg8X1RwPiYgX196LCBjb25zdCBfVHAmIF9feCkKK3sgcmV0dXJuIGNvbXBsZXg8X1RwPihfX3ouX01fcmUgKiBfX3gsIF9fei5fTV9pbSAqIF9feCk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBjb21wbGV4PF9UcD4gX1NUTFBfQ0FMTCBvcGVyYXRvci8oY29uc3QgX1RwJiBfX3gsIGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KSB7CisgIGNvbXBsZXg8X1RwPiBfX3Jlc3VsdDsKKyAgY29tcGxleDxfVHA+OjpfZGl2KF9feCwKKyAgICAgICAgICAgICAgICAgICAgIF9fei5fTV9yZSwgX196Ll9NX2ltLAorICAgICAgICAgICAgICAgICAgICAgX19yZXN1bHQuX01fcmUsIF9fcmVzdWx0Ll9NX2ltKTsKKyAgcmV0dXJuIF9fcmVzdWx0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIGNvbXBsZXg8X1RwPiBfU1RMUF9DQUxMIG9wZXJhdG9yLyhjb25zdCBjb21wbGV4PF9UcD4mIF9feiwgY29uc3QgX1RwJiBfX3gpCit7IHJldHVybiBjb21wbGV4PF9UcD4oX196Ll9NX3JlIC8gX194LCBfX3ouX01faW0gLyBfX3gpOyB9CisKKy8vIE5vbi1tZW1iZXIgYXJpdGhtZXRpYyBvcGVyYXRpb25zIGludm9sdmluZyB0d28gY29tcGxleCBhcmd1bWVudHMKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBjb21wbGV4PF9UcD4gX1NUTFBfQ0FMTAorb3BlcmF0b3IrKGNvbnN0IGNvbXBsZXg8X1RwPiYgX196MSwgY29uc3QgY29tcGxleDxfVHA+JiBfX3oyKQoreyByZXR1cm4gY29tcGxleDxfVHA+KF9fejEuX01fcmUgKyBfX3oyLl9NX3JlLCBfX3oxLl9NX2ltICsgX196Mi5fTV9pbSk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBjb21wbGV4PF9UcD4gX1NUTFBfQ0FMTAorb3BlcmF0b3ItKGNvbnN0IGNvbXBsZXg8X1RwPiYgX196MSwgY29uc3QgY29tcGxleDxfVHA+JiBfX3oyKQoreyByZXR1cm4gY29tcGxleDxfVHA+KF9fejEuX01fcmUgLSBfX3oyLl9NX3JlLCBfX3oxLl9NX2ltIC0gX196Mi5fTV9pbSk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBjb21wbGV4PF9UcD4gX1NUTFBfQ0FMTAorb3BlcmF0b3IqKGNvbnN0IGNvbXBsZXg8X1RwPiYgX196MSwgY29uc3QgY29tcGxleDxfVHA+JiBfX3oyKSB7CisgIHJldHVybiBjb21wbGV4PF9UcD4oX196MS5fTV9yZSAqIF9fejIuX01fcmUgLSBfX3oxLl9NX2ltICogX196Mi5fTV9pbSwKKyAgICAgICAgICAgICAgICAgICAgICBfX3oxLl9NX3JlICogX196Mi5fTV9pbSArIF9fejEuX01faW0gKiBfX3oyLl9NX3JlKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBjb21wbGV4PF9UcD4gX1NUTFBfQ0FMTAorb3BlcmF0b3IvKGNvbnN0IGNvbXBsZXg8X1RwPiYgX196MSwgY29uc3QgY29tcGxleDxfVHA+JiBfX3oyKSB7CisgIGNvbXBsZXg8X1RwPiBfX3Jlc3VsdDsKKyAgY29tcGxleDxfVHA+OjpfZGl2KF9fejEuX01fcmUsIF9fejEuX01faW0sCisgICAgICAgICAgICAgICAgICAgICBfX3oyLl9NX3JlLCBfX3oyLl9NX2ltLAorICAgICAgICAgICAgICAgICAgICAgX19yZXN1bHQuX01fcmUsIF9fcmVzdWx0Ll9NX2ltKTsKKyAgcmV0dXJuIF9fcmVzdWx0OworfQorCisvLyBDb21wYXJpc29uIG9wZXJhdG9ycy4KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBib29sIF9TVExQX0NBTEwgb3BlcmF0b3I9PShjb25zdCBjb21wbGV4PF9UcD4mIF9fejEsIGNvbnN0IGNvbXBsZXg8X1RwPiYgX196MikKK3sgcmV0dXJuIF9fejEuX01fcmUgPT0gX196Mi5fTV9yZSAmJiBfX3oxLl9NX2ltID09IF9fejIuX01faW07IH0KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBib29sIF9TVExQX0NBTEwgb3BlcmF0b3I9PShjb25zdCBjb21wbGV4PF9UcD4mIF9feiwgY29uc3QgX1RwJiBfX3gpCit7IHJldHVybiBfX3ouX01fcmUgPT0gX194ICYmIF9fei5fTV9pbSA9PSAwOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yPT0oY29uc3QgX1RwJiBfX3gsIGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KQoreyByZXR1cm4gX194ID09IF9fei5fTV9yZSAmJiAwID09IF9fei5fTV9pbTsgfQorCisvLzA0LzI3LzA0IGR1bXM6IHJlbW92YWwgb2YgdGhpcyBjaGVjaywgaWYgaXQgaXMgcmVzdGFibGlzaAorLy9wbGVhc2UgZXhwbGFpbiB3aHkgdGhlIG90aGVyIG9wZXJhdG9ycyBhcmUgbm90IG1hY3JvIGd1YXJkZWQKKy8vI2lmZGVmIF9TVExQX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIGJvb2wgX1NUTFBfQ0FMTCBvcGVyYXRvciE9KGNvbnN0IGNvbXBsZXg8X1RwPiYgX196MSwgY29uc3QgY29tcGxleDxfVHA+JiBfX3oyKQoreyByZXR1cm4gX196MS5fTV9yZSAhPSBfX3oyLl9NX3JlIHx8IF9fejEuX01faW0gIT0gX196Mi5fTV9pbTsgfQorCisvLyNlbmRpZiAvKiBfU1RMUF9GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIgKi8KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBib29sIF9TVExQX0NBTEwgb3BlcmF0b3IhPShjb25zdCBjb21wbGV4PF9UcD4mIF9feiwgY29uc3QgX1RwJiBfX3gpCit7IHJldHVybiBfX3ouX01fcmUgIT0gX194IHx8IF9fei5fTV9pbSAhPSAwOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yIT0oY29uc3QgX1RwJiBfX3gsIGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KQoreyByZXR1cm4gX194ICE9IF9fei5fTV9yZSB8fCAwICE9IF9fei5fTV9pbTsgfQorCisvLyBPdGhlciBiYXNpYyBhcml0aG1ldGljIG9wZXJhdGlvbnMKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX1RwIF9TVExQX0NBTEwgcmVhbChjb25zdCBjb21wbGV4PF9UcD4mIF9feikKK3sgcmV0dXJuIF9fei5fTV9yZTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIF9UcCBfU1RMUF9DQUxMIGltYWcoY29uc3QgY29tcGxleDxfVHA+JiBfX3opCit7IHJldHVybiBfX3ouX01faW07IH0KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK19UcCBfU1RMUF9DQUxMIGFicyhjb25zdCBjb21wbGV4PF9UcD4mIF9feik7CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitfVHAgX1NUTFBfQ0FMTCBhcmcoY29uc3QgY29tcGxleDxfVHA+JiBfX3opOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIF9UcCBfU1RMUF9DQUxMIG5vcm0oY29uc3QgY29tcGxleDxfVHA+JiBfX3opCit7IHJldHVybiBfX3ouX01fcmUgKiBfX3ouX01fcmUgKyBfX3ouX01faW0gKiBfX3ouX01faW07IH0KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBjb21wbGV4PF9UcD4gX1NUTFBfQ0FMTCBjb25qKGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KQoreyByZXR1cm4gY29tcGxleDxfVHA+KF9fei5fTV9yZSwgLV9fei5fTV9pbSk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2NvbXBsZXg8X1RwPiBfU1RMUF9DQUxMIHBvbGFyKGNvbnN0IF9UcCYgX19yaG8pCit7IHJldHVybiBjb21wbGV4PF9UcD4oX19yaG8sIDApOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+Citjb21wbGV4PF9UcD4gX1NUTFBfQ0FMTCBwb2xhcihjb25zdCBfVHAmIF9fcmhvLCBjb25zdCBfVHAmIF9fcGhpKTsKKworX1NUTFBfVEVNUExBVEVfTlVMTAorX1NUTFBfREVDTFNQRUMgZmxvYXQgX1NUTFBfQ0FMTCBhYnMoY29uc3QgY29tcGxleDxmbG9hdD4mKTsKK19TVExQX1RFTVBMQVRFX05VTEwKK19TVExQX0RFQ0xTUEVDIGRvdWJsZSBfU1RMUF9DQUxMIGFicyhjb25zdCBjb21wbGV4PGRvdWJsZT4mKTsKK19TVExQX1RFTVBMQVRFX05VTEwKK19TVExQX0RFQ0xTUEVDIGZsb2F0IF9TVExQX0NBTEwgYXJnKGNvbnN0IGNvbXBsZXg8ZmxvYXQ+Jik7CitfU1RMUF9URU1QTEFURV9OVUxMCitfU1RMUF9ERUNMU1BFQyBkb3VibGUgX1NUTFBfQ0FMTCBhcmcoY29uc3QgY29tcGxleDxkb3VibGU+Jik7CitfU1RMUF9URU1QTEFURV9OVUxMCitfU1RMUF9ERUNMU1BFQyBjb21wbGV4PGZsb2F0PiBfU1RMUF9DQUxMIHBvbGFyKGNvbnN0IGZsb2F0JiBfX3JobywgY29uc3QgZmxvYXQmIF9fcGhpKTsKK19TVExQX1RFTVBMQVRFX05VTEwKK19TVExQX0RFQ0xTUEVDIGNvbXBsZXg8ZG91YmxlPiBfU1RMUF9DQUxMIHBvbGFyKGNvbnN0IGRvdWJsZSYgX19yaG8sIGNvbnN0IGRvdWJsZSYgX19waGkpOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorX1RwIF9TVExQX0NBTEwgYWJzKGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KQoreyByZXR1cm4gX1RwKGFicyhjb21wbGV4PGRvdWJsZT4oZG91YmxlKF9fei5yZWFsKCkpLCBkb3VibGUoX196LmltYWcoKSkpKSk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK19UcCBfU1RMUF9DQUxMIGFyZyhjb25zdCBjb21wbGV4PF9UcD4mIF9feikKK3sgcmV0dXJuIF9UcChhcmcoY29tcGxleDxkb3VibGU+KGRvdWJsZShfX3oucmVhbCgpKSwgZG91YmxlKF9fei5pbWFnKCkpKSkpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+Citjb21wbGV4PF9UcD4gX1NUTFBfQ0FMTCBwb2xhcihjb25zdCBfVHAmIF9fcmhvLCBjb25zdCBfVHAmIF9fcGhpKSB7CisgIGNvbXBsZXg8ZG91YmxlPiBfX3RtcCA9IHBvbGFyKGRvdWJsZShfX3JobyksIGRvdWJsZShfX3BoaSkpOworICByZXR1cm4gY29tcGxleDxfVHA+KF9UcChfX3RtcC5yZWFsKCkpLCBfVHAoX190bXAuaW1hZygpKSk7Cit9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTE9OR19ET1VCTEUpCitfU1RMUF9URU1QTEFURV9OVUxMCitfU1RMUF9ERUNMU1BFQyBsb25nIGRvdWJsZSBfU1RMUF9DQUxMIGFyZyhjb25zdCBjb21wbGV4PGxvbmcgZG91YmxlPiYpOworX1NUTFBfVEVNUExBVEVfTlVMTAorX1NUTFBfREVDTFNQRUMgbG9uZyBkb3VibGUgX1NUTFBfQ0FMTCBhYnMoY29uc3QgY29tcGxleDxsb25nIGRvdWJsZT4mKTsKK19TVExQX1RFTVBMQVRFX05VTEwKK19TVExQX0RFQ0xTUEVDIGNvbXBsZXg8bG9uZyBkb3VibGU+IF9TVExQX0NBTEwgcG9sYXIoY29uc3QgbG9uZyBkb3VibGUmLCBjb25zdCBsb25nIGRvdWJsZSYpOworI2VuZGlmCisKKworI2lmICFkZWZpbmVkIChfU1RMUF9VU0VfTk9fSU9TVFJFQU1TKQorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyMgIGluY2x1ZGUgPGlvc2Z3ZD4KKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKKy8vIENvbXBsZXggb3V0cHV0LCBpbiB0aGUgZm9ybSAocmUsaW0pLiAgV2UgdXNlIGEgdHdvLXN0ZXAgcHJvY2VzcworLy8gaW52b2x2aW5nIHN0cmluZ3N0cmVhbSBzbyB0aGF0IHdlIGdldCB0aGUgcGFkZGluZyByaWdodC4KK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgIF9TVExQX0NBTEwKK29wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLCBjb25zdCBjb21wbGV4PF9UcD4mIF9feik7CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX1NUTFBfQ0FMTAorb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsIGNvbXBsZXg8X1RwPiYgX196KTsKKworLy8gU3BlY2lhbGl6YXRpb25zIGZvciBuYXJyb3cgY2hhcmFjdGVyczsgbGV0cyB1cyBhdm9pZCB3aWRlbi4KKworX1NUTFBfT1BFUkFUT1JfVEVNUExBVEUKK19TVExQX0RFQ0xTUEVDIGJhc2ljX2lzdHJlYW08Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiYgX1NUTFBfQ0FMTAorb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4mIF9faXMsIGNvbXBsZXg8ZmxvYXQ+JiBfX3opOworCitfU1RMUF9PUEVSQVRPUl9URU1QTEFURQorX1NUTFBfREVDTFNQRUMgYmFzaWNfaXN0cmVhbTxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+JiBfU1RMUF9DQUxMCitvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiYgX19pcywgY29tcGxleDxkb3VibGU+JiBfX3opOworCitfU1RMUF9PUEVSQVRPUl9URU1QTEFURQorX1NUTFBfREVDTFNQRUMgYmFzaWNfb3N0cmVhbTxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+JiBfU1RMUF9DQUxMCitvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiYgX19pcywgY29uc3QgY29tcGxleDxmbG9hdD4mIF9feik7CisKK19TVExQX09QRVJBVE9SX1RFTVBMQVRFCitfU1RMUF9ERUNMU1BFQyBiYXNpY19vc3RyZWFtPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4mIF9TVExQX0NBTEwKK29wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+JiBfX2lzLCBjb25zdCBjb21wbGV4PGRvdWJsZT4mIF9feik7CisKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9OT19MT05HX0RPVUJMRSkKK19TVExQX09QRVJBVE9SX1RFTVBMQVRFCitfU1RMUF9ERUNMU1BFQyBiYXNpY19pc3RyZWFtPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4mIF9TVExQX0NBTEwKK29wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+JiBfX2lzLCBjb21wbGV4PGxvbmcgZG91YmxlPiYgX196KTsKKworX1NUTFBfT1BFUkFUT1JfVEVNUExBVEUKK19TVExQX0RFQ0xTUEVDIGJhc2ljX29zdHJlYW08Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiYgX1NUTFBfQ0FMTAorb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4mIF9faXMsIGNvbnN0IGNvbXBsZXg8bG9uZyBkb3VibGU+JiBfX3opOworCisjICBlbmRpZgorCisjICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUKSAmJiAhIGRlZmluZWQgKF9TVExQX05PX1dDSEFSX1QpCisKK19TVExQX0VYUE9SVF9URU1QTEFURSBiYXNpY19pc3RyZWFtPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4mIF9TVExQX0NBTEwKK29wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+JiwgY29tcGxleDxkb3VibGU+Jik7CitfU1RMUF9FWFBPUlRfVEVNUExBVEUgYmFzaWNfb3N0cmVhbTx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+JiBfU1RMUF9DQUxMCitvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPiYsIGNvbnN0IGNvbXBsZXg8ZG91YmxlPiYpOworX1NUTFBfRVhQT1JUX1RFTVBMQVRFIGJhc2ljX2lzdHJlYW08d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPiYgX1NUTFBfQ0FMTAorb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4mLCBjb21wbGV4PGZsb2F0PiYpOworX1NUTFBfRVhQT1JUX1RFTVBMQVRFIGJhc2ljX29zdHJlYW08d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPiYgX1NUTFBfQ0FMTAorb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4mLCBjb25zdCBjb21wbGV4PGZsb2F0PiYpOworCisjICAgIGlmICFkZWZpbmVkIChfU1RMUF9OT19MT05HX0RPVUJMRSkKK19TVExQX0VYUE9SVF9URU1QTEFURSBiYXNpY19pc3RyZWFtPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4mIF9TVExQX0NBTEwKK29wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+JiwgY29tcGxleDxsb25nIGRvdWJsZT4mKTsKK19TVExQX0VYUE9SVF9URU1QTEFURSBiYXNpY19vc3RyZWFtPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4mIF9TVExQX0NBTEwKK29wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+JiwgY29uc3QgY29tcGxleDxsb25nIGRvdWJsZT4mKTsKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworCisvLyBUcmFuc2NlbmRlbnRhbCBmdW5jdGlvbnMuICBUaGVzZSBhcmUgZGVmaW5lZCBvbmx5IGZvciBmbG9hdCwKKy8vICBkb3VibGUsIGFuZCBsb25nIGRvdWJsZS4gIChTcXJ0IGlzbid0IHRyYW5zY2VuZGVudGFsLCBvZiBjb3Vyc2UsCisvLyAgYnV0IGl0J3MgaW5jbHVkZWQgaW4gdGhpcyBzZWN0aW9uIGFueXdheS4pCisKK19TVExQX0RFQ0xTUEVDIGNvbXBsZXg8ZmxvYXQ+IF9TVExQX0NBTEwgc3FydChjb25zdCBjb21wbGV4PGZsb2F0PiYpOworCitfU1RMUF9ERUNMU1BFQyBjb21wbGV4PGZsb2F0PiBfU1RMUF9DQUxMIGV4cChjb25zdCBjb21wbGV4PGZsb2F0PiYpOworX1NUTFBfREVDTFNQRUMgY29tcGxleDxmbG9hdD4gX1NUTFBfQ0FMTCAgbG9nKGNvbnN0IGNvbXBsZXg8ZmxvYXQ+Jik7CitfU1RMUF9ERUNMU1BFQyBjb21wbGV4PGZsb2F0PiBfU1RMUF9DQUxMIGxvZzEwKGNvbnN0IGNvbXBsZXg8ZmxvYXQ+Jik7CisKK19TVExQX0RFQ0xTUEVDIGNvbXBsZXg8ZmxvYXQ+IF9TVExQX0NBTEwgcG93KGNvbnN0IGNvbXBsZXg8ZmxvYXQ+JiwgaW50KTsKK19TVExQX0RFQ0xTUEVDIGNvbXBsZXg8ZmxvYXQ+IF9TVExQX0NBTEwgcG93KGNvbnN0IGNvbXBsZXg8ZmxvYXQ+JiwgY29uc3QgZmxvYXQmKTsKK19TVExQX0RFQ0xTUEVDIGNvbXBsZXg8ZmxvYXQ+IF9TVExQX0NBTEwgcG93KGNvbnN0IGZsb2F0JiwgY29uc3QgY29tcGxleDxmbG9hdD4mKTsKK19TVExQX0RFQ0xTUEVDIGNvbXBsZXg8ZmxvYXQ+IF9TVExQX0NBTEwgcG93KGNvbnN0IGNvbXBsZXg8ZmxvYXQ+JiwgY29uc3QgY29tcGxleDxmbG9hdD4mKTsKKworX1NUTFBfREVDTFNQRUMgY29tcGxleDxmbG9hdD4gX1NUTFBfQ0FMTCBzaW4oY29uc3QgY29tcGxleDxmbG9hdD4mKTsKK19TVExQX0RFQ0xTUEVDIGNvbXBsZXg8ZmxvYXQ+IF9TVExQX0NBTEwgY29zKGNvbnN0IGNvbXBsZXg8ZmxvYXQ+Jik7CitfU1RMUF9ERUNMU1BFQyBjb21wbGV4PGZsb2F0PiBfU1RMUF9DQUxMIHRhbihjb25zdCBjb21wbGV4PGZsb2F0PiYpOworCitfU1RMUF9ERUNMU1BFQyBjb21wbGV4PGZsb2F0PiBfU1RMUF9DQUxMIHNpbmgoY29uc3QgY29tcGxleDxmbG9hdD4mKTsKK19TVExQX0RFQ0xTUEVDIGNvbXBsZXg8ZmxvYXQ+IF9TVExQX0NBTEwgY29zaChjb25zdCBjb21wbGV4PGZsb2F0PiYpOworX1NUTFBfREVDTFNQRUMgY29tcGxleDxmbG9hdD4gX1NUTFBfQ0FMTCB0YW5oKGNvbnN0IGNvbXBsZXg8ZmxvYXQ+Jik7CisKK19TVExQX0RFQ0xTUEVDIGNvbXBsZXg8ZG91YmxlPiBfU1RMUF9DQUxMIHNxcnQoY29uc3QgY29tcGxleDxkb3VibGU+Jik7CisKK19TVExQX0RFQ0xTUEVDIGNvbXBsZXg8ZG91YmxlPiBfU1RMUF9DQUxMIGV4cChjb25zdCBjb21wbGV4PGRvdWJsZT4mKTsKK19TVExQX0RFQ0xTUEVDIGNvbXBsZXg8ZG91YmxlPiBfU1RMUF9DQUxMIGxvZyhjb25zdCBjb21wbGV4PGRvdWJsZT4mKTsKK19TVExQX0RFQ0xTUEVDIGNvbXBsZXg8ZG91YmxlPiBfU1RMUF9DQUxMIGxvZzEwKGNvbnN0IGNvbXBsZXg8ZG91YmxlPiYpOworCitfU1RMUF9ERUNMU1BFQyBjb21wbGV4PGRvdWJsZT4gX1NUTFBfQ0FMTCBwb3coY29uc3QgY29tcGxleDxkb3VibGU+JiwgaW50KTsKK19TVExQX0RFQ0xTUEVDIGNvbXBsZXg8ZG91YmxlPiBfU1RMUF9DQUxMIHBvdyhjb25zdCBjb21wbGV4PGRvdWJsZT4mLCBjb25zdCBkb3VibGUmKTsKK19TVExQX0RFQ0xTUEVDIGNvbXBsZXg8ZG91YmxlPiBfU1RMUF9DQUxMIHBvdyhjb25zdCBkb3VibGUmLCBjb25zdCBjb21wbGV4PGRvdWJsZT4mKTsKK19TVExQX0RFQ0xTUEVDIGNvbXBsZXg8ZG91YmxlPiBfU1RMUF9DQUxMIHBvdyhjb25zdCBjb21wbGV4PGRvdWJsZT4mLCBjb25zdCBjb21wbGV4PGRvdWJsZT4mKTsKKworX1NUTFBfREVDTFNQRUMgY29tcGxleDxkb3VibGU+IF9TVExQX0NBTEwgc2luKGNvbnN0IGNvbXBsZXg8ZG91YmxlPiYpOworX1NUTFBfREVDTFNQRUMgY29tcGxleDxkb3VibGU+IF9TVExQX0NBTEwgY29zKGNvbnN0IGNvbXBsZXg8ZG91YmxlPiYpOworX1NUTFBfREVDTFNQRUMgY29tcGxleDxkb3VibGU+IF9TVExQX0NBTEwgdGFuKGNvbnN0IGNvbXBsZXg8ZG91YmxlPiYpOworCitfU1RMUF9ERUNMU1BFQyBjb21wbGV4PGRvdWJsZT4gX1NUTFBfQ0FMTCBzaW5oKGNvbnN0IGNvbXBsZXg8ZG91YmxlPiYpOworX1NUTFBfREVDTFNQRUMgY29tcGxleDxkb3VibGU+IF9TVExQX0NBTEwgY29zaChjb25zdCBjb21wbGV4PGRvdWJsZT4mKTsKK19TVExQX0RFQ0xTUEVDIGNvbXBsZXg8ZG91YmxlPiBfU1RMUF9DQUxMIHRhbmgoY29uc3QgY29tcGxleDxkb3VibGU+Jik7CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTE9OR19ET1VCTEUpCitfU1RMUF9ERUNMU1BFQyBjb21wbGV4PGxvbmcgZG91YmxlPiBfU1RMUF9DQUxMIHNxcnQoY29uc3QgY29tcGxleDxsb25nIGRvdWJsZT4mKTsKK19TVExQX0RFQ0xTUEVDIGNvbXBsZXg8bG9uZyBkb3VibGU+IF9TVExQX0NBTEwgZXhwKGNvbnN0IGNvbXBsZXg8bG9uZyBkb3VibGU+Jik7CitfU1RMUF9ERUNMU1BFQyBjb21wbGV4PGxvbmcgZG91YmxlPiBfU1RMUF9DQUxMIGxvZyhjb25zdCBjb21wbGV4PGxvbmcgZG91YmxlPiYpOworX1NUTFBfREVDTFNQRUMgY29tcGxleDxsb25nIGRvdWJsZT4gX1NUTFBfQ0FMTCBsb2cxMChjb25zdCBjb21wbGV4PGxvbmcgZG91YmxlPiYpOworCitfU1RMUF9ERUNMU1BFQyBjb21wbGV4PGxvbmcgZG91YmxlPiBfU1RMUF9DQUxMIHBvdyhjb25zdCBjb21wbGV4PGxvbmcgZG91YmxlPiYsIGludCk7CitfU1RMUF9ERUNMU1BFQyBjb21wbGV4PGxvbmcgZG91YmxlPiBfU1RMUF9DQUxMIHBvdyhjb25zdCBjb21wbGV4PGxvbmcgZG91YmxlPiYsIGNvbnN0IGxvbmcgZG91YmxlJik7CitfU1RMUF9ERUNMU1BFQyBjb21wbGV4PGxvbmcgZG91YmxlPiBfU1RMUF9DQUxMIHBvdyhjb25zdCBsb25nIGRvdWJsZSYsIGNvbnN0IGNvbXBsZXg8bG9uZyBkb3VibGU+Jik7CitfU1RMUF9ERUNMU1BFQyBjb21wbGV4PGxvbmcgZG91YmxlPiBfU1RMUF9DQUxMIHBvdyhjb25zdCBjb21wbGV4PGxvbmcgZG91YmxlPiYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wbGV4PGxvbmcgZG91YmxlPiYpOworCitfU1RMUF9ERUNMU1BFQyBjb21wbGV4PGxvbmcgZG91YmxlPiBfU1RMUF9DQUxMIHNpbihjb25zdCBjb21wbGV4PGxvbmcgZG91YmxlPiYpOworX1NUTFBfREVDTFNQRUMgY29tcGxleDxsb25nIGRvdWJsZT4gX1NUTFBfQ0FMTCBjb3MoY29uc3QgY29tcGxleDxsb25nIGRvdWJsZT4mKTsKK19TVExQX0RFQ0xTUEVDIGNvbXBsZXg8bG9uZyBkb3VibGU+IF9TVExQX0NBTEwgdGFuKGNvbnN0IGNvbXBsZXg8bG9uZyBkb3VibGU+Jik7CisKK19TVExQX0RFQ0xTUEVDIGNvbXBsZXg8bG9uZyBkb3VibGU+IF9TVExQX0NBTEwgc2luaChjb25zdCBjb21wbGV4PGxvbmcgZG91YmxlPiYpOworX1NUTFBfREVDTFNQRUMgY29tcGxleDxsb25nIGRvdWJsZT4gX1NUTFBfQ0FMTCBjb3NoKGNvbnN0IGNvbXBsZXg8bG9uZyBkb3VibGU+Jik7CitfU1RMUF9ERUNMU1BFQyBjb21wbGV4PGxvbmcgZG91YmxlPiBfU1RMUF9DQUxMIHRhbmgoY29uc3QgY29tcGxleDxsb25nIGRvdWJsZT4mKTsKKyNlbmRpZgorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNpZm5kZWYgX1NUTFBfTElOS19USU1FX0lOU1RBTlRJQVRJT04KKyMgIGluY2x1ZGUgPHN0bC9fY29tcGxleC5jPgorI2VuZGlmCisKKyNlbmRpZgorCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RsL19jb25maWdfY29tcGF0X3Bvc3QuaCBiL3N0bC9fY29uZmlnX2NvbXBhdF9wb3N0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMyNmFjNQotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9fY29uZmlnX2NvbXBhdF9wb3N0LmgKQEAgLTAsMCArMSw1NSBAQAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKyNpZiAxIC8qIGRlZiBfU1RMUF8zX0NPTVBBVElCSUxJVFkgKi8KKworIyBkZWZpbmUgX19TR0lfU1RMX1BPUlQgIF9TVExQT1JUX1ZFUlNJT04KKworIyBpZiBkZWZpbmVkIChfU1RMUF9ERUJVRykgJiYgISBkZWZpbmVkICggX19TVExfREVCVUcgKQorIyAgZGVmaW5lIF9fU1RMX0RFQlVHIF9TVExQX0RFQlVHCisjIGVuZGlmCisKKyMgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX05BTUVTUEFDRVMpCisjICB1bmRlZiAgX19TVExfVVNFX05BTUVTUEFDRVMKKyMgIGRlZmluZSBfX1NUTF9VU0VfTkFNRVNQQUNFUyBfU1RMUF9VU0VfTkFNRVNQQUNFUworIyBlbmRpZgorCisjIGlmIGRlZmluZWQgKF9TVExQX1VTRV9FWENFUFRJT05TKQorIyAgdW5kZWYgIF9fU1RMX1VTRV9FWENFUFRJT05TCisjICBkZWZpbmUgX19TVExfVVNFX0VYQ0VQVElPTlMgX1NUTFBfVVNFX0VYQ0VQVElPTlMKKyMgZW5kaWYKKworIyBpZiBkZWZpbmVkIChfU1RMUF9CRUdJTl9OQU1FU1BBQ0UpICYmICEgZGVmaW5lZCAoIF9fU1RMX0JFR0lOX05BTUVTUEFDRSApCisjICBkZWZpbmUgX19TVExfQkVHSU5fTkFNRVNQQUNFIF9TVExQX0JFR0lOX05BTUVTUEFDRQorIyAgZGVmaW5lIF9fU1RMX0VORF9OQU1FU1BBQ0UgX1NUTFBfRU5EX05BTUVTUEFDRQorIyAgZGVmaW5lIF9fU1RMX1ZFTkRPUl9TVEQgX1NUTFBfVkVORE9SX1NURAorIyAgZGVmaW5lIF9fU1RMX1ZFTkRPUl9DU1REIF9TVExQX1ZFTkRPUl9DU1RECisjIGVuZGlmCisjIGVuZGlmCisKKy8qCisjIGlmIGRlZmluZWQgKF9TVExQX1hYWCkgJiYgISBkZWZpbmVkICggX19TVExfWFhYICkKKyMgIGRlZmluZSBfX1NUTF9YWFggX1NUTFBfWFhYCisjIGVuZGlmCisqLworCisvKiA1LjAgLT4gNC42IGNvbXBhdGliaWxpdHkgc2VjdGlvbiAqLworI2lmIDEgLyogZGVmIF9TVExQXzQ2X0NPTVBBVElCSUxJVFkgKi8KKworI2lmbmRlZiAgX1NUTFBfVVNJTkdfTkFNRVNQQUNFX0JVRworIyBkZWZpbmUgX1NUTFBfVVNJTkdfTkFNRVNQQUNFX0JVRworI2VuZGlmCisKKy8qIHByb3ZpZGUgYSB1bmlmb3JtIHdheSB0byBhY2Nlc3MgZnVsbCBmdW5jbGlvbmFsaXR5ICovCisjIGRlZmluZSBfX3NsaXN0X18gICAgICAgICBzbGlzdAorIyBkZWZpbmUgX19tYXBfXyAgICAgICAgICAgbWFwCisjIGRlZmluZSBfX211bHRpbWFwX18gICAgICBtdWx0aW1hcAorIyBkZWZpbmUgX19zZXRfXyAgICAgICAgICAgc2V0CisjIGRlZmluZSBfX211bHRpc2V0X18gICAgICBtdWx0aXNldAorIyBkZWZpbmUgX19saXN0X18gICAgICAgICAgbGlzdAorIyBkZWZpbmUgX19oYXNoX21hcF9fICAgICAgaGFzaF9tYXAKKyMgZGVmaW5lIF9faGFzaF9tdWx0aW1hcF9fIGhhc2hfbXVsdGltYXAKKyMgZGVmaW5lIF9faGFzaF9zZXRfXyAgICAgIGhhc2hfc2V0CisjIGRlZmluZSBfX2hhc2hfbXVsdGlzZXRfXyBoYXNoX211bHRpc2V0CisjIGRlZmluZSBfX3ZlY3Rvcl9fICAgICAgICB2ZWN0b3IKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL3N0bC9fY29uc3RydWN0LmggYi9zdGwvX2NvbnN0cnVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MjhkOTIKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvX2NvbnN0cnVjdC5oCkBAIC0wLDAgKzEsMjQ1IEBACisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBNb3Njb3cgQ2VudGVyIGZvciBTUEFSQyBUZWNobm9sb2d5CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworLyogTk9URTogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgU1RMIGhlYWRlcnMuCisgKiAgIFlvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LgorICovCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ09OU1RSVUNUX0gKKyNkZWZpbmUgX1NUTFBfSU5URVJOQUxfQ09OU1RSVUNUX0gKKworI2lmICFkZWZpbmVkIChfU1RMUF9ERUJVR19VTklOSVRJQUxJWkVEKSAmJiAhZGVmaW5lZCAoX1NUTFBfSU5URVJOQUxfQ1NUUklORykKKyMgIGluY2x1ZGUgPHN0bC9fY3N0cmluZy5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfTkVXCisjICBpbmNsdWRlIDxzdGwvX25ldy5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfSVRFUkFUT1JfQkFTRV9ICisjICBpbmNsdWRlIDxzdGwvX2l0ZXJhdG9yX2Jhc2UuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX01PVkVfQ09OU1RSVUNUX0ZXS19ICisjICBpbmNsdWRlIDxzdGwvX21vdmVfY29uc3RydWN0X2Z3ay5oPgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIHZvaWQgX19kZXN0cm95X2F1eChfVHAqIF9fcG9pbnRlciwgY29uc3QgX19mYWxzZV90eXBlJiAvKl9Ucml2aWFsX2Rlc3RydWN0b3IqLykKK3sgX19wb2ludGVyLT5+X1RwKCk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSB2b2lkIF9fZGVzdHJveV9hdXgoX1RwKiwgY29uc3QgX190cnVlX3R5cGUmIC8qX1RyaXZpYWxfZGVzdHJ1Y3RvciovKSB7fQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIHZvaWQgX0Rlc3Ryb3koX1RwKiBfX3BvaW50ZXIpIHsKKyNpZiBkZWZpbmVkIChfU1RMUF9NU1ZDKSAmJiAoX1NUTFBfTVNWQyA8PSAxMDEwKQorICBfX3BvaW50ZXI7CisjZW5kaWYKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX3R5cGVfdHJhaXRzPF9UcD46Omhhc190cml2aWFsX2Rlc3RydWN0b3IgX1RyaXZpYWxfZGVzdHJ1Y3RvcjsKKyAgX19kZXN0cm95X2F1eChfX3BvaW50ZXIsIF9Ucml2aWFsX2Rlc3RydWN0b3IoKSk7CisjaWYgZGVmaW5lZCAoX1NUTFBfREVCVUdfVU5JTklUSUFMSVpFRCkKKyAgbWVtc2V0KF9fUkVJTlRFUlBSRVRfQ0FTVChjaGFyKiwgX19wb2ludGVyKSwgX1NUTFBfU0hSRURfQllURSwgc2l6ZW9mKF9UcCkpOworI2VuZGlmCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgdm9pZCBfRGVzdHJveV9Nb3ZlZChfVHAqIF9fcG9pbnRlcikgeworICB0eXBlZGVmIHR5cGVuYW1lIF9fbW92ZV90cmFpdHM8X1RwPjo6Y29tcGxldGUgX1RyaXZpYWxfZGVzdHJ1Y3RvcjsKKyAgX19kZXN0cm95X2F1eChfX3BvaW50ZXIsIF9Ucml2aWFsX2Rlc3RydWN0b3IoKSk7CisjaWYgZGVmaW5lZCAoX1NUTFBfREVCVUdfVU5JTklUSUFMSVpFRCkKKyAgbWVtc2V0KChjaGFyKilfX3BvaW50ZXIsIF9TVExQX1NIUkVEX0JZVEUsIHNpemVvZihfVHApKTsKKyNlbmRpZgorfQorCisjaWYgZGVmaW5lZCAobmV3KQorIyAgZGVmaW5lIF9TVExQX05FV19SRURFRklORSBuZXcKKyMgIHVuZGVmIG5ldworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9ERUZfQ09OU1RfUExDVF9ORVdfQlVHKQordGVtcGxhdGUgPGNsYXNzIF9UMT4KK2lubGluZSB2b2lkIF9Db25zdHJ1Y3RfYXV4IChfVDEqIF9fcCwgY29uc3QgX19mYWxzZV90eXBlJikgeworICBfU1RMUF9QTEFDRU1FTlRfTkVXIChfX3ApIF9UMSgpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1QxPgoraW5saW5lIHZvaWQgX0NvbnN0cnVjdF9hdXggKF9UMSogX19wLCBjb25zdCBfX3RydWVfdHlwZSYpIHsKKyAgX1NUTFBfUExBQ0VNRU5UX05FVyAoX19wKSBfVDEoMCk7Cit9CisjZW5kaWYgLyogX1NUTFBfREVGX0NPTlNUX1BMQ1RfTkVXX0JVRyAqLworCit0ZW1wbGF0ZSA8Y2xhc3MgX1QxPgoraW5saW5lIHZvaWQgX0NvbnN0cnVjdChfVDEqIF9fcCkgeworI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHX1VOSU5JVElBTElaRUQpCisgIG1lbXNldCgoY2hhciopX19wLCBfU1RMUF9TSFJFRF9CWVRFLCBzaXplb2YoX1QxKSk7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChfU1RMUF9ERUZfQ09OU1RfUExDVF9ORVdfQlVHKQorICBfQ29uc3RydWN0X2F1eCAoX19wLCBfSGFzRGVmYXVsdFplcm9WYWx1ZShfX3ApLl9BbnN3ZXIoKSApOworI2Vsc2UKKyAgX1NUTFBfUExBQ0VNRU5UX05FVyAoX19wKSBfVDEoKTsKKyNlbmRpZiAvKiBfU1RMUF9ERUZfQ09OU1RfUExDVF9ORVdfQlVHICovCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgdm9pZCBfQ29weV9Db25zdHJ1Y3QoX1RwKiBfX3AsIGNvbnN0IF9UcCYgX192YWwpIHsKKyNpZiBkZWZpbmVkIChfU1RMUF9ERUJVR19VTklOSVRJQUxJWkVEKQorICBtZW1zZXQoKGNoYXIqKV9fcCwgX1NUTFBfU0hSRURfQllURSwgc2l6ZW9mKF9UcCkpOworI2VuZGlmCisgIF9TVExQX1BMQUNFTUVOVF9ORVcgKF9fcCkgX1RwKF9fdmFsKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgoraW5saW5lIHZvaWQgX1BhcmFtX0NvbnN0cnVjdChfVDEqIF9fcCwgY29uc3QgX1QyJiBfX3ZhbCkgeworI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHX1VOSU5JVElBTElaRUQpCisgIG1lbXNldCgoY2hhciopX19wLCBfU1RMUF9TSFJFRF9CWVRFLCBzaXplb2YoX1QxKSk7CisjZW5kaWYKKyAgX1NUTFBfUExBQ0VNRU5UX05FVyAoX19wKSBfVDEoX192YWwpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+CitpbmxpbmUgdm9pZCBfTW92ZV9Db25zdHJ1Y3RfQXV4KF9UMSogX19wLCBfVDImIF9fdmFsLCBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qX0lzUE9EKi8pIHsKKyAgX1NUTFBfUExBQ0VNRU5UX05FVyAoX19wKSBfVDEoX1NUTFBfUFJJViBfQXNNb3ZlU291cmNlKF9fdmFsKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KK2lubGluZSB2b2lkIF9Nb3ZlX0NvbnN0cnVjdF9BdXgoX1QxKiBfX3AsIF9UMiYgX192YWwsIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKl9Jc1BPRCovKSB7CisgIF9TVExQX1BMQUNFTUVOVF9ORVcgKF9fcCkgX1QxKF9fdmFsKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgoraW5saW5lIHZvaWQgX01vdmVfQ29uc3RydWN0KF9UMSogX19wLCBfVDImIF9fdmFsKSB7CisjaWYgZGVmaW5lZCAoX1NUTFBfREVCVUdfVU5JTklUSUFMSVpFRCkKKyAgbWVtc2V0KChjaGFyKilfX3AsIF9TVExQX1NIUkVEX0JZVEUsIHNpemVvZihfVDEpKTsKKyNlbmRpZgorICBfTW92ZV9Db25zdHJ1Y3RfQXV4KF9fcCwgX192YWwsIF9Jc19QT0QoX19wKS5fQW5zd2VyKCkpOworfQorCisjaWYgZGVmaW5lZChfU1RMUF9ORVdfUkVERUZJTkUpCisjICBpZiBkZWZpbmVkIChERUJVR19ORVcpCisjICAgIGRlZmluZSBuZXcgREVCVUdfTkVXCisjICBlbmRpZgorIyAgdW5kZWYgX1NUTFBfTkVXX1JFREVGSU5FCisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3IsIGNsYXNzIF9UcD4KK19TVExQX0lOTElORV9MT09QIHZvaWQKK19fZGVzdHJveV9yYW5nZV9hdXgoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwgX1RwKiwgY29uc3QgX19mYWxzZV90eXBlJiAvKl9Ucml2aWFsX2Rlc3RydWN0b3IqLykgeworICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpIHsKKyAgICBfX2Rlc3Ryb3lfYXV4KCYoKl9fZmlyc3QpLCBfX2ZhbHNlX3R5cGUoKSk7CisjaWYgZGVmaW5lZCAoX1NUTFBfREVCVUdfVU5JTklUSUFMSVpFRCkKKyAgICBtZW1zZXQoKGNoYXIqKSYoKl9fZmlyc3QpLCBfU1RMUF9TSFJFRF9CWVRFLCBzaXplb2YoX1RwKSk7CisjZW5kaWYKKyAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvciwgY2xhc3MgX1RwPgorI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHX1VOSU5JVElBTElaRUQpCitfU1RMUF9JTkxJTkVfTE9PUCB2b2lkCitfX2Rlc3Ryb3lfcmFuZ2VfYXV4KF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsIF9UcCosIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKl9Ucml2aWFsX2Rlc3RydWN0b3IqLykgeworICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisgICAgbWVtc2V0KChjaGFyKikmKCpfX2ZpcnN0KSwgX1NUTFBfU0hSRURfQllURSwgc2l6ZW9mKF9UcCkpOworfQorI2Vsc2UKK2lubGluZSB2b2lkCitfX2Rlc3Ryb3lfcmFuZ2VfYXV4KF9Gb3J3YXJkSXRlcmF0b3IsIF9Gb3J3YXJkSXRlcmF0b3IsIF9UcCosIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKl9Ucml2aWFsX2Rlc3RydWN0b3IqLykge30KKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvciwgY2xhc3MgX1RwPgoraW5saW5lIHZvaWQKK19fZGVzdHJveV9yYW5nZShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LCBfVHAgKl9fcHRyKSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgX190eXBlX3RyYWl0czxfVHA+OjpoYXNfdHJpdmlhbF9kZXN0cnVjdG9yIF9Ucml2aWFsX2Rlc3RydWN0b3I7CisgIF9fZGVzdHJveV9yYW5nZV9hdXgoX19maXJzdCwgX19sYXN0LCBfX3B0ciwgX1RyaXZpYWxfZGVzdHJ1Y3RvcigpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CitpbmxpbmUgdm9pZCBfRGVzdHJveV9SYW5nZShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KSB7CisgIF9fZGVzdHJveV9yYW5nZShfX2ZpcnN0LCBfX2xhc3QsIF9TVExQX1ZBTFVFX1RZUEUoX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvcikpOworfQorCitpbmxpbmUgdm9pZCBfRGVzdHJveV9SYW5nZShjaGFyKiwgY2hhciopIHt9CisjaWYgZGVmaW5lZCAoX1NUTFBfSEFTX1dDSEFSX1QpIC8vIGR3YSA4LzE1Lzk3CitpbmxpbmUgdm9pZCBfRGVzdHJveV9SYW5nZSh3Y2hhcl90Kiwgd2NoYXJfdCopIHt9CitpbmxpbmUgdm9pZCBfRGVzdHJveV9SYW5nZShjb25zdCB3Y2hhcl90KiwgY29uc3Qgd2NoYXJfdCopIHt9CisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3IsIGNsYXNzIF9UcD4KK2lubGluZSB2b2lkCitfX2Rlc3Ryb3lfbXZfc3JjcyhfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LCBfVHAgKl9fcHRyKSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgX19tb3ZlX3RyYWl0czxfVHA+Ojpjb21wbGV0ZSBfQ29tcGxldGVNb3ZlOworICBfX2Rlc3Ryb3lfcmFuZ2VfYXV4KF9fZmlyc3QsIF9fbGFzdCwgX19wdHIsIF9Db21wbGV0ZU1vdmUoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgoraW5saW5lIHZvaWQgX0Rlc3Ryb3lfTW92ZWRfUmFuZ2UoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCkgeworICBfX2Rlc3Ryb3lfbXZfc3JjcyhfX2ZpcnN0LCBfX2xhc3QsIF9TVExQX1ZBTFVFX1RZUEUoX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvcikpOworfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfREVGX0NPTlNUX0RFRl9QQVJBTV9CVUcpCisvLyBUaG9zZSBhZGFwdG9ycyBhcmUgaGVyZSB0byBmaXggY29tbW9uIGNvbXBpbGVyIGJ1ZyByZWdhcmRpbmcgYnVpbHRpbnM6CisvLyBleHByZXNzaW9ucyBsaWtlIGludCBrID0gaW50KCkgc2hvdWxkIGluaXRpYWxpemUgayB0byAwCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIF9UcCBfX2RlZmF1bHRfY29uc3RydWN0ZWRfYXV4KF9UcCosIGNvbnN0IF9fZmFsc2VfdHlwZSYpIHsKKyAgcmV0dXJuIF9UcCgpOworfQordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfVHAgX19kZWZhdWx0X2NvbnN0cnVjdGVkX2F1eChfVHAqLCBjb25zdCBfX3RydWVfdHlwZSYpIHsKKyAgcmV0dXJuIF9UcCgwKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfVHAgX19kZWZhdWx0X2NvbnN0cnVjdGVkKF9UcCogX19wKSB7CisgIHJldHVybiBfX2RlZmF1bHRfY29uc3RydWN0ZWRfYXV4KF9fcCwgX0hhc0RlZmF1bHRaZXJvVmFsdWUoX19wKS5fQW5zd2VyKCkpOworfQorCisjICBkZWZpbmUgX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRChfVFRwKSBfX2RlZmF1bHRfY29uc3RydWN0ZWQoKF9UVHAqKTApCisjZWxzZQorIyAgZGVmaW5lIF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQoX1RUcCkgX1RUcCgpCisjZW5kaWYgLyogX1NUTFBfREVGX0NPTlNUX0RFRl9QQVJBTV9CVUcgKi8KKworCisjaWYgIWRlZmluZWQgKF9TVExQX05PX0FOQUNIUk9OSVNNUykKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBPbGQgbmFtZXMgZnJvbSB0aGUgSFAgU1RMLgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+CitpbmxpbmUgdm9pZCBjb25zdHJ1Y3QoX1QxKiBfX3AsIGNvbnN0IF9UMiYgX192YWwpIHtfUGFyYW1fQ29uc3RydWN0KF9fcCwgX192YWwpOyB9Cit0ZW1wbGF0ZSA8Y2xhc3MgX1QxPgoraW5saW5lIHZvaWQgY29uc3RydWN0KF9UMSogX19wKSB7IF9TVExQX1NURDo6X0NvbnN0cnVjdChfX3ApOyB9Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIHZvaWQgZGVzdHJveShfVHAqIF9fcG9pbnRlcikgeyAgX1NUTFBfU1REOjpfRGVzdHJveShfX3BvaW50ZXIpOyB9Cit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KK2lubGluZSB2b2lkIGRlc3Ryb3koX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCkgeyBfU1RMUF9TVEQ6Ol9EZXN0cm95X1JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7IH0KKyNlbmRpZiAvKiBfU1RMUF9OT19BTkFDSFJPTklTTVMgKi8KKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfQ09OU1RSVUNUX0ggKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9fY3NldGptcC5oIGIvc3RsL19jc2V0am1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JiMDAxOAotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9fY3NldGptcC5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NTRVRKTVAKKyNkZWZpbmUgX1NUTFBfSU5URVJOQUxfQ1NFVEpNUAorCisvLyBpZiB0aGUgbWFjcm8gaXMgb24sIHRoZSBoZWFkZXIgaXMgYWxyZWFkeSB0aGVyZQorI2lmICFkZWZpbmVkIChzZXRqbXApCisjICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfTkVXX0NfSEVBREVSUykKKyMgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ1BQX0NfSEVBREVSKGNzZXRqbXApCisjICBlbHNlCisjICAgIGRlZmluZSBfU1RMUF9OQVRJVkVfU0VUSk1QX0hfSU5DTFVERUQKKyMgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ19IRUFERVIoc2V0am1wLmgpCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9JTVBPUlRfVkVORE9SX0NTVEQpCisKKyMgIGlmIGRlZmluZWQgKF9fQk9STEFORENfXykgJiYgZGVmaW5lZCAoX1NUTFBfVVNFX05FV19DX0hFQURFUlMpCisvKiBGb3IgQm9ybGFuZCwgZXZlbiBpZiBzdGRqbXAuaCBpcyBpbmNsdWRlZCBzeW1ib2xzIHdvbid0IGJlIGluIGdsb2JhbCBuYW1lc3BhY2UKKyAqIHNvIHdlIG5lZWQgdG8gcmVhY2ggdGhlbSBpbiB2ZW5kb3IgbmFtZXNwYWNlOgorICovCisjICAgIHVuZGVmIF9TVExQX05BVElWRV9TRVRKTVBfSF9JTkNMVURFRAorIyAgZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisjICBpZiAhZGVmaW5lZCAoX1NUTFBfTkFUSVZFX1NFVEpNUF9IX0lOQ0xVREVEKQordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmptcF9idWY7CisjICBlbHNlCisvLyBpZiBzZXRqbXAuaCB3YXMgaW5jbHVkZWQgZmlyc3QsIHRoaXMgaXMgaW4gZ2xvYmFsIG5hbWVzcGFjZSwgbm90IGluCisvLyB2ZW5kb3IncyBzdGQuICAtIDIwMDUtMDgtMDQsIHB0cgordXNpbmcgOjpqbXBfYnVmOworIyAgZW5kaWYKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9OT19DU1REX0ZVTkNUSU9OX0lNUE9SVFMpCisjICAgIGlmICFkZWZpbmVkIChzZXRqbXApCisjICAgICAgaWYgIWRlZmluZWQgKF9fTVNMX18pIHx8ICgoX19NU0xfXyA+IDB4NzAwMSkgJiYgKF9fTVNMX18gPCAweDgwMDApKQorIyAgICAgICAgaWZuZGVmIF9TVExQX05BVElWRV9TRVRKTVBfSF9JTkNMVURFRAordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnNldGptcDsKKyMgICAgICAgIGVsc2UKK3VzaW5nIDo6c2V0am1wOworIyAgICAgICAgZW5kaWYKKyMgICAgICBlbmRpZgorIyAgICBlbmRpZgorIyAgICBpZiAhZGVmaW5lZCAoX1NUTFBfTkFUSVZFX1NFVEpNUF9IX0lOQ0xVREVEKQordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmxvbmdqbXA7CisjICAgIGVsc2UKK3VzaW5nIDo6bG9uZ2ptcDsKKyMgICAgZW5kaWYKKyMgIGVuZGlmCitfU1RMUF9FTkRfTkFNRVNQQUNFCisjZW5kaWYgLyogX1NUTFBfSU1QT1JUX1ZFTkRPUl9DU1REICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3RsL19jc2lnbmFsLmggYi9zdGwvX2NzaWduYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTllOWM0Ci0tLSAvZGV2L251bGwKKysrIGIvc3RsL19jc2lnbmFsLmgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1NJR05BTAorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9DU0lHTkFMCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfV0NFKQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX05FV19DX0hFQURFUlMpCisjICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9DX0hFQURFUihjc2lnbmFsKQorIyAgZWxzZQorIyAgICBpbmNsdWRlIF9TVExQX05BVElWRV9DX0hFQURFUihzaWduYWwuaCkKKyMgIGVuZGlmCisKKyMgIGlmIGRlZmluZWQgKF9TVExQX0lNUE9SVF9WRU5ET1JfQ1NURCkKK19TVExQX0JFR0lOX05BTUVTUEFDRQorIyAgICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fQ1NURF9GVU5DVElPTl9JTVBPUlRTKQordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnNpZ25hbDsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpyYWlzZTsKKyMgICAgZW5kaWYgLyogX1NUTFBfTk9fQ1NURF9GVU5DVElPTl9JTVBPUlRTICovCit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6c2lnX2F0b21pY190OworX1NUTFBfRU5EX05BTUVTUEFDRQorIyAgZW5kaWYgLyogX1NUTFBfSU1QT1JUX1ZFTkRPUl9DU1REICovCisjZW5kaWYKKworI2VuZGlmIC8qIF9TVExQX0lOVEVSTkFMX0NTSUdOQUwgKi8KZGlmZiAtLWdpdCBhL3N0bC9fY3N0ZGFyZy5oIGIvc3RsL19jc3RkYXJnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU1MWU2MgotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9fY3N0ZGFyZy5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICovCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1NUREFSRworI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9DU1REQVJHCisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfTkVXX0NfSEVBREVSUykKKyMgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9DX0hFQURFUihjc3RkYXJnKQorI2Vsc2UKKyMgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NfSEVBREVSKHN0ZGFyZy5oKQorI2VuZGlmCisKKyNpZmRlZiBfU1RMUF9JTVBPUlRfVkVORE9SX0NTVEQKK19TVExQX0JFR0lOX05BTUVTUEFDRQordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnZhX2xpc3Q7CitfU1RMUF9FTkRfTkFNRVNQQUNFCisjZW5kaWYgLyogX1NUTFBfSU1QT1JUX1ZFTkRPUl9DU1REICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3RsL19jc3RkZGVmLmggYi9zdGwvX2NzdGRkZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWMxZTJkCi0tLSAvZGV2L251bGwKKysrIGIvc3RsL19jc3RkZGVmLmgKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1NURERFRgorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9DU1REREVGCisKKyMgIGlmIChfX0dOVUNfXyA+PSAzKSAmJiBkZWZpbmVkIChfX0NZR1dJTl9fKSAvLyB0aGlzIHRvdGFsIEhBQ0sgaXMgdGhlIG9ubHkgZXhwZWRpZW50IHdheSBJIGNvdWxkIGN5Z3dpbiB0byB3b3JrIHdpdGggR0NDIDMuMAorIyAgICBkZWZpbmUgX19uZWVkX3dpbnRfdCAvLyBtb3N0bHkgYmVjYXVzZSB3aW50X3QgZGlkbid0IHNlZW0gdG8gZ2V0IGRlZmluZWQgb3RoZXJ3aXNlIDooCisjICAgIGRlZmluZSBfX25lZWRfd2NoYXJfdAorIyAgICBkZWZpbmUgX19uZWVkX3NpemVfdAorIyAgICBkZWZpbmUgX19uZWVkX3B0cmRpZmZfdAorIyAgICBkZWZpbmUgX19uZWVkX05VTEwKKyMgIGVuZGlmCisKKyMgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9ORVdfQ19IRUFERVJTKQorIyAgICBpbmNsdWRlIF9TVExQX05BVElWRV9DUFBfQ19IRUFERVIoY3N0ZGRlZikKKyMgIGVsc2UKKyMgICAgaW5jbHVkZSA8c3RkZGVmLmg+CisjICBlbmRpZgorCisjICBpZmRlZiBfU1RMUF9JTVBPUlRfVkVORE9SX0NTVEQKK19TVExQX0JFR0lOX05BTUVTUEFDRQordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnB0cmRpZmZfdDsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpzaXplX3Q7CitfU1RMUF9FTkRfTkFNRVNQQUNFCisjICBlbmRpZiAvKiBfU1RMUF9JTVBPUlRfVkVORE9SX0NTVEQgKi8KKworI2VuZGlmIC8qIF9TVExQX0lOVEVSTkFMX0NTVERERUYgKi8KZGlmZiAtLWdpdCBhL3N0bC9fY3N0ZGlvLmggYi9zdGwvX2NzdGRpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0YWZiMzUKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvX2NzdGRpby5oCkBAIC0wLDAgKzEsMTI1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DU1RESU8KKyNkZWZpbmUgX1NUTFBfSU5URVJOQUxfQ1NURElPCisKKyNpZiBkZWZpbmVkIChfX0x5bnhfXykKKyMgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NfSEVBREVSKHN0ZGFyZy5oKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfTkVXX0NfSEVBREVSUykKKyMgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9DX0hFQURFUihjc3RkaW8pCisjZWxzZQorIyAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ19IRUFERVIoc3RkaW8uaCkKKyNlbmRpZgorCisjaWYgKGRlZmluZWQgKF9fTVdFUktTX18pICYmICFkZWZpbmVkIChOX1BMQVRfTkxNKSkgIHx8IGRlZmluZWQgKF9fQk9STEFORENfXykKKyMgIHVuZGVmIHN0ZGluCisjICB1bmRlZiBzdGRvdXQKKyMgIHVuZGVmIHN0ZGVycgorIyAgaWYgZGVmaW5lZCAoX19NV0VSS1NfXykKKyMgIGRlZmluZSBzdGRpbiAgICgmX1NUTFBfVkVORE9SX0NTVEQ6Ol9fZmlsZXNbMF0pCisjICBkZWZpbmUgc3Rkb3V0ICAoJl9TVExQX1ZFTkRPUl9DU1REOjpfX2ZpbGVzWzFdKQorIyAgZGVmaW5lIHN0ZGVyciAgKCZfU1RMUF9WRU5ET1JfQ1NURDo6X19maWxlc1syXSkKKyMgIGVsaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKQorIyAgICBkZWZpbmUgc3RkaW4gICAoJl9TVExQX1ZFTkRPUl9DU1REOjpfc3RyZWFtc1swXSkKKyMgICAgZGVmaW5lIHN0ZG91dCAgKCZfU1RMUF9WRU5ET1JfQ1NURDo6X3N0cmVhbXNbMV0pCisjICAgIGRlZmluZSBzdGRlcnIgICgmX1NUTFBfVkVORE9SX0NTVEQ6Ol9zdHJlYW1zWzJdKQorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfTVNWQ19MSUIpICYmIChfU1RMUF9NU1ZDX0xJQiA8IDE0MDApIHx8IGRlZmluZWQgKF9TVExQX1VTSU5HX1BMQVRGT1JNX1NES19DT01QSUxFUikKK2lubGluZSBpbnQgdnNucHJpbnRmKGNoYXIgKnMxLCBzaXplX3QgbiwgY29uc3QgY2hhciAqczIsIHZhX2xpc3QgdikKK3sgcmV0dXJuIF9TVExQX1ZFTkRPUl9DU1REOjpfdnNucHJpbnRmKHMxLCBuLCBzMiwgdik7IH0KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfSU1QT1JUX1ZFTkRPUl9DU1REICkKK19TVExQX0JFR0lOX05BTUVTUEFDRQordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OkZJTEU7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6ZnBvc190OwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnNpemVfdDsKKworLy8gdW5kZWYgb2Jzb2xldGUgbWFjcm9zCisjICB1bmRlZiBwdXRjCisjICB1bmRlZiBnZXRjCisjICB1bmRlZiBnZXRjaGFyCisjICB1bmRlZiBwdXRjaGFyCisjICB1bmRlZiBmZW9mCisjICB1bmRlZiBmZXJyb3IKKworIyAgaWYgIWRlZmluZWQgKF9TVExQX05PX0NTVERfRlVOQ1RJT05fSU1QT1JUUykKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpjbGVhcmVycjsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpmY2xvc2U7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6ZmVvZjsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpmZXJyb3I7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6ZmZsdXNoOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmZnZXRjOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmZnZXRwb3M7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6ZmdldHM7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6Zm9wZW47Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6ZnByaW50ZjsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpmcHV0YzsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpmcHV0czsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpmcmVhZDsKKyMgICAgaWYgIWRlZmluZWQgKF9XSU4zMl9XQ0UpIHx8IChfV0lOMzJfV0NFIDwgMHg1MDApIC8vIENFNSBzdG9wcGVkIHN1cHBseWluZyB0aGlzCit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6ZnJlb3BlbjsKKyMgICAgZW5kaWYKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpmc2NhbmY7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6ZnNlZWs7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6ZnNldHBvczsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpmdGVsbDsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpmd3JpdGU7CisKKyMgICAgaWYgICEoZGVmaW5lZCAoX19JQk1DUFBfXykgJiYgKF9fSUJNQ1BQX18gPj0gNTAwKSkKKyMgICAgICBpZiAhZGVmaW5lZCAoX1dJTjMyX1dDRSkgfHwgKF9XSU4zMl9XQ0UgPCAweDUwMCkgLy8gQ0U1IHN0b3BwZWQgc3VwcGx5aW5nIHRoaXMgZXhjZXB0IGFzIG1hY3Jvcy4gVE9ETzogdXNlIGlubGluZSBmdW5jdGlvbiB0byByZWRpcmVjdCB0byB0aGUgbWFjcm9zPworIHVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpnZXRjOworIHVzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpwdXRjOworIyAgICAgIGVuZGlmCisgdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmdldGNoYXI7CisgdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnB1dGNoYXI7CisjICAgIGVuZGlmCisKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpnZXRzOworIyAgICBpZiAhZGVmaW5lZCAoX1dJTjMyX1dDRSkgfHwgKF9XSU4zMl9XQ0UgPCAweDUwMCkgLy8gQ0U1IHN0b3BwZWQgc3VwcGx5aW5nIHRoaXMKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpwZXJyb3I7CisjICAgIGVuZGlmCit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6cHJpbnRmOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnB1dHM7CisjICAgIGlmICFkZWZpbmVkIChfV0lOMzJfV0NFKSB8fCAoX1dJTjMyX1dDRSA8IDB4NTAwKSAvLyBDRTUgc3RvcHBlZCBzdXBwbHlpbmcgdGhpcwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnJlbW92ZTsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpyZW5hbWU7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6cmV3aW5kOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnNldGJ1ZjsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjp0bXBmaWxlOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnRtcG5hbTsKKyMgICAgZW5kaWYKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpzY2FuZjsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpzZXR2YnVmOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnNwcmludGY7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6c3NjYW5mOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnVuZ2V0YzsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjp2ZnByaW50ZjsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjp2cHJpbnRmOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnZzcHJpbnRmOworIyAgICBpZiAoKGRlZmluZWQgKF9fTVdFUktTX18pICYmICFkZWZpbmVkIChOX1BMQVRfTkxNKSkgfHwgKGRlZmluZWQgKF9TVExQX01TVkNfTElCKSAmJiAoX1NUTFBfTVNWQ19MSUIgPCAxNDAwKSkgfHwgXAorICAgICAgICAoZGVmaW5lZCAoX19CT1JMQU5EQ19fKSkpCit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6dnNucHJpbnRmOworIyAgICBlbmRpZgorIyAgZW5kaWYgLyogX1NUTFBfTk9fQ1NURF9GVU5DVElPTl9JTVBPUlRTICovCitfU1RMUF9FTkRfTkFNRVNQQUNFCisjZW5kaWYgLyogX1NUTFBfSU1QT1JUX1ZFTkRPUl9DU1REICovCisKKyNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9DU1RESU8gKi8KZGlmZiAtLWdpdCBhL3N0bC9fY3N0ZGxpYi5oIGIvc3RsL19jc3RkbGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM1NDM3ZAotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9fY3N0ZGxpYi5oCkBAIC0wLDAgKzEsMjAxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DU1RETElCCisjZGVmaW5lIF9TVExQX0lOVEVSTkFMX0NTVERMSUIKKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9ORVdfQ19IRUFERVJTKQorIyAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ1BQX0NfSEVBREVSKGNzdGRsaWIpCisjZWxzZQorIyAgaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fQk9STEFORENfXykKKy8qIEJvcmxhbmQgcHJvY2Vzcy5oIGhlYWRlciBkbyBub3QgYnJpbmcgYW55dGhpbmcgaGVyZSBhbmQgaXMganVzdCBpbmNsdWRlZAorICogaW4gb3JkZXIgdG8gYXZvaWQgaW5jbHVzaW9uIGxhdGVyLiBUaGlzIGhlYWRlciBjYW5ub3QgYmUgaW5jbHVkZWQgbGF0ZXIKKyAqIGJlY2F1c2UgQm9ybGFuZCBjb21waWxlciBjb25zaWRlciB0aGF0IGZvciBpbnN0YW5jZSB0aGUgYWJvcnQgZnVuY3Rpb24KKyAqIGRlZmluZWQgYXMgZXh0ZXJuICJDIiBjYW5ub3QgYmUgb3ZlcmxvYWRlZCBhbmQgaXQgZmluZHMgMiAib3ZlcmxvYWRzIiwKKyAqIG9uY2UgaW4gbmF0aXZlIHN0ZCBuYW1lc3BhY2UgYW5kIHRoZSBvdGhlciBpbiBTVExwb3J0IG5hbWVzcGFjZS4uLgorICovCisjICBpbmNsdWRlIDxwcm9jZXNzLmg+CisjZW5kaWYKKworLyogb24gZXZjMy9ldmM0IGluY2x1ZGluZyBzdGRsaWIuaCBhbHNvIGRlZmluZXMgc2V0am1wIG1hY3JvICovCisjaWYgZGVmaW5lZCAoX1NUTFBfV0NFKQorIyAgZGVmaW5lIF9TVExQX05BVElWRV9TRVRKTVBfSF9JTkNMVURFRAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX01TTF9fKSAmJiAoX19NU0xfXyA8PSAweDUwMDMpCituYW1lc3BhY2Ugc3RkIHsKKyAgdHlwZWRlZiA6OmRpdl90IGRpdl90OworICB0eXBlZGVmIDo6bGRpdl90IGxkaXZfdDsKKyMgIGlmZGVmIF9fTVNMX0xPTkdMT05HX1NVUFBPUlRfXworICB0eXBlZGVmIDo6bGxkaXZfdCBsbGRpdl90OworIyAgZW5kaWYKK30KKyNlbmRpZgorCisjaWZkZWYgX1NUTFBfSU1QT1JUX1ZFTkRPUl9DU1RECitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKyMgIGlmICFkZWZpbmVkIChBTkRST0lEKQorLy8gdGhlc2UgdHlwZXMgZG9uJ3QgZXhpc3Qgb24gQW5kcm9pZAordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmRpdl90OwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmxkaXZfdDsKKyMgIGVuZGlmCit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6c2l6ZV90OworCisjICBpZm5kZWYgX1NUTFBfTk9fQ1NURF9GVU5DVElPTl9JTVBPUlRTCisjICAgIGlmbmRlZiBfU1RMUF9XQ0UKKy8vIHRoZXNlIGZ1bmN0aW9ucyBqdXN0IGRvbid0IGV4aXN0IG9uIFdpbmRvd3MgQ0UKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjphYm9ydDsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpnZXRlbnY7CisjICAgICAgaWYgIWRlZmluZWQgKEFORFJPSUQpCisvLyB0aGVzZSBmdW5jdGlvbnMgZG9uJ3QgZXhpc3Qgb24gQW5kcm9pZAordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6Om1ibGVuOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6Om1idG93YzsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpzeXN0ZW07Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6YnNlYXJjaDsKKyMgICAgICBlbmRpZgorIyAgICBlbmRpZgordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmF0ZXhpdDsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpleGl0OwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmNhbGxvYzsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpmcmVlOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6Om1hbGxvYzsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpyZWFsbG9jOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmF0b2Y7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6YXRvaTsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjphdG9sOworIyAgICBpZiAhZGVmaW5lZCAoQU5EUk9JRCkKKy8vIHRoaXMgZnVuY3Rpb24gZG9lc24ndCBleGlzdCBvbiBBbmRyb2lkCit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6bWJzdG93Y3M7CisjICAgIGVuZGlmCit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6c3RydG9kOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnN0cnRvbDsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpzdHJ0b3VsOworCisjICAgIGlmICEoZGVmaW5lZCAoX1NUTFBfTk9fTkFUSVZFX1dJREVfU1RSRUFNUykgfHwgZGVmaW5lZCAoX1NUTFBfTk9fTUJTVEFURV9UKSkKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjp3Y3N0b21iczsKKyMgICAgICBpZm5kZWYgX1NUTFBfV0NFCit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6d2N0b21iOworIyAgICAgIGVuZGlmCisjICAgIGVuZGlmCit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6cXNvcnQ7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6bGFiczsKKyMgICAgaWYgIWRlZmluZWQgKEFORFJPSUQpCisvLyB0aGlzIGZ1bmN0aW9uIGRvZXNuJ3QgZXhpc3Qgb24gQW5kcm9pZAordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmxkaXY7CisjICAgIGVuZGlmCisjICAgIGlmIGRlZmluZWQgKF9TVExQX0xPTkdfTE9ORykgJiYgIWRlZmluZWQgKF9TVExQX05PX1ZFTkRPUl9TVERMSUJfTCkKKyMgICAgICBpZiAhZGVmaW5lZChfX3N1bikKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpsbGFiczsKKyMgICAgICAgIGlmICFkZWZpbmVkIChBTkRST0lEKQorLy8gdGhlc2UgdHlwZXMgZG9uJ3QgZXhpc3Qgb24gQW5kcm9pZAordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmxsZGl2X3Q7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6bGxkaXY7CisjICAgICAgICBlbmRpZgorIyAgICAgIGVsc2UKK3VzaW5nIDo6bGxhYnM7Cit1c2luZyA6OmxsZGl2X3Q7Cit1c2luZyA6OmxsZGl2OworIyAgICAgIGVuZGlmCisjICAgIGVuZGlmCit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6cmFuZDsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpzcmFuZDsKKyMgIGVuZGlmIC8qIF9TVExQX05PX0NTVERfRlVOQ1RJT05fSU1QT1JUUyAqLworX1NUTFBfRU5EX05BTUVTUEFDRQorI2VuZGlmIC8qIF9TVExQX0lNUE9SVF9WRU5ET1JfQ1NURCAqLworCisjaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKSAmJiBkZWZpbmVkIChfU1RMUF9VU0VfTkVXX0NfSEVBREVSUykKKy8vSW4gdGhpcyBjb25maWcgYmNjIGRlZmluZSBldmVyeXRoaW5nIGluIHN0ZCBuYW1lc3BhY2UgYW5kIG5vdCBpbgorLy90aGUgZ2xvYmFsIG9uZS4KK2lubGluZSBpbnQgYWJzKGludCBfX3gpIHsgcmV0dXJuIF9TVExQX1ZFTkRPUl9DU1REOjphYnMoX194KTsgfQoraW5saW5lIF9TVExQX1ZFTkRPUl9DU1REOjpkaXZfdCBkaXYoaW50IF9feCwgaW50IF9feSkgeyByZXR1cm4gX1NUTFBfVkVORE9SX0NTVEQ6OmRpdihfX3gsIF9feSk7IH0KKyNlbmRpZgorCisjaWYgZGVmaW5lZChfTVNDX0VYVEVOU0lPTlMpICYmIGRlZmluZWQoX1NUTFBfTVNWQykgJiYgKF9TVExQX01TVkMgPD0gMTMwMCkKKyMgIGRlZmluZSBfU1RMUF9SRVNUT1JFX0ZVTkNUSU9OX0lOVFJJTlNJQworIyAgcHJhZ21hIHdhcm5pbmcgKHB1c2gpCisjICBwcmFnbWEgd2FybmluZyAoZGlzYWJsZTogNDE2MikKKyMgIHByYWdtYSBmdW5jdGlvbiAoYWJzKQorI2VuZGlmCisKKy8vSFAtVVggbmF0aXZlIGxpYiBoYXMgYWJzKCkgYW5kIGRpdigpIGZ1bmN0aW9ucyBpbiBnbG9iYWwgbmFtZXNwYWNlCisjaWYgIWRlZmluZWQgKF9fSFBfYUNDKSB8fCAoX19IUF9hQ0MgPCAzMDAwMCkKKworLy9NU1ZDIHN0YXJ0aW5nIHdpdGggLk5ldCAyMDAzIGFscmVhZHkgZGVmaW5lIGFsbCBtYXRoIGZ1bmN0aW9ucyBpbiBnbG9iYWwgbmFtZXNwYWNlOgorIyAgaWYgIWRlZmluZWQgKF9TVExQX01TVkNfTElCKSB8fCAoX1NUTFBfTVNWQ19MSUIgPCAxMzEwKSB8fCBkZWZpbmVkKFVOREVSX0NFKQoraW5saW5lIGxvbmcgYWJzKGxvbmcgX194KSB7IHJldHVybiBfU1RMUF9WRU5ET1JfQ1NURDo6bGFicyhfX3gpOyB9CisjICBlbmRpZgorCisvKiogVkMgc2luY2UgdmVyc2lvbiA4IGhhcyB0aGlzLCB0aGUgcGxhdGZvcm0gU0RLIGFuZCBDRSBTREtzIGhhbmdpbmcgYmVoaW5kLgorICogIEFuZHJvaWQgZG9lc24ndCBoYXZlIGxkaXZfdC4gKi8KKyMgIGlmICghZGVmaW5lZCAoX1NUTFBfTVNWQ19MSUIpIHx8IChfU1RMUF9NU1ZDX0xJQiA8IDE0MDApIHx8IGRlZmluZWQgKF9TVExQX1VTSU5HX1BMQVRGT1JNX1NES19DT01QSUxFUikgfHwgZGVmaW5lZChVTkRFUl9DRSkpICYmICFkZWZpbmVkIChBTkRST0lEKQoraW5saW5lIF9TVExQX1ZFTkRPUl9DU1REOjpsZGl2X3QgZGl2KGxvbmcgX194LCBsb25nIF9feSkgeyByZXR1cm4gX1NUTFBfVkVORE9SX0NTVEQ6OmxkaXYoX194LCBfX3kpOyB9CisjICBlbmRpZgorCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX1JFU1RPUkVfRlVOQ1RJT05fSU5UUklOU0lDKQorIyAgcHJhZ21hIGludHJpbnNpYyAoYWJzKQorIyAgcHJhZ21hIHdhcm5pbmcgKHBvcCkKKyMgIHVuZGVmIF9TVExQX1JFU1RPUkVfRlVOQ1RJT05fSU5UUklOU0lDCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX0xPTkdfTE9ORykKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9OT19WRU5ET1JfU1RETElCX0wpCisjICAgIGlmICFkZWZpbmVkIChfX3N1bikKK2lubGluZSBfU1RMUF9MT05HX0xPTkcgIGFicyhfU1RMUF9MT05HX0xPTkcgX194KSB7IHJldHVybiBfU1RMUF9WRU5ET1JfQ1NURDo6bGxhYnMoX194KTsgfQorIyAgICAgIGlmICFkZWZpbmVkIChBTkRST0lEKQorLy8gQW5kcm9pZCBkb2Vzbid0IGhhdmUgbGxkaXZfdC4KK2lubGluZSBsbGRpdl90IGRpdihfU1RMUF9MT05HX0xPTkcgX194LCBfU1RMUF9MT05HX0xPTkcgX195KSB7IHJldHVybiBfU1RMUF9WRU5ET1JfQ1NURDo6bGxkaXYoX194LCBfX3kpOyB9CisjICAgICAgZW5kaWYKKyMgICAgZWxzZQoraW5saW5lIF9TVExQX0xPTkdfTE9ORyAgYWJzKF9TVExQX0xPTkdfTE9ORyBfX3gpIHsgcmV0dXJuIDo6bGxhYnMoX194KTsgfQoraW5saW5lIGxsZGl2X3QgZGl2KF9TVExQX0xPTkdfTE9ORyBfX3gsIF9TVExQX0xPTkdfTE9ORyBfX3kpIHsgcmV0dXJuIDo6bGxkaXYoX194LCBfX3kpOyB9CisjICAgIGVuZGlmCisjICBlbHNlCitpbmxpbmUgX1NUTFBfTE9OR19MT05HICBhYnMoX1NUTFBfTE9OR19MT05HIF9feCkgeyByZXR1cm4gX194IDwgMCA/IC1fX3ggOiBfX3g7IH0KKyMgIGVuZGlmCisjZW5kaWYKKworLyogQysrIFN0YW5kYXJkIGlzIHVuY2xlYXIgYWJvdXQgc2V2ZXJhbCBjYWxsIHRvICd1c2luZyA6OmZ1bmMnIGlmIG5ldyBvdmVybG9hZHMKKyAqIG9mIDo6ZnVuYyBhcHBlYXJzIGJldHdlZW4gMiBzdWNjZXNzaXZlICd1c2luZycgY2FsbHMuIFRvIGF2b2lkIHRoaXMgcG90ZW50aWFsCisgKiBwcm9ibGVtIHdlIHByb3ZpZGUgYWxsIGFicyBvdmVybG9hZCBiZWZvcmUgdGhlICd1c2luZycgY2FsbC4KKyAqIEJld2FyZTogVGhpcyBoZWFkZXIgaW5jbHVzaW9uIGhhcyB0byBiZSBhZnRlciBhbGwgYWJzIG92ZXJsb2FkIG9mIHRoaXMgZmlsZS4KKyAqICAgICAgICAgVGhlIGZpcnN0ICd1c2luZyA6OmFicycgY2FsbCBpcyBnb2luZyB0byBiZSBpbiB0aGUgb3RoZXIgaGVhZGVyLgorICovCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NNQVRICisjICBpbmNsdWRlIDxzdGwvX2NtYXRoLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX0lNUE9SVF9WRU5ET1JfQ1NURCkgJiYgIWRlZmluZWQgKF9TVExQX05PX0NTVERfRlVOQ1RJT05fSU1QT1JUUykKKy8vIGFkIGhvYywgZG9uJ3QgcmVwbGFjZSB3aXRoIF9TVExQX1ZFTkRPUl9DU1REOjphYnMgaGVyZSEgLSBwdHIgMjAwNS0wMy0wNQorX1NUTFBfQkVHSU5fTkFNRVNQQUNFCit1c2luZyA6OmFiczsKKyMgIGlmICFkZWZpbmVkIChBTkRST0lEKQorLy8gQW5kcm9pZCBkb2Vzbid0IGhhdmUgZGl2X3Qgb3IgbGRpdl90LgorIyAgICBpZiAhZGVmaW5lZCAoTl9QTEFUX05MTSkKK3VzaW5nIDo6ZGl2OworIyAgICBlbHNlCisvLyBEb24ndCB1c2UgZGl2IGZyb20gY2xpYiBvciBsaWJjIG9uIE5ldFdhcmUtLS1idWdneSEgLSBwdHIgMjAwNS0wNi0wNgoraW5saW5lIGRpdl90IGRpdihpbnQgX194LCBpbnQgX195KSB7IGRpdl90IGQ7IGQucXVvdCA9IF9feCAvIF9feTsgZC5yZW0gPSBfX3ggJSBfX3k7IHJldHVybiBkOyB9CitpbmxpbmUgbGRpdl90IGRpdihsb25nIF9feCwgbG9uZyBfX3kpIHsgbGRpdl90IGQ7IGQucXVvdCA9IF9feCAvIF9feTsgZC5yZW0gPSBfX3ggJSBfX3k7IHJldHVybiBkOyB9CisjICAgIGVuZGlmCisjICBlbmRpZgorX1NUTFBfRU5EX05BTUVTUEFDRQorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9DU1RETElCICovCmRpZmYgLS1naXQgYS9zdGwvX2NzdHJpbmcuaCBiL3N0bC9fY3N0cmluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMzlhN2EKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvX2NzdHJpbmcuaApAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DU1RSSU5HCisjZGVmaW5lIF9TVExQX0lOVEVSTkFMX0NTVFJJTkcKKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9ORVdfQ19IRUFERVJTKQorIyAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ1BQX0NfSEVBREVSKGNzdHJpbmcpCisjZWxzZQorIyAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ19IRUFERVIoc3RyaW5nLmgpCisjZW5kaWYKKworI2lmZGVmIF9TVExQX0lNUE9SVF9WRU5ET1JfQ1NURAorX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisjICBpbmNsdWRlIDx1c2luZy9jc3RyaW5nPgorX1NUTFBfRU5EX05BTUVTUEFDRQorI2VuZGlmIC8qIF9TVExQX0lNUE9SVF9WRU5ET1JfQ1NURCAqLworCisjZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfQ1NUUklORyAqLwpkaWZmIC0tZ2l0IGEvc3RsL19jdGltZS5oIGIvc3RsL19jdGltZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5OTVkNDIKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvX2N0aW1lLmgKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1RJTUUKKyNkZWZpbmUgX1NUTFBfSU5URVJOQUxfQ1RJTUUKKworI2lmICFkZWZpbmVkIChfU1RMUF9XQ0VfRVZDMykKKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX05FV19DX0hFQURFUlMpCisjICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9DX0hFQURFUihjdGltZSkKKyMgIGVsc2UKKyMgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ19IRUFERVIodGltZS5oKQorIyAgZW5kaWYKKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfSU1QT1JUX1ZFTkRPUl9DU1REKQorX1NUTFBfQkVHSU5fTkFNRVNQQUNFCit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6c2l6ZV90OwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmNsb2NrX3Q7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6dGltZV90OwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnRtOworIyAgICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fQ1NURF9GVU5DVElPTl9JTVBPUlRTKQordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmNsb2NrOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmFzY3RpbWU7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6Y3RpbWU7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6Z210aW1lOworCisjICAgICAgaWYgIWRlZmluZWQgKF9XSU4zMl9XQ0UpIHx8IChfV0lOMzJfV0NFIDwgMHg1MDApIC8vIENFNSBzdG9wcGVkIHN1cHBseWluZyB0aGlzCit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6ZGlmZnRpbWU7CisjICAgICAgZW5kaWYKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpta3RpbWU7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6bG9jYWx0aW1lOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnN0cmZ0aW1lOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnRpbWU7CisjICAgIGVuZGlmIC8qIF9TVExQX05PX0NTVERfRlVOQ1RJT05fSU1QT1JUUyAqLworX1NUTFBfRU5EX05BTUVTUEFDRQorIyAgZW5kaWYgLyogX1NUTFBfSU1QT1JUX1ZFTkRPUl9DU1REICovCisKKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfQ1RJTUUgKi8KZGlmZiAtLWdpdCBhL3N0bC9fY3RyYWl0c19mbnMuaCBiL3N0bC9fY3RyYWl0c19mbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGE0YWYxCi0tLSAvZGV2L251bGwKKysrIGIvc3RsL19jdHJhaXRzX2Zucy5oCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8vIFdBUk5JTkc6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIEMrKworLy8gc3RhbmRhcmQgbGlicmFyeSBoZWFkZXJzLiAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgdGhpcyBoZWFkZXIKKy8vIGZpbGUgZGlyZWN0bHkuCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1RSQUlUU19GVU5DVElPTlNfSAorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9DVFJBSVRTX0ZVTkNUSU9OU19ICisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfRlVOQ1RJT05fQkFTRV9ICisjICBpbmNsdWRlIDxzdGwvX2Z1bmN0aW9uX2Jhc2UuaD4KKyNlbmRpZgorCisvLyBUaGlzIGZpbGUgY29udGFpbnMgYSBmZXcgc21hbGwgYWRhcHRlcnMgdGhhdCBhbGxvdyBhIGNoYXJhY3RlcgorLy8gdHJhaXRzIGNsYXNzIHRvIGJlIHVzZWQgYXMgYSBmdW5jdGlvbiBvYmplY3QuCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfVHJhaXRzPgorc3RydWN0IF9FcV90cmFpdHMKKyAgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPHR5cGVuYW1lIF9UcmFpdHM6OmNoYXJfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9UcmFpdHM6OmNoYXJfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2w+IHsKKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IHR5cGVuYW1lIF9UcmFpdHM6OmNoYXJfdHlwZSYgX194LAorICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZW5hbWUgX1RyYWl0czo6Y2hhcl90eXBlJiBfX3kpIGNvbnN0CisgIHsgcmV0dXJuIF9UcmFpdHM6OmVxKF9feCwgX195KTsgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcmFpdHM+CitzdHJ1Y3QgX0VxX2NoYXJfYm91bmQKKyAgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248dHlwZW5hbWUgX1RyYWl0czo6Y2hhcl90eXBlLCBib29sPiB7CisgIHR5cGVuYW1lIF9UcmFpdHM6OmNoYXJfdHlwZSBfX3ZhbDsKKyAgX0VxX2NoYXJfYm91bmQodHlwZW5hbWUgX1RyYWl0czo6Y2hhcl90eXBlIF9fYykgOiBfX3ZhbChfX2MpIHt9CisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCB0eXBlbmFtZSBfVHJhaXRzOjpjaGFyX3R5cGUmIF9feCkgY29uc3QKKyAgeyByZXR1cm4gX1RyYWl0czo6ZXEoX194LCBfX3ZhbCk7IH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHJhaXRzPgorc3RydWN0IF9OZXFfY2hhcl9ib3VuZAorICA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjx0eXBlbmFtZSBfVHJhaXRzOjpjaGFyX3R5cGUsIGJvb2w+Cit7CisgIHR5cGVuYW1lIF9UcmFpdHM6OmNoYXJfdHlwZSBfX3ZhbDsKKyAgX05lcV9jaGFyX2JvdW5kKHR5cGVuYW1lIF9UcmFpdHM6OmNoYXJfdHlwZSBfX2MpIDogX192YWwoX19jKSB7fQorICBib29sIG9wZXJhdG9yKCkoY29uc3QgdHlwZW5hbWUgX1RyYWl0czo6Y2hhcl90eXBlJiBfX3gpIGNvbnN0CisgIHsgcmV0dXJuICFfVHJhaXRzOjplcShfX3gsIF9fdmFsKTsgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcmFpdHM+CitzdHJ1Y3QgX0VxX2ludF9ib3VuZAorICA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjx0eXBlbmFtZSBfVHJhaXRzOjpjaGFyX3R5cGUsIGJvb2w+IHsKKyAgdHlwZW5hbWUgX1RyYWl0czo6aW50X3R5cGUgX192YWw7CisKKyAgX0VxX2ludF9ib3VuZCh0eXBlbmFtZSBfVHJhaXRzOjppbnRfdHlwZSBfX2MpIDogX192YWwoX19jKSB7fQorICBib29sIG9wZXJhdG9yKCkoY29uc3QgdHlwZW5hbWUgX1RyYWl0czo6Y2hhcl90eXBlJiBfX3gpIGNvbnN0CisgIHsgcmV0dXJuIF9UcmFpdHM6OmVxX2ludF90eXBlKF9UcmFpdHM6OnRvX2ludF90eXBlKF9feCksIF9fdmFsKTsgfQorfTsKKworI2lmIDAKK3RlbXBsYXRlIDxjbGFzcyBfVHJhaXRzPgorc3RydWN0IF9MdF90cmFpdHMKKyAgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPHR5cGVuYW1lIF9UcmFpdHM6OmNoYXJfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9UcmFpdHM6OmNoYXJfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2w+IHsKKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IHR5cGVuYW1lIF9UcmFpdHM6OmNoYXJfdHlwZSYgX194LAorICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZW5hbWUgX1RyYWl0czo6Y2hhcl90eXBlJiBfX3kpIGNvbnN0CisgIHsgcmV0dXJuIF9UcmFpdHM6Omx0KF9feCwgX195KTsgfQorfTsKKyNlbmRpZgorCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfQ1RSQUlUU19GVU5DVElPTlNfSCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RsL19jdHlwZS5oIGIvc3RsL19jdHlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMTBmNDUKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvX2N0eXBlLmgKQEAgLTAsMCArMSwyNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisvLyBXQVJOSU5HOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBDKysKKy8vIHN0YW5kYXJkIGxpYnJhcnkgaGVhZGVycy4gIFlvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gdXNlIHRoaXMgaGVhZGVyCisvLyBmaWxlIGRpcmVjdGx5LgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NUWVBFX0gKKyNkZWZpbmUgX1NUTFBfSU5URVJOQUxfQ1RZUEVfSAorCisjaWZuZGVmIF9TVExQX0NfTE9DQUxFX0gKKyMgIGluY2x1ZGUgPHN0bC9jX2xvY2FsZS5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfTE9DQUxFX0gKKyMgIGluY2x1ZGUgPHN0bC9fbG9jYWxlLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9BTEdPQkFTRV9ICisjICBpbmNsdWRlIDxzdGwvX2FsZ29iYXNlLmg+CisjZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKK2NsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIGN0eXBlX2Jhc2UgeworcHVibGljOgorICBlbnVtIG1hc2sgeworICAgIHNwYWNlICAgPSBfTG9jYWxlX1NQQUNFLAorICAgIHByaW50ICAgPSBfTG9jYWxlX1BSSU5ULAorICAgIGNudHJsICAgPSBfTG9jYWxlX0NOVFJMLAorICAgIHVwcGVyICAgPSBfTG9jYWxlX1VQUEVSLAorICAgIGxvd2VyICAgPSBfTG9jYWxlX0xPV0VSLAorICAgIGFscGhhICAgPSBfTG9jYWxlX0FMUEhBLAorICAgIGRpZ2l0ICAgPSBfTG9jYWxlX0RJR0lULAorICAgIHB1bmN0ICAgPSBfTG9jYWxlX1BVTkNULAorICAgIHhkaWdpdCAgPSBfTG9jYWxlX1hESUdJVCwKKyAgICBhbG51bSAgID0gYWxwaGEgfCBkaWdpdCwKKyAgICBncmFwaCAgID0gYWxudW0gfCBwdW5jdAorICB9OworfTsKKworLy8gY3R5cGU8PiB0ZW1wbGF0ZQorCit0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQ+IGNsYXNzIGN0eXBlIHt9OwordGVtcGxhdGUgPGNsYXNzIGNoYXJUPiBjbGFzcyBjdHlwZV9ieW5hbWUge307CisKKy8vY3R5cGUgc3BlY2lhbGl6YXRpb25zCisKK19TVExQX1RFTVBMQVRFX05VTEwKK2NsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIGN0eXBlPGNoYXI+IDogcHVibGljIGxvY2FsZTo6ZmFjZXQsIHB1YmxpYyBjdHlwZV9iYXNlIHsKKyNpZm5kZWYgX1NUTFBfTk9fV0NIQVJfVAorIyAgaWZkZWYgX1NUTFBfTVNWQworICAgIHR5cGVkZWYgY3R5cGU8d2NoYXJfdD4gX1djdHlwZTsKKyAgICBmcmllbmQgX1djdHlwZTsKKyMgIGVsc2UKKyAgICBmcmllbmQgY2xhc3MgY3R5cGU8d2NoYXJfdD47CisjICBlbmRpZgorI2VuZGlmCisgIGZyaWVuZCBjbGFzcyBfTG9jYWxlX2ltcGw7CitwdWJsaWM6CisKKyAgdHlwZWRlZiBjaGFyIGNoYXJfdHlwZTsKKworICBleHBsaWNpdCBjdHlwZShjb25zdCBtYXNrKiBfX3RhYiA9IDAsIGJvb2wgX19kZWwgPSBmYWxzZSwgc2l6ZV90IF9fcmVmcyA9IDApOworICBib29sIGlzKG1hc2sgX19tLCBjaGFyIF9fYykgY29uc3QKKyAgeyByZXR1cm4gKCgqKF9NX2N0eXBlX3RhYmxlKyh1bnNpZ25lZCBjaGFyKV9fYykpICYgX19tKSAhPSAwOyB9CisKKyAgY29uc3QgY2hhciogaXMoY29uc3QgY2hhciogX19sb3csIGNvbnN0IGNoYXIqIF9faGlnaCwgbWFzayogX192ZWMpIGNvbnN0IHsKKyAgICBmb3IgKGNvbnN0IGNoYXIqIF9fcCA9IF9fbG93O19fcCAhPSBfX2hpZ2g7ICsrX19wLCArK19fdmVjKSB7CisgICAgICAqX192ZWMgPSBfTV9jdHlwZV90YWJsZVsodW5zaWduZWQgY2hhcikqX19wXTsKKyAgICB9CisgICAgcmV0dXJuIF9faGlnaDsKKyAgfQorCisgIGNvbnN0IGNoYXIqIHNjYW5faXMobWFzayBfX20sIGNvbnN0IGNoYXIqIF9fbG93LCBjb25zdCBjaGFyKiBfX2hpZ2gpIGNvbnN0OworICBjb25zdCBjaGFyKiBzY2FuX25vdChtYXNrIF9fbSwgY29uc3QgY2hhciogX19sb3csIGNvbnN0IGNoYXIqIF9faGlnaCkgY29uc3Q7CisKKyAgY2hhciAgICAgICAgKHRvdXBwZXIpKGNoYXIgX19jKSBjb25zdCB7IHJldHVybiBkb190b3VwcGVyKF9fYyk7IH0KKyAgY29uc3QgY2hhciogKHRvdXBwZXIpKGNoYXIqIF9fbG93LCBjb25zdCBjaGFyKiBfX2hpZ2gpIGNvbnN0IHsKKyAgICByZXR1cm4gZG9fdG91cHBlcihfX2xvdywgX19oaWdoKTsKKyAgfQorCisgIGNoYXIgICAgICAgICh0b2xvd2VyKShjaGFyIF9fYykgY29uc3QgeyByZXR1cm4gZG9fdG9sb3dlcihfX2MpOyB9CisgIGNvbnN0IGNoYXIqICh0b2xvd2VyKShjaGFyKiBfX2xvdywgY29uc3QgY2hhciogX19oaWdoKSBjb25zdCB7CisgICAgcmV0dXJuIGRvX3RvbG93ZXIoX19sb3csIF9faGlnaCk7CisgIH0KKworICBjaGFyICAgICAgICB3aWRlbihjaGFyIF9fYykgY29uc3QgeyByZXR1cm4gZG9fd2lkZW4oX19jKTsgfQorICBjb25zdCBjaGFyKiB3aWRlbihjb25zdCBjaGFyKiBfX2xvdywgY29uc3QgY2hhciogX19oaWdoLCBjaGFyKiBfX3RvKSBjb25zdCB7CisgICAgcmV0dXJuIGRvX3dpZGVuKF9fbG93LCBfX2hpZ2gsIF9fdG8pOworICB9CisKKyAgY2hhciAgICAgICAgbmFycm93KGNoYXIgX19jLCBjaGFyIF9fZGZhdWx0KSBjb25zdCB7CisgICAgcmV0dXJuIGRvX25hcnJvdyhfX2MsIF9fZGZhdWx0KTsKKyAgfQorICBjb25zdCBjaGFyKiBuYXJyb3coY29uc3QgY2hhciogX19sb3csIGNvbnN0IGNoYXIqIF9faGlnaCwKKyAgICAgICAgICAgICAgICAgICAgIGNoYXIgX19kZmF1bHQsIGNoYXIqIF9fdG8pIGNvbnN0IHsKKyAgICByZXR1cm4gZG9fbmFycm93KF9fbG93LCBfX2hpZ2gsIF9fZGZhdWx0LCBfX3RvKTsKKyAgfQorCisgIHN0YXRpYyBfU1RMUF9TVEFUSUNfTUVNQkVSX0RFQ0xTUEVDIGxvY2FsZTo6aWQgaWQ7CisjIGlmIGRlZmluZWQoX1NUTFBfU1RBVElDX0NPTlNUX0lOSVRfQlVHKQorICBlbnVtIF9fVGFibGVTaXplIHsgdGFibGVfc2l6ZSA9IDI1NiB9OworIyBlbHNlCisgIHN0YXRpYyBjb25zdCBzaXplX3QgdGFibGVfc2l6ZSA9IDI1NjsKKyMgZW5kaWYKKworcHJvdGVjdGVkOgorICBjb25zdCBtYXNrKiB0YWJsZSgpIGNvbnN0IF9TVExQX05PVEhST1cgeyByZXR1cm4gX01fY3R5cGVfdGFibGU7IH0KKyAgc3RhdGljIGNvbnN0IG1hc2sqIF9TVExQX0NBTEwgY2xhc3NpY190YWJsZSgpIF9TVExQX05PVEhST1c7CisKKyAgfmN0eXBlKCk7CisKKyAgdmlydHVhbCBjaGFyICAgICAgICBkb190b3VwcGVyKGNoYXIgX19jKSBjb25zdDsKKyAgdmlydHVhbCBjaGFyICAgICAgICBkb190b2xvd2VyKGNoYXIgX19jKSBjb25zdDsKKyAgdmlydHVhbCBjb25zdCBjaGFyKiBkb190b3VwcGVyKGNoYXIqIF9fbG93LCBjb25zdCBjaGFyKiBfX2hpZ2gpIGNvbnN0OworICB2aXJ0dWFsIGNvbnN0IGNoYXIqIGRvX3RvbG93ZXIoY2hhciogX19sb3csIGNvbnN0IGNoYXIqIF9faGlnaCkgY29uc3Q7CisgIHZpcnR1YWwgY2hhciAgICAgICAgZG9fd2lkZW4oY2hhciBfX2MpIGNvbnN0OworICB2aXJ0dWFsIGNvbnN0IGNoYXIqIGRvX3dpZGVuKGNvbnN0IGNoYXIqIF9fbG93LCBjb25zdCBjaGFyKiBfX2hpZ2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogX190bykgY29uc3Q7CisgIHZpcnR1YWwgY2hhciAgICAgICAgZG9fbmFycm93KGNoYXIgX19jLCBjaGFyIC8qIGRmYXVsdCAqLyApIGNvbnN0OworICB2aXJ0dWFsIGNvbnN0IGNoYXIqIGRvX25hcnJvdyhjb25zdCBjaGFyKiBfX2xvdywgY29uc3QgY2hhciogX19oaWdoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIC8qIGRmYXVsdCAqLywgY2hhciogX190bykgY29uc3Q7Citwcml2YXRlOgorICBzdHJ1Y3QgX0lzX21hc2sgeworICAgIG1hc2sgX19tOworICAgIF9Jc19tYXNrKG1hc2sgX194KTogX19tKF9feCkge30KKyAgIGJvb2wgb3BlcmF0b3IoKShjaGFyIF9fYykge3JldHVybiAoX19tICYgKHVuc2lnbmVkIGNoYXIpIF9fYykgIT0gMDt9CisgIH07CisKK3Byb3RlY3RlZDoKKyAgY29uc3QgbWFzayogX01fY3R5cGVfdGFibGU7Citwcml2YXRlOgorICBib29sIF9NX2RlbGV0ZTsKK307CisKK19TVExQX1RFTVBMQVRFX05VTEwKK2NsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIGN0eXBlX2J5bmFtZTxjaGFyPjogcHVibGljIGN0eXBlPGNoYXI+IHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgY3R5cGVfYnluYW1lKGNvbnN0IGNoYXIqLCBzaXplX3QgPSAwLCBfTG9jYWxlX25hbWVfaGludCogX19oaW50ID0gMCk7CisgIH5jdHlwZV9ieW5hbWUoKTsKKworICB2aXJ0dWFsIGNoYXIgICAgICAgIGRvX3RvdXBwZXIoY2hhciBfX2MpIGNvbnN0OworICB2aXJ0dWFsIGNoYXIgICAgICAgIGRvX3RvbG93ZXIoY2hhciBfX2MpIGNvbnN0OworCisgIHZpcnR1YWwgY29uc3QgY2hhciogZG9fdG91cHBlcihjaGFyKiwgY29uc3QgY2hhciopIGNvbnN0OworICB2aXJ0dWFsIGNvbnN0IGNoYXIqIGRvX3RvbG93ZXIoY2hhciosIGNvbnN0IGNoYXIqKSBjb25zdDsKKworcHJpdmF0ZToKKyAgbWFzayBfTV9ieW5hbWVfdGFibGVbdGFibGVfc2l6ZV07CisgIF9Mb2NhbGVfY3R5cGUqIF9NX2N0eXBlOworCisgIC8vZXhwbGljaXRlbHkgZGVmaW5lZCBhcyBwcml2YXRlIHRvIGF2b2lkIHdhcm5pbmdzOgorICB0eXBlZGVmIGN0eXBlX2J5bmFtZTxjaGFyPiBfU2VsZjsKKyAgY3R5cGVfYnluYW1lKF9TZWxmIGNvbnN0Jik7CisgIF9TZWxmJiBvcGVyYXRvciA9IChfU2VsZiBjb25zdCYpOworICBmcmllbmQgX0xvY2FsZV9uYW1lX2hpbnQqIF9Mb2NhbGVfZXh0cmFjdF9oaW50KGN0eXBlX2J5bmFtZTxjaGFyPiopOworfTsKKworIyAgaWZuZGVmIF9TVExQX05PX1dDSEFSX1QKK19TVExQX1RFTVBMQVRFX05VTEwKK2NsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIGN0eXBlPHdjaGFyX3Q+IDogcHVibGljIGxvY2FsZTo6ZmFjZXQsIHB1YmxpYyBjdHlwZV9iYXNlCit7CisgIGZyaWVuZCBjbGFzcyBfTG9jYWxlX2ltcGw7CitwdWJsaWM6CisgIHR5cGVkZWYgd2NoYXJfdCBjaGFyX3R5cGU7CisKKyAgZXhwbGljaXQgY3R5cGUoc2l6ZV90IF9fcmVmcyA9IDApIDogbG9jYWxlOjpmYWNldChfX3JlZnMpIHt9CisKKyAgYm9vbCBpcyhtYXNrIF9fbSwgd2NoYXJfdCBfX2MpIGNvbnN0CisgICAgeyByZXR1cm4gZG9faXMoX19tLCBfX2MpOyB9CisKKyAgY29uc3Qgd2NoYXJfdCogaXMoY29uc3Qgd2NoYXJfdCogX19sb3csIGNvbnN0IHdjaGFyX3QqIF9faGlnaCwKKyAgICAgICAgICAgICAgICAgICAgbWFzayogX192ZWMpIGNvbnN0CisgICAgeyByZXR1cm4gZG9faXMoX19sb3csIF9faGlnaCwgX192ZWMpOyB9CisKKyAgY29uc3Qgd2NoYXJfdCogc2Nhbl9pcyhtYXNrIF9fbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBfX2xvdywgY29uc3Qgd2NoYXJfdCogX19oaWdoKSBjb25zdAorICAgIHsgcmV0dXJuIGRvX3NjYW5faXMoX19tLCBfX2xvdywgX19oaWdoKTsgfQorCisgIGNvbnN0IHdjaGFyX3QqIHNjYW5fbm90IChtYXNrIF9fbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIF9fbG93LCBjb25zdCB3Y2hhcl90KiBfX2hpZ2gpIGNvbnN0CisgICAgeyByZXR1cm4gZG9fc2Nhbl9ub3QoX19tLCBfX2xvdywgX19oaWdoKTsgfQorCisgIHdjaGFyX3QgKHRvdXBwZXIpKHdjaGFyX3QgX19jKSBjb25zdCB7IHJldHVybiBkb190b3VwcGVyKF9fYyk7IH0KKyAgY29uc3Qgd2NoYXJfdCogKHRvdXBwZXIpKHdjaGFyX3QqIF9fbG93LCBjb25zdCB3Y2hhcl90KiBfX2hpZ2gpIGNvbnN0CisgICAgeyByZXR1cm4gZG9fdG91cHBlcihfX2xvdywgX19oaWdoKTsgfQorCisgIHdjaGFyX3QgKHRvbG93ZXIpKHdjaGFyX3QgX19jKSBjb25zdCB7IHJldHVybiBkb190b2xvd2VyKF9fYyk7IH0KKyAgY29uc3Qgd2NoYXJfdCogKHRvbG93ZXIpKHdjaGFyX3QqIF9fbG93LCBjb25zdCB3Y2hhcl90KiBfX2hpZ2gpIGNvbnN0CisgICAgeyByZXR1cm4gZG9fdG9sb3dlcihfX2xvdywgX19oaWdoKTsgfQorCisgIHdjaGFyX3Qgd2lkZW4oY2hhciBfX2MpIGNvbnN0IHsgcmV0dXJuIGRvX3dpZGVuKF9fYyk7IH0KKyAgY29uc3QgY2hhciogd2lkZW4oY29uc3QgY2hhciogX19sb3csIGNvbnN0IGNoYXIqIF9faGlnaCwKKyAgICAgICAgICAgICAgICAgICAgd2NoYXJfdCogX190bykgY29uc3QKKyAgICB7IHJldHVybiBkb193aWRlbihfX2xvdywgX19oaWdoLCBfX3RvKTsgfQorCisgIGNoYXIgbmFycm93KHdjaGFyX3QgX19jLCBjaGFyIF9fZGZhdWx0KSBjb25zdAorICAgIHsgcmV0dXJuIGRvX25hcnJvdyhfX2MsIF9fZGZhdWx0KTsgfQorICBjb25zdCB3Y2hhcl90KiBuYXJyb3coY29uc3Qgd2NoYXJfdCogX19sb3csIGNvbnN0IHdjaGFyX3QqIF9faGlnaCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgX19kZmF1bHQsIGNoYXIqIF9fdG8pIGNvbnN0CisgICAgeyByZXR1cm4gZG9fbmFycm93KF9fbG93LCBfX2hpZ2gsIF9fZGZhdWx0LCBfX3RvKTsgfQorCisgIHN0YXRpYyBfU1RMUF9TVEFUSUNfTUVNQkVSX0RFQ0xTUEVDIGxvY2FsZTo6aWQgaWQ7CisKK3Byb3RlY3RlZDoKKyAgfmN0eXBlKCk7CisKKyAgdmlydHVhbCBib29sICAgICAgICAgICBkb19pcyhtYXNrIF9fbSwgd2NoYXJfdCBfX2MpIGNvbnN0OworICB2aXJ0dWFsIGNvbnN0IHdjaGFyX3QqIGRvX2lzKGNvbnN0IHdjaGFyX3QqLCBjb25zdCB3Y2hhcl90KiwgbWFzayopIGNvbnN0OworICB2aXJ0dWFsIGNvbnN0IHdjaGFyX3QqIGRvX3NjYW5faXMobWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqLCBjb25zdCB3Y2hhcl90KikgY29uc3Q7CisgIHZpcnR1YWwgY29uc3Qgd2NoYXJfdCogZG9fc2Nhbl9ub3QobWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiwgY29uc3Qgd2NoYXJfdCopIGNvbnN0OworICB2aXJ0dWFsIHdjaGFyX3QgZG9fdG91cHBlcih3Y2hhcl90IF9fYykgY29uc3Q7CisgIHZpcnR1YWwgY29uc3Qgd2NoYXJfdCogZG9fdG91cHBlcih3Y2hhcl90KiwgY29uc3Qgd2NoYXJfdCopIGNvbnN0OworICB2aXJ0dWFsIHdjaGFyX3QgZG9fdG9sb3dlcih3Y2hhcl90IGMpIGNvbnN0OworICB2aXJ0dWFsIGNvbnN0IHdjaGFyX3QqIGRvX3RvbG93ZXIod2NoYXJfdCosIGNvbnN0IHdjaGFyX3QqKSBjb25zdDsKKyAgdmlydHVhbCB3Y2hhcl90IGRvX3dpZGVuKGNoYXIgYykgY29uc3Q7CisgIHZpcnR1YWwgY29uc3QgY2hhciogZG9fd2lkZW4oY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCB3Y2hhcl90KikgY29uc3Q7CisgIHZpcnR1YWwgY2hhciAgZG9fbmFycm93KHdjaGFyX3QgX19jLCBjaGFyIF9fZGZhdWx0KSBjb25zdDsKKyAgdmlydHVhbCBjb25zdCB3Y2hhcl90KiBkb19uYXJyb3coY29uc3Qgd2NoYXJfdCosIGNvbnN0IHdjaGFyX3QqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyLCBjaGFyKikgY29uc3Q7Cit9OworCitfU1RMUF9URU1QTEFURV9OVUxMCitjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBjdHlwZV9ieW5hbWU8d2NoYXJfdD46IHB1YmxpYyBjdHlwZTx3Y2hhcl90PiB7CitwdWJsaWM6CisgIGV4cGxpY2l0IGN0eXBlX2J5bmFtZShjb25zdCBjaGFyKiBfX25hbWUsIHNpemVfdCBfX3JlZnMgPSAwLCBfTG9jYWxlX25hbWVfaGludCogX19oaW50ID0gMCk7CisKK3Byb3RlY3RlZDoKKyAgfmN0eXBlX2J5bmFtZSgpOworCisgIHZpcnR1YWwgYm9vbCAgICAgICAgICAgZG9faXMobWFzayBfX20sIHdjaGFyX3QgX19jKSBjb25zdDsKKyAgdmlydHVhbCBjb25zdCB3Y2hhcl90KiBkb19pcyhjb25zdCB3Y2hhcl90KiwgY29uc3Qgd2NoYXJfdCosIG1hc2sqKSBjb25zdDsKKyAgdmlydHVhbCBjb25zdCB3Y2hhcl90KiBkb19zY2FuX2lzKG1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiwgY29uc3Qgd2NoYXJfdCopIGNvbnN0OworICB2aXJ0dWFsIGNvbnN0IHdjaGFyX3QqIGRvX3NjYW5fbm90KG1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCosIGNvbnN0IHdjaGFyX3QqKSBjb25zdDsKKyAgdmlydHVhbCB3Y2hhcl90IGRvX3RvdXBwZXIod2NoYXJfdCBfX2MpIGNvbnN0OworICB2aXJ0dWFsIGNvbnN0IHdjaGFyX3QqIGRvX3RvdXBwZXIod2NoYXJfdCosIGNvbnN0IHdjaGFyX3QqKSBjb25zdDsKKyAgdmlydHVhbCB3Y2hhcl90IGRvX3RvbG93ZXIod2NoYXJfdCBjKSBjb25zdDsKKyAgdmlydHVhbCBjb25zdCB3Y2hhcl90KiBkb190b2xvd2VyKHdjaGFyX3QqLCBjb25zdCB3Y2hhcl90KikgY29uc3Q7CisKK3ByaXZhdGU6CisgIF9Mb2NhbGVfY3R5cGUqIF9NX2N0eXBlOworCisgIC8vZXhwbGljaXRlbHkgZGVmaW5lZCBhcyBwcml2YXRlIHRvIGF2b2lkIHdhcm5pbmdzOgorICB0eXBlZGVmIGN0eXBlX2J5bmFtZTx3Y2hhcl90PiBfU2VsZjsKKyAgY3R5cGVfYnluYW1lKF9TZWxmIGNvbnN0Jik7CisgIF9TZWxmJiBvcGVyYXRvciA9IChfU2VsZiBjb25zdCYpOworfTsKKworIyAgZW5kaWYgLyogV0NIQVJfVCAqLworCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9DVFlQRV9IICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CisKZGlmZiAtLWdpdCBhL3N0bC9fY3djaGFyLmggYi9zdGwvX2N3Y2hhci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ODM2YWQKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvX2N3Y2hhci5oCkBAIC0wLDAgKzEsMzI0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DV0NIQVIKKyNkZWZpbmUgX1NUTFBfSU5URVJOQUxfQ1dDSEFSCisKKyNpZiBkZWZpbmVkIChfU1RMUF9XQ0VfRVZDMykKKyMgIGlmbmRlZiBfU1RMUF9JTlRFUk5BTF9NQlNUQVRFX1QKKyMgICAgaW5jbHVkZSA8c3RsL19tYnN0YXRlX3QuaD4KKyMgIGVuZGlmCisjZWxzZQorIyAgaWYgZGVmaW5lZCAoX19HTlVDX18pCisjICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9DX0hFQURFUihjc3RkZGVmKQorIyAgZW5kaWYKKworIyAgaWYgIWRlZmluZWQgKF9TVExQX05PX0NXQ0hBUikgJiYgZGVmaW5lZCAoX1NUTFBfVVNFX05FV19DX0hFQURFUlMpCisjICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9DX0hFQURFUihjd2NoYXIpCisjICAgIGlmIGRlZmluZWQgKF9fT3BlbkJTRF9fKQordHlwZWRlZiBfQlNEX1dJTlRfVF8gd2ludF90OworIyAgICBlbmRpZiAvKiBfX09wZW5CU0RfXyAqLworCisjICBlbGlmIGRlZmluZWQgKF9TVExQX05PX1dDSEFSX1QpIHx8IGRlZmluZWQgKF9fTVJDX18pIHx8IChkZWZpbmVkIChfX1NDX18pICYmICFkZWZpbmVkIChfX0RNQ19fKSkgfHwgXAorICAgICAgIChkZWZpbmVkIChfX0JPUkxBTkRDX18pICYmIChfX0JPUkxBTkRDX18gPCAweDU4MCkpIHx8IFwKKyAgICAgICAgZGVmaW5lZCAoX19PcGVuQlNEX18pIHx8IGRlZmluZWQgKF9fRnJlZUJTRF9fKSB8fCBcCisgICAgICAgKGRlZmluZWQgKF9fR05VQ19fKSAmJiAoZGVmaW5lZCAoX19BUFBMRV9fKSB8fCBkZWZpbmVkICggX19MeW54X18gKSkpCisjICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NfSEVBREVSKHN0ZGRlZi5oKQorIyAgICBpZiBkZWZpbmVkIChfX0x5bnhfXykKKyMgICAgICBpZm5kZWYgX1dJTlRfVAordHlwZWRlZiBsb25nIGludCB3aW50X3Q7CisjICAgICAgICBkZWZpbmUgX1dJTlRfVAorIyAgICAgIGVuZGlmIC8qIF9XSU5UX1QgKi8KKyMgICAgZW5kaWYKKyMgICAgaWYgZGVmaW5lZChfX09wZW5CU0RfXykKK3R5cGVkZWYgX0JTRF9XSU5UX1RfIHdpbnRfdDsKKyMgICAgZW5kaWYgLyogX19PcGVuQlNEX18gKi8KKyMgIGVsaWYgZGVmaW5lZCAoX19NV0VSS1NfXykgJiYgZGVmaW5lZCAoTl9QTEFUX05MTSkKKyMgICAgaW5jbHVkZSA8d2NoYXIuaD4KKyMgIGVsaWYgIWRlZmluZWQgKEFORFJPSUQpCisvLyBBbmRyb2lkIGRvZXNuJ3QgaGF2ZSBhIHdvcmtpbmcgd2NoYXIuaAorIyAgICBpbmNsdWRlIF9TVExQX05BVElWRV9DX0hFQURFUih3Y2hhci5oKQorCisjICAgIGlmIGRlZmluZWQgKF9fc3VuKSAmJiAoZGVmaW5lZCAoX1hPUEVOX1NPVVJDRSkgfHwgKF9YT1BFTl9WRVJTSU9OIC0gMCA9PSA0KSkKK2V4dGVybiB3aW50X3QgICBidG93YygpOworZXh0ZXJuIGludCAgICAgIGZ3cHJpbnRmKCk7CitleHRlcm4gaW50ICAgICAgZndzY2FuZigpOworZXh0ZXJuIGludCAgICAgIGZ3aWRlKCk7CitleHRlcm4gaW50ICAgICAgbWJzaW5pdCgpOworZXh0ZXJuIHNpemVfdCAgIG1icmxlbigpOworZXh0ZXJuIHNpemVfdCAgIG1icnRvd2MoKTsKK2V4dGVybiBzaXplX3QgICBtYnNydG93Y3MoKTsKK2V4dGVybiBpbnQgICAgICBzd3ByaW50ZigpOworZXh0ZXJuIGludCAgICAgIHN3c2NhbmYoKTsKK2V4dGVybiBpbnQgICAgICB2ZndwcmludGYoKTsKK2V4dGVybiBpbnQgICAgICB2d3ByaW50ZigpOworZXh0ZXJuIGludCAgICAgIHZzd3ByaW50ZigpOworZXh0ZXJuIHNpemVfdCAgIHdjcnRvbWIoKTsKK2V4dGVybiBzaXplX3QgICB3Y3NydG9tYnMoKTsKK2V4dGVybiB3Y2hhcl90ICAqd2Nzc3RyKCk7CitleHRlcm4gaW50ICAgICAgd2N0b2IoKTsKK2V4dGVybiB3Y2hhcl90ICAqd21lbWNocigpOworZXh0ZXJuIGludCAgICAgIHdtZW1jbXAoKTsKK2V4dGVybiB3Y2hhcl90ICAqd21lbWNweSgpOworZXh0ZXJuIHdjaGFyX3QgICp3bWVtbW92ZSgpOworZXh0ZXJuIHdjaGFyX3QgICp3bWVtc2V0KCk7CitleHRlcm4gaW50ICAgICAgd3ByaW50ZigpOworZXh0ZXJuIGludCAgICAgIHdzY2FuZigpOworIyAgICBlbmRpZgorIyAgZW5kaWYKKworIyAgaWYgZGVmaW5lZCAoX19NU0xfXykgJiYgKF9fTVNMX18gPD0gMHg1MUZGKSAgLyogZHdhIDIvMjgvOTkgLSBub3QgeWV0IGltcGxlbWVudGVkIGJ5IE1TTCAgKi8KKyMgICAgZGVmaW5lIF9TVExQX1dDSEFSX01TTF9FWENMVURFIDEKK25hbWVzcGFjZSBzdGQgeworICBleHRlcm4gIkMiIHNpemVfdCB3Y3NmdGltZSh3Y2hhcl90ICogc3RyLCBzaXplX3QgbWF4X3NpemUsIGNvbnN0IHdjaGFyX3QgKiBmb3JtYXRfc3RyLCBjb25zdCBzdHJ1Y3QgdG0gKiB0aW1lcHRyKTsKK30KKyMgICAgZGVmaW5lIF9TVExQX05PX01CU1RBVEVfVCAxCisjICBlbGlmIGRlZmluZWQgKF9fQk9STEFORENfXykKKyMgICAgaWYgIWRlZmluZWQgKF9TVExQX1VTRV9OT19JT1NUUkVBTVMpCisjICAgICAgZGVmaW5lIF9TVExQX05PX05BVElWRV9NQlNUQVRFX1QKKyMgICAgZW5kaWYKKyMgICAgZGVmaW5lIF9TVExQX1dDSEFSX0JPUkxBTkRfRVhDTFVERSAxCisjICBlbmRpZgorCisjICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfTUJTVEFURV9UCisjICAgIGluY2x1ZGUgPHN0bC9fbWJzdGF0ZV90Lmg+CisjICBlbmRpZgorCisjICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkKKyMgICAgaWZuZGVmIFdDSEFSX01JTgorIyAgICAgIGRlZmluZSBXQ0hBUl9NSU4gMAorLyogU1VOcHJvIGhhcyBzb21lIGJ1Z3Mgd2l0aCBjYXN0cy4gd2NoYXJfdCBpcyBzaXplIG9mIGludCB0aGVyZSBhbnl3YXkuICovCisjICAgICAgaWYgZGVmaW5lZCAoX19TVU5QUk9fQ0MpIHx8IGRlZmluZWQgKF9fREpHUFApCisjICAgICAgICBkZWZpbmUgV0NIQVJfTUFYICh+MCkKKyMgICAgICBlbHNlCisjICAgICAgICBkZWZpbmUgV0NIQVJfTUFYICgod2NoYXJfdCl+MCkKKyMgICAgICBlbmRpZgorIyAgICBlbmRpZgorIyAgICBpZiBkZWZpbmVkIChfX0dOVUNfXykgJiYgZGVmaW5lZCAoX19hbHBoYV9fKQorLyogRGVmaW5pdGlvbiBvZiBXQ0hBUl9NSU4gYW5kIE1BWCBhcmUgd3JvbmcgZm9yIGFscGhhIHBsYXRmb3JtCisgKiBhcyBnY2MgY29uc2lkZXIgd2NoYXJfdCBhcyBhbiB1bnNpZ25lZCB0eXBlLiBTdGF0aWMgYXNzZXJ0aW9uIGFyZQorICogaGVyZSB0byBjaGVjayB0aGF0IGEgZnV0dXJlIGFscGhhIFNESyBvciBhIGZ1dHVyZSBnY2Mgd29uJ3QgY2hhbmdlIHRoZQorICogc2l0dWF0aW9uIG1ha2luZyB0aGlzIHdvcmthcm91bmQgdXNlbGVzcy4KKyAqLworX1NUTFBfU1RBVElDX0FTU0VSVCgoKHdjaGFyX3QpLTEgPiAwKSAmJiAoV0NIQVJfTUlOIDwgMCkpCisjICAgICAgdW5kZWYgV0NIQVJfTUlOCisjICAgICAgZGVmaW5lIFdDSEFSX01JTiAwCisjICAgICAgdW5kZWYgV0NIQVJfTUFYCisjICAgICAgZGVmaW5lIFdDSEFSX01BWCAoKHdjaGFyX3QpfjApCisjICAgIGVuZGlmCisjICAgIGlmIGRlZmluZWQoX19IUF9hQ0MpICYmIChfX0hQX2FDQyA+PSA2MDAwMCkKKy8qIFN0YXJ0aW5nIHdpdGggQi4xMS4zMSwgSFAtVVgvaWE2NCBwcm92aWRlcyBDOTktY29tcGxpYW50IGRlZmluaXRpb25zCisgKiBvZiBXQ0hBUl9NSU4vTUFYIG1hY3JvcyB3aXRob3V0IGhhdmluZyB0byBkZWZpbmUKKyAqIF9JTkNMVURFX1NURENfX1NPVVJDRV8xOTk5MDEgbWFjcm8gKHdoaWNoIGFDQyBjb21waWxlciBkb2VzIG5vdAorICogcHJlZGVmaW5lKS4gTGV0IFNUTHBvcnQgcHJvdmlkZSBCLjExLjMxIGRlZmluaXRpb25zIG9uIGFueSB2ZXJzaW9uIG9mCisgKiBIUC1VWC9pYTY0LgorICovCisjICAgICAgdW5kZWYgV0NIQVJfTUlOCisjICAgICAgZGVmaW5lIFdDSEFSX01JTiAwCisjICAgICAgdW5kZWYgV0NIQVJfTUFYCisjICAgICAgZGVmaW5lIFdDSEFSX01BWCBVSU5UX01BWCAKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisKKyMgIGlmIGRlZmluZWQgKF9TVExQX0lNUE9SVF9WRU5ET1JfQ1NURCkKKworIyAgICBpZiBkZWZpbmVkIChfX1NVTlBST19DQykgJiYgIWRlZmluZWQgKF9TVExQX0hBU19OT19ORVdfQ19IRUFERVJTKQordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OndpbnRfdDsKKyMgICAgZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisjICAgIGlmIGRlZmluZWQgKF9TVExQX05PX1dDSEFSX1QpCit0eXBlZGVmIGludCB3aW50X3Q7CisjICAgIGVsc2UKKy8vIGdjYyAzLjAgaGFzIGEgZ2xpdGNoIDogd2ludF90IG9ubHkgc3Vja2VkIGludG8gdGhlIGdsb2JhbCBuYW1lc3BhY2UgaWYgX0dMSUJDUFBfVVNFX1dDSEFSX1QgaXMgZGVmaW5lZAorLy8gX19NV0VSS1NfXyBoYXMgZGVmaW5pdGlvbiBpbiB3Y2hhcl90LmggKE1TTCBDKyspLCBidXQgb25lcyBkaWZmZXIgZnJvbSBkZWZpbml0aW9uCisvLyBpbiBzdGRpby5oOyBJIHByZWZlciBzZXR0aW5ncyBmcm9tIGxhc3QgZmlsZS4KKyMgICAgICBpZiAoZGVmaW5lZCAoX19HTlVDX18pICYmICEgZGVmaW5lZCAoX0dMSUJDUFBfVVNFX1dDSEFSX1QpKSAvLyB8fCAoZGVmaW5lZChfX01XRVJLU19fKSAmJiBkZWZpbmVkKE5fUExBVF9OTE0pKQordXNpbmcgOjp3aW50X3Q7CisjICAgICAgZWxzZQordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OndpbnRfdDsKKyMgICAgICBlbmRpZgorIyAgICBlbmRpZgorCit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6c2l6ZV90OworCisjICAgIGlmICFkZWZpbmVkIChfU1RMUF9OT19OQVRJVkVfTUJTVEFURV9UKSAmJiAhZGVmaW5lZCAoX1NUTFBfVVNFX09XTl9NQlNUQVRFX1QpCit1c2luZyBfU1RMUF9WRU5ET1JfTUJfTkFNRVNQQUNFOjptYnN0YXRlX3Q7CisKKyMgICAgICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fQ1NURF9GVU5DVElPTl9JTVBPUlRTKSAmJiAhZGVmaW5lZChfU1RMUF9XQ0hBUl9CT1JMQU5EX0VYQ0xVREUpICYmIFwKKyAgICAgICAgICghZGVmaW5lZChfX01TTF9fKSB8fCBfX01TTF9fID4gMHg2MDAxKQorIyAgICAgICAgaWYgZGVmaW5lZCAoX19NSU5HVzMyX18pICYmICgoX19NSU5HVzMyX01BSk9SX1ZFUlNJT04gPiAzKSB8fCAoKF9fTUlOR1czMl9NQUpPUl9WRVJTSU9OID09IDMpICYmIChfX01JTkdXMzJfTUlOT1JfVkVSU0lPTiA+PSA4KSkpIHx8IFwKKyAgICAgICAgICAhKGRlZmluZWQgKF9fS0NDKSB8fCBkZWZpbmVkIChfX0dOVUNfXykpICYmICFkZWZpbmVkKF9TVExQX1dDRV9ORVQpICYmICEoZGVmaW5lZChfX01XRVJLU19fKSAmJiBkZWZpbmVkKE5fUExBVF9OTE0pKQordXNpbmcgX1NUTFBfVkVORE9SX01CX05BTUVTUEFDRTo6YnRvd2M7CisjICAgICAgICAgIGlmICghZGVmaW5lZChfX01TTF9fKSB8fCBfX01TTF9fID4gMHg3MDAxKQordXNpbmcgX1NUTFBfVkVORE9SX01CX05BTUVTUEFDRTo6bWJzaW5pdDsKKyMgICAgICAgICAgZW5kaWYKKyMgICAgICAgIGVuZGlmCisjICAgICAgICBpZiBkZWZpbmVkIChfX01JTkdXMzJfXykgJiYgKChfX01JTkdXMzJfTUFKT1JfVkVSU0lPTiA+IDMpIHx8ICgoX19NSU5HVzMyX01BSk9SX1ZFUlNJT04gPT0gMykgJiYgKF9fTUlOR1czMl9NSU5PUl9WRVJTSU9OID49IDgpKSkgfHwgXAorICAgICAgICAgICAhZGVmaW5lZCAoX19HTlVDX18pICYmICFkZWZpbmVkKF9TVExQX1dDRV9ORVQpICYmICEoZGVmaW5lZChfX01XRVJLU19fKSAmJiBkZWZpbmVkKE5fUExBVF9OTE0pKQordXNpbmcgX1NUTFBfVkVORE9SX01CX05BTUVTUEFDRTo6bWJybGVuOwordXNpbmcgX1NUTFBfVkVORE9SX01CX05BTUVTUEFDRTo6bWJydG93YzsKK3VzaW5nIF9TVExQX1ZFTkRPUl9NQl9OQU1FU1BBQ0U6Om1ic3J0b3djczsKK3VzaW5nIF9TVExQX1ZFTkRPUl9NQl9OQU1FU1BBQ0U6OndjcnRvbWI7Cit1c2luZyBfU1RMUF9WRU5ET1JfTUJfTkFNRVNQQUNFOjp3Y3NydG9tYnM7CisjICAgICAgICBlbmRpZgorIyAgICAgIGVuZGlmIC8qIEJPUkxBTkQgJiYgIV9fTVNMX18gfHwgX19NU0xfXyA+IDB4NjAwMSAqLworCisjICAgIGVuZGlmIC8qIF9TVExQX05PX05BVElWRV9NQlNUQVRFX1QgKi8KKworIyAgICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTkFUSVZFX1dJREVfRlVOQ1RJT05TKSAmJiAhIGRlZmluZWQgKF9TVExQX05PX0NTVERfRlVOQ1RJT05fSU1QT1JUUykKKworIyAgICAgIGlmICFkZWZpbmVkIChfU1RMUF9XQ0hBUl9CT1JMQU5EX0VYQ0xVREUpICYmICEgZGVmaW5lZCAoX1NUTFBfTk9fQ1NURF9GVU5DVElPTl9JTVBPUlRTKSAmJiAhKGRlZmluZWQoX19NV0VSS1NfXykgJiYgZGVmaW5lZChOX1BMQVRfTkxNKSkKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpmZ2V0d2M7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6ZmdldHdzOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OmZwdXR3YzsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpmcHV0d3M7CisjICAgICAgZW5kaWYKKworIyAgICAgIGlmICEoZGVmaW5lZCAoX1NUTFBfV0NIQVJfU1VOUFJPX0VYQ0xVREUpIHx8IGRlZmluZWQgKF9TVExQX1dDSEFSX0JPUkxBTkRfRVhDTFVERSkgfHwgXAorICAgICAgICAgICAgZGVmaW5lZChfU1RMUF9XQ0hBUl9IUEFDQ19FWENMVURFKSB8fCAoZGVmaW5lZChfX01XRVJLU19fKSAmJiBkZWZpbmVkKE5fUExBVF9OTE0pKSkKKyMgICAgICAgIGlmICFkZWZpbmVkIChfX0RFQ0NYWCkKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpmd2lkZTsKKyMgICAgICAgIGVuZGlmCit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6ZndwcmludGY7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6ZndzY2FuZjsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpnZXR3Y2hhcjsKKyMgICAgICBlbmRpZgorCisjICAgICAgaWYgIWRlZmluZWQoX1NUTFBfV0NIQVJfQk9STEFORF9FWENMVURFKSAmJiAhKGRlZmluZWQoX19NV0VSS1NfXykgJiYgZGVmaW5lZChOX1BMQVRfTkxNKSkKKyMgICAgICAgIGlmbmRlZiBfU1RMUF9XQ0VfTkVUCit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6Z2V0d2M7CisjICAgICAgICBlbmRpZgordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnVuZ2V0d2M7CisjICAgICAgICBpZm5kZWYgX1NUTFBfV0NFX05FVAordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnB1dHdjOworIyAgICAgICAgZW5kaWYKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpwdXR3Y2hhcjsKKyMgICAgICBlbmRpZgorCisjICAgICAgaWYgIShkZWZpbmVkIChfU1RMUF9XQ0hBUl9TVU5QUk9fRVhDTFVERSkgfHwgZGVmaW5lZCAoX1NUTFBfV0NIQVJfQk9STEFORF9FWENMVURFKSB8fCBcCisgICAgICAgICAgICBkZWZpbmVkIChfU1RMUF9XQ0hBUl9IUEFDQ19FWENMVURFKSB8fCAoZGVmaW5lZCAoX19NV0VSS1NfXykgJiYgZGVmaW5lZCAoTl9QTEFUX05MTSkpKQorIyAgICAgICAgaWYgZGVmaW5lZCAoX1NUTFBfTVNWQ19MSUIpICYmIChfU1RMUF9NU1ZDX0xJQiA8PSAxMzAwKSB8fCBcCisgICAgICAgICAgICBkZWZpbmVkIChfX01JTkdXMzJfXykKKyMgICAgICAgICAgdW5kZWYgc3dwcmludGYKKyMgICAgICAgICAgZGVmaW5lIHN3cHJpbnRmIF9zbndwcmludGYKKyMgICAgICAgICAgdW5kZWYgdnN3cHJpbnRmCisjICAgICAgICAgIGRlZmluZSB2c3dwcmludGYgX3ZzbndwcmludGYKK3VzaW5nIDo6c3dwcmludGY7Cit1c2luZyA6OnZzd3ByaW50ZjsKKyMgICAgICAgIGVsc2UKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpzd3ByaW50ZjsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjp2c3dwcmludGY7CisjICAgICAgICBlbmRpZgordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnN3c2NhbmY7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6dmZ3cHJpbnRmOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnZ3cHJpbnRmOworCisjICAgICAgICBpZiAoIWRlZmluZWQoX19NU0xfXykgfHwgX19NU0xfXyA+IDB4NzAwMSApICYmICFkZWZpbmVkKF9TVExQX1dDRV9ORVQpICYmIFwKKyAgICAgICAgICAgICAhZGVmaW5lZChfU1RMUF9VU0VfVUNMSUJDKSAvKiBhdCBsZWFzdCBpbiB1Q2xpYmMgMC45LjI2ICovCisKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjp3Y3NmdGltZTsKKyMgICAgICAgIGVuZGlmCit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6d2NzdG9rOworCisjICAgICAgZW5kaWYKKworIyAgICAgIGlmICEoZGVmaW5lZChfX01XRVJLU19fKSAmJiBkZWZpbmVkKE5fUExBVF9OTE0pKQorIyAgICAgICAgaWYgIWRlZmluZWQgKF9TVExQX1dDRV9ORVQpCit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6d2NzY29sbDsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjp3Y3N4ZnJtOworIyAgICAgICAgZW5kaWYKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjp3Y3NjYXQ7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6d2NzcmNocjsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjp3Y3NjbXA7CisKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjp3Y3NjcHk7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6d2NzY3NwbjsKKwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6Ondjc2xlbjsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjp3Y3NuY2F0OwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6Ondjc25jbXA7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6d2NzbmNweTsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjp3Y3NwYnJrOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6Ondjc2NocjsKKwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6Ondjc3NwbjsKKyMgICAgICBlbmRpZgorCisjICAgICAgaWYgIWRlZmluZWQgKF9TVExQX1dDSEFSX0JPUkxBTkRfRVhDTFVERSkgJiYgIShkZWZpbmVkKF9fTVdFUktTX18pICYmIGRlZmluZWQoTl9QTEFUX05MTSkpCit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6d2NzdG9kOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6Ondjc3RvbDsKKyMgICAgICBlbmRpZgorCisjICAgICAgaWYgIShkZWZpbmVkIChfU1RMUF9XQ0hBUl9TVU5QUk9fRVhDTFVERSkgfHwgZGVmaW5lZCAoX1NUTFBfV0NIQVJfSFBBQ0NfRVhDTFVERSkgfHwgXAorICAgICAgICAgICAgKGRlZmluZWQgKF9fTVdFUktTX18pICYmIGRlZmluZWQgKE5fUExBVF9OTE0pKSkKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjp3Y3NzdHI7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6d21lbWNocjsKKworIyAgICAgICAgaWYgIWRlZmluZWQgKF9TVExQX1dDSEFSX0JPUkxBTkRfRVhDTFVERSkKKyMgICAgICAgICAgICBpZiAhZGVmaW5lZCAoX1NUTFBfV0NFX05FVCkKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjp3Y3RvYjsKKyMgICAgICAgICAgICBlbmRpZgorIyAgICAgICAgICBpZiAhZGVmaW5lZCAoX19ETUNfXykKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjp3bWVtY21wOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OndtZW1tb3ZlOworIyAgICAgICAgICBlbmRpZgordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OndwcmludGY7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6d3NjYW5mOworIyAgICAgICAgZW5kaWYKKworIyAgICAgICAgaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKQoraW5saW5lIHdjaGFyX3QqIF9TVExQX3dtZW1jcHkod2NoYXJfdCogX193ZHN0LCBjb25zdCB3Y2hhcl90KiBfX3dzcmMsIHNpemVfdCBfX24pCit7IHJldHVybiBfX1NUQVRJQ19DQVNUKHdjaGFyX3QqLCBfU1RMUF9WRU5ET1JfQ1NURDo6d21lbWNweShfX3dkc3QsIF9fd3NyYywgX19uKSk7IH0KK2lubGluZSB3Y2hhcl90KiBfU1RMUF93bWVtc2V0KHdjaGFyX3QqIF9fd2RzdCwgd2NoYXJfdCBfX3djLCBzaXplX3QgX19uKQoreyByZXR1cm4gX19TVEFUSUNfQ0FTVCh3Y2hhcl90KiwgX1NUTFBfVkVORE9SX0NTVEQ6Om1lbXNldChfX3dkc3QsIF9fd2MsIF9fbikpOyB9CisjICAgICAgICAgIHVuZGVmIHdtZW1jcHkKKyMgICAgICAgICAgdW5kZWYgd21lbXNldAoraW5saW5lIHdjaGFyX3QqIHdtZW1jcHkod2NoYXJfdCogX193ZHN0LCBjb25zdCB3Y2hhcl90KiBfX3dzcmMsIHNpemVfdCBfX24pCit7IHJldHVybiBfU1RMUF93bWVtY3B5KF9fd2RzdCwgX193c3JjLCBfX24pOyB9CitpbmxpbmUgd2NoYXJfdCogd21lbXNldCh3Y2hhcl90KiBfX3dkc3QsIHdjaGFyX3QgX193Yywgc2l6ZV90IF9fbikKK3sgcmV0dXJuIF9TVExQX3dtZW1zZXQoX193ZHN0LCBfX3djLCBfX24pOyB9CisjICAgICAgICBlbGlmIGRlZmluZWQgKF9fRE1DX18pCitpbmxpbmUgd2NoYXJfdCogd21lbWNweSh3Y2hhcl90KiBfX1JFU1RSSUNUIF9fd2RzdCwgY29uc3Qgd2NoYXJfdCogX19SRVNUUklDVCBfX3dzcmMsIHNpemVfdCBfX24pCit7IHJldHVybiBfX1NUQVRJQ19DQVNUKHdjaGFyX3QqLCBtZW1jcHkoX193ZHN0LCBfX3dzcmMsIF9fbiAqIHNpemVvZih3Y2hhcl90KSkpOyB9CitpbmxpbmUgd2NoYXJfdCogd21lbW1vdmUod2NoYXJfdCogX19SRVNUUklDVCBfX3dkc3QsIGNvbnN0IHdjaGFyX3QgKiBfX1JFU1RSSUNUIF9fd2MsIHNpemVfdCBfX24pCit7IHJldHVybiBfX1NUQVRJQ19DQVNUKHdjaGFyX3QqLCBtZW1tb3ZlKF9fd2RzdCwgX193YywgX19uICogc2l6ZW9mKHdjaGFyX3QpKSk7IH0KK2lubGluZSB3Y2hhcl90KiB3bWVtc2V0KHdjaGFyX3QqIF9fd2RzdCwgd2NoYXJfdCBfX3djLCBzaXplX3QgX19uKQoreyBmb3IgKHNpemVfdCBpID0gMDsgaSA8IF9fbjsgaSsrKSBfX3dkc3RbaV0gPSBfX3djOyByZXR1cm4gX193ZHN0OyB9CisjICAgICAgICBlbHNlCit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6d21lbWNweTsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjp3bWVtc2V0OworIyAgICAgICAgZW5kaWYKKyMgICAgICBlbmRpZgorCisjICAgIGVsaWYgZGVmaW5lZCAoX19NV0VSS1NfXykgJiYgZGVmaW5lZCAoTl9QTEFUX05MTSkgLyogX1NUTFBfTk9fTkFUSVZFX1dJREVfRlVOQ1RJT05TICovCit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6d2NzbGVuOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6Ondjc2NtcDsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjp3Y3NjcHk7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6d2Nzc3RyOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6Ondjc2NocjsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjp3Y3NyY2hyOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6Ondjc3Bicms7CisjICAgIGVuZGlmIC8qIF9TVExQX05PX05BVElWRV9XSURFX0ZVTkNUSU9OUyAqLworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjICBlbmRpZiAvKiBfU1RMUF9JTVBPUlRfVkVORE9SX0NTVEQgKi8KKworIyAgdW5kZWYgX1NUTFBfV0NIQVJfU1VOUFJPX0VYQ0xVREUKKyMgIHVuZGVmIF9TVExQX1dDSEFSX01TTF9FWENMVURFCisKKyMgIGVuZGlmIC8qICFkZWZpbmVkKF9TVExQX1dDRV9FVkMzKSAqLworCisjZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfQ1dDSEFSICovCmRpZmYgLS1naXQgYS9zdGwvX2N3Y3R5cGUuaCBiL3N0bC9fY3djdHlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZGI3ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvX2N3Y3R5cGUuaApAQCAtMCwwICsxLDkzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DV0NUWVBFCisjZGVmaW5lIF9TVExQX0lOVEVSTkFMX0NXQ1RZUEUKKworI2lmIGRlZmluZWQgKF9fQk9STEFORENfXykgJiYgIWRlZmluZWQgKF9TVExQX0lOVEVSTkFMX0NDVFlQRSkKKyMgIGluY2x1ZGUgPHN0bC9fY2N0eXBlLmg+CisjZW5kaWYKKworI2lmICFkZWZpbmVkIChfU1RMUF9XQ0VfRVZDMykKKyMgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9ORVdfQ19IRUFERVJTKQorIyAgICBpZiAhZGVmaW5lZCAoTl9QTEFUX05MTSkKKyMgICAgICBpbmNsdWRlIF9TVExQX05BVElWRV9DUFBfQ19IRUFERVIoY3djdHlwZSkKKyMgICAgZWxzZQorICAgICAgIC8vIHNlZSBjb21tZW50cyBpbiBzdGxwb3J0L2N3Y2hhciBhYm91dCB3aW50X3Qgb24gTm92ZWxsCisjICAgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ1BQX0NfSEVBREVSKHdjaGFyX3QuaCkKKyMgICAgICBpbmNsdWRlIF9TVExQX05BVElWRV9DX0hFQURFUihzdGRkZWYuaCkKKyMgICAgICBpbmNsdWRlIF9TVExQX05BVElWRV9DX0hFQURFUihzdGRpby5oKQorIyAgICBlbmRpZgorIyAgICBpZiBkZWZpbmVkIChfX01TTF9fKSAmJiAhZGVmaW5lZCAoTl9QTEFUX05MTSkKK25hbWVzcGFjZSBzdGQgeworICB0eXBlZGVmIHdjaGFyX3Qgd2N0cmFuc190OworICB3aW50X3QgdG93Y3RyYW5zKHdpbnRfdCBjLCB3Y3RyYW5zX3QgdmFsdWUpOworICB3Y3RyYW5zX3Qgd2N0cmFucyhjb25zdCBjaGFyICpuYW1lKTsKK30KK3VzaW5nIHN0ZDo6d2N0cmFuc190OwordXNpbmcgc3RkOjp0b3djdHJhbnM7Cit1c2luZyBzdGQ6OndjdHJhbnM7CisjICAgIGVuZGlmCisjICBlbHNlCisjICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NfSEVBREVSKHdjdHlwZS5oKQorIyAgZW5kaWYKKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfSU1QT1JUX1ZFTkRPUl9DU1REKQorCisjICAgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9HTElCQykgJiYgIShkZWZpbmVkIChfR0xJQkNQUF9VU0VfV0NIQVJfVCkgfHwgZGVmaW5lZCAoX0dMSUJDWFhfVVNFX1dDSEFSX1QpKSB8fCBcCisgICAgICAgIGRlZmluZWQgKF9fc3VuKSB8fCBkZWZpbmVkIChfX0ZyZWVCU0RfXykgfHwgXAorICAgICAgICBkZWZpbmVkIChfX01JTkdXMzJfXykgJiYgKChfX01JTkdXMzJfTUFKT1JfVkVSU0lPTiA8IDMpIHx8IChfX01JTkdXMzJfTUFKT1JfVkVSU0lPTiA9PSAzKSAmJiAoX19NSU5HVzMyX01JTk9SX1ZFUlNJT04gPD0gMCkpCisvL1dlIHRha2Ugd2lkZSBmdW5jdGlvbnMgZnJvbSBnbG9iYWwgbmFtZXNwYWNlOgorIyAgICAgIGRlZmluZSBfU1RMUF9WRU5ET1JfQ1NURF9XRlVOQworIyAgICBlbHNlCisjICAgICAgZGVmaW5lIF9TVExQX1ZFTkRPUl9DU1REX1dGVU5DIF9TVExQX1ZFTkRPUl9DU1RECisjICAgIGVuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQordXNpbmcgX1NUTFBfVkVORE9SX0NTVERfV0ZVTkM6OndjdHlwZV90OwordXNpbmcgX1NUTFBfVkVORE9SX0NTVERfV0ZVTkM6OndpbnRfdDsKKyMgICAgaWYgIWRlZmluZWQgKF9TVExQX05PX0NTVERfRlVOQ1RJT05fSU1QT1JUUykKKyMgICAgICBpZiAhZGVmaW5lZCAoX19CT1JMQU5EQ19fKSAmJiAhZGVmaW5lZCAoX19NU0xfXykKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REX1dGVU5DOjp3Y3RyYW5zX3Q7CisjICAgICAgICBpZiAhZGVmaW5lZCAoX19ETUNfXykgJiYgKCFkZWZpbmVkKF9XSU4zMl9XQ0UpIHx8IF9XSU4zMl9XQ0U8MHg1MDApCit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURF9XRlVOQzo6dG93Y3RyYW5zOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVERfV0ZVTkM6OndjdHJhbnM7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURF9XRlVOQzo6d2N0eXBlOworIyAgICAgICAgZW5kaWYKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REX1dGVU5DOjppc3djdHlwZTsKKyMgICAgICBlbmRpZgorIyAgICAgIGlmICFkZWZpbmVkKE5fUExBVF9OTE0pCit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURF9XRlVOQzo6aXN3YWxudW07Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURF9XRlVOQzo6aXN3YWxwaGE7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURF9XRlVOQzo6aXN3Y250cmw7CisKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REX1dGVU5DOjppc3dkaWdpdDsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REX1dGVU5DOjppc3dncmFwaDsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REX1dGVU5DOjppc3dsb3dlcjsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REX1dGVU5DOjppc3dwcmludDsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REX1dGVU5DOjppc3dwdW5jdDsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REX1dGVU5DOjppc3dzcGFjZTsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REX1dGVU5DOjppc3d1cHBlcjsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REX1dGVU5DOjppc3d4ZGlnaXQ7CisKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REX1dGVU5DOjp0b3dsb3dlcjsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REX1dGVU5DOjp0b3d1cHBlcjsKKyMgICAgICBlbmRpZiAvKiAhTl9QTEFUX05MTSAqLworIyAgICBlbmRpZiAvKiBfU1RMUF9OT19DU1REX0ZVTkNUSU9OX0lNUE9SVFMgKi8KK19TVExQX0VORF9OQU1FU1BBQ0UKKyMgIGVuZGlmIC8qIF9TVExQX0lNUE9SVF9WRU5ET1JfQ1NURCAqLworI2VuZGlmIC8qIF9TVExQX1dDRV9FVkMzICovCisKKyNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9DV0NUWVBFICovCmRpZmYgLS1naXQgYS9zdGwvX2RlcXVlLmMgYi9zdGwvX2RlcXVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJkNmZjOQotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9fZGVxdWUuYwpAQCAtMCwwICsxLDgxNCBAQAorLyoKKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworI2lmbmRlZiBfU1RMUF9ERVFVRV9DCisjZGVmaW5lIF9TVExQX0RFUVVFX0MKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9ERVFVRV9ICisjICBpbmNsdWRlIDxzdGwvX2RlcXVlLmg+CisjZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKworLy8gTm9uLWlubGluZSBtZW1iZXIgZnVuY3Rpb25zIGZyb20gX0RlcXVlX2Jhc2UuCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYyA+CitfRGVxdWVfYmFzZTxfVHAsX0FsbG9jID46On5fRGVxdWVfYmFzZSgpIHsKKyAgaWYgKF9NX21hcC5fTV9kYXRhKSB7CisgICAgX01fZGVzdHJveV9ub2RlcyhfTV9zdGFydC5fTV9ub2RlLCB0aGlzLT5fTV9maW5pc2guX01fbm9kZSArIDEpOworICAgIF9NX21hcC5kZWFsbG9jYXRlKF9NX21hcC5fTV9kYXRhLCBfTV9tYXBfc2l6ZS5fTV9kYXRhKTsKKyAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2MgPgordm9pZCBfRGVxdWVfYmFzZTxfVHAsX0FsbG9jPjo6X01faW5pdGlhbGl6ZV9tYXAoc2l6ZV90IF9fbnVtX2VsZW1lbnRzKSB7CisgIHNpemVfdCBfX251bV9ub2RlcyA9IF9fbnVtX2VsZW1lbnRzIC8gdGhpcy0+YnVmZmVyX3NpemUoKSArIDEgOworCisgIF9NX21hcF9zaXplLl9NX2RhdGEgPSAobWF4KSgoc2l6ZV90KSBfU19pbml0aWFsX21hcF9zaXplLCBfX251bV9ub2RlcyArIDIpOworICBfTV9tYXAuX01fZGF0YSA9IF9NX21hcC5hbGxvY2F0ZShfTV9tYXBfc2l6ZS5fTV9kYXRhKTsKKworICBfVHAqKiBfX25zdGFydCA9IF9NX21hcC5fTV9kYXRhICsgKF9NX21hcF9zaXplLl9NX2RhdGEgLSBfX251bV9ub2RlcykgLyAyOworICBfVHAqKiBfX25maW5pc2ggPSBfX25zdGFydCArIF9fbnVtX25vZGVzOworCisgIF9TVExQX1RSWSB7CisgICAgX01fY3JlYXRlX25vZGVzKF9fbnN0YXJ0LCBfX25maW5pc2gpOworICB9CisgIF9TVExQX1VOV0lORCgoX01fbWFwLmRlYWxsb2NhdGUoX01fbWFwLl9NX2RhdGEsIF9NX21hcF9zaXplLl9NX2RhdGEpLAorICAgICAgICAgICAgICAgIF9NX21hcC5fTV9kYXRhID0gMCwgX01fbWFwX3NpemUuX01fZGF0YSA9IDApKQorICBfTV9zdGFydC5fTV9zZXRfbm9kZShfX25zdGFydCk7CisgIHRoaXMtPl9NX2ZpbmlzaC5fTV9zZXRfbm9kZShfX25maW5pc2ggLSAxKTsKKyAgX01fc3RhcnQuX01fY3VyID0gX01fc3RhcnQuX01fZmlyc3Q7CisgIHRoaXMtPl9NX2ZpbmlzaC5fTV9jdXIgPSB0aGlzLT5fTV9maW5pc2guX01fZmlyc3QgKyBfX251bV9lbGVtZW50cyAlIHRoaXMtPmJ1ZmZlcl9zaXplKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYyA+Cit2b2lkIF9EZXF1ZV9iYXNlPF9UcCxfQWxsb2M+OjpfTV9jcmVhdGVfbm9kZXMoX1RwKiogX19uc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1RwKiogX19uZmluaXNoKSB7CisgIF9UcCoqIF9fY3VyID0gX19uc3RhcnQ7CisgIF9TVExQX1RSWSB7CisgICAgZm9yICg7IF9fY3VyIDwgX19uZmluaXNoOyArK19fY3VyKQorICAgICAgKl9fY3VyID0gX01fbWFwX3NpemUuYWxsb2NhdGUodGhpcy0+YnVmZmVyX3NpemUoKSk7CisgIH0KKyAgX1NUTFBfVU5XSU5EKF9NX2Rlc3Ryb3lfbm9kZXMoX19uc3RhcnQsIF9fY3VyKSkKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jID4KK3ZvaWQgX0RlcXVlX2Jhc2U8X1RwLF9BbGxvYz46Ol9NX2Rlc3Ryb3lfbm9kZXMoX1RwKiogX19uc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9UcCoqIF9fbmZpbmlzaCkgeworICBmb3IgKF9UcCoqIF9fbiA9IF9fbnN0YXJ0OyBfX24gPCBfX25maW5pc2g7ICsrX19uKQorICAgIF9NX21hcF9zaXplLmRlYWxsb2NhdGUoKl9fbiwgdGhpcy0+YnVmZmVyX3NpemUoKSk7Cit9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUFRSX1NQRUNJQUxJWkFUSU9OUykKKyMgIGRlZmluZSBkZXF1ZSBfU1RMUF9QVFJfSU1QTF9OQU1FKGRlcXVlKQorI2VsaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpCisjICBkZWZpbmUgZGVxdWUgX1NUTFBfTk9OX0RCR19OQU1FKGRlcXVlKQorI2Vsc2UKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9ORVNURURfVFlQRV9QQVJBTV9CVUcpCisvLyBxdWFsaWZpZWQgcmVmZXJlbmNlcworIyAgZGVmaW5lIF9faXRlcmF0b3JfXyAgIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9Ob25jb25zdF90cmFpdHM8X1RwPiA+CisjICBkZWZpbmUgY29uc3RfaXRlcmF0b3IgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX0NvbnN0X3RyYWl0czxfVHA+ICA+CisjICBkZWZpbmUgaXRlcmF0b3IgICAgICAgX19pdGVyYXRvcl9fCisjICBkZWZpbmUgc2l6ZV90eXBlICAgICAgc2l6ZV90CisjICBkZWZpbmUgdmFsdWVfdHlwZSAgICAgX1RwCisjZWxzZQorIyAgZGVmaW5lIF9faXRlcmF0b3JfXyAgIF9TVExQX1RZUEVOQU1FX09OX1JFVFVSTl9UWVBFIGRlcXVlPF9UcCwgX0FsbG9jPjo6aXRlcmF0b3IKKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2MgPgorZGVxdWU8X1RwLCBfQWxsb2MgPiYKK2RlcXVlPF9UcCwgX0FsbG9jID46Om9wZXJhdG9yPSAoY29uc3QgZGVxdWU8X1RwLCBfQWxsb2MgPiYgX194KSB7CisgIGNvbnN0IHNpemVfdHlwZSBfX2xlbiA9IHNpemUoKTsKKyAgaWYgKCZfX3ggIT0gdGhpcykgeworICAgIGlmIChfX2xlbiA+PSBfX3guc2l6ZSgpKQorICAgICAgZXJhc2UoY29weShfX3guYmVnaW4oKSwgX194LmVuZCgpLCB0aGlzLT5fTV9zdGFydCksIHRoaXMtPl9NX2ZpbmlzaCk7CisgICAgZWxzZSB7CisgICAgICBjb25zdF9pdGVyYXRvciBfX21pZCA9IF9feC5iZWdpbigpICsgZGlmZmVyZW5jZV90eXBlKF9fbGVuKTsKKyAgICAgIGNvcHkoX194LmJlZ2luKCksIF9fbWlkLCB0aGlzLT5fTV9zdGFydCk7CisgICAgICBpbnNlcnQodGhpcy0+X01fZmluaXNoLCBfX21pZCwgX194LmVuZCgpKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2MgPgordm9pZCBkZXF1ZTxfVHAsIF9BbGxvYyA+OjpfTV9maWxsX2luc2VydChpdGVyYXRvciBfX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX194KSB7CisgIGlmIChfX3Bvcy5fTV9jdXIgPT0gdGhpcy0+X01fc3RhcnQuX01fY3VyKSB7CisgICAgaXRlcmF0b3IgX19uZXdfc3RhcnQgPSBfTV9yZXNlcnZlX2VsZW1lbnRzX2F0X2Zyb250KF9fbik7CisgICAgX1NUTFBfVFJZIHsKKyAgICAgIHVuaW5pdGlhbGl6ZWRfZmlsbChfX25ld19zdGFydCwgdGhpcy0+X01fc3RhcnQsIF9feCk7CisgICAgfQorICAgIF9TVExQX1VOV0lORCh0aGlzLT5fTV9kZXN0cm95X25vZGVzKF9fbmV3X3N0YXJ0Ll9NX25vZGUsIHRoaXMtPl9NX3N0YXJ0Ll9NX25vZGUpKQorICAgIHRoaXMtPl9NX3N0YXJ0ID0gX19uZXdfc3RhcnQ7CisgIH0KKyAgZWxzZSBpZiAoX19wb3MuX01fY3VyID09IHRoaXMtPl9NX2ZpbmlzaC5fTV9jdXIpIHsKKyAgICBpdGVyYXRvciBfX25ld19maW5pc2ggPSBfTV9yZXNlcnZlX2VsZW1lbnRzX2F0X2JhY2soX19uKTsKKyAgICBfU1RMUF9UUlkgeworICAgICAgdW5pbml0aWFsaXplZF9maWxsKHRoaXMtPl9NX2ZpbmlzaCwgX19uZXdfZmluaXNoLCBfX3gpOworICAgIH0KKyAgICBfU1RMUF9VTldJTkQodGhpcy0+X01fZGVzdHJveV9ub2Rlcyh0aGlzLT5fTV9maW5pc2guX01fbm9kZSsxLCBfX25ld19maW5pc2guX01fbm9kZSsxKSkKKyAgICB0aGlzLT5fTV9maW5pc2ggPSBfX25ld19maW5pc2g7CisgIH0KKyAgZWxzZQorICAgIF9NX2ZpbGxfaW5zZXJ0X2F1eChfX3BvcywgX19uLCBfX3gsIF9Nb3ZhYmxlKCkpOworfQorCisjaWYgIWRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYyA+Cit2b2lkIGRlcXVlPF9UcCwgX0FsbG9jPjo6aW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZV90eXBlKiBfX2ZpcnN0LCBjb25zdCB2YWx1ZV90eXBlKiBfX2xhc3QpIHsKKyAgc2l6ZV90eXBlIF9fbiA9IF9fbGFzdCAtIF9fZmlyc3Q7CisgIGlmIChfX3Bvcy5fTV9jdXIgPT0gdGhpcy0+X01fc3RhcnQuX01fY3VyKSB7CisgICAgaXRlcmF0b3IgX19uZXdfc3RhcnQgPSBfTV9yZXNlcnZlX2VsZW1lbnRzX2F0X2Zyb250KF9fbik7CisgICAgX1NUTFBfVFJZIHsKKyAgICAgIF9TVExQX1BSSVYgX191Y29weShfX2ZpcnN0LCBfX2xhc3QsIF9fbmV3X3N0YXJ0KTsKKyAgICB9CisgICAgX1NUTFBfVU5XSU5EKHRoaXMtPl9NX2Rlc3Ryb3lfbm9kZXMoX19uZXdfc3RhcnQuX01fbm9kZSwgdGhpcy0+X01fc3RhcnQuX01fbm9kZSkpCisgICAgdGhpcy0+X01fc3RhcnQgPSBfX25ld19zdGFydDsKKyAgfQorICBlbHNlIGlmIChfX3Bvcy5fTV9jdXIgPT0gdGhpcy0+X01fZmluaXNoLl9NX2N1cikgeworICAgIGl0ZXJhdG9yIF9fbmV3X2ZpbmlzaCA9IF9NX3Jlc2VydmVfZWxlbWVudHNfYXRfYmFjayhfX24pOworICAgIF9TVExQX1RSWSB7CisgICAgICBfU1RMUF9QUklWIF9fdWNvcHkoX19maXJzdCwgX19sYXN0LCB0aGlzLT5fTV9maW5pc2gpOworICAgIH0KKyAgICBfU1RMUF9VTldJTkQodGhpcy0+X01fZGVzdHJveV9ub2Rlcyh0aGlzLT5fTV9maW5pc2guX01fbm9kZSArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19uZXdfZmluaXNoLl9NX25vZGUgKyAxKSkKKyAgICB0aGlzLT5fTV9maW5pc2ggPSBfX25ld19maW5pc2g7CisgIH0KKyAgZWxzZQorICAgIF9NX2luc2VydF9yYW5nZV9hdXgoX19wb3MsIF9fZmlyc3QsIF9fbGFzdCwgX19uLCBfTW92YWJsZSgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jID4KK3ZvaWQgZGVxdWU8X1RwLF9BbGxvYz46Omluc2VydChpdGVyYXRvciBfX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpIHsKKyAgc2l6ZV90eXBlIF9fbiA9IF9fbGFzdCAtIF9fZmlyc3Q7CisgIGlmIChfX3Bvcy5fTV9jdXIgPT0gdGhpcy0+X01fc3RhcnQuX01fY3VyKSB7CisgICAgaXRlcmF0b3IgX19uZXdfc3RhcnQgPSBfTV9yZXNlcnZlX2VsZW1lbnRzX2F0X2Zyb250KF9fbik7CisgICAgX1NUTFBfVFJZIHsKKyAgICAgIF9TVExQX1BSSVYgX191Y29weShfX2ZpcnN0LCBfX2xhc3QsIF9fbmV3X3N0YXJ0KTsKKyAgICB9CisgICAgX1NUTFBfVU5XSU5EKHRoaXMtPl9NX2Rlc3Ryb3lfbm9kZXMoX19uZXdfc3RhcnQuX01fbm9kZSwgdGhpcy0+X01fc3RhcnQuX01fbm9kZSkpCisgICAgdGhpcy0+X01fc3RhcnQgPSBfX25ld19zdGFydDsKKyAgfQorICBlbHNlIGlmIChfX3Bvcy5fTV9jdXIgPT0gdGhpcy0+X01fZmluaXNoLl9NX2N1cikgeworICAgIGl0ZXJhdG9yIF9fbmV3X2ZpbmlzaCA9IF9NX3Jlc2VydmVfZWxlbWVudHNfYXRfYmFjayhfX24pOworICAgIF9TVExQX1RSWSB7CisgICAgICBfU1RMUF9QUklWIF9fdWNvcHkoX19maXJzdCwgX19sYXN0LCB0aGlzLT5fTV9maW5pc2gpOworICAgIH0KKyAgICBfU1RMUF9VTldJTkQodGhpcy0+X01fZGVzdHJveV9ub2Rlcyh0aGlzLT5fTV9maW5pc2guX01fbm9kZSArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19uZXdfZmluaXNoLl9NX25vZGUgKyAxKSkKKyAgICB0aGlzLT5fTV9maW5pc2ggPSBfX25ld19maW5pc2g7CisgIH0KKyAgZWxzZQorICAgIF9NX2luc2VydF9yYW5nZV9hdXgoX19wb3MsIF9fZmlyc3QsIF9fbGFzdCwgX19uLCBfTW92YWJsZSgpKTsKK30KKworI2VuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jID4KK19faXRlcmF0b3JfXyBkZXF1ZTxfVHAsX0FsbG9jPjo6X01fZXJhc2UoaXRlcmF0b3IgX19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKl9Nb3ZhYmxlKi8pIHsKKyAgZGlmZmVyZW5jZV90eXBlIF9faW5kZXggPSBfX3BvcyAtIHRoaXMtPl9NX3N0YXJ0OworICBpZiAoc2l6ZV90eXBlKF9faW5kZXgpIDwgdGhpcy0+c2l6ZSgpID4+IDEpIHsKKyAgICAvL1dlIG1vdmUgdGhlIHN0YXJ0IG9mIHRoZSBkZXF1ZSBvbmUgcG9zaXRpb24gdG8gdGhlIHJpZ2h0CisgICAgLy9zdGFydGluZyBmcm9tIHRoZSByaWdodG1vc3QgZWxlbWVudCB0byBtb3ZlLgorICAgIGl0ZXJhdG9yIF9fc3JjID0gX19wb3MsIF9fZHN0ID0gX19wb3M7CisgICAgX1NUTFBfU1REOjpfRGVzdHJveSgmKCpfX2RzdCkpOworICAgIGlmIChfX3NyYyAhPSB0aGlzLT5fTV9zdGFydCkgeworICAgICAgZm9yICgtLV9fc3JjOyBfX2RzdCAhPSB0aGlzLT5fTV9zdGFydDsgLS1fX3NyYywgLS1fX2RzdCkgeworICAgICAgICBfU1RMUF9TVEQ6Ol9Nb3ZlX0NvbnN0cnVjdCgmKCpfX2RzdCksICpfX3NyYyk7CisgICAgICAgIF9TVExQX1NURDo6X0Rlc3Ryb3lfTW92ZWQoJigqX19zcmMpKTsKKyAgICAgIH0KKyAgICB9CisgICAgX01fcG9wX2Zyb250X2F1eCgpOworICB9CisgIGVsc2UgeworICAgIGl0ZXJhdG9yIF9fc3JjID0gX19wb3MsIF9fZHN0ID0gX19wb3M7CisgICAgX1NUTFBfU1REOjpfRGVzdHJveSgmKCpfX2RzdCkpOworICAgIGZvciAoKytfX3NyYzsgX19zcmMgIT0gdGhpcy0+X01fZmluaXNoOyArK19fc3JjLCArK19fZHN0KSB7CisgICAgICBfU1RMUF9TVEQ6Ol9Nb3ZlX0NvbnN0cnVjdCgmKCpfX2RzdCksICpfX3NyYyk7CisgICAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95X01vdmVkKCYoKl9fc3JjKSk7CisgICAgfQorICAgIC8vRHVwbGljYXRpb24gb2YgdGhlIHBvcF9iYWNrIGNvZGUgd2l0aG91dCB0aGUgZGVzdHJveSB3aGljaCBoYXMgYWxyZWFkeSBiZWVuIGRvbmU6CisgICAgaWYgKHRoaXMtPl9NX2ZpbmlzaC5fTV9jdXIgIT0gdGhpcy0+X01fZmluaXNoLl9NX2ZpcnN0KSB7CisgICAgICAtLXRoaXMtPl9NX2ZpbmlzaC5fTV9jdXI7CisgICAgfQorICAgIGVsc2UgeworICAgICAgX01fcG9wX2JhY2tfYXV4KCk7CisgICAgfQorICB9CisgIHJldHVybiB0aGlzLT5fTV9zdGFydCArIF9faW5kZXg7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYyA+CitfX2l0ZXJhdG9yX18gZGVxdWU8X1RwLF9BbGxvYz46Ol9NX2VyYXNlKGl0ZXJhdG9yIF9fcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qX01vdmFibGUqLykgeworICBpdGVyYXRvciBfX25leHQgPSBfX3BvczsKKyAgKytfX25leHQ7CisgIGRpZmZlcmVuY2VfdHlwZSBfX2luZGV4ID0gX19wb3MgLSB0aGlzLT5fTV9zdGFydDsKKyAgaWYgKHNpemVfdHlwZShfX2luZGV4KSA8IHRoaXMtPnNpemUoKSA+PiAxKSB7CisgICAgY29weV9iYWNrd2FyZCh0aGlzLT5fTV9zdGFydCwgX19wb3MsIF9fbmV4dCk7CisgICAgcG9wX2Zyb250KCk7CisgIH0KKyAgZWxzZSB7CisgICAgY29weShfX25leHQsIHRoaXMtPl9NX2ZpbmlzaCwgX19wb3MpOworICAgIHBvcF9iYWNrKCk7CisgIH0KKyAgcmV0dXJuIHRoaXMtPl9NX3N0YXJ0ICsgX19pbmRleDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jID4KK19faXRlcmF0b3JfXyBkZXF1ZTxfVHAsX0FsbG9jPjo6X01fZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX3RydWVfdHlwZSYgLypfTW92YWJsZSovKSB7CisgIGRpZmZlcmVuY2VfdHlwZSBfX24gPSBfX2xhc3QgLSBfX2ZpcnN0OworICBkaWZmZXJlbmNlX3R5cGUgX19lbGVtc19iZWZvcmUgPSBfX2ZpcnN0IC0gdGhpcy0+X01fc3RhcnQ7CisgIGlmIChfX2VsZW1zX2JlZm9yZSA8PSBkaWZmZXJlbmNlX3R5cGUodGhpcy0+c2l6ZSgpIC0gX19uKSAvIDIpIHsKKyAgICBpdGVyYXRvciBfX3NyYyA9IF9fZmlyc3QsIF9fZHN0ID0gX19sYXN0OworICAgIGlmIChfX3NyYyAhPSB0aGlzLT5fTV9zdGFydCkgeworICAgICAgZm9yICgtLV9fc3JjLCAtLV9fZHN0OyAoX19zcmMgPj0gdGhpcy0+X01fc3RhcnQpICYmIChfX2RzdCA+PSBfX2ZpcnN0KTsgLS1fX3NyYywgLS1fX2RzdCkgeworICAgICAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95KCYoKl9fZHN0KSk7CisgICAgICAgIF9TVExQX1NURDo6X01vdmVfQ29uc3RydWN0KCYoKl9fZHN0KSwgKl9fc3JjKTsKKyAgICAgIH0KKyAgICAgIGlmIChfX2RzdCA+PSBfX2ZpcnN0KSB7CisgICAgICAgIC8vVGhlcmUgYXJlIG1vcmUgZWxlbWVudHMgdG8gZXJhc2UgdGhhbiBlbGVtZW50cyB0byBtb3ZlCisgICAgICAgIF9TVExQX1NURDo6X0Rlc3Ryb3lfUmFuZ2UoX19maXJzdCwgKytfX2RzdCk7CisgICAgICAgIF9TVExQX1NURDo6X0Rlc3Ryb3lfTW92ZWRfUmFuZ2UodGhpcy0+X01fc3RhcnQsIF9fZmlyc3QpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIC8vVGhlcmUgYXJlIG1vcmUgZWxlbWVudHMgdG8gbW92ZSB0aGFuIGVsZW1lbnRzIHRvIGVyYXNlCisgICAgICAgIGZvciAoOyBfX3NyYyA+PSB0aGlzLT5fTV9zdGFydDsgLS1fX3NyYywgLS1fX2RzdCkgeworICAgICAgICAgIF9TVExQX1NURDo6X0Rlc3Ryb3lfTW92ZWQoJigqX19kc3QpKTsKKyAgICAgICAgICBfU1RMUF9TVEQ6Ol9Nb3ZlX0NvbnN0cnVjdCgmKCpfX2RzdCksICpfX3NyYyk7CisgICAgICAgIH0KKyAgICAgICAgX1NUTFBfU1REOjpfRGVzdHJveV9Nb3ZlZF9SYW5nZSh0aGlzLT5fTV9zdGFydCwgKytfX2RzdCk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgX1NUTFBfU1REOjpfRGVzdHJveV9SYW5nZSh0aGlzLT5fTV9zdGFydCwgX19sYXN0KTsKKyAgICB9CisgICAgaXRlcmF0b3IgX19uZXdfc3RhcnQgPSB0aGlzLT5fTV9zdGFydCArIF9fbjsKKyAgICB0aGlzLT5fTV9kZXN0cm95X25vZGVzKHRoaXMtPl9NX3N0YXJ0Ll9NX25vZGUsIF9fbmV3X3N0YXJ0Ll9NX25vZGUpOworICAgIHRoaXMtPl9NX3N0YXJ0ID0gX19uZXdfc3RhcnQ7CisgIH0KKyAgZWxzZSB7CisgICAgaWYgKF9fbGFzdCAhPSB0aGlzLT5fTV9maW5pc2gpIHsKKyAgICAgIGl0ZXJhdG9yIF9fc3JjID0gX19sYXN0LCBfX2RzdCA9IF9fZmlyc3Q7CisgICAgICBmb3IgKDsgKF9fc3JjICE9IHRoaXMtPl9NX2ZpbmlzaCkgJiYgKF9fZHN0ICE9IF9fbGFzdCk7ICsrX19zcmMsICsrX19kc3QpIHsKKyAgICAgICAgX1NUTFBfU1REOjpfRGVzdHJveSgmKCpfX2RzdCkpOworICAgICAgICBfU1RMUF9TVEQ6Ol9Nb3ZlX0NvbnN0cnVjdCgmKCpfX2RzdCksICpfX3NyYyk7CisgICAgICB9CisgICAgICBpZiAoX19kc3QgIT0gX19sYXN0KSB7CisgICAgICAgIC8vVGhlcmUgYXJlIG1vcmUgZWxlbWVudHMgdG8gZXJhc2UgdGhhbiBlbGVtZW50cyB0byBtb3ZlCisgICAgICAgIF9TVExQX1NURDo6X0Rlc3Ryb3lfUmFuZ2UoX19kc3QsIF9fbGFzdCk7CisgICAgICAgIF9TVExQX1NURDo6X0Rlc3Ryb3lfTW92ZWRfUmFuZ2UoX19sYXN0LCB0aGlzLT5fTV9maW5pc2gpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIC8vVGhlcmUgYXJlIG1vcmUgZWxlbWVudHMgdG8gbW92ZSB0aGFuIGVsZW1lbnRzIHRvIGVyYXNlCisgICAgICAgIGZvciAoOyBfX3NyYyAhPSB0aGlzLT5fTV9maW5pc2g7ICsrX19zcmMsICsrX19kc3QpIHsKKyAgICAgICAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95X01vdmVkKCYoKl9fZHN0KSk7CisgICAgICAgICAgX1NUTFBfU1REOjpfTW92ZV9Db25zdHJ1Y3QoJigqX19kc3QpLCAqX19zcmMpOworICAgICAgICB9CisgICAgICAgIF9TVExQX1NURDo6X0Rlc3Ryb3lfTW92ZWRfUmFuZ2UoX19kc3QsIHRoaXMtPl9NX2ZpbmlzaCk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgX1NUTFBfU1REOjpfRGVzdHJveV9SYW5nZShfX2ZpcnN0LCB0aGlzLT5fTV9maW5pc2gpOworICAgIH0KKyAgICBpdGVyYXRvciBfX25ld19maW5pc2ggPSB0aGlzLT5fTV9maW5pc2ggLSBfX247CisgICAgdGhpcy0+X01fZGVzdHJveV9ub2RlcyhfX25ld19maW5pc2guX01fbm9kZSArIDEsIHRoaXMtPl9NX2ZpbmlzaC5fTV9ub2RlICsgMSk7CisgICAgdGhpcy0+X01fZmluaXNoID0gX19uZXdfZmluaXNoOworICB9CisgIHJldHVybiB0aGlzLT5fTV9zdGFydCArIF9fZWxlbXNfYmVmb3JlOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2MgPgorX19pdGVyYXRvcl9fIGRlcXVlPF9UcCxfQWxsb2M+OjpfTV9lcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypfTW92YWJsZSovKSB7CisgIGRpZmZlcmVuY2VfdHlwZSBfX24gPSBfX2xhc3QgLSBfX2ZpcnN0OworICBkaWZmZXJlbmNlX3R5cGUgX19lbGVtc19iZWZvcmUgPSBfX2ZpcnN0IC0gdGhpcy0+X01fc3RhcnQ7CisgIGlmIChfX2VsZW1zX2JlZm9yZSA8PSBkaWZmZXJlbmNlX3R5cGUodGhpcy0+c2l6ZSgpIC0gX19uKSAvIDIpIHsKKyAgICBjb3B5X2JhY2t3YXJkKHRoaXMtPl9NX3N0YXJ0LCBfX2ZpcnN0LCBfX2xhc3QpOworICAgIGl0ZXJhdG9yIF9fbmV3X3N0YXJ0ID0gdGhpcy0+X01fc3RhcnQgKyBfX247CisgICAgX1NUTFBfU1REOjpfRGVzdHJveV9SYW5nZSh0aGlzLT5fTV9zdGFydCwgX19uZXdfc3RhcnQpOworICAgIHRoaXMtPl9NX2Rlc3Ryb3lfbm9kZXModGhpcy0+X01fc3RhcnQuX01fbm9kZSwgX19uZXdfc3RhcnQuX01fbm9kZSk7CisgICAgdGhpcy0+X01fc3RhcnQgPSBfX25ld19zdGFydDsKKyAgfQorICBlbHNlIHsKKyAgICBjb3B5KF9fbGFzdCwgdGhpcy0+X01fZmluaXNoLCBfX2ZpcnN0KTsKKyAgICBpdGVyYXRvciBfX25ld19maW5pc2ggPSB0aGlzLT5fTV9maW5pc2ggLSBfX247CisgICAgX1NUTFBfU1REOjpfRGVzdHJveV9SYW5nZShfX25ld19maW5pc2gsIHRoaXMtPl9NX2ZpbmlzaCk7CisgICAgdGhpcy0+X01fZGVzdHJveV9ub2RlcyhfX25ld19maW5pc2guX01fbm9kZSArIDEsIHRoaXMtPl9NX2ZpbmlzaC5fTV9ub2RlICsgMSk7CisgICAgdGhpcy0+X01fZmluaXNoID0gX19uZXdfZmluaXNoOworICB9CisgIHJldHVybiB0aGlzLT5fTV9zdGFydCArIF9fZWxlbXNfYmVmb3JlOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2MgPgordm9pZCBkZXF1ZTxfVHAsX0FsbG9jPjo6Y2xlYXIoKSB7CisgIGZvciAoX01hcF9wb2ludGVyIF9fbm9kZSA9IHRoaXMtPl9NX3N0YXJ0Ll9NX25vZGUgKyAxOworICAgICAgIF9fbm9kZSA8IHRoaXMtPl9NX2ZpbmlzaC5fTV9ub2RlOworICAgICAgICsrX19ub2RlKSB7CisgICAgX1NUTFBfU1REOjpfRGVzdHJveV9SYW5nZSgqX19ub2RlLCAqX19ub2RlICsgdGhpcy0+YnVmZmVyX3NpemUoKSk7CisgICAgdGhpcy0+X01fbWFwX3NpemUuZGVhbGxvY2F0ZSgqX19ub2RlLCB0aGlzLT5idWZmZXJfc2l6ZSgpKTsKKyAgfQorCisgIGlmICh0aGlzLT5fTV9zdGFydC5fTV9ub2RlICE9IHRoaXMtPl9NX2ZpbmlzaC5fTV9ub2RlKSB7CisgICAgX1NUTFBfU1REOjpfRGVzdHJveV9SYW5nZSh0aGlzLT5fTV9zdGFydC5fTV9jdXIsIHRoaXMtPl9NX3N0YXJ0Ll9NX2xhc3QpOworICAgIF9TVExQX1NURDo6X0Rlc3Ryb3lfUmFuZ2UodGhpcy0+X01fZmluaXNoLl9NX2ZpcnN0LCB0aGlzLT5fTV9maW5pc2guX01fY3VyKTsKKyAgICB0aGlzLT5fTV9tYXBfc2l6ZS5kZWFsbG9jYXRlKHRoaXMtPl9NX2ZpbmlzaC5fTV9maXJzdCwgdGhpcy0+YnVmZmVyX3NpemUoKSk7CisgIH0KKyAgZWxzZQorICAgIF9TVExQX1NURDo6X0Rlc3Ryb3lfUmFuZ2UodGhpcy0+X01fc3RhcnQuX01fY3VyLCB0aGlzLT5fTV9maW5pc2guX01fY3VyKTsKKworICB0aGlzLT5fTV9maW5pc2ggPSB0aGlzLT5fTV9zdGFydDsKK30KKworLy8gUHJlY29uZGl0aW9uOiB0aGlzLT5fTV9zdGFydCBhbmQgdGhpcy0+X01fZmluaXNoIGhhdmUgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLAorLy8gYnV0IG5vbmUgb2YgdGhlIGRlcXVlJ3MgZWxlbWVudHMgaGF2ZSB5ZXQgYmVlbiBjb25zdHJ1Y3RlZC4KK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYyA+Cit2b2lkIGRlcXVlPF9UcCxfQWxsb2M+OjpfTV9maWxsX2luaXRpYWxpemUoY29uc3QgdmFsdWVfdHlwZSYgX192YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19mYWxzZV90eXBlJiAvKl9Ucml2aWFsSW5pdCovKSB7CisgIF9NYXBfcG9pbnRlciBfX2N1ciA9IHRoaXMtPl9NX3N0YXJ0Ll9NX25vZGU7CisgIF9TVExQX1RSWSB7CisgICAgZm9yICg7IF9fY3VyIDwgdGhpcy0+X01fZmluaXNoLl9NX25vZGU7ICsrX19jdXIpCisgICAgICB1bmluaXRpYWxpemVkX2ZpbGwoKl9fY3VyLCAqX19jdXIgKyB0aGlzLT5idWZmZXJfc2l6ZSgpLCBfX3ZhbCk7CisgICAgdW5pbml0aWFsaXplZF9maWxsKHRoaXMtPl9NX2ZpbmlzaC5fTV9maXJzdCwgdGhpcy0+X01fZmluaXNoLl9NX2N1ciwgX192YWwpOworICB9CisgIF9TVExQX1VOV0lORChfU1RMUF9TVEQ6Ol9EZXN0cm95X1JhbmdlKHRoaXMtPl9NX3N0YXJ0LCBpdGVyYXRvcigqX19jdXIsIF9fY3VyKSkpCit9CisKKworLy8gQ2FsbGVkIG9ubHkgaWYgdGhpcy0+X01fZmluaXNoLl9NX2N1ciA9PSB0aGlzLT5fTV9maW5pc2guX01fbGFzdCAtIDEuCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2MgPgordm9pZCBkZXF1ZTxfVHAsX0FsbG9jPjo6X01fcHVzaF9iYWNrX2F1eF92KGNvbnN0IHZhbHVlX3R5cGUmIF9fdCkgeworICBfTV9yZXNlcnZlX21hcF9hdF9iYWNrKCk7CisgICoodGhpcy0+X01fZmluaXNoLl9NX25vZGUgKyAxKSA9IHRoaXMtPl9NX21hcF9zaXplLmFsbG9jYXRlKHRoaXMtPmJ1ZmZlcl9zaXplKCkpOworICBfU1RMUF9UUlkgeworICAgIF9Db3B5X0NvbnN0cnVjdCh0aGlzLT5fTV9maW5pc2guX01fY3VyLCBfX3QpOworICAgIHRoaXMtPl9NX2ZpbmlzaC5fTV9zZXRfbm9kZSh0aGlzLT5fTV9maW5pc2guX01fbm9kZSArIDEpOworICAgIHRoaXMtPl9NX2ZpbmlzaC5fTV9jdXIgPSB0aGlzLT5fTV9maW5pc2guX01fZmlyc3Q7CisgIH0KKyAgX1NUTFBfVU5XSU5EKHRoaXMtPl9NX21hcF9zaXplLmRlYWxsb2NhdGUoKih0aGlzLT5fTV9maW5pc2guX01fbm9kZSArIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5idWZmZXJfc2l6ZSgpKSkKK30KKworI2lmIGRlZmluZWQoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkgJiYgIWRlZmluZWQoX1NUTFBfTk9fQU5BQ0hST05JU01TKQorLy8gQ2FsbGVkIG9ubHkgaWYgdGhpcy0+X01fZmluaXNoLl9NX2N1ciA9PSB0aGlzLT5fTV9maW5pc2guX01fbGFzdCAtIDEuCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2MgPgordm9pZCBkZXF1ZTxfVHAsX0FsbG9jPjo6X01fcHVzaF9iYWNrX2F1eCgpIHsKKyAgX01fcmVzZXJ2ZV9tYXBfYXRfYmFjaygpOworICAqKHRoaXMtPl9NX2ZpbmlzaC5fTV9ub2RlICsgMSkgPSB0aGlzLT5fTV9tYXBfc2l6ZS5hbGxvY2F0ZSh0aGlzLT5idWZmZXJfc2l6ZSgpKTsKKyAgX1NUTFBfVFJZIHsKKyAgICBfU1RMUF9TVEQ6Ol9Db25zdHJ1Y3QodGhpcy0+X01fZmluaXNoLl9NX2N1cik7CisgICAgdGhpcy0+X01fZmluaXNoLl9NX3NldF9ub2RlKHRoaXMtPl9NX2ZpbmlzaC5fTV9ub2RlICsgMSk7CisgICAgdGhpcy0+X01fZmluaXNoLl9NX2N1ciA9IHRoaXMtPl9NX2ZpbmlzaC5fTV9maXJzdDsKKyAgfQorICBfU1RMUF9VTldJTkQodGhpcy0+X01fbWFwX3NpemUuZGVhbGxvY2F0ZSgqKHRoaXMtPl9NX2ZpbmlzaC5fTV9ub2RlICsgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPmJ1ZmZlcl9zaXplKCkpKQorfQorI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSAmJiAhX1NUTFBfTk9fQU5BQ0hST05JU01TKi8KKworLy8gQ2FsbGVkIG9ubHkgaWYgdGhpcy0+X01fc3RhcnQuX01fY3VyID09IHRoaXMtPl9NX3N0YXJ0Ll9NX2ZpcnN0LgordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jID4KK3ZvaWQgZGVxdWU8X1RwLF9BbGxvYz46Ol9NX3B1c2hfZnJvbnRfYXV4X3YoY29uc3QgdmFsdWVfdHlwZSYgX190KSB7CisgIF9NX3Jlc2VydmVfbWFwX2F0X2Zyb250KCk7CisgICoodGhpcy0+X01fc3RhcnQuX01fbm9kZSAtIDEpID0gdGhpcy0+X01fbWFwX3NpemUuYWxsb2NhdGUodGhpcy0+YnVmZmVyX3NpemUoKSk7CisgIF9TVExQX1RSWSB7CisgICAgdGhpcy0+X01fc3RhcnQuX01fc2V0X25vZGUodGhpcy0+X01fc3RhcnQuX01fbm9kZSAtIDEpOworICAgIHRoaXMtPl9NX3N0YXJ0Ll9NX2N1ciA9IHRoaXMtPl9NX3N0YXJ0Ll9NX2xhc3QgLSAxOworICAgIF9Db3B5X0NvbnN0cnVjdCh0aGlzLT5fTV9zdGFydC5fTV9jdXIsIF9fdCk7CisgIH0KKyAgX1NUTFBfVU5XSU5EKCgrK3RoaXMtPl9NX3N0YXJ0LAorICAgICAgICAgICAgICAgIHRoaXMtPl9NX21hcF9zaXplLmRlYWxsb2NhdGUoKih0aGlzLT5fTV9zdGFydC5fTV9ub2RlIC0gMSksIHRoaXMtPmJ1ZmZlcl9zaXplKCkpKSkKK30KKworCisjaWYgZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkgJiYgIWRlZmluZWQgKF9TVExQX05PX0FOQUNIUk9OSVNNUykKKy8vIENhbGxlZCBvbmx5IGlmIHRoaXMtPl9NX3N0YXJ0Ll9NX2N1ciA9PSB0aGlzLT5fTV9zdGFydC5fTV9maXJzdC4KK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYyA+Cit2b2lkIGRlcXVlPF9UcCxfQWxsb2M+OjpfTV9wdXNoX2Zyb250X2F1eCgpIHsKKyAgX01fcmVzZXJ2ZV9tYXBfYXRfZnJvbnQoKTsKKyAgKih0aGlzLT5fTV9zdGFydC5fTV9ub2RlIC0gMSkgPSB0aGlzLT5fTV9tYXBfc2l6ZS5hbGxvY2F0ZSh0aGlzLT5idWZmZXJfc2l6ZSgpKTsKKyAgX1NUTFBfVFJZIHsKKyAgICB0aGlzLT5fTV9zdGFydC5fTV9zZXRfbm9kZSh0aGlzLT5fTV9zdGFydC5fTV9ub2RlIC0gMSk7CisgICAgdGhpcy0+X01fc3RhcnQuX01fY3VyID0gdGhpcy0+X01fc3RhcnQuX01fbGFzdCAtIDE7CisgICAgX1NUTFBfU1REOjpfQ29uc3RydWN0KHRoaXMtPl9NX3N0YXJ0Ll9NX2N1cik7CisgIH0KKyAgX1NUTFBfVU5XSU5EKCgrK3RoaXMtPl9NX3N0YXJ0LCB0aGlzLT5fTV9tYXBfc2l6ZS5kZWFsbG9jYXRlKCoodGhpcy0+X01fc3RhcnQuX01fbm9kZSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+YnVmZmVyX3NpemUoKSkpKQorfQorI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSAmJiAhX1NUTFBfTk9fQU5BQ0hST05JU01TKi8KKworLy8gQ2FsbGVkIG9ubHkgaWYgdGhpcy0+X01fZmluaXNoLl9NX2N1ciA9PSB0aGlzLT5fTV9maW5pc2guX01fZmlyc3QuCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2MgPgordm9pZCBkZXF1ZTxfVHAsX0FsbG9jPjo6X01fcG9wX2JhY2tfYXV4KCkgeworICB0aGlzLT5fTV9tYXBfc2l6ZS5kZWFsbG9jYXRlKHRoaXMtPl9NX2ZpbmlzaC5fTV9maXJzdCwgdGhpcy0+YnVmZmVyX3NpemUoKSk7CisgIHRoaXMtPl9NX2ZpbmlzaC5fTV9zZXRfbm9kZSh0aGlzLT5fTV9maW5pc2guX01fbm9kZSAtIDEpOworICB0aGlzLT5fTV9maW5pc2guX01fY3VyID0gdGhpcy0+X01fZmluaXNoLl9NX2xhc3QgLSAxOworfQorCisvLyBOb3RlIHRoYXQgaWYgdGhlIGRlcXVlIGhhcyBhdCBsZWFzdCBvbmUgZWxlbWVudCAoYSBwcmVjb25kaXRpb24gZm9yIHRoaXMgbWVtYmVyCisvLyBmdW5jdGlvbiksIGFuZCBpZiB0aGlzLT5fTV9zdGFydC5fTV9jdXIgPT0gdGhpcy0+X01fc3RhcnQuX01fbGFzdCwgdGhlbiB0aGUgZGVxdWUKKy8vIG11c3QgaGF2ZSBhdCBsZWFzdCB0d28gbm9kZXMuCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2MgPgordm9pZCBkZXF1ZTxfVHAsX0FsbG9jPjo6X01fcG9wX2Zyb250X2F1eCgpIHsKKyAgaWYgKHRoaXMtPl9NX3N0YXJ0Ll9NX2N1ciAhPSB0aGlzLT5fTV9zdGFydC5fTV9sYXN0IC0gMSkKKyAgICArK3RoaXMtPl9NX3N0YXJ0Ll9NX2N1cjsKKyAgZWxzZSB7CisgICAgdGhpcy0+X01fbWFwX3NpemUuZGVhbGxvY2F0ZSh0aGlzLT5fTV9zdGFydC5fTV9maXJzdCwgdGhpcy0+YnVmZmVyX3NpemUoKSk7CisgICAgdGhpcy0+X01fc3RhcnQuX01fc2V0X25vZGUodGhpcy0+X01fc3RhcnQuX01fbm9kZSArIDEpOworICAgIHRoaXMtPl9NX3N0YXJ0Ll9NX2N1ciA9IHRoaXMtPl9NX3N0YXJ0Ll9NX2ZpcnN0OworICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYyA+CitfX2l0ZXJhdG9yX18gZGVxdWU8X1RwLF9BbGxvYz46Ol9NX2ZpbGxfaW5zZXJ0X2F1eChpdGVyYXRvciBfX3Bvcywgc2l6ZV90eXBlIF9fbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlX3R5cGUmIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKl9Nb3ZhYmxlKi8pIHsKKyAgY29uc3QgZGlmZmVyZW5jZV90eXBlIF9fZWxlbXNfYmVmb3JlID0gX19wb3MgLSB0aGlzLT5fTV9zdGFydDsKKyAgc2l6ZV90eXBlIF9fbGVuZ3RoID0gdGhpcy0+c2l6ZSgpOworICB2YWx1ZV90eXBlIF9feF9jb3B5ID0gX194OworICBpZiAoX19lbGVtc19iZWZvcmUgPD0gZGlmZmVyZW5jZV90eXBlKF9fbGVuZ3RoIC8gMikpIHsKKyAgICBpdGVyYXRvciBfX25ld19zdGFydCA9IF9NX3Jlc2VydmVfZWxlbWVudHNfYXRfZnJvbnQoX19uKTsKKyAgICBfX3BvcyA9IHRoaXMtPl9NX3N0YXJ0ICsgX19lbGVtc19iZWZvcmU7CisgICAgX1NUTFBfVFJZIHsKKyAgICAgIGl0ZXJhdG9yIF9fZHN0ID0gX19uZXdfc3RhcnQ7CisgICAgICBpdGVyYXRvciBfX3NyYyA9IHRoaXMtPl9NX3N0YXJ0OworICAgICAgZm9yICg7IF9fc3JjICE9IF9fcG9zOyArK19fZHN0LCArK19fc3JjKSB7CisgICAgICAgIF9TVExQX1NURDo6X01vdmVfQ29uc3RydWN0KCYoKl9fZHN0KSwgKl9fc3JjKTsKKyAgICAgICAgX1NUTFBfU1REOjpfRGVzdHJveV9Nb3ZlZCgmKCpfX3NyYykpOworICAgICAgfQorICAgICAgdGhpcy0+X01fc3RhcnQgPSBfX25ld19zdGFydDsKKyAgICAgIHVuaW5pdGlhbGl6ZWRfZmlsbChfX2RzdCwgX19zcmMsIF9feF9jb3B5KTsKKyAgICAgIF9fcG9zID0gX19kc3Q7CisgICAgfQorICAgIF9TVExQX1VOV0lORCh0aGlzLT5fTV9kZXN0cm95X25vZGVzKF9fbmV3X3N0YXJ0Ll9NX25vZGUsIHRoaXMtPl9NX3N0YXJ0Ll9NX25vZGUpKQorICB9CisgIGVsc2UgeworICAgIGl0ZXJhdG9yIF9fbmV3X2ZpbmlzaCA9IF9NX3Jlc2VydmVfZWxlbWVudHNfYXRfYmFjayhfX24pOworICAgIGNvbnN0IGRpZmZlcmVuY2VfdHlwZSBfX2VsZW1zX2FmdGVyID0gZGlmZmVyZW5jZV90eXBlKF9fbGVuZ3RoKSAtIF9fZWxlbXNfYmVmb3JlOworICAgIF9fcG9zID0gdGhpcy0+X01fZmluaXNoIC0gX19lbGVtc19hZnRlcjsKKyAgICBfU1RMUF9UUlkgeworICAgICAgaXRlcmF0b3IgX19kc3QgPSBfX25ld19maW5pc2g7CisgICAgICBpdGVyYXRvciBfX3NyYyA9IHRoaXMtPl9NX2ZpbmlzaDsKKyAgICAgIGZvciAoLS1fX3NyYywgLS1fX2RzdDsgX19zcmMgPj0gX19wb3M7IC0tX19zcmMsIC0tX19kc3QpIHsKKyAgICAgICAgX1NUTFBfU1REOjpfTW92ZV9Db25zdHJ1Y3QoJigqX19kc3QpLCAqX19zcmMpOworICAgICAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95X01vdmVkKCYoKl9fc3JjKSk7CisgICAgICB9CisgICAgICB0aGlzLT5fTV9maW5pc2ggPSBfX25ld19maW5pc2g7CisgICAgICB1bmluaXRpYWxpemVkX2ZpbGwoX19wb3MsIF9fcG9zICsgX19uLCBfX3hfY29weSk7CisgICAgfQorICAgIF9TVExQX1VOV0lORCh0aGlzLT5fTV9kZXN0cm95X25vZGVzKHRoaXMtPl9NX2ZpbmlzaC5fTV9ub2RlICsgMSwgX19uZXdfZmluaXNoLl9NX25vZGUgKyAxKSkKKyAgfQorICByZXR1cm4gX19wb3M7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYyA+CitfX2l0ZXJhdG9yX18gZGVxdWU8X1RwLF9BbGxvYz46Ol9NX2ZpbGxfaW5zZXJ0X2F1eChpdGVyYXRvciBfX3Bvcywgc2l6ZV90eXBlIF9fbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlX3R5cGUmIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypfTW92YWJsZSovKSB7CisgIGNvbnN0IGRpZmZlcmVuY2VfdHlwZSBfX2VsZW1zX2JlZm9yZSA9IF9fcG9zIC0gdGhpcy0+X01fc3RhcnQ7CisgIHNpemVfdHlwZSBfX2xlbmd0aCA9IHRoaXMtPnNpemUoKTsKKyAgdmFsdWVfdHlwZSBfX3hfY29weSA9IF9feDsKKyAgaWYgKF9fZWxlbXNfYmVmb3JlIDw9IGRpZmZlcmVuY2VfdHlwZShfX2xlbmd0aCAvIDIpKSB7CisgICAgaXRlcmF0b3IgX19uZXdfc3RhcnQgPSBfTV9yZXNlcnZlX2VsZW1lbnRzX2F0X2Zyb250KF9fbik7CisgICAgaXRlcmF0b3IgX19vbGRfc3RhcnQgPSB0aGlzLT5fTV9zdGFydDsKKyAgICBfX3BvcyA9IHRoaXMtPl9NX3N0YXJ0ICsgX19lbGVtc19iZWZvcmU7CisgICAgX1NUTFBfVFJZIHsKKyAgICAgIGlmIChfX2VsZW1zX2JlZm9yZSA+PSBkaWZmZXJlbmNlX3R5cGUoX19uKSkgeworICAgICAgICBpdGVyYXRvciBfX3N0YXJ0X24gPSB0aGlzLT5fTV9zdGFydCArIGRpZmZlcmVuY2VfdHlwZShfX24pOworICAgICAgICBfU1RMUF9QUklWIF9fdWNvcHkodGhpcy0+X01fc3RhcnQsIF9fc3RhcnRfbiwgX19uZXdfc3RhcnQpOworICAgICAgICB0aGlzLT5fTV9zdGFydCA9IF9fbmV3X3N0YXJ0OworICAgICAgICBjb3B5KF9fc3RhcnRfbiwgX19wb3MsIF9fb2xkX3N0YXJ0KTsKKyAgICAgICAgZmlsbChfX3BvcyAtIGRpZmZlcmVuY2VfdHlwZShfX24pLCBfX3BvcywgX194X2NvcHkpOworICAgICAgICBfX3BvcyAtPSBkaWZmZXJlbmNlX3R5cGUoX19uKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBfU1RMUF9QUklWIF9fdW5pbml0aWFsaXplZF9jb3B5X2ZpbGwodGhpcy0+X01fc3RhcnQsIF9fcG9zLCBfX25ld19zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPl9NX3N0YXJ0LCBfX3hfY29weSk7CisgICAgICAgIHRoaXMtPl9NX3N0YXJ0ID0gX19uZXdfc3RhcnQ7CisgICAgICAgIGZpbGwoX19vbGRfc3RhcnQsIF9fcG9zLCBfX3hfY29weSk7CisgICAgICB9CisgICAgfQorICAgIF9TVExQX1VOV0lORCh0aGlzLT5fTV9kZXN0cm95X25vZGVzKF9fbmV3X3N0YXJ0Ll9NX25vZGUsIHRoaXMtPl9NX3N0YXJ0Ll9NX25vZGUpKQorICB9CisgIGVsc2UgeworICAgIGl0ZXJhdG9yIF9fbmV3X2ZpbmlzaCA9IF9NX3Jlc2VydmVfZWxlbWVudHNfYXRfYmFjayhfX24pOworICAgIGl0ZXJhdG9yIF9fb2xkX2ZpbmlzaCA9IHRoaXMtPl9NX2ZpbmlzaDsKKyAgICBjb25zdCBkaWZmZXJlbmNlX3R5cGUgX19lbGVtc19hZnRlciA9CisgICAgICBkaWZmZXJlbmNlX3R5cGUoX19sZW5ndGgpIC0gX19lbGVtc19iZWZvcmU7CisgICAgX19wb3MgPSB0aGlzLT5fTV9maW5pc2ggLSBfX2VsZW1zX2FmdGVyOworICAgIF9TVExQX1RSWSB7CisgICAgICBpZiAoX19lbGVtc19hZnRlciA+IGRpZmZlcmVuY2VfdHlwZShfX24pKSB7CisgICAgICAgIGl0ZXJhdG9yIF9fZmluaXNoX24gPSB0aGlzLT5fTV9maW5pc2ggLSBkaWZmZXJlbmNlX3R5cGUoX19uKTsKKyAgICAgICAgX1NUTFBfUFJJViBfX3Vjb3B5KF9fZmluaXNoX24sIHRoaXMtPl9NX2ZpbmlzaCwgdGhpcy0+X01fZmluaXNoKTsKKyAgICAgICAgdGhpcy0+X01fZmluaXNoID0gX19uZXdfZmluaXNoOworICAgICAgICBjb3B5X2JhY2t3YXJkKF9fcG9zLCBfX2ZpbmlzaF9uLCBfX29sZF9maW5pc2gpOworICAgICAgICBmaWxsKF9fcG9zLCBfX3BvcyArIGRpZmZlcmVuY2VfdHlwZShfX24pLCBfX3hfY29weSk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgX1NUTFBfUFJJViBfX3VuaW5pdGlhbGl6ZWRfZmlsbF9jb3B5KHRoaXMtPl9NX2ZpbmlzaCwgX19wb3MgKyBkaWZmZXJlbmNlX3R5cGUoX19uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9feF9jb3B5LCBfX3BvcywgdGhpcy0+X01fZmluaXNoKTsKKyAgICAgICAgdGhpcy0+X01fZmluaXNoID0gX19uZXdfZmluaXNoOworICAgICAgICBmaWxsKF9fcG9zLCBfX29sZF9maW5pc2gsIF9feF9jb3B5KTsKKyAgICAgIH0KKyAgICB9CisgICAgX1NUTFBfVU5XSU5EKHRoaXMtPl9NX2Rlc3Ryb3lfbm9kZXModGhpcy0+X01fZmluaXNoLl9NX25vZGUgKyAxLCBfX25ld19maW5pc2guX01fbm9kZSArIDEpKQorICB9CisgIHJldHVybiBfX3BvczsKK30KKworI2lmICFkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jID4KK3ZvaWQgZGVxdWU8X1RwLF9BbGxvYz46Ol9NX2luc2VydF9yYW5nZV9hdXgoaXRlcmF0b3IgX19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlX3R5cGUqIF9fZmlyc3QsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fbiwgY29uc3QgX190cnVlX3R5cGUmIC8qX01vdmFibGUqLykgeworICBjb25zdCBkaWZmZXJlbmNlX3R5cGUgX19lbGVtc19iZWZvcmUgPSBfX3BvcyAtIHRoaXMtPl9NX3N0YXJ0OworICBzaXplX3R5cGUgX19sZW5ndGggPSBzaXplKCk7CisgIGlmIChfX2VsZW1zX2JlZm9yZSA8PSBkaWZmZXJlbmNlX3R5cGUoX19sZW5ndGggLyAyKSkgeworICAgIGl0ZXJhdG9yIF9fbmV3X3N0YXJ0ID0gX01fcmVzZXJ2ZV9lbGVtZW50c19hdF9mcm9udChfX24pOworICAgIF9fcG9zID0gdGhpcy0+X01fc3RhcnQgKyBfX2VsZW1zX2JlZm9yZTsKKyAgICBfU1RMUF9UUlkgeworICAgICAgaXRlcmF0b3IgX19kc3QgPSBfX25ld19zdGFydDsKKyAgICAgIGl0ZXJhdG9yIF9fc3JjID0gdGhpcy0+X01fc3RhcnQ7CisgICAgICBmb3IgKDsgX19zcmMgIT0gX19wb3M7ICsrX19kc3QsICsrX19zcmMpIHsKKyAgICAgICAgX1NUTFBfU1REOjpfTW92ZV9Db25zdHJ1Y3QoJigqX19kc3QpLCAqX19zcmMpOworICAgICAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95X01vdmVkKCYoKl9fc3JjKSk7CisgICAgICB9CisgICAgICB0aGlzLT5fTV9zdGFydCA9IF9fbmV3X3N0YXJ0OworICAgICAgX1NUTFBfUFJJViBfX3Vjb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19kc3QpOworICAgIH0KKyAgICBfU1RMUF9VTldJTkQodGhpcy0+X01fZGVzdHJveV9ub2RlcyhfX25ld19zdGFydC5fTV9ub2RlLCB0aGlzLT5fTV9zdGFydC5fTV9ub2RlKSkKKyAgfQorICBlbHNlIHsKKyAgICBpdGVyYXRvciBfX25ld19maW5pc2ggPSBfTV9yZXNlcnZlX2VsZW1lbnRzX2F0X2JhY2soX19uKTsKKyAgICBjb25zdCBkaWZmZXJlbmNlX3R5cGUgX19lbGVtc19hZnRlciA9IGRpZmZlcmVuY2VfdHlwZShfX2xlbmd0aCkgLSBfX2VsZW1zX2JlZm9yZTsKKyAgICBfX3BvcyA9IHRoaXMtPl9NX2ZpbmlzaCAtIF9fZWxlbXNfYWZ0ZXI7CisgICAgX1NUTFBfVFJZIHsKKyAgICAgIGl0ZXJhdG9yIF9fZHN0ID0gX19uZXdfZmluaXNoOworICAgICAgaXRlcmF0b3IgX19zcmMgPSB0aGlzLT5fTV9maW5pc2g7CisgICAgICBmb3IgKC0tX19zcmMsIC0tX19kc3Q7IF9fc3JjID49IF9fcG9zOyAtLV9fc3JjLCAtLV9fZHN0KSB7CisgICAgICAgIF9TVExQX1NURDo6X01vdmVfQ29uc3RydWN0KCYoKl9fZHN0KSwgKl9fc3JjKTsKKyAgICAgICAgX1NUTFBfU1REOjpfRGVzdHJveV9Nb3ZlZCgmKCpfX3NyYykpOworICAgICAgfQorICAgICAgdGhpcy0+X01fZmluaXNoID0gX19uZXdfZmluaXNoOworICAgICAgX1NUTFBfUFJJViBfX3Vjb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19wb3MpOworICAgIH0KKyAgICBfU1RMUF9VTldJTkQodGhpcy0+X01fZGVzdHJveV9ub2Rlcyh0aGlzLT5fTV9maW5pc2guX01fbm9kZSArIDEsIF9fbmV3X2ZpbmlzaC5fTV9ub2RlICsgMSkpCisgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jID4KK3ZvaWQgZGVxdWU8X1RwLF9BbGxvYz46Ol9NX2luc2VydF9yYW5nZV9hdXgoaXRlcmF0b3IgX19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlX3R5cGUqIF9fZmlyc3QsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fbiwgY29uc3QgX19mYWxzZV90eXBlJiAvKl9Nb3ZhYmxlKi8pIHsKKyAgY29uc3QgZGlmZmVyZW5jZV90eXBlIF9fZWxlbXNfYmVmb3JlID0gX19wb3MgLSB0aGlzLT5fTV9zdGFydDsKKyAgc2l6ZV90eXBlIF9fbGVuZ3RoID0gc2l6ZSgpOworICBpZiAoX19lbGVtc19iZWZvcmUgPD0gZGlmZmVyZW5jZV90eXBlKF9fbGVuZ3RoIC8gMikpIHsKKyAgICBpdGVyYXRvciBfX25ld19zdGFydCA9IF9NX3Jlc2VydmVfZWxlbWVudHNfYXRfZnJvbnQoX19uKTsKKyAgICBpdGVyYXRvciBfX29sZF9zdGFydCA9IHRoaXMtPl9NX3N0YXJ0OworICAgIF9fcG9zID0gdGhpcy0+X01fc3RhcnQgKyBfX2VsZW1zX2JlZm9yZTsKKyAgICBfU1RMUF9UUlkgeworICAgICAgaWYgKF9fZWxlbXNfYmVmb3JlID49IGRpZmZlcmVuY2VfdHlwZShfX24pKSB7CisgICAgICAgIGl0ZXJhdG9yIF9fc3RhcnRfbiA9IHRoaXMtPl9NX3N0YXJ0ICsgZGlmZmVyZW5jZV90eXBlKF9fbik7CisgICAgICAgIF9TVExQX1BSSVYgX191Y29weSh0aGlzLT5fTV9zdGFydCwgX19zdGFydF9uLCBfX25ld19zdGFydCk7CisgICAgICAgIHRoaXMtPl9NX3N0YXJ0ID0gX19uZXdfc3RhcnQ7CisgICAgICAgIGNvcHkoX19zdGFydF9uLCBfX3BvcywgX19vbGRfc3RhcnQpOworICAgICAgICBjb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19wb3MgLSBkaWZmZXJlbmNlX3R5cGUoX19uKSk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgY29uc3QgdmFsdWVfdHlwZSogX19taWQgPSBfX2ZpcnN0ICsgKGRpZmZlcmVuY2VfdHlwZShfX24pIC0gX19lbGVtc19iZWZvcmUpOworICAgICAgICBfX3VuaW5pdGlhbGl6ZWRfY29weV9jb3B5KHRoaXMtPl9NX3N0YXJ0LCBfX3BvcywgX19maXJzdCwgX19taWQsIF9fbmV3X3N0YXJ0KTsKKyAgICAgICAgdGhpcy0+X01fc3RhcnQgPSBfX25ld19zdGFydDsKKyAgICAgICAgY29weShfX21pZCwgX19sYXN0LCBfX29sZF9zdGFydCk7CisgICAgICB9CisgICAgfQorICAgIF9TVExQX1VOV0lORCh0aGlzLT5fTV9kZXN0cm95X25vZGVzKF9fbmV3X3N0YXJ0Ll9NX25vZGUsIHRoaXMtPl9NX3N0YXJ0Ll9NX25vZGUpKQorICB9CisgIGVsc2UgeworICAgIGl0ZXJhdG9yIF9fbmV3X2ZpbmlzaCA9IF9NX3Jlc2VydmVfZWxlbWVudHNfYXRfYmFjayhfX24pOworICAgIGl0ZXJhdG9yIF9fb2xkX2ZpbmlzaCA9IHRoaXMtPl9NX2ZpbmlzaDsKKyAgICBjb25zdCBkaWZmZXJlbmNlX3R5cGUgX19lbGVtc19hZnRlciA9CisgICAgICBkaWZmZXJlbmNlX3R5cGUoX19sZW5ndGgpIC0gX19lbGVtc19iZWZvcmU7CisgICAgX19wb3MgPSB0aGlzLT5fTV9maW5pc2ggLSBfX2VsZW1zX2FmdGVyOworICAgIF9TVExQX1RSWSB7CisKKyAgICAgIGlmIChfX2VsZW1zX2FmdGVyID4gZGlmZmVyZW5jZV90eXBlKF9fbikpIHsKKyAgICAgICAgaXRlcmF0b3IgX19maW5pc2hfbiA9IHRoaXMtPl9NX2ZpbmlzaCAtIGRpZmZlcmVuY2VfdHlwZShfX24pOworICAgICAgICBfU1RMUF9QUklWIF9fdWNvcHkoX19maW5pc2hfbiwgdGhpcy0+X01fZmluaXNoLCB0aGlzLT5fTV9maW5pc2gpOworICAgICAgICB0aGlzLT5fTV9maW5pc2ggPSBfX25ld19maW5pc2g7CisgICAgICAgIGNvcHlfYmFja3dhcmQoX19wb3MsIF9fZmluaXNoX24sIF9fb2xkX2ZpbmlzaCk7CisgICAgICAgIGNvcHkoX19maXJzdCwgX19sYXN0LCBfX3Bvcyk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgY29uc3QgdmFsdWVfdHlwZSogX19taWQgPSBfX2ZpcnN0ICsgX19lbGVtc19hZnRlcjsKKyAgICAgICAgX191bmluaXRpYWxpemVkX2NvcHlfY29weShfX21pZCwgX19sYXN0LCBfX3BvcywgdGhpcy0+X01fZmluaXNoLCB0aGlzLT5fTV9maW5pc2gpOworICAgICAgICB0aGlzLT5fTV9maW5pc2ggPSBfX25ld19maW5pc2g7CisgICAgICAgIGNvcHkoX19maXJzdCwgX19taWQsIF9fcG9zKTsKKyAgICAgIH0KKyAgICB9CisgICAgX1NUTFBfVU5XSU5EKHRoaXMtPl9NX2Rlc3Ryb3lfbm9kZXModGhpcy0+X01fZmluaXNoLl9NX25vZGUgKyAxLCBfX25ld19maW5pc2guX01fbm9kZSArIDEpKQorICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYyA+Cit2b2lkIGRlcXVlPF9UcCxfQWxsb2M+OjpfTV9pbnNlcnRfcmFuZ2VfYXV4KGl0ZXJhdG9yIF9fcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX24sIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKl9Nb3ZhYmxlKi8pIHsKKyAgY29uc3QgZGlmZmVyZW5jZV90eXBlIF9fZWxlbXNfYmVmb3JlID0gX19wb3MgLSB0aGlzLT5fTV9zdGFydDsKKyAgc2l6ZV90eXBlIF9fbGVuZ3RoID0gc2l6ZSgpOworICBpZiAoX19lbGVtc19iZWZvcmUgPD0gZGlmZmVyZW5jZV90eXBlKF9fbGVuZ3RoIC8gMikpIHsKKyAgICBpdGVyYXRvciBfX25ld19zdGFydCA9IF9NX3Jlc2VydmVfZWxlbWVudHNfYXRfZnJvbnQoX19uKTsKKyAgICBfX3BvcyA9IHRoaXMtPl9NX3N0YXJ0ICsgX19lbGVtc19iZWZvcmU7CisgICAgX1NUTFBfVFJZIHsKKyAgICAgIGl0ZXJhdG9yIF9fZHN0ID0gX19uZXdfc3RhcnQ7CisgICAgICBpdGVyYXRvciBfX3NyYyA9IHRoaXMtPl9NX3N0YXJ0OworICAgICAgZm9yICg7IF9fc3JjICE9IF9fcG9zOyArK19fZHN0LCArK19fc3JjKSB7CisgICAgICAgIF9TVExQX1NURDo6X01vdmVfQ29uc3RydWN0KCYoKl9fZHN0KSwgKl9fc3JjKTsKKyAgICAgICAgX1NUTFBfU1REOjpfRGVzdHJveV9Nb3ZlZCgmKCpfX3NyYykpOworICAgICAgfQorICAgICAgdGhpcy0+X01fc3RhcnQgPSBfX25ld19zdGFydDsKKyAgICAgIF9TVExQX1BSSVYgX191Y29weShfX2ZpcnN0LCBfX2xhc3QsIF9fZHN0KTsKKyAgICB9CisgICAgX1NUTFBfVU5XSU5EKHRoaXMtPl9NX2Rlc3Ryb3lfbm9kZXMoX19uZXdfc3RhcnQuX01fbm9kZSwgdGhpcy0+X01fc3RhcnQuX01fbm9kZSkpCisgIH0KKyAgZWxzZSB7CisgICAgaXRlcmF0b3IgX19uZXdfZmluaXNoID0gX01fcmVzZXJ2ZV9lbGVtZW50c19hdF9iYWNrKF9fbik7CisgICAgY29uc3QgZGlmZmVyZW5jZV90eXBlIF9fZWxlbXNfYWZ0ZXIgPSBkaWZmZXJlbmNlX3R5cGUoX19sZW5ndGgpIC0gX19lbGVtc19iZWZvcmU7CisgICAgX19wb3MgPSB0aGlzLT5fTV9maW5pc2ggLSBfX2VsZW1zX2FmdGVyOworICAgIF9TVExQX1RSWSB7CisgICAgICBpdGVyYXRvciBfX2RzdCA9IF9fbmV3X2ZpbmlzaDsKKyAgICAgIGl0ZXJhdG9yIF9fc3JjID0gdGhpcy0+X01fZmluaXNoOworICAgICAgZm9yICgtLV9fc3JjLCAtLV9fZHN0OyBfX3NyYyA+PSBfX3BvczsgLS1fX3NyYywgLS1fX2RzdCkgeworICAgICAgICBfU1RMUF9TVEQ6Ol9Nb3ZlX0NvbnN0cnVjdCgmKCpfX2RzdCksICpfX3NyYyk7CisgICAgICAgIF9TVExQX1NURDo6X0Rlc3Ryb3lfTW92ZWQoJigqX19zcmMpKTsKKyAgICAgIH0KKyAgICAgIHRoaXMtPl9NX2ZpbmlzaCA9IF9fbmV3X2ZpbmlzaDsKKyAgICAgIF9TVExQX1BSSVYgX191Y29weShfX2ZpcnN0LCBfX2xhc3QsIF9fcG9zKTsKKyAgICB9CisgICAgX1NUTFBfVU5XSU5EKHRoaXMtPl9NX2Rlc3Ryb3lfbm9kZXModGhpcy0+X01fZmluaXNoLl9NX25vZGUgKyAxLCBfX25ld19maW5pc2guX01fbm9kZSArIDEpKQorICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYyA+Cit2b2lkIGRlcXVlPF9UcCxfQWxsb2M+OjpfTV9pbnNlcnRfcmFuZ2VfYXV4KGl0ZXJhdG9yIF9fcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX24sIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypfTW92YWJsZSovKSB7CisgIGNvbnN0IGRpZmZlcmVuY2VfdHlwZSBfX2VsZW1zX2JlZm9yZSA9IF9fcG9zIC0gdGhpcy0+X01fc3RhcnQ7CisgIHNpemVfdHlwZSBfX2xlbmd0aCA9IHNpemUoKTsKKyAgaWYgKF9fZWxlbXNfYmVmb3JlIDwgZGlmZmVyZW5jZV90eXBlKF9fbGVuZ3RoIC8gMikpIHsKKyAgICBpdGVyYXRvciBfX25ld19zdGFydCA9IF9NX3Jlc2VydmVfZWxlbWVudHNfYXRfZnJvbnQoX19uKTsKKyAgICBpdGVyYXRvciBfX29sZF9zdGFydCA9IHRoaXMtPl9NX3N0YXJ0OworICAgIF9fcG9zID0gdGhpcy0+X01fc3RhcnQgKyBfX2VsZW1zX2JlZm9yZTsKKyAgICBfU1RMUF9UUlkgeworICAgICAgaWYgKF9fZWxlbXNfYmVmb3JlID49IGRpZmZlcmVuY2VfdHlwZShfX24pKSB7CisgICAgICAgIGl0ZXJhdG9yIF9fc3RhcnRfbiA9IHRoaXMtPl9NX3N0YXJ0ICsgX19uOworICAgICAgICBfU1RMUF9QUklWIF9fdWNvcHkodGhpcy0+X01fc3RhcnQsIF9fc3RhcnRfbiwgX19uZXdfc3RhcnQpOworICAgICAgICB0aGlzLT5fTV9zdGFydCA9IF9fbmV3X3N0YXJ0OworICAgICAgICBjb3B5KF9fc3RhcnRfbiwgX19wb3MsIF9fb2xkX3N0YXJ0KTsKKyAgICAgICAgY29weShfX2ZpcnN0LCBfX2xhc3QsIF9fcG9zIC0gZGlmZmVyZW5jZV90eXBlKF9fbikpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fbWlkID0gX19maXJzdCArIChfX24gLSBfX2VsZW1zX2JlZm9yZSk7CisgICAgICAgIF9fdW5pbml0aWFsaXplZF9jb3B5X2NvcHkodGhpcy0+X01fc3RhcnQsIF9fcG9zLCBfX2ZpcnN0LCBfX21pZCwgX19uZXdfc3RhcnQpOworICAgICAgICB0aGlzLT5fTV9zdGFydCA9IF9fbmV3X3N0YXJ0OworICAgICAgICBjb3B5KF9fbWlkLCBfX2xhc3QsIF9fb2xkX3N0YXJ0KTsKKyAgICAgIH0KKyAgICB9CisgICAgX1NUTFBfVU5XSU5EKHRoaXMtPl9NX2Rlc3Ryb3lfbm9kZXMoX19uZXdfc3RhcnQuX01fbm9kZSwgdGhpcy0+X01fc3RhcnQuX01fbm9kZSkpCisgIH0KKyAgZWxzZSB7CisgICAgaXRlcmF0b3IgX19uZXdfZmluaXNoID0gX01fcmVzZXJ2ZV9lbGVtZW50c19hdF9iYWNrKF9fbik7CisgICAgaXRlcmF0b3IgX19vbGRfZmluaXNoID0gdGhpcy0+X01fZmluaXNoOworICAgIGNvbnN0IGRpZmZlcmVuY2VfdHlwZSBfX2VsZW1zX2FmdGVyID0gX19sZW5ndGggLSBfX2VsZW1zX2JlZm9yZTsKKyAgICBfX3BvcyA9IHRoaXMtPl9NX2ZpbmlzaCAtIF9fZWxlbXNfYWZ0ZXI7CisgICAgX1NUTFBfVFJZIHsKKyAgICAgIGlmIChfX2VsZW1zX2FmdGVyID4gZGlmZmVyZW5jZV90eXBlKF9fbikpIHsKKyAgICAgICAgaXRlcmF0b3IgX19maW5pc2hfbiA9IHRoaXMtPl9NX2ZpbmlzaCAtIGRpZmZlcmVuY2VfdHlwZShfX24pOworICAgICAgICBfU1RMUF9QUklWIF9fdWNvcHkoX19maW5pc2hfbiwgdGhpcy0+X01fZmluaXNoLCB0aGlzLT5fTV9maW5pc2gpOworICAgICAgICB0aGlzLT5fTV9maW5pc2ggPSBfX25ld19maW5pc2g7CisgICAgICAgIGNvcHlfYmFja3dhcmQoX19wb3MsIF9fZmluaXNoX24sIF9fb2xkX2ZpbmlzaCk7CisgICAgICAgIGNvcHkoX19maXJzdCwgX19sYXN0LCBfX3Bvcyk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgY29uc3RfaXRlcmF0b3IgX19taWQgPSBfX2ZpcnN0ICsgX19lbGVtc19hZnRlcjsKKyAgICAgICAgX191bmluaXRpYWxpemVkX2NvcHlfY29weShfX21pZCwgX19sYXN0LCBfX3BvcywgdGhpcy0+X01fZmluaXNoLCB0aGlzLT5fTV9maW5pc2gpOworICAgICAgICB0aGlzLT5fTV9maW5pc2ggPSBfX25ld19maW5pc2g7CisgICAgICAgIGNvcHkoX19maXJzdCwgX19taWQsIF9fcG9zKTsKKyAgICAgIH0KKyAgICB9CisgICAgX1NUTFBfVU5XSU5EKHRoaXMtPl9NX2Rlc3Ryb3lfbm9kZXModGhpcy0+X01fZmluaXNoLl9NX25vZGUgKyAxLCBfX25ld19maW5pc2guX01fbm9kZSArIDEpKQorICB9Cit9CisjZW5kaWYgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2MgPgordm9pZCBkZXF1ZTxfVHAsX0FsbG9jPjo6X01fbmV3X2VsZW1lbnRzX2F0X2Zyb250KHNpemVfdHlwZSBfX25ld19lbGVtcykgeworICBzaXplX3R5cGUgX19uZXdfbm9kZXMKKyAgICAgID0gKF9fbmV3X2VsZW1zICsgdGhpcy0+YnVmZmVyX3NpemUoKSAtIDEpIC8gdGhpcy0+YnVmZmVyX3NpemUoKTsKKyAgX01fcmVzZXJ2ZV9tYXBfYXRfZnJvbnQoX19uZXdfbm9kZXMpOworICBzaXplX3R5cGUgX19pID0gMTsKKyAgX1NUTFBfVFJZIHsKKyAgICBmb3IgKDsgX19pIDw9IF9fbmV3X25vZGVzOyArK19faSkKKyAgICAgICoodGhpcy0+X01fc3RhcnQuX01fbm9kZSAtIF9faSkgPSB0aGlzLT5fTV9tYXBfc2l6ZS5hbGxvY2F0ZSh0aGlzLT5idWZmZXJfc2l6ZSgpKTsKKyAgfQorICBfU1RMUF9VTldJTkQoZm9yIChzaXplX3R5cGUgX19qID0gMTsgX19qIDwgX19pOyArK19faikKKyAgICAgICAgICAgICAgICAgdGhpcy0+X01fbWFwX3NpemUuZGVhbGxvY2F0ZSgqKHRoaXMtPl9NX3N0YXJ0Ll9NX25vZGUgLSBfX2opLCB0aGlzLT5idWZmZXJfc2l6ZSgpKSkKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jID4KK3ZvaWQgZGVxdWU8X1RwLF9BbGxvYz46Ol9NX25ld19lbGVtZW50c19hdF9iYWNrKHNpemVfdHlwZSBfX25ld19lbGVtcykgeworICBzaXplX3R5cGUgX19uZXdfbm9kZXMKKyAgICAgID0gKF9fbmV3X2VsZW1zICsgdGhpcy0+YnVmZmVyX3NpemUoKSAtIDEpIC8gdGhpcy0+YnVmZmVyX3NpemUoKTsKKyAgX01fcmVzZXJ2ZV9tYXBfYXRfYmFjayhfX25ld19ub2Rlcyk7CisgIHNpemVfdHlwZSBfX2kgPSAxOworICBfU1RMUF9UUlkgeworICAgIGZvciAoOyBfX2kgPD0gX19uZXdfbm9kZXM7ICsrX19pKQorICAgICAgKih0aGlzLT5fTV9maW5pc2guX01fbm9kZSArIF9faSkgPSB0aGlzLT5fTV9tYXBfc2l6ZS5hbGxvY2F0ZSh0aGlzLT5idWZmZXJfc2l6ZSgpKTsKKyAgfQorICBfU1RMUF9VTldJTkQoZm9yIChzaXplX3R5cGUgX19qID0gMTsgX19qIDwgX19pOyArK19faikKKyAgICAgICAgICAgICAgICAgdGhpcy0+X01fbWFwX3NpemUuZGVhbGxvY2F0ZSgqKHRoaXMtPl9NX2ZpbmlzaC5fTV9ub2RlICsgX19qKSwgdGhpcy0+YnVmZmVyX3NpemUoKSkpCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYyA+Cit2b2lkIGRlcXVlPF9UcCxfQWxsb2M+OjpfTV9yZWFsbG9jYXRlX21hcChzaXplX3R5cGUgX19ub2Rlc190b19hZGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIF9fYWRkX2F0X2Zyb250KSB7CisgIHNpemVfdHlwZSBfX29sZF9udW1fbm9kZXMgPSB0aGlzLT5fTV9maW5pc2guX01fbm9kZSAtIHRoaXMtPl9NX3N0YXJ0Ll9NX25vZGUgKyAxOworICBzaXplX3R5cGUgX19uZXdfbnVtX25vZGVzID0gX19vbGRfbnVtX25vZGVzICsgX19ub2Rlc190b19hZGQ7CisKKyAgX01hcF9wb2ludGVyIF9fbmV3X25zdGFydDsKKyAgaWYgKHRoaXMtPl9NX21hcF9zaXplLl9NX2RhdGEgPiAyICogX19uZXdfbnVtX25vZGVzKSB7CisgICAgX19uZXdfbnN0YXJ0ID0gdGhpcy0+X01fbWFwLl9NX2RhdGEgKyAodGhpcy0+X01fbWFwX3NpemUuX01fZGF0YSAtIF9fbmV3X251bV9ub2RlcykgLyAyCisgICAgICAgICAgICAgICAgICAgICArIChfX2FkZF9hdF9mcm9udCA/IF9fbm9kZXNfdG9fYWRkIDogMCk7CisgICAgaWYgKF9fbmV3X25zdGFydCA8IHRoaXMtPl9NX3N0YXJ0Ll9NX25vZGUpCisgICAgICBjb3B5KHRoaXMtPl9NX3N0YXJ0Ll9NX25vZGUsIHRoaXMtPl9NX2ZpbmlzaC5fTV9ub2RlICsgMSwgX19uZXdfbnN0YXJ0KTsKKyAgICBlbHNlCisgICAgICBjb3B5X2JhY2t3YXJkKHRoaXMtPl9NX3N0YXJ0Ll9NX25vZGUsIHRoaXMtPl9NX2ZpbmlzaC5fTV9ub2RlICsgMSwKKyAgICAgICAgICAgICAgICAgICAgX19uZXdfbnN0YXJ0ICsgX19vbGRfbnVtX25vZGVzKTsKKyAgfQorICBlbHNlIHsKKyAgICBzaXplX3R5cGUgX19uZXdfbWFwX3NpemUgPQorICAgICAgdGhpcy0+X01fbWFwX3NpemUuX01fZGF0YSArIChtYXgpKChzaXplX3QpdGhpcy0+X01fbWFwX3NpemUuX01fZGF0YSwgX19ub2Rlc190b19hZGQpICsgMjsKKworICAgIF9NYXBfcG9pbnRlciBfX25ld19tYXAgPSB0aGlzLT5fTV9tYXAuYWxsb2NhdGUoX19uZXdfbWFwX3NpemUpOworICAgIF9fbmV3X25zdGFydCA9IF9fbmV3X21hcCArIChfX25ld19tYXBfc2l6ZSAtIF9fbmV3X251bV9ub2RlcykgLyAyCisgICAgICAgICAgICAgICAgICAgICAgICAgKyAoX19hZGRfYXRfZnJvbnQgPyBfX25vZGVzX3RvX2FkZCA6IDApOworICAgIGNvcHkodGhpcy0+X01fc3RhcnQuX01fbm9kZSwgdGhpcy0+X01fZmluaXNoLl9NX25vZGUgKyAxLCBfX25ld19uc3RhcnQpOworICAgIHRoaXMtPl9NX21hcC5kZWFsbG9jYXRlKHRoaXMtPl9NX21hcC5fTV9kYXRhLCB0aGlzLT5fTV9tYXBfc2l6ZS5fTV9kYXRhKTsKKworICAgIHRoaXMtPl9NX21hcC5fTV9kYXRhID0gX19uZXdfbWFwOworICAgIHRoaXMtPl9NX21hcF9zaXplLl9NX2RhdGEgPSBfX25ld19tYXBfc2l6ZTsKKyAgfQorCisgIHRoaXMtPl9NX3N0YXJ0Ll9NX3NldF9ub2RlKF9fbmV3X25zdGFydCk7CisgIHRoaXMtPl9NX2ZpbmlzaC5fTV9zZXRfbm9kZShfX25ld19uc3RhcnQgKyBfX29sZF9udW1fbm9kZXMgLSAxKTsKK30KKworI2lmIGRlZmluZWQgKGRlcXVlKQorIyAgdW5kZWYgZGVxdWUKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorI2VuZGlmCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI3VuZGVmIF9faXRlcmF0b3JfXworI3VuZGVmIGl0ZXJhdG9yCisjdW5kZWYgY29uc3RfaXRlcmF0b3IKKyN1bmRlZiBzaXplX3R5cGUKKyN1bmRlZiB2YWx1ZV90eXBlCisKKyNlbmRpZiAvKiAgX1NUTFBfREVRVUVfQyAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RsL19kZXF1ZS5oIGIvc3RsL19kZXF1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiOGI5MzgKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvX2RlcXVlLmgKQEAgLTAsMCArMSwxMDk3IEBACisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBNb3Njb3cgQ2VudGVyIGZvciBTUEFSQyBUZWNobm9sb2d5CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworLyogTk9URTogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgU1RMIGhlYWRlcnMuCisgKiAgIFlvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LgorICovCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfREVRVUVfSAorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9ERVFVRV9ICisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQUxHT0JBU0VfSAorIyAgaW5jbHVkZSA8c3RsL19hbGdvYmFzZS5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQUxMT0NfSAorIyAgaW5jbHVkZSA8c3RsL19hbGxvYy5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfSVRFUkFUT1JfSAorIyAgaW5jbHVkZSA8c3RsL19pdGVyYXRvci5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfVU5JTklUSUFMSVpFRF9ICisjICBpbmNsdWRlIDxzdGwvX3VuaW5pdGlhbGl6ZWQuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX1JBTkdFX0VSUk9SU19ICisjICBpbmNsdWRlIDxzdGwvX3JhbmdlX2Vycm9ycy5oPgorI2VuZGlmCisKKy8qIENsYXNzIGludmFyaWFudHM6CisgKiAgRm9yIGFueSBub25zaW5ndWxhciBpdGVyYXRvciBpOgorICogICAgaS5ub2RlIGlzIHRoZSBhZGRyZXNzIG9mIGFuIGVsZW1lbnQgaW4gdGhlIG1hcCBhcnJheS4gIFRoZQorICogICAgICBjb250ZW50cyBvZiBpLm5vZGUgaXMgYSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgYSBub2RlLgorICogICAgaS5maXJzdCA9PSAqKGkubm9kZSkKKyAqICAgIGkubGFzdCAgPT0gaS5maXJzdCArIG5vZGVfc2l6ZQorICogICAgaS5jdXIgaXMgYSBwb2ludGVyIGluIHRoZSByYW5nZSBbaS5maXJzdCwgaS5sYXN0KS4gIE5PVEU6CisgKiAgICAgIHRoZSBpbXBsaWNhdGlvbiBvZiB0aGlzIGlzIHRoYXQgaS5jdXIgaXMgYWx3YXlzIGEgZGVyZWZlcmVuY2VhYmxlCisgKiAgICAgIHBvaW50ZXIsIGV2ZW4gaWYgaSBpcyBhIHBhc3QtdGhlLWVuZCBpdGVyYXRvci4KKyAqICBTdGFydCBhbmQgRmluaXNoIGFyZSBhbHdheXMgbm9uc2luZ3VsYXIgaXRlcmF0b3JzLiAgTk9URTogdGhpcyBtZWFucworICogICAgdGhhdCBhbiBlbXB0eSBkZXF1ZSBtdXN0IGhhdmUgb25lIG5vZGUsIGFuZCB0aGF0IGEgZGVxdWUKKyAqICAgIHdpdGggTiBlbGVtZW50cywgd2hlcmUgTiBpcyB0aGUgYnVmZmVyIHNpemUsIG11c3QgaGF2ZSB0d28gbm9kZXMuCisgKiAgRm9yIGV2ZXJ5IG5vZGUgb3RoZXIgdGhhbiBzdGFydC5ub2RlIGFuZCBmaW5pc2gubm9kZSwgZXZlcnkgZWxlbWVudAorICogICAgaW4gdGhlIG5vZGUgaXMgYW4gaW5pdGlhbGl6ZWQgb2JqZWN0LiAgSWYgc3RhcnQubm9kZSA9PSBmaW5pc2gubm9kZSwKKyAqICAgIHRoZW4gW3N0YXJ0LmN1ciwgZmluaXNoLmN1cikgYXJlIGluaXRpYWxpemVkIG9iamVjdHMsIGFuZAorICogICAgdGhlIGVsZW1lbnRzIG91dHNpZGUgdGhhdCByYW5nZSBhcmUgdW5pbml0aWFsaXplZCBzdG9yYWdlLiAgT3RoZXJ3aXNlLAorICogICAgW3N0YXJ0LmN1ciwgc3RhcnQubGFzdCkgYW5kIFtmaW5pc2guZmlyc3QsIGZpbmlzaC5jdXIpIGFyZSBpbml0aWFsaXplZAorICogICAgb2JqZWN0cywgYW5kIFtzdGFydC5maXJzdCwgc3RhcnQuY3VyKSBhbmQgW2ZpbmlzaC5jdXIsIGZpbmlzaC5sYXN0KQorICogICAgYXJlIHVuaW5pdGlhbGl6ZWQgc3RvcmFnZS4KKyAqICBbbWFwLCBtYXAgKyBtYXBfc2l6ZSkgaXMgYSB2YWxpZCwgbm9uLWVtcHR5IHJhbmdlLgorICogIFtzdGFydC5ub2RlLCBmaW5pc2gubm9kZV0gaXMgYSB2YWxpZCByYW5nZSBjb250YWluZWQgd2l0aGluCisgKiAgICBbbWFwLCBtYXAgKyBtYXBfc2l6ZSkuCisgKiAgQSBwb2ludGVyIGluIHRoZSByYW5nZSBbbWFwLCBtYXAgKyBtYXBfc2l6ZSkgcG9pbnRzIHRvIGFuIGFsbG9jYXRlZCBub2RlCisgKiAgICBpZiBhbmQgb25seSBpZiB0aGUgcG9pbnRlciBpcyBpbiB0aGUgcmFuZ2UgW3N0YXJ0Lm5vZGUsIGZpbmlzaC5ub2RlXS4KKyAqLworCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9EZXF1ZV9pdGVyYXRvcl9iYXNlIHsKKworICBlbnVtIF9Db25zdGFudHMgeworICAgIF9ibG9ja3NpemUgPSBfTUFYX0JZVEVTLAorICAgIF9fYnVmZmVyX3NpemUgPSAoc2l6ZW9mKF9UcCkgPCAoc2l6ZV90KV9ibG9ja3NpemUgPworICAgICAgICAgICAgICAgICAgKCAoc2l6ZV90KV9ibG9ja3NpemUgLyBzaXplb2YoX1RwKSkgOiBzaXplX3QoMSkpCisgIH07CisKKyAgdHlwZWRlZiByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKKworICB0eXBlZGVmIF9UcCB2YWx1ZV90eXBlOworICB0eXBlZGVmIHNpemVfdCBzaXplX3R5cGU7CisgIHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKKworICB0eXBlZGVmIHZhbHVlX3R5cGUqKiBfTWFwX3BvaW50ZXI7CisKKyAgdHlwZWRlZiBfRGVxdWVfaXRlcmF0b3JfYmFzZTwgX1RwID4gX1NlbGY7CisKKyAgdmFsdWVfdHlwZSogX01fY3VyOworICB2YWx1ZV90eXBlKiBfTV9maXJzdDsKKyAgdmFsdWVfdHlwZSogX01fbGFzdDsKKyAgX01hcF9wb2ludGVyIF9NX25vZGU7CisKKyAgX0RlcXVlX2l0ZXJhdG9yX2Jhc2UodmFsdWVfdHlwZSogX194LCBfTWFwX3BvaW50ZXIgX195KQorICAgIDogX01fY3VyKF9feCksIF9NX2ZpcnN0KCpfX3kpLAorICAgICAgX01fbGFzdCgqX195ICsgX19idWZmZXJfc2l6ZSksIF9NX25vZGUoX195KSB7fQorCisgIF9EZXF1ZV9pdGVyYXRvcl9iYXNlKCkgOiBfTV9jdXIoMCksIF9NX2ZpcnN0KDApLCBfTV9sYXN0KDApLCBfTV9ub2RlKDApIHt9CisKKy8vIHNlZSBjb21tZW50IGluIGRvYy9SRUFETUUuZXZjNCBhbmQgZG9jL1JFQURNRS5ldmM4CisjaWYgZGVmaW5lZCAoX1NUTFBfTVNWQykgJiYgKF9TVExQX01TVkMgPD0gMTQwMSkgJiYgZGVmaW5lZCAoTUlQUykgJiYgZGVmaW5lZCAoTkRFQlVHKQorICBfRGVxdWVfaXRlcmF0b3JfYmFzZShfRGVxdWVfaXRlcmF0b3JfYmFzZSBjb25zdCYgX19vdGhlcikKKyAgOiBfTV9jdXIoX19vdGhlci5fTV9jdXIpLCBfTV9maXJzdChfX290aGVyLl9NX2ZpcnN0KSwKKyAgICBfTV9sYXN0KF9fb3RoZXIuX01fbGFzdCksIF9NX25vZGUoX19vdGhlci5fTV9ub2RlKSB7fQorI2VuZGlmCisKKyAgZGlmZmVyZW5jZV90eXBlIF9NX3N1YnRyYWN0KGNvbnN0IF9TZWxmJiBfX3gpIGNvbnN0IHsKKyAgICByZXR1cm4gZGlmZmVyZW5jZV90eXBlKF9fYnVmZmVyX3NpemUpICogKF9NX25vZGUgLSBfX3guX01fbm9kZSAtIDEpICsKKyAgICAgIChfTV9jdXIgLSBfTV9maXJzdCkgKyAoX194Ll9NX2xhc3QgLSBfX3guX01fY3VyKTsKKyAgfQorCisgIHZvaWQgX01faW5jcmVtZW50KCkgeworICAgIGlmICgrK19NX2N1ciA9PSBfTV9sYXN0KSB7CisgICAgICBfTV9zZXRfbm9kZShfTV9ub2RlICsgMSk7CisgICAgICBfTV9jdXIgPSBfTV9maXJzdDsKKyAgICB9CisgIH0KKworICB2b2lkIF9NX2RlY3JlbWVudCgpIHsKKyAgICBpZiAoX01fY3VyID09IF9NX2ZpcnN0KSB7CisgICAgICBfTV9zZXRfbm9kZShfTV9ub2RlIC0gMSk7CisgICAgICBfTV9jdXIgPSBfTV9sYXN0OworICAgIH0KKyAgICAtLV9NX2N1cjsKKyAgfQorCisgIHZvaWQgX01fYWR2YW5jZShkaWZmZXJlbmNlX3R5cGUgX19uKSB7CisgICAgZGlmZmVyZW5jZV90eXBlIF9fb2Zmc2V0ID0gX19uICsgKF9NX2N1ciAtIF9NX2ZpcnN0KTsKKyAgICBpZiAoX19vZmZzZXQgPj0gMCAmJiBfX29mZnNldCA8IGRpZmZlcmVuY2VfdHlwZShfX2J1ZmZlcl9zaXplKSkKKyAgICAgIF9NX2N1ciArPSBfX247CisgICAgZWxzZSB7CisgICAgICBkaWZmZXJlbmNlX3R5cGUgX19ub2RlX29mZnNldCA9CisgICAgICAgIF9fb2Zmc2V0ID4gMCA/IF9fb2Zmc2V0IC8gX19idWZmZXJfc2l6ZQorICAgICAgICAgICAgICAgICAgIDogLWRpZmZlcmVuY2VfdHlwZSgoLV9fb2Zmc2V0IC0gMSkgLyBfX2J1ZmZlcl9zaXplKSAtIDE7CisgICAgICBfTV9zZXRfbm9kZShfTV9ub2RlICsgX19ub2RlX29mZnNldCk7CisgICAgICBfTV9jdXIgPSBfTV9maXJzdCArCisKKyAgICAgICAgKF9fb2Zmc2V0IC0gX19ub2RlX29mZnNldCAqIGRpZmZlcmVuY2VfdHlwZShfX2J1ZmZlcl9zaXplKSk7CisgICAgfQorICB9CisKKyAgdm9pZCBfTV9zZXRfbm9kZShfTWFwX3BvaW50ZXIgX19uZXdfbm9kZSkgeworICAgIF9NX2xhc3QgPSAoX01fZmlyc3QgPSAqKF9NX25vZGUgPSBfX25ld19ub2RlKSkgKyBkaWZmZXJlbmNlX3R5cGUoX19idWZmZXJfc2l6ZSk7CisgIH0KK307CisKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1RyYWl0cz4KK3N0cnVjdCBfRGVxdWVfaXRlcmF0b3IgOiBwdWJsaWMgX0RlcXVlX2l0ZXJhdG9yX2Jhc2U8IF9UcD4geworICB0eXBlZGVmIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OworICB0eXBlZGVmIF9UcCB2YWx1ZV90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OnJlZmVyZW5jZSAgcmVmZXJlbmNlOworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OnBvaW50ZXIgICAgcG9pbnRlcjsKKyAgdHlwZWRlZiBzaXplX3Qgc2l6ZV90eXBlOworICB0eXBlZGVmIHB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7CisgIHR5cGVkZWYgdmFsdWVfdHlwZSoqIF9NYXBfcG9pbnRlcjsKKworICB0eXBlZGVmIF9EZXF1ZV9pdGVyYXRvcl9iYXNlPCBfVHAgPiBfQmFzZTsKKyAgdHlwZWRlZiBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfVHJhaXRzPiBfU2VsZjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpfTm9uQ29uc3RUcmFpdHMgICAgIF9Ob25Db25zdFRyYWl0czsKKyAgdHlwZWRlZiBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfTm9uQ29uc3RUcmFpdHM+IGl0ZXJhdG9yOworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6Ol9Db25zdFRyYWl0cyAgICAgICAgX0NvbnN0VHJhaXRzOworICB0eXBlZGVmIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9Db25zdFRyYWl0cz4gICAgY29uc3RfaXRlcmF0b3I7CisKKyAgX0RlcXVlX2l0ZXJhdG9yKHZhbHVlX3R5cGUqIF9feCwgX01hcF9wb2ludGVyIF9feSkgOgorICAgIF9EZXF1ZV9pdGVyYXRvcl9iYXNlPHZhbHVlX3R5cGU+KF9feCxfX3kpIHt9CisKKyAgX0RlcXVlX2l0ZXJhdG9yKCkge30KKyAgLy9jb3B5IGNvbnN0cnVjdG9yIGZvciBpdGVyYXRvciBhbmQgY29uc3RydWN0b3IgZnJvbSBpdGVyYXRvciBmb3IgY29uc3RfaXRlcmF0b3IKKyAgX0RlcXVlX2l0ZXJhdG9yKGNvbnN0IGl0ZXJhdG9yJiBfX3gpIDoKKyAgICBfRGVxdWVfaXRlcmF0b3JfYmFzZTx2YWx1ZV90eXBlPihfX3gpIHt9CisKKyAgcmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICByZXR1cm4gKnRoaXMtPl9NX2N1cjsKKyAgfQorCisgIF9TVExQX0RFRklORV9BUlJPV19PUEVSQVRPUgorCisgIGRpZmZlcmVuY2VfdHlwZSBvcGVyYXRvci0oY29uc3QgY29uc3RfaXRlcmF0b3ImIF9feCkgY29uc3QgeyByZXR1cm4gdGhpcy0+X01fc3VidHJhY3QoX194KTsgfQorCisgIF9TZWxmJiBvcGVyYXRvcisrKCkgeyB0aGlzLT5fTV9pbmNyZW1lbnQoKTsgcmV0dXJuICp0aGlzOyB9CisgIF9TZWxmIG9wZXJhdG9yKysoaW50KSAgeworICAgIF9TZWxmIF9fdG1wID0gKnRoaXM7CisgICAgKysqdGhpczsKKyAgICByZXR1cm4gX190bXA7CisgIH0KKworICBfU2VsZiYgb3BlcmF0b3ItLSgpIHsgdGhpcy0+X01fZGVjcmVtZW50KCk7IHJldHVybiAqdGhpczsgfQorICBfU2VsZiBvcGVyYXRvci0tKGludCkgeworICAgIF9TZWxmIF9fdG1wID0gKnRoaXM7CisgICAgLS0qdGhpczsKKyAgICByZXR1cm4gX190bXA7CisgIH0KKworICBfU2VsZiYgb3BlcmF0b3IrPShkaWZmZXJlbmNlX3R5cGUgX19uKSB7IHRoaXMtPl9NX2FkdmFuY2UoX19uKTsgcmV0dXJuICp0aGlzOyB9CisgIF9TZWxmIG9wZXJhdG9yKyhkaWZmZXJlbmNlX3R5cGUgX19uKSBjb25zdCB7CisgICAgX1NlbGYgX190bXAgPSAqdGhpczsKKyAgICByZXR1cm4gX190bXAgKz0gX19uOworICB9CisKKyAgX1NlbGYmIG9wZXJhdG9yLT0oZGlmZmVyZW5jZV90eXBlIF9fbikgeyByZXR1cm4gKnRoaXMgKz0gLV9fbjsgfQorICBfU2VsZiBvcGVyYXRvci0oZGlmZmVyZW5jZV90eXBlIF9fbikgY29uc3QgeworICAgIF9TZWxmIF9fdG1wID0gKnRoaXM7CisgICAgcmV0dXJuIF9fdG1wIC09IF9fbjsKKyAgfQorCisgIHJlZmVyZW5jZSBvcGVyYXRvcltdKGRpZmZlcmVuY2VfdHlwZSBfX24pIGNvbnN0IHsgcmV0dXJuICooKnRoaXMgKyBfX24pOyB9Cit9OworCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9UcmFpdHM+CitpbmxpbmUgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1RyYWl0cz4gX1NUTFBfQ0FMTAorb3BlcmF0b3IrKHB0cmRpZmZfdCBfX24sIGNvbnN0IF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcmFpdHM+JiBfX3gpCit7IHJldHVybiBfX3ggKyBfX247IH0KKworCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1NFUEFSQVRFX1JFTE9QU19OQU1FU1BBQ0UpCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIGJvb2wgX1NUTFBfQ0FMTAorb3BlcmF0b3I9PShjb25zdCBfRGVxdWVfaXRlcmF0b3JfYmFzZTxfVHAgPiYgX194LAorICAgICAgICAgICBjb25zdCBfRGVxdWVfaXRlcmF0b3JfYmFzZTxfVHAgPiYgX195KQoreyByZXR1cm4gX194Ll9NX2N1ciA9PSBfX3kuX01fY3VyOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMCitvcGVyYXRvciA8IChjb25zdCBfRGVxdWVfaXRlcmF0b3JfYmFzZTxfVHAgPiYgX194LAorICAgICAgICAgICAgY29uc3QgX0RlcXVlX2l0ZXJhdG9yX2Jhc2U8X1RwID4mIF9feSkgeworICByZXR1cm4gKF9feC5fTV9ub2RlID09IF9feS5fTV9ub2RlKSA/CisgICAgKF9feC5fTV9jdXIgPCBfX3kuX01fY3VyKSA6IChfX3guX01fbm9kZSA8IF9feS5fTV9ub2RlKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBib29sIF9TVExQX0NBTEwKK29wZXJhdG9yIT0oY29uc3QgX0RlcXVlX2l0ZXJhdG9yX2Jhc2U8X1RwID4mIF9feCwKKyAgICAgICAgICAgY29uc3QgX0RlcXVlX2l0ZXJhdG9yX2Jhc2U8X1RwID4mIF9feSkKK3sgcmV0dXJuIF9feC5fTV9jdXIgIT0gX195Ll9NX2N1cjsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIGJvb2wgX1NUTFBfQ0FMTAorb3BlcmF0b3I+KGNvbnN0IF9EZXF1ZV9pdGVyYXRvcl9iYXNlPF9UcCA+JiBfX3gsCisgICAgICAgICAgY29uc3QgX0RlcXVlX2l0ZXJhdG9yX2Jhc2U8X1RwID4mIF9feSkKK3sgcmV0dXJuIF9feSA8IF9feDsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIGJvb2wgIF9TVExQX0NBTEwgb3BlcmF0b3I+PShjb25zdCBfRGVxdWVfaXRlcmF0b3JfYmFzZTxfVHAgPiYgX194LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfRGVxdWVfaXRlcmF0b3JfYmFzZTxfVHAgPiYgX195KQoreyByZXR1cm4gIShfX3ggPCBfX3kpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgYm9vbCAgX1NUTFBfQ0FMTCBvcGVyYXRvcjw9KGNvbnN0IF9EZXF1ZV9pdGVyYXRvcl9iYXNlPF9UcCA+JiBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9EZXF1ZV9pdGVyYXRvcl9iYXNlPF9UcCA+JiBfX3kpCit7IHJldHVybiAhKF9feSA8IF9feCk7IH0KKworI2Vsc2UgLyogX1NUTFBfVVNFX1NFUEFSQVRFX1JFTE9QU19OQU1FU1BBQ0UgKi8KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1RyYWl0czEsIGNsYXNzIF9UcmFpdHMyPgoraW5saW5lIGJvb2wgIF9TVExQX0NBTEwKK29wZXJhdG9yPT0oY29uc3QgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1RyYWl0czEgPiYgX194LAorICAgICAgICAgICBjb25zdCBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfVHJhaXRzMiA+JiBfX3kpCit7IHJldHVybiBfX3guX01fY3VyID09IF9feS5fTV9jdXI7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1RyYWl0czEsIGNsYXNzIF9UcmFpdHMyPgoraW5saW5lIGJvb2wgX1NUTFBfQ0FMTAorb3BlcmF0b3IgPCAoY29uc3QgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1RyYWl0czEgPiYgX194LAorICAgICAgICAgICAgY29uc3QgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1RyYWl0czIgPiYgX195KSB7CisgIHJldHVybiAoX194Ll9NX25vZGUgPT0gX195Ll9NX25vZGUpID8KKyAgICAoX194Ll9NX2N1ciA8IF9feS5fTV9jdXIpIDogKF9feC5fTV9ub2RlIDwgX195Ll9NX25vZGUpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIGJvb2wgX1NUTFBfQ0FMTAorb3BlcmF0b3IhPShjb25zdCBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfTm9uY29uc3RfdHJhaXRzPF9UcD4gPiYgX194LAorICAgICAgICAgICBjb25zdCBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfQ29uc3RfdHJhaXRzPF9UcD4gPiYgX195KQoreyByZXR1cm4gX194Ll9NX2N1ciAhPSBfX3kuX01fY3VyOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMCitvcGVyYXRvcj4oY29uc3QgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX05vbmNvbnN0X3RyYWl0czxfVHA+ID4mIF9feCwKKyAgICAgICAgICBjb25zdCBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfQ29uc3RfdHJhaXRzPF9UcD4gPiYgX195KQoreyByZXR1cm4gX195IDwgX194OyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgYm9vbCAgX1NUTFBfQ0FMTAorb3BlcmF0b3I+PShjb25zdCBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfTm9uY29uc3RfdHJhaXRzPF9UcD4gPiYgX194LAorICAgICAgICAgICBjb25zdCBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfQ29uc3RfdHJhaXRzPF9UcD4gPiYgX195KQoreyByZXR1cm4gIShfX3ggPCBfX3kpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMCitvcGVyYXRvcjw9KGNvbnN0IF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9Ob25jb25zdF90cmFpdHM8X1RwPiA+JiBfX3gsCisgICAgICAgICAgIGNvbnN0IF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9Db25zdF90cmFpdHM8X1RwPiA+JiBfX3kpCit7IHJldHVybiAhKF9feSA8IF9feCk7IH0KKyNlbmRpZiAvKiBfU1RMUF9VU0VfU0VQQVJBVEVfUkVMT1BTX05BTUVTUEFDRSAqLworCisjaWYgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1RyYWl0cz4KK3N0cnVjdCBfX3R5cGVfdHJhaXRzPF9TVExQX1BSSVYgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1RyYWl0cz4gPiB7CisgIHR5cGVkZWYgX19mYWxzZV90eXBlICAgaGFzX3RyaXZpYWxfZGVmYXVsdF9jb25zdHJ1Y3RvcjsKKyAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9jb3B5X2NvbnN0cnVjdG9yOworICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3I7CisgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjsKKyAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgICBpc19QT0RfdHlwZTsKK307CitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisjZW5kaWYgLyogX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTiAqLworCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX09MRF9IUF9JVEVSQVRPUl9RVUVSSUVTKQorX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVHJhaXRzPiBpbmxpbmUgX1RwKiAgX1NUTFBfQ0FMTAordmFsdWVfdHlwZShjb25zdCBfU1RMUF9QUklWIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcmFpdHMgID4mKSB7IHJldHVybiAoX1RwKikwOyB9Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVHJhaXRzPiBpbmxpbmUgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgX1NUTFBfQ0FMTAoraXRlcmF0b3JfY2F0ZWdvcnkoY29uc3QgX1NUTFBfUFJJViBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfVHJhaXRzICA+JikgeyByZXR1cm4gcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcoKTsgfQordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1RyYWl0cz4gaW5saW5lIHB0cmRpZmZfdCogX1NUTFBfQ0FMTAorZGlzdGFuY2VfdHlwZShjb25zdCBfU1RMUF9QUklWIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcmFpdHMgID4mKSB7IHJldHVybiAwOyB9CitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisjZW5kaWYKKworLyogRGVxdWUgYmFzZSBjbGFzcy4gIEl0IGhhcyB0d28gcHVycG9zZXMuICBGaXJzdCwgaXRzIGNvbnN0cnVjdG9yCisgKiAgYW5kIGRlc3RydWN0b3IgYWxsb2NhdGUgKGJ1dCBkb24ndCBpbml0aWFsaXplKSBzdG9yYWdlLiAgVGhpcyBtYWtlcworICogIGV4Y2VwdGlvbiBzYWZldHkgZWFzaWVyLiAgU2Vjb25kLCB0aGUgYmFzZSBjbGFzcyBlbmNhcHN1bGF0ZXMgYWxsIG9mCisgKiAgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gU0dJLXN0eWxlIGFsbG9jYXRvcnMgYW5kIHN0YW5kYXJkLWNvbmZvcm1pbmcKKyAqICBhbGxvY2F0b3JzLgorICovCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK2NsYXNzIF9EZXF1ZV9iYXNlIHsKKyAgdHlwZWRlZiBfRGVxdWVfYmFzZTxfVHAsIF9BbGxvYz4gX1NlbGY7CitwdWJsaWM6CisgIHR5cGVkZWYgX1RwIHZhbHVlX3R5cGU7CisgIF9TVExQX0ZPUkNFX0FMTE9DQVRPUlMoX1RwLCBfQWxsb2MpCisgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jX3RyYWl0czxfVHAsX0FsbG9jPjo6YWxsb2NhdG9yX3R5cGUgIGFsbG9jYXRvcl90eXBlOworICB0eXBlZGVmIF9TVExQX2FsbG9jX3Byb3h5PHNpemVfdCwgdmFsdWVfdHlwZSwgIGFsbG9jYXRvcl90eXBlPiBfQWxsb2NfcHJveHk7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2NfdHJhaXRzPF9UcCosIF9BbGxvYz46OmFsbG9jYXRvcl90eXBlIF9NYXBfYWxsb2NfdHlwZTsKKyAgdHlwZWRlZiBfU1RMUF9hbGxvY19wcm94eTx2YWx1ZV90eXBlKiosIHZhbHVlX3R5cGUqLCBfTWFwX2FsbG9jX3R5cGU+IF9NYXBfYWxsb2NfcHJveHk7CisKKyAgdHlwZWRlZiBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfTm9uY29uc3RfdHJhaXRzPF9UcD4gPiBpdGVyYXRvcjsKKyAgdHlwZWRlZiBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfQ29uc3RfdHJhaXRzPF9UcD4gPiAgICBjb25zdF9pdGVyYXRvcjsKKworICBzdGF0aWMgc2l6ZV90IF9TVExQX0NBTEwgYnVmZmVyX3NpemUoKSB7IHJldHVybiAoc2l6ZV90KV9EZXF1ZV9pdGVyYXRvcl9iYXNlPF9UcD46Ol9fYnVmZmVyX3NpemU7IH0KKworICBfRGVxdWVfYmFzZShjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hLCBzaXplX3QgX19udW1fZWxlbWVudHMpCisgICAgOiBfTV9zdGFydCgpLCBfTV9maW5pc2goKSwgX01fbWFwKF9TVExQX0NPTlZFUlRfQUxMT0NBVE9SKF9fYSwgX1RwKiksIDApLAorICAgICAgX01fbWFwX3NpemUoX19hLCAoc2l6ZV90KTApCisgIHsgX01faW5pdGlhbGl6ZV9tYXAoX19udW1fZWxlbWVudHMpOyB9CisKKyAgX0RlcXVlX2Jhc2UoY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICA6IF9NX3N0YXJ0KCksIF9NX2ZpbmlzaCgpLCBfTV9tYXAoX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoX19hLCBfVHAqKSwgMCksCisgICAgICBfTV9tYXBfc2l6ZShfX2EsIChzaXplX3QpMCkge30KKworICBfRGVxdWVfYmFzZShfX21vdmVfc291cmNlPF9TZWxmPiBzcmMpCisgICAgOiBfTV9zdGFydChzcmMuZ2V0KCkuX01fc3RhcnQpLCBfTV9maW5pc2goc3JjLmdldCgpLl9NX2ZpbmlzaCksCisgICAgICBfTV9tYXAoX19tb3ZlX3NvdXJjZTxfTWFwX2FsbG9jX3Byb3h5PihzcmMuZ2V0KCkuX01fbWFwKSksCisgICAgICBfTV9tYXBfc2l6ZShfX21vdmVfc291cmNlPF9BbGxvY19wcm94eT4oc3JjLmdldCgpLl9NX21hcF9zaXplKSkgeworICAgIHNyYy5nZXQoKS5fTV9tYXAuX01fZGF0YSA9IDA7CisgICAgc3JjLmdldCgpLl9NX21hcF9zaXplLl9NX2RhdGEgPSAwOworICAgIHNyYy5nZXQoKS5fTV9maW5pc2ggPSBzcmMuZ2V0KCkuX01fc3RhcnQ7CisgIH0KKworICB+X0RlcXVlX2Jhc2UoKTsKKworcHJvdGVjdGVkOgorICB2b2lkIF9NX2luaXRpYWxpemVfbWFwKHNpemVfdCk7CisgIHZvaWQgX01fY3JlYXRlX25vZGVzKF9UcCoqIF9fbnN0YXJ0LCBfVHAqKiBfX25maW5pc2gpOworICB2b2lkIF9NX2Rlc3Ryb3lfbm9kZXMoX1RwKiogX19uc3RhcnQsIF9UcCoqIF9fbmZpbmlzaCk7CisgIGVudW0geyBfU19pbml0aWFsX21hcF9zaXplID0gOCB9OworCitwcm90ZWN0ZWQ6CisgIGl0ZXJhdG9yIF9NX3N0YXJ0OworICBpdGVyYXRvciBfTV9maW5pc2g7CisgIF9NYXBfYWxsb2NfcHJveHkgIF9NX21hcDsKKyAgX0FsbG9jX3Byb3h5ICAgICAgX01fbWFwX3NpemU7Cit9OworCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BUUl9TUEVDSUFMSVpBVElPTlMpCisjICBkZWZpbmUgZGVxdWUgX1NUTFBfUFRSX0lNUExfTkFNRShkZXF1ZSkKKyNlbGlmIGRlZmluZWQgKF9TVExQX0RFQlVHKQorIyAgZGVmaW5lIGRlcXVlIF9TVExQX05PTl9EQkdfTkFNRShkZXF1ZSkKKyNlbHNlCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBfU1RMUF9ERUZBVUxUX0FMTE9DQVRPUl9TRUxFQ1QoX1RwKSA+CitjbGFzcyBkZXF1ZSA6IHByb3RlY3RlZCBfU1RMUF9QUklWIF9EZXF1ZV9iYXNlPF9UcCwgX0FsbG9jPgorI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QQVJUSUFMX1NQRUNfV09SS0FST1VORCkgJiYgIWRlZmluZWQgKGRlcXVlKQorICAgICAgICAgICAgLCBwdWJsaWMgX19zdGxwb3J0X2NsYXNzPGRlcXVlPF9UcCwgX0FsbG9jPiA+CisjZW5kaWYKK3sKKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9EZXF1ZV9iYXNlPF9UcCwgX0FsbG9jPiBfQmFzZTsKKyAgdHlwZWRlZiBkZXF1ZTxfVHAsIF9BbGxvYz4gX1NlbGY7CitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJhc2ljIHR5cGVzCisgIHR5cGVkZWYgX1RwIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgdmFsdWVfdHlwZSogcG9pbnRlcjsKKyAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlKiBjb25zdF9wb2ludGVyOworICB0eXBlZGVmIHZhbHVlX3R5cGUmIHJlZmVyZW5jZTsKKyAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlJiBjb25zdF9yZWZlcmVuY2U7CisgIHR5cGVkZWYgc2l6ZV90IHNpemVfdHlwZTsKKyAgdHlwZWRlZiBwdHJkaWZmX3QgZGlmZmVyZW5jZV90eXBlOworICB0eXBlZGVmIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnIF9JdGVyYXRvcl9jYXRlZ29yeTsKKyAgX1NUTFBfRk9SQ0VfQUxMT0NBVE9SUyhfVHAsIF9BbGxvYykKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7CisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXRlcmF0b3JzCisgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yICAgICAgIGl0ZXJhdG9yOworICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKKworICBfU1RMUF9ERUNMQVJFX1JBTkRPTV9BQ0NFU1NfUkVWRVJTRV9JVEVSQVRPUlM7CisKK3Byb3RlY3RlZDogICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWwgdHlwZWRlZnMKKyAgdHlwZWRlZiBwb2ludGVyKiBfTWFwX3BvaW50ZXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgX190eXBlX3RyYWl0czxfVHA+OjpoYXNfdHJpdmlhbF9hc3NpZ25tZW50X29wZXJhdG9yIF9Ucml2aWFsQXNzOworICB0eXBlZGVmIHR5cGVuYW1lIF9fdHlwZV90cmFpdHM8X1RwPjo6aGFzX3RyaXZpYWxfY29weV9jb25zdHJ1Y3RvciBfVHJpdmlhbENweTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfVHJpdmlhbEluaXQ8X1RwPjo6X1JldCBfVHJpdmlhbEluaXQ7CisjaWYgIWRlZmluZWQgKF9TVExQX05PX01PVkVfU0VNQU5USUMpCisgIHR5cGVkZWYgdHlwZW5hbWUgX19tb3ZlX3RyYWl0czxfVHA+OjppbXBsZW1lbnRlZCBfTW92YWJsZTsKKyNlbHNlCisgIHR5cGVkZWYgX19mYWxzZV90eXBlIF9Nb3ZhYmxlOworI2VuZGlmCisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gQmFzaWMgYWNjZXNzb3JzCisgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gdGhpcy0+X01fc3RhcnQ7IH0KKyAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gdGhpcy0+X01fZmluaXNoOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IodGhpcy0+X01fc3RhcnQpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKHRoaXMtPl9NX2ZpbmlzaCk7IH0KKworICByZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IodGhpcy0+X01fZmluaXNoKTsgfQorICByZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKHRoaXMtPl9NX3N0YXJ0KTsgfQorICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0CisgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcih0aGlzLT5fTV9maW5pc2gpOyB9CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0CisgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcih0aGlzLT5fTV9zdGFydCk7IH0KKworICByZWZlcmVuY2Ugb3BlcmF0b3JbXShzaXplX3R5cGUgX19uKQorICAgIHsgcmV0dXJuIHRoaXMtPl9NX3N0YXJ0W2RpZmZlcmVuY2VfdHlwZShfX24pXTsgfQorICBjb25zdF9yZWZlcmVuY2Ugb3BlcmF0b3JbXShzaXplX3R5cGUgX19uKSBjb25zdAorICAgIHsgcmV0dXJuIHRoaXMtPl9NX3N0YXJ0W2RpZmZlcmVuY2VfdHlwZShfX24pXTsgfQorCisgIHZvaWQgX01fcmFuZ2VfY2hlY2soc2l6ZV90eXBlIF9fbikgY29uc3QgeworICAgIGlmIChfX24gPj0gdGhpcy0+c2l6ZSgpKQorICAgICAgX19zdGxfdGhyb3dfb3V0X29mX3JhbmdlKCJkZXF1ZSIpOworICB9CisgIHJlZmVyZW5jZSBhdChzaXplX3R5cGUgX19uKQorICAgIHsgX01fcmFuZ2VfY2hlY2soX19uKTsgcmV0dXJuICgqdGhpcylbX19uXTsgfQorICBjb25zdF9yZWZlcmVuY2UgYXQoc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICB7IF9NX3JhbmdlX2NoZWNrKF9fbik7IHJldHVybiAoKnRoaXMpW19fbl07IH0KKworICByZWZlcmVuY2UgZnJvbnQoKSB7IHJldHVybiAqdGhpcy0+X01fc3RhcnQ7IH0KKyAgcmVmZXJlbmNlIGJhY2soKSB7CisgICAgaXRlcmF0b3IgX190bXAgPSB0aGlzLT5fTV9maW5pc2g7CisgICAgLS1fX3RtcDsKKyAgICByZXR1cm4gKl9fdG1wOworICB9CisgIGNvbnN0X3JlZmVyZW5jZSBmcm9udCgpIGNvbnN0IHsgcmV0dXJuICp0aGlzLT5fTV9zdGFydDsgfQorICBjb25zdF9yZWZlcmVuY2UgYmFjaygpIGNvbnN0IHsKKyAgICBjb25zdF9pdGVyYXRvciBfX3RtcCA9IHRoaXMtPl9NX2ZpbmlzaDsKKyAgICAtLV9fdG1wOworICAgIHJldHVybiAqX190bXA7CisgIH0KKworICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHRoaXMtPl9NX2ZpbmlzaCAtIHRoaXMtPl9NX3N0YXJ0OyB9CisgIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHNpemVfdHlwZSgtMSk7IH0KKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIHRoaXMtPl9NX2ZpbmlzaCA9PSB0aGlzLT5fTV9zdGFydDsgfQorICBhbGxvY2F0b3JfdHlwZSBnZXRfYWxsb2NhdG9yKCkgY29uc3QgeyByZXR1cm4gdGhpcy0+X01fbWFwX3NpemU7IH0KKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb25zdHJ1Y3RvciwgZGVzdHJ1Y3Rvci4KKyNpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKKyAgZXhwbGljaXQgZGVxdWUoY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisjZWxzZQorICBkZXF1ZSgpCisgICAgOiBfU1RMUF9QUklWIF9EZXF1ZV9iYXNlPF9UcCwgX0FsbG9jPihhbGxvY2F0b3JfdHlwZSgpLCAwKSB7fQorICBkZXF1ZShjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorI2VuZGlmCisgICAgOiBfU1RMUF9QUklWIF9EZXF1ZV9iYXNlPF9UcCwgX0FsbG9jPihfX2EsIDApIHt9CisKKyAgZGVxdWUoY29uc3QgX1NlbGYmIF9feCkKKyAgICA6IF9TVExQX1BSSVYgX0RlcXVlX2Jhc2U8X1RwLCBfQWxsb2M+KF9feC5nZXRfYWxsb2NhdG9yKCksIF9feC5zaXplKCkpCisgIHsgX1NUTFBfUFJJViBfX3Vjb3B5KF9feC5iZWdpbigpLCBfX3guZW5kKCksIHRoaXMtPl9NX3N0YXJ0KTsgfQorCisjaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCitwcml2YXRlOgorICB2b2lkIF9NX2luaXRpYWxpemUoc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX192YWwgPSBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKF9UcCkpCisgIHsgX01fZmlsbF9pbml0aWFsaXplKF9fdmFsLCBfVHJpdmlhbEluaXQoKSk7IH0KK3B1YmxpYzoKKyAgZXhwbGljaXQgZGVxdWUoc2l6ZV90eXBlIF9fbikKKyAgICA6IF9TVExQX1BSSVYgX0RlcXVlX2Jhc2U8X1RwLCBfQWxsb2M+KGFsbG9jYXRvcl90eXBlKCksIF9fbikKKyAgeyBfTV9pbml0aWFsaXplKF9fbik7IH0KKyAgZGVxdWUoc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX192YWwsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorI2Vsc2UKKyAgZXhwbGljaXQgZGVxdWUoc2l6ZV90eXBlIF9fbikKKyAgICA6IF9TVExQX1BSSVYgX0RlcXVlX2Jhc2U8X1RwLCBfQWxsb2M+KGFsbG9jYXRvcl90eXBlKCksIF9fbikKKyAgeyBfTV9maWxsX2luaXRpYWxpemUoX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRChfVHApLCBfVHJpdmlhbEluaXQoKSk7IH0KKyAgZGVxdWUoc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX192YWwpCisgICAgOiBfU1RMUF9QUklWIF9EZXF1ZV9iYXNlPF9UcCwgX0FsbG9jPihhbGxvY2F0b3JfdHlwZSgpLCBfX24pCisgIHsgX01fZmlsbF9pbml0aWFsaXplKF9fdmFsLCBfX2ZhbHNlX3R5cGUoKSk7IH0KKyAgZGVxdWUoc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX192YWwsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisjZW5kaWYKKyAgICA6IF9TVExQX1BSSVYgX0RlcXVlX2Jhc2U8X1RwLCBfQWxsb2M+KF9fYSwgX19uKQorICB7IF9NX2ZpbGxfaW5pdGlhbGl6ZShfX3ZhbCwgX19mYWxzZV90eXBlKCkpOyB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorcHJvdGVjdGVkOgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0ludGVnZXI+CisgIHZvaWQgX01faW5pdGlhbGl6ZV9kaXNwYXRjaChfSW50ZWdlciBfX24sIF9JbnRlZ2VyIF9feCwgY29uc3QgX190cnVlX3R5cGUmKSB7CisgICAgdGhpcy0+X01faW5pdGlhbGl6ZV9tYXAoX19uKTsKKyAgICBfTV9maWxsX2luaXRpYWxpemUoX194LCBfX2ZhbHNlX3R5cGUoKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcj4KKyAgdm9pZCBfTV9pbml0aWFsaXplX2Rpc3BhdGNoKF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX2ZhbHNlX3R5cGUmKSB7CisgICAgX01fcmFuZ2VfaW5pdGlhbGl6ZShfX2ZpcnN0LCBfX2xhc3QsIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9fZmlyc3QsIF9JbnB1dEl0ZXIpKTsKKyAgfQorCitwdWJsaWM6CisgIC8vIENoZWNrIHdoZXRoZXIgaXQncyBhbiBpbnRlZ3JhbCB0eXBlLiAgSWYgc28sIGl0J3Mgbm90IGFuIGl0ZXJhdG9yLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIGRlcXVlKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSBfU1RMUF9BTExPQ0FUT1JfVFlQRV9ERkwpCisgICAgOiBfU1RMUF9QUklWIF9EZXF1ZV9iYXNlPF9UcCwgX0FsbG9jPihfX2EpIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Jc0ludGVncmFsPF9JbnB1dEl0ZXJhdG9yPjo6X1JldCBfSW50ZWdyYWw7CisgICAgX01faW5pdGlhbGl6ZV9kaXNwYXRjaChfX2ZpcnN0LCBfX2xhc3QsIF9JbnRlZ3JhbCgpKTsKKyAgfQorCisjICBpZiBkZWZpbmVkIChfU1RMUF9ORUVEU19FWFRSQV9URU1QTEFURV9DT05TVFJVQ1RPUlMpCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgZGVxdWUoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgIDogX1NUTFBfUFJJViBfRGVxdWVfYmFzZTxfVHAsIF9BbGxvYz4oYWxsb2NhdG9yX3R5cGUoKSkgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lzSW50ZWdyYWw8X0lucHV0SXRlcmF0b3I+OjpfUmV0IF9JbnRlZ3JhbDsKKyAgICBfTV9pbml0aWFsaXplX2Rpc3BhdGNoKF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOworICB9CisjICBlbmRpZgorCisjZWxzZQorICBkZXF1ZShjb25zdCB2YWx1ZV90eXBlKiBfX2ZpcnN0LCBjb25zdCB2YWx1ZV90eXBlKiBfX2xhc3QsCisgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpICkKKyAgICA6IF9TVExQX1BSSVYgX0RlcXVlX2Jhc2U8X1RwLCBfQWxsb2M+KF9fYSwgX19sYXN0IC0gX19maXJzdCkKKyAgeyBfU1RMUF9QUklWIF9fdWNvcHkoX19maXJzdCwgX19sYXN0LCB0aGlzLT5fTV9zdGFydCk7IH0KKworICBkZXF1ZShjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QsCisgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpICkKKyAgICA6IF9TVExQX1BSSVYgX0RlcXVlX2Jhc2U8X1RwLCBfQWxsb2M+KF9fYSwgX19sYXN0IC0gX19maXJzdCkKKyAgeyBfU1RMUF9QUklWIF9fdWNvcHkoX19maXJzdCwgX19sYXN0LCB0aGlzLT5fTV9zdGFydCk7IH0KKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisKKyAgZGVxdWUoX19tb3ZlX3NvdXJjZTxfU2VsZj4gc3JjKQorICAgIDogX1NUTFBfUFJJViBfRGVxdWVfYmFzZTxfVHAsIF9BbGxvYz4oX19tb3ZlX3NvdXJjZTxfQmFzZT4oc3JjLmdldCgpKSkKKyAge30KKworICB+ZGVxdWUoKQorICB7IF9TVExQX1NURDo6X0Rlc3Ryb3lfUmFuZ2UodGhpcy0+X01fc3RhcnQsIHRoaXMtPl9NX2ZpbmlzaCk7IH0KKworICBfU2VsZiYgb3BlcmF0b3I9IChjb25zdCBfU2VsZiYgX194KTsKKworICB2b2lkIHN3YXAoX1NlbGYmIF9feCkgeworICAgIF9TVExQX1NURDo6c3dhcCh0aGlzLT5fTV9zdGFydCwgX194Ll9NX3N0YXJ0KTsKKyAgICBfU1RMUF9TVEQ6OnN3YXAodGhpcy0+X01fZmluaXNoLCBfX3guX01fZmluaXNoKTsKKyAgICB0aGlzLT5fTV9tYXAuc3dhcChfX3guX01fbWFwKTsKKyAgICB0aGlzLT5fTV9tYXBfc2l6ZS5zd2FwKF9feC5fTV9tYXBfc2l6ZSk7CisgIH0KKworcHVibGljOgorICAvLyBhc3NpZ24oKSwgYSBnZW5lcmFsaXplZCBhc3NpZ25tZW50IG1lbWJlciBmdW5jdGlvbi4gIFR3bworICAvLyB2ZXJzaW9uczogb25lIHRoYXQgdGFrZXMgYSBjb3VudCwgYW5kIG9uZSB0aGF0IHRha2VzIGEgcmFuZ2UuCisgIC8vIFRoZSByYW5nZSB2ZXJzaW9uIGlzIGEgbWVtYmVyIHRlbXBsYXRlLCBzbyB3ZSBkaXNwYXRjaCBvbiB3aGV0aGVyCisgIC8vIG9yIG5vdCB0aGUgdHlwZSBpcyBhbiBpbnRlZ2VyLgorCisgIHZvaWQgX01fZmlsbF9hc3NpZ24oc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3ZhbCkgeworICAgIGlmIChfX24gPiBzaXplKCkpIHsKKyAgICAgIF9TVExQX1NURDo6ZmlsbChiZWdpbigpLCBlbmQoKSwgX192YWwpOworICAgICAgaW5zZXJ0KGVuZCgpLCBfX24gLSBzaXplKCksIF9fdmFsKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBlcmFzZShiZWdpbigpICsgX19uLCBlbmQoKSk7CisgICAgICBfU1RMUF9TVEQ6OmZpbGwoYmVnaW4oKSwgZW5kKCksIF9fdmFsKTsKKyAgICB9CisgIH0KKworICB2b2lkIGFzc2lnbihzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9fdmFsKSB7CisgICAgX01fZmlsbF9hc3NpZ24oX19uLCBfX3ZhbCk7CisgIH0KKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgdm9pZCBhc3NpZ24oX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXNJbnRlZ3JhbDxfSW5wdXRJdGVyYXRvcj46Ol9SZXQgX0ludGVncmFsOworICAgIF9NX2Fzc2lnbl9kaXNwYXRjaChfX2ZpcnN0LCBfX2xhc3QsIF9JbnRlZ3JhbCgpKTsKKyAgfQorCitwcml2YXRlOiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhlbHBlciBmdW5jdGlvbnMgZm9yIGFzc2lnbigpCisKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnRlZ2VyPgorICB2b2lkIF9NX2Fzc2lnbl9kaXNwYXRjaChfSW50ZWdlciBfX24sIF9JbnRlZ2VyIF9fdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX3RydWVfdHlwZSYgLypfSXNJbnRlZ3JhbCovKQorICB7IF9NX2ZpbGxfYXNzaWduKChzaXplX3R5cGUpIF9fbiwgKF9UcCkgX192YWwpOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICB2b2lkIF9NX2Fzc2lnbl9kaXNwYXRjaChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypfSXNJbnRlZ3JhbCovKSB7CisgICAgX01fYXNzaWduX2F1eChfX2ZpcnN0LCBfX2xhc3QsIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcj4KKyAgdm9pZCBfTV9hc3NpZ25fYXV4KF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsIGNvbnN0IGlucHV0X2l0ZXJhdG9yX3RhZyAmKSB7CisgICAgaXRlcmF0b3IgX19jdXIgPSBiZWdpbigpOworICAgIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3QgJiYgX19jdXIgIT0gZW5kKCk7ICsrX19jdXIsICsrX19maXJzdCkKKyAgICAgICpfX2N1ciA9ICpfX2ZpcnN0OworICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKyAgICAgIGVyYXNlKF9fY3VyLCBlbmQoKSk7CisgICAgZWxzZQorICAgICAgaW5zZXJ0KGVuZCgpLCBfX2ZpcnN0LCBfX2xhc3QpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CisgIHZvaWQgX01fYXNzaWduX2F1eChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9yd2FyZF9pdGVyYXRvcl90YWcgJikgeworI2Vsc2UKKyAgdm9pZCBhc3NpZ24oY29uc3QgdmFsdWVfdHlwZSAqX19maXJzdCwgY29uc3QgdmFsdWVfdHlwZSAqX19sYXN0KSB7CisgICAgc2l6ZV90eXBlIF9fc2l6ZSA9IHNpemUoKTsKKyAgICBzaXplX3R5cGUgX19sZW4gPSBfX2xhc3QgLSBfX2ZpcnN0OworICAgIGlmIChfX2xlbiA+IF9fc2l6ZSkgeworICAgICAgY29uc3QgdmFsdWVfdHlwZSAqX19taWQgPSBfX2ZpcnN0ICsgX19zaXplOworICAgICAgY29weShfX2ZpcnN0LCBfX21pZCwgYmVnaW4oKSk7CisgICAgICBpbnNlcnQoZW5kKCksIF9fbWlkLCBfX2xhc3QpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGVyYXNlKGNvcHkoX19maXJzdCwgX19sYXN0LCBiZWdpbigpKSwgZW5kKCkpOworICAgIH0KKyAgfQorICB2b2lkIGFzc2lnbihjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpIHsKKyAgICB0eXBlZGVmIGNvbnN0X2l0ZXJhdG9yIF9Gb3J3YXJkSXRlcmF0b3I7CisjZW5kaWYgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworICAgIHNpemVfdHlwZSBfX2xlbiA9IGRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgaWYgKF9fbGVuID4gc2l6ZSgpKSB7CisgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbWlkID0gX19maXJzdDsKKyAgICAgIGFkdmFuY2UoX19taWQsIHNpemUoKSk7CisgICAgICBjb3B5KF9fZmlyc3QsIF9fbWlkLCBiZWdpbigpKTsKKyAgICAgIGluc2VydChlbmQoKSwgX19taWQsIF9fbGFzdCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgZXJhc2UoY29weShfX2ZpcnN0LCBfX2xhc3QsIGJlZ2luKCkpLCBlbmQoKSk7CisgICAgfQorICB9CisKKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwdXNoXyogYW5kIHBvcF8qCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkgJiYgIWRlZmluZWQgKF9TVExQX05PX0FOQUNIUk9OSVNNUykKKyAgdm9pZCBwdXNoX2JhY2soY29uc3QgdmFsdWVfdHlwZSYgX190ID0gX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRChfVHApKSB7CisjZWxzZQorICB2b2lkIHB1c2hfYmFjayhjb25zdCB2YWx1ZV90eXBlJiBfX3QpIHsKKyNlbmRpZiAvKiFfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNICYmICFfU1RMUF9OT19BTkFDSFJPTklTTVMqLworICAgIGlmICh0aGlzLT5fTV9maW5pc2guX01fY3VyICE9IHRoaXMtPl9NX2ZpbmlzaC5fTV9sYXN0IC0gMSkgeworICAgICAgX0NvcHlfQ29uc3RydWN0KHRoaXMtPl9NX2ZpbmlzaC5fTV9jdXIsIF9fdCk7CisgICAgICArK3RoaXMtPl9NX2ZpbmlzaC5fTV9jdXI7CisgICAgfQorICAgIGVsc2UKKyAgICAgIF9NX3B1c2hfYmFja19hdXhfdihfX3QpOworICB9CisjaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pICYmICFkZWZpbmVkIChfU1RMUF9OT19BTkFDSFJPTklTTVMpCisgIHZvaWQgcHVzaF9mcm9udChjb25zdCB2YWx1ZV90eXBlJiBfX3QgPSBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKF9UcCkpICAgeworI2Vsc2UKKyAgdm9pZCBwdXNoX2Zyb250KGNvbnN0IHZhbHVlX3R5cGUmIF9fdCkgICB7CisjZW5kaWYgLyohX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSAmJiAhX1NUTFBfTk9fQU5BQ0hST05JU01TKi8KKyAgICBpZiAodGhpcy0+X01fc3RhcnQuX01fY3VyICE9IHRoaXMtPl9NX3N0YXJ0Ll9NX2ZpcnN0KSB7CisgICAgICBfQ29weV9Db25zdHJ1Y3QodGhpcy0+X01fc3RhcnQuX01fY3VyIC0gMSwgX190KTsKKyAgICAgIC0tdGhpcy0+X01fc3RhcnQuX01fY3VyOworICAgIH0KKyAgICBlbHNlCisgICAgICBfTV9wdXNoX2Zyb250X2F1eF92KF9fdCk7CisgIH0KKworI2lmIGRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pICYmICFkZWZpbmVkIChfU1RMUF9OT19BTkFDSFJPTklTTVMpCisgIHZvaWQgcHVzaF9iYWNrKCkgeworICAgIGlmICh0aGlzLT5fTV9maW5pc2guX01fY3VyICE9IHRoaXMtPl9NX2ZpbmlzaC5fTV9sYXN0IC0gMSkgeworICAgICAgX1NUTFBfU1REOjpfQ29uc3RydWN0KHRoaXMtPl9NX2ZpbmlzaC5fTV9jdXIpOworICAgICAgKyt0aGlzLT5fTV9maW5pc2guX01fY3VyOworICAgIH0KKyAgICBlbHNlCisgICAgICBfTV9wdXNoX2JhY2tfYXV4KCk7CisgIH0KKyAgdm9pZCBwdXNoX2Zyb250KCkgeworICAgIGlmICh0aGlzLT5fTV9zdGFydC5fTV9jdXIgIT0gdGhpcy0+X01fc3RhcnQuX01fZmlyc3QpIHsKKyAgICAgIF9TVExQX1NURDo6X0NvbnN0cnVjdCh0aGlzLT5fTV9zdGFydC5fTV9jdXIgLSAxKTsKKyAgICAgIC0tdGhpcy0+X01fc3RhcnQuX01fY3VyOworICAgIH0KKyAgICBlbHNlCisgICAgICBfTV9wdXNoX2Zyb250X2F1eCgpOworICB9CisjZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNICYmICFfU1RMUF9OT19BTkFDSFJPTklTTVMqLworCisgIHZvaWQgcG9wX2JhY2soKSB7CisgICAgaWYgKHRoaXMtPl9NX2ZpbmlzaC5fTV9jdXIgIT0gdGhpcy0+X01fZmluaXNoLl9NX2ZpcnN0KSB7CisgICAgICAtLXRoaXMtPl9NX2ZpbmlzaC5fTV9jdXI7CisgICAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95KHRoaXMtPl9NX2ZpbmlzaC5fTV9jdXIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIF9NX3BvcF9iYWNrX2F1eCgpOworICAgICAgX1NUTFBfU1REOjpfRGVzdHJveSh0aGlzLT5fTV9maW5pc2guX01fY3VyKTsKKyAgICB9CisgIH0KKworICB2b2lkIHBvcF9mcm9udCgpIHsKKyAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95KHRoaXMtPl9NX3N0YXJ0Ll9NX2N1cik7CisgICAgX01fcG9wX2Zyb250X2F1eCgpOworICB9CisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5zZXJ0CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkgJiYgIWRlZmluZWQgKF9TVExQX05PX0FOQUNIUk9OSVNNUykKKyAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBjb25zdCB2YWx1ZV90eXBlJiBfX3ggPSBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKF9UcCkpIHsKKyNlbHNlCisgIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBfX3BvcywgY29uc3QgdmFsdWVfdHlwZSYgX194KSB7CisjZW5kaWYgLyohX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSAmJiAhX1NUTFBfTk9fQU5BQ0hST05JU01TKi8KKyAgICBpZiAoX19wb3MuX01fY3VyID09IHRoaXMtPl9NX3N0YXJ0Ll9NX2N1cikgeworICAgICAgcHVzaF9mcm9udChfX3gpOworICAgICAgcmV0dXJuIHRoaXMtPl9NX3N0YXJ0OworICAgIH0KKyAgICBlbHNlIGlmIChfX3Bvcy5fTV9jdXIgPT0gdGhpcy0+X01fZmluaXNoLl9NX2N1cikgeworICAgICAgcHVzaF9iYWNrKF9feCk7CisgICAgICBpdGVyYXRvciBfX3RtcCA9IHRoaXMtPl9NX2ZpbmlzaDsKKyAgICAgIC0tX190bXA7CisgICAgICByZXR1cm4gX190bXA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgcmV0dXJuIF9NX2ZpbGxfaW5zZXJ0X2F1eChfX3BvcywgMSwgX194LCBfTW92YWJsZSgpKTsKKyAgICB9CisgIH0KKworI2lmIGRlZmluZWQoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkgJiYgIWRlZmluZWQoX1NUTFBfTk9fQU5BQ0hST05JU01TKQorICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3IgX19wb3MpCisgIHsgcmV0dXJuIGluc2VydChfX3BvcywgX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRChfVHApKTsgfQorI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSAmJiAhX1NUTFBfTk9fQU5BQ0hST05JU01TKi8KKworICB2b2lkIGluc2VydChpdGVyYXRvciBfX3Bvcywgc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX194KQorICB7IF9NX2ZpbGxfaW5zZXJ0KF9fcG9zLCBfX24sIF9feCk7IH0KKworcHJvdGVjdGVkOgorICBpdGVyYXRvciBfTV9maWxsX2luc2VydF9hdXgoaXRlcmF0b3IgX19wb3MsIHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCwgY29uc3QgX190cnVlX3R5cGUmIC8qX01vdmFibGUqLyk7CisgIGl0ZXJhdG9yIF9NX2ZpbGxfaW5zZXJ0X2F1eChpdGVyYXRvciBfX3Bvcywgc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX194LCBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qX01vdmFibGUqLyk7CisKKyAgdm9pZCBfTV9maWxsX2luc2VydChpdGVyYXRvciBfX3Bvcywgc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX194KTsKKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIHRlbXBsYXRlIDxjbGFzcyBfSW50ZWdlcj4KKyAgdm9pZCBfTV9pbnNlcnRfZGlzcGF0Y2goaXRlcmF0b3IgX19wb3MsIF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX194LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX3RydWVfdHlwZSYgLypfSXNJbnRlZ3JhbCovKSB7CisgICAgX01fZmlsbF9pbnNlcnQoX19wb3MsIChzaXplX3R5cGUpIF9fbiwgKHZhbHVlX3R5cGUpIF9feCk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZvaWQgX01faW5zZXJ0X2Rpc3BhdGNoKGl0ZXJhdG9yIF9fcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypfSXNJbnRlZ3JhbCovKSB7CisgICAgX01faW5zZXJ0KF9fcG9zLCBfX2ZpcnN0LCBfX2xhc3QsIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yKSk7CisgIH0KKworcHVibGljOgorICAvLyBDaGVjayB3aGV0aGVyIGl0J3MgYW4gaW50ZWdyYWwgdHlwZS4gIElmIHNvLCBpdCdzIG5vdCBhbiBpdGVyYXRvci4KKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICB2b2lkIGluc2VydChpdGVyYXRvciBfX3BvcywgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXNJbnRlZ3JhbDxfSW5wdXRJdGVyYXRvcj46Ol9SZXQgX0ludGVncmFsOworICAgIF9NX2luc2VydF9kaXNwYXRjaChfX3BvcywgX19maXJzdCwgX19sYXN0LCBfSW50ZWdyYWwoKSk7CisgIH0KKworI2Vsc2UgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworICB2b2lkIF9NX2luc2VydF9yYW5nZV9hdXgoaXRlcmF0b3IgX19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZV90eXBlKiBfX2ZpcnN0LCBjb25zdCB2YWx1ZV90eXBlKiBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uLCBjb25zdCBfX3RydWVfdHlwZSYgLypfTW92YWJsZSovKTsKKyAgdm9pZCBfTV9pbnNlcnRfcmFuZ2VfYXV4KGl0ZXJhdG9yIF9fcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWVfdHlwZSogX19maXJzdCwgY29uc3QgdmFsdWVfdHlwZSogX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fbiwgY29uc3QgX19mYWxzZV90eXBlJiAvKl9Nb3ZhYmxlKi8pOworICB2b2lkIF9NX2luc2VydF9yYW5nZV9hdXgoaXRlcmF0b3IgX19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uLCBjb25zdCBfX3RydWVfdHlwZSYgLypfTW92YWJsZSovKTsKKyAgdm9pZCBfTV9pbnNlcnRfcmFuZ2VfYXV4KGl0ZXJhdG9yIF9fcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fbiwgY29uc3QgX19mYWxzZV90eXBlJiAvKl9Nb3ZhYmxlKi8pOworcHVibGljOgorICB2b2lkIGluc2VydChpdGVyYXRvciBfX3BvcywKKyAgICAgICAgICAgICAgY29uc3QgdmFsdWVfdHlwZSogX19maXJzdCwgY29uc3QgdmFsdWVfdHlwZSogX19sYXN0KTsKKyAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wb3MsCisgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCk7CisKKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisKK3B1YmxpYzoKKyNpZiAhZGVmaW5lZChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQorICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgX19uZXdfc2l6ZSwKKyAgICAgICAgICAgICAgY29uc3QgdmFsdWVfdHlwZSYgX194ID0gX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRChfVHApKSB7CisjZWxzZQorICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgX19uZXdfc2l6ZSwgY29uc3QgdmFsdWVfdHlwZSYgX194KSB7CisjZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKi8KKyAgICBjb25zdCBzaXplX3R5cGUgX19sZW4gPSBzaXplKCk7CisgICAgaWYgKF9fbmV3X3NpemUgPCBfX2xlbikKKyAgICAgIGVyYXNlKHRoaXMtPl9NX3N0YXJ0ICsgX19uZXdfc2l6ZSwgdGhpcy0+X01fZmluaXNoKTsKKyAgICBlbHNlCisgICAgICBpbnNlcnQodGhpcy0+X01fZmluaXNoLCBfX25ld19zaXplIC0gX19sZW4sIF9feCk7CisgIH0KKworI2lmIGRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCisgIHZvaWQgcmVzaXplKHNpemVfdHlwZSBfX25ld19zaXplKQorICB7IHJlc2l6ZShfX25ld19zaXplLCBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKF9UcCkpOyB9CisjZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKi8KKworcHJvdGVjdGVkOgorICBpdGVyYXRvciBfTV9lcmFzZShpdGVyYXRvciBfX3BvcywgY29uc3QgX190cnVlX3R5cGUmIC8qX01vdmFibGUqLyk7CisgIGl0ZXJhdG9yIF9NX2VyYXNlKGl0ZXJhdG9yIF9fcG9zLCBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qX01vdmFibGUqLyk7CisKKyAgaXRlcmF0b3IgX01fZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0LCBjb25zdCBfX3RydWVfdHlwZSYgLypfTW92YWJsZSovKTsKKyAgaXRlcmF0b3IgX01fZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0LCBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qX01vdmFibGUqLyk7CitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVyYXNlCisgIGl0ZXJhdG9yIGVyYXNlKGl0ZXJhdG9yIF9fcG9zKSB7CisgICAgcmV0dXJuIF9NX2VyYXNlKF9fcG9zLCBfTW92YWJsZSgpKTsKKyAgfQorICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpIHsKKyAgICBpZiAoX19maXJzdCA9PSB0aGlzLT5fTV9zdGFydCAmJiBfX2xhc3QgPT0gdGhpcy0+X01fZmluaXNoKSB7CisgICAgICBjbGVhcigpOworICAgICAgcmV0dXJuIHRoaXMtPl9NX2ZpbmlzaDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QpCisgICAgICAgIHJldHVybiBfX2ZpcnN0OworICAgICAgcmV0dXJuIF9NX2VyYXNlKF9fZmlyc3QsIF9fbGFzdCwgX01vdmFibGUoKSk7CisgICAgfQorICB9CisgIHZvaWQgY2xlYXIoKTsKKworcHJvdGVjdGVkOiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsIGNvbnN0cnVjdGlvbi9kZXN0cnVjdGlvbgorCisgIHZvaWQgX01fZmlsbF9pbml0aWFsaXplKGNvbnN0IHZhbHVlX3R5cGUmIF9fdmFsLCBjb25zdCBfX3RydWVfdHlwZSYgLypfVHJpdmlhbEluaXQqLykKKyAge30KKyAgdm9pZCBfTV9maWxsX2luaXRpYWxpemUoY29uc3QgdmFsdWVfdHlwZSYgX192YWwsIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypfVHJpdmlhbEluaXQqLyk7CisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZvaWQgX01fcmFuZ2VfaW5pdGlhbGl6ZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnB1dF9pdGVyYXRvcl90YWcgJikgeworICAgIHRoaXMtPl9NX2luaXRpYWxpemVfbWFwKDApOworICAgIF9TVExQX1RSWSB7CisgICAgICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisgICAgICAgIHB1c2hfYmFjaygqX19maXJzdCk7CisgICAgfQorICAgIF9TVExQX1VOV0lORChjbGVhcigpKQorICB9CisgIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorICB2b2lkICBfTV9yYW5nZV9pbml0aWFsaXplKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9yd2FyZF9pdGVyYXRvcl90YWcgJikgIHsKKyAgIHNpemVfdHlwZSBfX24gPSBkaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QpOworICAgdGhpcy0+X01faW5pdGlhbGl6ZV9tYXAoX19uKTsKKyAgIF9NYXBfcG9pbnRlciBfX2N1cl9ub2RlID0gdGhpcy0+X01fc3RhcnQuX01fbm9kZTsKKyAgIF9TVExQX1RSWSB7CisgICAgZm9yICg7IF9fY3VyX25vZGUgPCB0aGlzLT5fTV9maW5pc2guX01fbm9kZTsgKytfX2N1cl9ub2RlKSB7CisgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbWlkID0gX19maXJzdDsKKyAgICAgIGFkdmFuY2UoX19taWQsIHRoaXMtPmJ1ZmZlcl9zaXplKCkpOworICAgICAgdW5pbml0aWFsaXplZF9jb3B5KF9fZmlyc3QsIF9fbWlkLCAqX19jdXJfbm9kZSk7CisgICAgICBfX2ZpcnN0ID0gX19taWQ7CisgICAgfQorICAgIHVuaW5pdGlhbGl6ZWRfY29weShfX2ZpcnN0LCBfX2xhc3QsIHRoaXMtPl9NX2ZpbmlzaC5fTV9maXJzdCk7CisgICB9CisgIF9TVExQX1VOV0lORChfU1RMUF9TVEQ6Ol9EZXN0cm95X1JhbmdlKHRoaXMtPl9NX3N0YXJ0LCBpdGVyYXRvcigqX19jdXJfbm9kZSwgX19jdXJfbm9kZSkpKQorIH0KKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisKK3Byb3RlY3RlZDogICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbCBwdXNoXyogYW5kIHBvcF8qCisKKyAgdm9pZCBfTV9wdXNoX2JhY2tfYXV4X3YoY29uc3QgdmFsdWVfdHlwZSYpOworICB2b2lkIF9NX3B1c2hfZnJvbnRfYXV4X3YoY29uc3QgdmFsdWVfdHlwZSYpOworI2lmIGRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pICYmICFkZWZpbmVkIChfU1RMUF9OT19BTkFDSFJPTklTTVMpCisgIHZvaWQgX01fcHVzaF9iYWNrX2F1eCgpOworICB2b2lkIF9NX3B1c2hfZnJvbnRfYXV4KCk7CisjZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNICFfU1RMUF9OT19BTkFDSFJPTklTTVMqLworICB2b2lkIF9NX3BvcF9iYWNrX2F1eCgpOworICB2b2lkIF9NX3BvcF9mcm9udF9hdXgoKTsKKworcHJvdGVjdGVkOiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsIGluc2VydCBmdW5jdGlvbnMKKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICB2b2lkIF9NX2luc2VydChpdGVyYXRvciBfX3BvcywKKyAgICAgICAgICAgICAgICBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LAorICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICBjb25zdCBpbnB1dF9pdGVyYXRvcl90YWcgJikgeworICAgIGNvcHkoX19maXJzdCwgX19sYXN0LCBpbnNlcnRlcigqdGhpcywgX19wb3MpKTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorICB2b2lkICBfTV9pbnNlcnQoaXRlcmF0b3IgX19wb3MsCisgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgY29uc3QgZm9yd2FyZF9pdGVyYXRvcl90YWcgJikgeworICAgIHNpemVfdHlwZSBfX24gPSBkaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QpOworICAgIGlmIChfX3Bvcy5fTV9jdXIgPT0gdGhpcy0+X01fc3RhcnQuX01fY3VyKSB7CisgICAgICBpdGVyYXRvciBfX25ld19zdGFydCA9IF9NX3Jlc2VydmVfZWxlbWVudHNfYXRfZnJvbnQoX19uKTsKKyAgICAgIF9TVExQX1RSWSB7CisgICAgICAgIHVuaW5pdGlhbGl6ZWRfY29weShfX2ZpcnN0LCBfX2xhc3QsIF9fbmV3X3N0YXJ0KTsKKyAgICAgICAgdGhpcy0+X01fc3RhcnQgPSBfX25ld19zdGFydDsKKyAgICAgIH0KKyAgICAgIF9TVExQX1VOV0lORCh0aGlzLT5fTV9kZXN0cm95X25vZGVzKF9fbmV3X3N0YXJ0Ll9NX25vZGUsIHRoaXMtPl9NX3N0YXJ0Ll9NX25vZGUpKQorICAgIH0KKyAgICBlbHNlIGlmIChfX3Bvcy5fTV9jdXIgPT0gdGhpcy0+X01fZmluaXNoLl9NX2N1cikgeworICAgICAgaXRlcmF0b3IgX19uZXdfZmluaXNoID0gX01fcmVzZXJ2ZV9lbGVtZW50c19hdF9iYWNrKF9fbik7CisgICAgICBfU1RMUF9UUlkgeworICAgICAgICB1bmluaXRpYWxpemVkX2NvcHkoX19maXJzdCwgX19sYXN0LCB0aGlzLT5fTV9maW5pc2gpOworICAgICAgICB0aGlzLT5fTV9maW5pc2ggPSBfX25ld19maW5pc2g7CisgICAgICB9CisgICAgICBfU1RMUF9VTldJTkQodGhpcy0+X01fZGVzdHJveV9ub2Rlcyh0aGlzLT5fTV9maW5pc2guX01fbm9kZSArIDEsIF9fbmV3X2ZpbmlzaC5fTV9ub2RlICsgMSkpCisgICAgfQorICAgIGVsc2UKKyAgICAgIF9NX2luc2VydF9yYW5nZV9hdXgoX19wb3MsIF9fZmlyc3QsIF9fbGFzdCwgX19uLCBfTW92YWJsZSgpKTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorICB2b2lkIF9NX2luc2VydF9yYW5nZV9hdXgoaXRlcmF0b3IgX19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fbiwgY29uc3QgX190cnVlX3R5cGUmIC8qX01vdmFibGUqLykgeworICAgIGNvbnN0IGRpZmZlcmVuY2VfdHlwZSBfX2VsZW1zYmVmb3JlID0gX19wb3MgLSB0aGlzLT5fTV9zdGFydDsKKyAgICBzaXplX3R5cGUgX19sZW5ndGggPSBzaXplKCk7CisgICAgaWYgKF9fZWxlbXNiZWZvcmUgPD0gZGlmZmVyZW5jZV90eXBlKF9fbGVuZ3RoIC8gMikpIHsKKyAgICAgIGl0ZXJhdG9yIF9fbmV3X3N0YXJ0ID0gX01fcmVzZXJ2ZV9lbGVtZW50c19hdF9mcm9udChfX24pOworICAgICAgX19wb3MgPSB0aGlzLT5fTV9zdGFydCArIF9fZWxlbXNiZWZvcmU7CisgICAgICBfU1RMUF9UUlkgeworICAgICAgICBpdGVyYXRvciBfX2RzdCA9IF9fbmV3X3N0YXJ0OworICAgICAgICBpdGVyYXRvciBfX3NyYyA9IHRoaXMtPl9NX3N0YXJ0OworICAgICAgICBmb3IgKDsgX19zcmMgIT0gX19wb3M7ICsrX19kc3QsICsrX19zcmMpIHsKKyAgICAgICAgICBfU1RMUF9TVEQ6Ol9Nb3ZlX0NvbnN0cnVjdCgmKCpfX2RzdCksICpfX3NyYyk7CisgICAgICAgICAgX1NUTFBfU1REOjpfRGVzdHJveV9Nb3ZlZCgmKCpfX3NyYykpOworICAgICAgICB9CisgICAgICAgIHRoaXMtPl9NX3N0YXJ0ID0gX19uZXdfc3RhcnQ7CisgICAgICAgIHVuaW5pdGlhbGl6ZWRfY29weShfX2ZpcnN0LCBfX2xhc3QsIF9fZHN0KTsKKyAgICAgIH0KKyAgICAgIF9TVExQX1VOV0lORCh0aGlzLT5fTV9kZXN0cm95X25vZGVzKF9fbmV3X3N0YXJ0Ll9NX25vZGUsIHRoaXMtPl9NX3N0YXJ0Ll9NX25vZGUpKQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGl0ZXJhdG9yIF9fbmV3X2ZpbmlzaCA9IF9NX3Jlc2VydmVfZWxlbWVudHNfYXRfYmFjayhfX24pOworICAgICAgY29uc3QgZGlmZmVyZW5jZV90eXBlIF9fZWxlbXNhZnRlciA9IGRpZmZlcmVuY2VfdHlwZShfX2xlbmd0aCkgLSBfX2VsZW1zYmVmb3JlOworICAgICAgX19wb3MgPSB0aGlzLT5fTV9maW5pc2ggLSBfX2VsZW1zYWZ0ZXI7CisgICAgICBfU1RMUF9UUlkgeworICAgICAgICBpdGVyYXRvciBfX2RzdCA9IF9fbmV3X2ZpbmlzaDsKKyAgICAgICAgaXRlcmF0b3IgX19zcmMgPSB0aGlzLT5fTV9maW5pc2g7CisgICAgICAgIGZvciAoLS1fX3NyYywgLS1fX2RzdDsgX19zcmMgPj0gX19wb3M7IC0tX19zcmMsIC0tX19kc3QpIHsKKyAgICAgICAgICBfU1RMUF9TVEQ6Ol9Nb3ZlX0NvbnN0cnVjdCgmKCpfX2RzdCksICpfX3NyYyk7CisgICAgICAgICAgX1NUTFBfU1REOjpfRGVzdHJveV9Nb3ZlZCgmKCpfX3NyYykpOworICAgICAgICB9CisgICAgICAgIHRoaXMtPl9NX2ZpbmlzaCA9IF9fbmV3X2ZpbmlzaDsKKyAgICAgICAgdW5pbml0aWFsaXplZF9jb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19wb3MpOworICAgICAgfQorICAgICAgX1NUTFBfVU5XSU5EKHRoaXMtPl9NX2Rlc3Ryb3lfbm9kZXModGhpcy0+X01fZmluaXNoLl9NX25vZGUgKyAxLCBfX25ld19maW5pc2guX01fbm9kZSArIDEpKQorICAgIH0KKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorICB2b2lkIF9NX2luc2VydF9yYW5nZV9hdXgoaXRlcmF0b3IgX19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fbiwgY29uc3QgX19mYWxzZV90eXBlJiAvKl9Nb3ZhYmxlKi8pIHsKKyAgICBjb25zdCBkaWZmZXJlbmNlX3R5cGUgX19lbGVtc2JlZm9yZSA9IF9fcG9zIC0gdGhpcy0+X01fc3RhcnQ7CisgICAgc2l6ZV90eXBlIF9fbGVuZ3RoID0gc2l6ZSgpOworICAgIGlmIChfX2VsZW1zYmVmb3JlIDw9IGRpZmZlcmVuY2VfdHlwZShfX2xlbmd0aCAvIDIpKSB7CisgICAgICBpdGVyYXRvciBfX25ld19zdGFydCA9IF9NX3Jlc2VydmVfZWxlbWVudHNfYXRfZnJvbnQoX19uKTsKKyAgICAgIGl0ZXJhdG9yIF9fb2xkX3N0YXJ0ID0gdGhpcy0+X01fc3RhcnQ7CisgICAgICBfX3BvcyA9IHRoaXMtPl9NX3N0YXJ0ICsgX19lbGVtc2JlZm9yZTsKKyAgICAgIF9TVExQX1RSWSB7CisgICAgICAgIGlmIChfX2VsZW1zYmVmb3JlID49IGRpZmZlcmVuY2VfdHlwZShfX24pKSB7CisgICAgICAgICAgaXRlcmF0b3IgX19zdGFydF9uID0gdGhpcy0+X01fc3RhcnQgKyBkaWZmZXJlbmNlX3R5cGUoX19uKTsKKyAgICAgICAgICB1bmluaXRpYWxpemVkX2NvcHkodGhpcy0+X01fc3RhcnQsIF9fc3RhcnRfbiwgX19uZXdfc3RhcnQpOworICAgICAgICAgIHRoaXMtPl9NX3N0YXJ0ID0gX19uZXdfc3RhcnQ7CisgICAgICAgICAgY29weShfX3N0YXJ0X24sIF9fcG9zLCBfX29sZF9zdGFydCk7CisgICAgICAgICAgY29weShfX2ZpcnN0LCBfX2xhc3QsIF9fcG9zIC0gZGlmZmVyZW5jZV90eXBlKF9fbikpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19taWQgPSBfX2ZpcnN0OworICAgICAgICAgIGFkdmFuY2UoX19taWQsIGRpZmZlcmVuY2VfdHlwZShfX24pIC0gX19lbGVtc2JlZm9yZSk7CisgICAgICAgICAgX1NUTFBfUFJJViBfX3VuaW5pdGlhbGl6ZWRfY29weV9jb3B5KHRoaXMtPl9NX3N0YXJ0LCBfX3BvcywgX19maXJzdCwgX19taWQsIF9fbmV3X3N0YXJ0KTsKKyAgICAgICAgICB0aGlzLT5fTV9zdGFydCA9IF9fbmV3X3N0YXJ0OworICAgICAgICAgIGNvcHkoX19taWQsIF9fbGFzdCwgX19vbGRfc3RhcnQpOworICAgICAgICB9CisgICAgICB9CisgICAgICBfU1RMUF9VTldJTkQodGhpcy0+X01fZGVzdHJveV9ub2RlcyhfX25ld19zdGFydC5fTV9ub2RlLCB0aGlzLT5fTV9zdGFydC5fTV9ub2RlKSkKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBpdGVyYXRvciBfX25ld19maW5pc2ggPSBfTV9yZXNlcnZlX2VsZW1lbnRzX2F0X2JhY2soX19uKTsKKyAgICAgIGl0ZXJhdG9yIF9fb2xkX2ZpbmlzaCA9IHRoaXMtPl9NX2ZpbmlzaDsKKyAgICAgIGNvbnN0IGRpZmZlcmVuY2VfdHlwZSBfX2VsZW1zYWZ0ZXIgPSBkaWZmZXJlbmNlX3R5cGUoX19sZW5ndGgpIC0gX19lbGVtc2JlZm9yZTsKKyAgICAgIF9fcG9zID0gdGhpcy0+X01fZmluaXNoIC0gX19lbGVtc2FmdGVyOworICAgICAgX1NUTFBfVFJZIHsKKyAgICAgICAgaWYgKF9fZWxlbXNhZnRlciA+IGRpZmZlcmVuY2VfdHlwZShfX24pKSB7CisgICAgICAgICAgaXRlcmF0b3IgX19maW5pc2hfbiA9IHRoaXMtPl9NX2ZpbmlzaCAtIGRpZmZlcmVuY2VfdHlwZShfX24pOworICAgICAgICAgIHVuaW5pdGlhbGl6ZWRfY29weShfX2ZpbmlzaF9uLCB0aGlzLT5fTV9maW5pc2gsIHRoaXMtPl9NX2ZpbmlzaCk7CisgICAgICAgICAgdGhpcy0+X01fZmluaXNoID0gX19uZXdfZmluaXNoOworICAgICAgICAgIGNvcHlfYmFja3dhcmQoX19wb3MsIF9fZmluaXNoX24sIF9fb2xkX2ZpbmlzaCk7CisgICAgICAgICAgY29weShfX2ZpcnN0LCBfX2xhc3QsIF9fcG9zKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbWlkID0gX19maXJzdDsKKyAgICAgICAgICBhZHZhbmNlKF9fbWlkLCBfX2VsZW1zYWZ0ZXIpOworICAgICAgICAgIF9TVExQX1BSSVYgX191bmluaXRpYWxpemVkX2NvcHlfY29weShfX21pZCwgX19sYXN0LCBfX3BvcywgdGhpcy0+X01fZmluaXNoLCB0aGlzLT5fTV9maW5pc2gpOworICAgICAgICAgIHRoaXMtPl9NX2ZpbmlzaCA9IF9fbmV3X2ZpbmlzaDsKKyAgICAgICAgICBjb3B5KF9fZmlyc3QsIF9fbWlkLCBfX3Bvcyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIF9TVExQX1VOV0lORCh0aGlzLT5fTV9kZXN0cm95X25vZGVzKHRoaXMtPl9NX2ZpbmlzaC5fTV9ub2RlICsgMSwgX19uZXdfZmluaXNoLl9NX25vZGUgKyAxKSkKKyAgICB9CisgIH0KKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisKKyAgaXRlcmF0b3IgX01fcmVzZXJ2ZV9lbGVtZW50c19hdF9mcm9udChzaXplX3R5cGUgX19uKSB7CisgICAgc2l6ZV90eXBlIF9fdmFjYW5jaWVzID0gdGhpcy0+X01fc3RhcnQuX01fY3VyIC0gdGhpcy0+X01fc3RhcnQuX01fZmlyc3Q7CisgICAgaWYgKF9fbiA+IF9fdmFjYW5jaWVzKQorICAgICAgX01fbmV3X2VsZW1lbnRzX2F0X2Zyb250KF9fbiAtIF9fdmFjYW5jaWVzKTsKKyAgICByZXR1cm4gdGhpcy0+X01fc3RhcnQgLSBkaWZmZXJlbmNlX3R5cGUoX19uKTsKKyAgfQorCisgIGl0ZXJhdG9yIF9NX3Jlc2VydmVfZWxlbWVudHNfYXRfYmFjayhzaXplX3R5cGUgX19uKSB7CisgICAgc2l6ZV90eXBlIF9fdmFjYW5jaWVzID0gKHRoaXMtPl9NX2ZpbmlzaC5fTV9sYXN0IC0gdGhpcy0+X01fZmluaXNoLl9NX2N1cikgLSAxOworICAgIGlmIChfX24gPiBfX3ZhY2FuY2llcykKKyAgICAgIF9NX25ld19lbGVtZW50c19hdF9iYWNrKF9fbiAtIF9fdmFjYW5jaWVzKTsKKyAgICByZXR1cm4gdGhpcy0+X01fZmluaXNoICsgZGlmZmVyZW5jZV90eXBlKF9fbik7CisgIH0KKworICB2b2lkIF9NX25ld19lbGVtZW50c19hdF9mcm9udChzaXplX3R5cGUgX19uZXdfZWxlbWVudHMpOworICB2b2lkIF9NX25ld19lbGVtZW50c19hdF9iYWNrKHNpemVfdHlwZSBfX25ld19lbGVtZW50cyk7CisKK3Byb3RlY3RlZDogICAgICAgICAgICAgICAgICAgICAgLy8gQWxsb2NhdGlvbiBvZiBfTV9tYXAgYW5kIG5vZGVzCisKKyAgLy8gTWFrZXMgc3VyZSB0aGUgX01fbWFwIGhhcyBzcGFjZSBmb3IgbmV3IG5vZGVzLiAgRG9lcyBub3QgYWN0dWFsbHkKKyAgLy8gIGFkZCB0aGUgbm9kZXMuICBDYW4gaW52YWxpZGF0ZSBfTV9tYXAgcG9pbnRlcnMuICAoQW5kIGNvbnNlcXVlbnRseSwKKyAgLy8gIGRlcXVlIGl0ZXJhdG9ycy4pCisKKyAgdm9pZCBfTV9yZXNlcnZlX21hcF9hdF9iYWNrIChzaXplX3R5cGUgX19ub2Rlc190b19hZGQgPSAxKSB7CisgICAgaWYgKF9fbm9kZXNfdG9fYWRkICsgMSA+IHRoaXMtPl9NX21hcF9zaXplLl9NX2RhdGEgLSAodGhpcy0+X01fZmluaXNoLl9NX25vZGUgLSB0aGlzLT5fTV9tYXAuX01fZGF0YSkpCisgICAgICBfTV9yZWFsbG9jYXRlX21hcChfX25vZGVzX3RvX2FkZCwgZmFsc2UpOworICB9CisKKyAgdm9pZCBfTV9yZXNlcnZlX21hcF9hdF9mcm9udCAoc2l6ZV90eXBlIF9fbm9kZXNfdG9fYWRkID0gMSkgeworICAgIGlmIChfX25vZGVzX3RvX2FkZCA+IHNpemVfdHlwZSh0aGlzLT5fTV9zdGFydC5fTV9ub2RlIC0gdGhpcy0+X01fbWFwLl9NX2RhdGEpKQorICAgICAgX01fcmVhbGxvY2F0ZV9tYXAoX19ub2Rlc190b19hZGQsIHRydWUpOworICB9CisKKyAgdm9pZCBfTV9yZWFsbG9jYXRlX21hcChzaXplX3R5cGUgX19ub2Rlc190b19hZGQsIGJvb2wgX19hZGRfYXRfZnJvbnQpOworfTsKKworI2lmIGRlZmluZWQgKGRlcXVlKQorIyAgdW5kZWYgZGVxdWUKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorI2VuZGlmCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2lmICFkZWZpbmVkIChfU1RMUF9MSU5LX1RJTUVfSU5TVEFOVElBVElPTikKKyMgIGluY2x1ZGUgPHN0bC9fZGVxdWUuYz4KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BUUl9TUEVDSUFMSVpBVElPTlMpCisjICBpbmNsdWRlIDxzdGwvcG9pbnRlcnMvX2RlcXVlLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHKQorIyAgaW5jbHVkZSA8c3RsL2RlYnVnL19kZXF1ZS5oPgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisjZGVmaW5lIF9TVExQX1RFTVBMQVRFX0NPTlRBSU5FUiBkZXF1ZTxfVHAsIF9BbGxvYz4KKyNkZWZpbmUgX1NUTFBfVEVNUExBVEVfSEVBREVSICAgIHRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KKyNpbmNsdWRlIDxzdGwvX3JlbG9wc19jb250Lmg+CisjdW5kZWYgX1NUTFBfVEVNUExBVEVfQ09OVEFJTkVSCisjdW5kZWYgX1NUTFBfVEVNUExBVEVfSEVBREVSCisKKyNpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgorc3RydWN0IF9fbW92ZV90cmFpdHM8ZGVxdWU8X1RwLCBfQWxsb2M+ID4geworICB0eXBlZGVmIF9fc3RscF9tb3ZhYmxlIGltcGxlbWVudGVkOworICB0eXBlZGVmIHR5cGVuYW1lIF9fbW92ZV90cmFpdHM8X0FsbG9jPjo6Y29tcGxldGUgY29tcGxldGU7Cit9OworI2VuZGlmIC8qIF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04gKi8KKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfREVRVUVfSCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgorCmRpZmYgLS1naXQgYS9zdGwvX2VwaWxvZy5oIGIvc3RsL19lcGlsb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzQ3YWUzCi0tLSAvZGV2L251bGwKKysrIGIvc3RsL19lcGlsb2cuaApAQCAtMCwwICsxLDQyIEBACisvKiBOT1RFIDogdGhpcyBoZWFkZXIgaGFzIG5vIGd1YXJkcyBhbmQgaXMgTUVBTlQgZm9yIG11bHRpcGxlIGluY2x1c2lvbiEKKyAqIElmIHlvdSBhcmUgdXNpbmcgImhlYWRlciBwcm90ZWN0aW9uIiBvcHRpb24gd2l0aCB5b3VyIGNvbXBpbGVyLAorICogcGxlYXNlIGFsc28gZmluZCAjcHJhZ21hIHdoaWNoIGRpc2FibGVzIGl0IGFuZCBwdXQgaXQgaGVyZSwgdG8KKyAqIGFsbG93IHJlZW50cmFuY3kgb2YgdGhpcyBoZWFkZXIuCisgKi8KKworI2lmbmRlZiBfU1RMUF9QUk9MT0dfSEVBREVSX0lOQ0xVREVECisjICBlcnJvciBTVExwb3J0IGVwaWxvZyBoZWFkZXIgY2FuIG5vdCBiZSBpbmNsdWRlZCBhcyBsb25nIGFzIHByb2xvZyBoYXMgbm90IGJlIGluY2x1ZGVkLgorI2VuZGlmCisKKy8qIElmIHRoZSBwbGF0Zm9ybSBwcm92aWRlcyBhbnkgc3BlY2lmaWMgZXBpbG9nIGFjdGlvbnMsCisgKiBsaWtlICNwcmFnbWFzLCBkbyBpbmNsdWRlIHBsYXRmb3JtLXNwZWNpZmljIHByb2xvZyBmaWxlCisgKi8KKyNpZiBkZWZpbmVkIChfU1RMUF9IQVNfU1BFQ0lGSUNfUFJPTE9HX0VQSUxPRykKKyMgIGluY2x1ZGUgPHN0bC9jb25maWcvX2VwaWxvZy5oPgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fUE9TVF9DT01QQVRJQkxFX1NFQ1RJT04pCisjICBpbmNsdWRlIDxzdGwvX2NvbmZpZ19jb21wYXRfcG9zdC5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfT1dOX05BTUVTUEFDRSkKKworIyAgaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfUkVERUZJTkVfU1REKQorLyogIFdlIHJlZGVmaW5lICJzdGQiIHRvIFNUTFBPUlQsIHNvIHRoYXQgdXNlciBjb2RlIG1heSB1c2Ugc3RkOjogdHJhbnNwYXJlbnRseQorICogIFRoZSBTVExQT1JUIG1hY3JvIGNvbnRhaW5zIHRoZSBTVExwb3J0IG5hbWVzcGFjZSBuYW1lIGNvbnRhaW5pbmcgYWxsIHRoZSBzdGQKKyAqICBzdHVmZi4KKyAqLworIyAgICBpZiBkZWZpbmVkIChzdGQpCisvKgorICogTG9va3MgbGlrZSB0aGUgY29tcGlsZXIgbmF0aXZlIGxpYnJhcnkgb24gd2hpY2ggU1RMcG9ydCByZWx5IGRlZmluZWQgdGhlIHN0ZCBtYWNyby4KKyAqIFRoaXMgbWlnaHQgaW50cm9kdWNlIG1ham9yIGluY29tcGF0aWJpbGl0eSBzbyByZXBvcnQgdGhlIHByb2JsZW0gdG8gdGhlIFNUTHBvcnQKKyAqIGZvcnVtIG9yIGNvbW1lbnQgdGhlIGZvbGxvd2luZyAjZXJyb3IgYXQgeW91ciBvd24gcmlzay4KKyAqLworIyAgICAgIGVycm9yIEluY29tcGF0aWJsZSBuYXRpdmUgU3RkIGxpYnJhcnkuCisjICAgIGVuZGlmIC8qIHN0ZCAqLworIyAgICBkZWZpbmUgc3RkIFNUTFBPUlQKKyMgIGVuZGlmIC8qIF9TVExQX0RPTlRfUkVERUZJTkVfU1REICovCisKKyNlbmRpZgorCisjdW5kZWYgX1NUTFBfUFJPTE9HX0hFQURFUl9JTkNMVURFRCAvKiBkZWZpbmVkIGluIF9wcm9sb2cuaCAqLwpkaWZmIC0tZ2l0IGEvc3RsL19leGNlcHRpb24uaCBiL3N0bC9fZXhjZXB0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFmZGM0YwotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9fZXhjZXB0aW9uLmgKQEAgLTAsMCArMSwxODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqLworCisvLyBUaGUgaGVhZGVyIDxleGNlcHRpb24+IGNvbnRhaW5zIGxvdy1sZXZlbCBmdW5jdGlvbnMgdGhhdCBpbnRlcmFjdAorLy8gd2l0aCBhIGNvbXBpbGVyJ3MgZXhjZXB0aW9uLWhhbmRsaW5nIG1lY2hhbmlzbS4gIEl0IGlzIGFzc3VtZWQgdG8KKy8vIGJlIHN1cHBsaWVkIHdpdGggdGhlIGNvbXBpbGVyLCByYXRoZXIgdGhhbiB3aXRoIHRoZSBsaWJyYXJ5LCBiZWNhdXNlCisvLyBpdCBpcyBpbmhlcmVudGx5IHRpZWQgdmVyeSBjbG9zZWx5IHRvIHRoZSBjb21waWxlciBpdHNlbGYuCisKKy8vIE9uIHBsYXRmb3JtcyB3aGVyZSA8ZXhjZXB0aW9uPiBkb2VzIG5vdCBleGlzdCwgdGhpcyBoZWFkZXIgZGVmaW5lcworLy8gYW4gZXhjZXB0aW9uIGJhc2UgY2xhc3MuICBUaGlzIGlzICpub3QqIGEgc3Vic3RpdHV0ZSBmb3IgZXZlcnl0aGluZworLy8gaW4gPGV4Y2VwdGlvbj4sIGJ1dCBpdCBzdWZmaWNlcyB0byBzdXBwb3J0IGEgYmFyZSBtaW5pbXVtIG9mIFNUTAorLy8gZnVuY3Rpb25hbGl0eS4KKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9FWENFUFRJT04KKyNkZWZpbmUgX1NUTFBfSU5URVJOQUxfRVhDRVBUSU9OCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhDRVBUSU9OX0hFQURFUikKKworIyAgaWYgZGVmaW5lZCAoIF9VTkNBVUdIVF9FWENFUFRJT04gKQorIyAgICB1bmRlZiBfU1RMUF9OT19VTkNBVUdIVF9FWENFUFRfU1VQUE9SVAorIyAgZW5kaWYKKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfQlJPS0VOX0VYQ0VQVElPTl9DTEFTUykKKyMgICAgZGVmaW5lIGV4Y2VwdGlvbiAgICAgX1NUTFBfTlVMTElGSUVEX0JST0tFTl9FWENFUFRJT05fQ0xBU1MKKyMgICAgZGVmaW5lIGJhZF9leGNlcHRpb24gX1NUTFBfTlVMTElGSUVEX0JST0tFTl9CQURfRVhDRVBUSU9OX0NMQVNTCisjICAgIGlmIGRlZmluZWQgKF9TVExQX05PX05FV19ORVdfSEVBREVSKQorIyAgICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9SVU5USU1FX0hFQURFUihFeGNlcHRpb24uaCkKKyMgICAgZWxzZQorIyAgICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9SVU5USU1FX0hFQURFUihFeGNlcHRpb24pCisjICAgIGVuZGlmCisjICAgIHVuZGVmIGV4Y2VwdGlvbgorIyAgICB1bmRlZiBiYWRfZXhjZXB0aW9uCisjICBlbHNlCisjICAgIGlmIGRlZmluZWQgKF9TVExQX05PX05FV19ORVdfSEVBREVSKQorIyAgICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9SVU5USU1FX0hFQURFUihleGNlcHRpb24uaCkKKyMgICAgZWxzZQorIyAgICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9SVU5USU1FX0hFQURFUihleGNlcHRpb24pCisjICAgIGVuZGlmCisjICBlbmRpZgorCisjICBpZiBkZWZpbmVkIChfU1RMUF9IQVNfU1BFQ0lGSUNfUFJPTE9HX0VQSUxPRykgJiYgKGRlZmluZWQgKF9TVExQX01TVkMpIHx8IGRlZmluZWQgKF9fSUNMKSkKKy8vIGR3YSAwMi8wNC8wMCAtIGhlcmUgSSdtIGFzc3VtaW5nIHRoYXQgX19JQ0wgdXNlcyB0aGUgc2FtZSBsaWJyYXJ5IGhlYWRlcnMgYXMgdmM2LgorLy8gdGhlIGhlYWRlciA8eXZhbHMuaD4gd2hpY2ggc2hpcHMgd2l0aCB2YzYgYW5kIGlzIGluY2x1ZGVkIGJ5IGl0cyBuYXRpdmUgPGV4Y2VwdGlvbj4KKy8vIGFjdHVhbGx5IHR1cm5zIG9uIHdhcm5pbmdzLCBzbyB3ZSBoYXZlIHRvIHR1cm4gdGhlbSBiYWNrIG9mZi4KKyMgICAgaW5jbHVkZSA8c3RsL2NvbmZpZy9fd2FybmluZ3Nfb2ZmLmg+CisjICBlbmRpZgorCisjICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfT1dOX05BTUVTUEFDRSkKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisjICAgIGlmICFkZWZpbmVkIChfU1RMUF9CUk9LRU5fRVhDRVBUSU9OX0NMQVNTKQorIyAgICAgIGlmICFkZWZpbmVkIChfU1RMUF9VU0lOR19QTEFURk9STV9TREtfQ09NUElMRVIpIHx8ICFkZWZpbmVkIChfV0lONjQpCit1c2luZyBfU1RMUF9WRU5ET1JfRVhDRVBUX1NURDo6ZXhjZXB0aW9uOworIyAgICAgIGVsc2UKK3VzaW5nIDo6ZXhjZXB0aW9uOworIyAgICAgIGVuZGlmCit1c2luZyBfU1RMUF9WRU5ET1JfRVhDRVBUX1NURDo6YmFkX2V4Y2VwdGlvbjsKKyMgICAgZW5kaWYKKworIyAgICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fVVNJTkdfRk9SX0dMT0JBTF9GVU5DVElPTlMpCisvLyBmYnAgOiBtYW55IHBsYXRmb3JtcyBwcmVzZW50IHN0cmFuZ2UgbWl4IG9mCisvLyB0aG9zZSBpbiB2YXJpb3VzIG5hbWVzcGFjZXMKKyMgICAgICBpZiAhZGVmaW5lZCAoX1NUTFBfVkVORE9SX1VORVhQRUNURURfU1REKQorIyAgICAgICAgZGVmaW5lIF9TVExQX1ZFTkRPUl9VTkVYUEVDVEVEX1NURCBfU1RMUF9WRU5ET1JfRVhDRVBUX1NURAorIyAgICAgIGVsc2UKKy8qIFRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgYXJlIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGFzIF9TVExQX1ZFTkRPUl9URVJNSU5BVEVfU1RECisgKiBhbmQgX1NUTFBfVkVORE9SX1VOQ0FVR0hUX0VYQ0VQVElPTl9TVEQgaGFzIGJlZW4gaW50cm9kdWNlIGFmdGVyIF9TVExQX1ZFTkRPUl9VTkVYUEVDVEVEX1NURAorICogYW5kIF9TVExQX1ZFTkRPUl9VTkVYUEVDVEVEX1NURCB3YXMgdGhlIG1hY3JvIHVzZWQgaW4gdGhlaXIgcGxhY2UgYmVmb3JlIHRoYXQgaW50cm9kdWN0aW9uLgorICovCisjICAgICAgICBpZiAhZGVmaW5lZCAoX1NUTFBfVkVORE9SX1RFUk1JTkFURV9TVEQpCisjICAgICAgICAgIGRlZmluZSBfU1RMUF9WRU5ET1JfVEVSTUlOQVRFX1NURCBfU1RMUF9WRU5ET1JfVU5FWFBFQ1RFRF9TVEQKKyMgICAgICAgIGVuZGlmCisjICAgICAgICBpZiAhZGVmaW5lZCAoX1NUTFBfVkVORE9SX1VOQ0FVR0hUX0VYQ0VQVElPTl9TVEQpCisjICAgICAgICAgIGRlZmluZSBfU1RMUF9WRU5ET1JfVU5DQVVHSFRfRVhDRVBUSU9OX1NURCBfU1RMUF9WRU5ET1JfVU5FWFBFQ1RFRF9TVEQKKyMgICAgICAgIGVuZGlmCisjICAgICAgZW5kaWYKKyMgICAgICBpZiAhZGVmaW5lZCAoX1NUTFBfVkVORE9SX1RFUk1JTkFURV9TVEQpCisjICAgICAgICBkZWZpbmUgX1NUTFBfVkVORE9SX1RFUk1JTkFURV9TVEQgX1NUTFBfVkVORE9SX0VYQ0VQVF9TVEQKKyMgICAgICBlbmRpZgorIyAgICAgIGlmICFkZWZpbmVkIChfU1RMUF9WRU5ET1JfVU5DQVVHSFRfRVhDRVBUSU9OX1NURCkKKyMgICAgICAgIGRlZmluZSBfU1RMUF9WRU5ET1JfVU5DQVVHSFRfRVhDRVBUSU9OX1NURCBfU1RMUF9WRU5ET1JfRVhDRVBUX1NURAorIyAgICAgIGVuZGlmCisjICAgICAgaWYgIWRlZmluZWQgKF9TVExQX1ZFTkRPUl9URVJNSU5BVEVfU1REKQorIyAgICAgICAgZGVmaW5lIF9TVExQX1ZFTkRPUl9URVJNSU5BVEVfU1REIF9TVExQX1ZFTkRPUl9FWENFUFRfU1RECisjICAgICAgZW5kaWYKKyMgICAgICBpZiAhZGVmaW5lZCAoX1NUTFBfVkVORE9SX1VOQ0FVR0hUX0VYQ0VQVElPTl9TVEQpCisjICAgICAgICBkZWZpbmUgX1NUTFBfVkVORE9SX1VOQ0FVR0hUX0VYQ0VQVElPTl9TVEQgX1NUTFBfVkVORE9SX0VYQ0VQVF9TVEQKKyMgICAgICBlbmRpZgorLy8gd2VpcmQgZXJyb3JzCisjICAgICAgICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fVU5FWFBFQ1RFRF9FWENFUFRfU1VQUE9SVCkKKyMgICAgICAgICAgaWYgZGVmaW5lZCAoX19JQ0wpICYmIChfX0lDTCA+PSA5MDApICYmIChfU1RMUF9NU1ZDX0xJQiA8IDEzMDApCisvL1NlZSBjb25maWcvX2ludGVsLmggZm9yIHJlYXNvbiBhYm91dCB0aGlzIHdvcmthcm91bmQKK3VzaW5nIHN0ZDo6dW5leHBlY3RlZDsKKyMgICAgICAgICAgZWxzZQordXNpbmcgX1NUTFBfVkVORE9SX1VORVhQRUNURURfU1REOjp1bmV4cGVjdGVkOworIyAgICAgICAgICBlbmRpZgordXNpbmcgX1NUTFBfVkVORE9SX1VORVhQRUNURURfU1REOjp1bmV4cGVjdGVkX2hhbmRsZXI7Cit1c2luZyBfU1RMUF9WRU5ET1JfVU5FWFBFQ1RFRF9TVEQ6OnNldF91bmV4cGVjdGVkOworIyAgICAgICAgZW5kaWYKK3VzaW5nIF9TVExQX1ZFTkRPUl9URVJNSU5BVEVfU1REOjp0ZXJtaW5hdGU7Cit1c2luZyBfU1RMUF9WRU5ET1JfVEVSTUlOQVRFX1NURDo6dGVybWluYXRlX2hhbmRsZXI7Cit1c2luZyBfU1RMUF9WRU5ET1JfVEVSTUlOQVRFX1NURDo6c2V0X3Rlcm1pbmF0ZTsKKworIyAgICAgIGlmICFkZWZpbmVkIChfU1RMUF9OT19VTkNBVUdIVF9FWENFUFRfU1VQUE9SVCkKK3VzaW5nIF9TVExQX1ZFTkRPUl9VTkNBVUdIVF9FWENFUFRJT05fU1REOjp1bmNhdWdodF9leGNlcHRpb247CisjICAgICAgZW5kaWYKKyMgICAgZW5kaWYgLyogIV9TVExQX05PX1VTSU5HX0ZPUl9HTE9CQUxfRlVOQ1RJT05TICovCitfU1RMUF9FTkRfTkFNRVNQQUNFCisjICBlbmRpZiAvKiBfU1RMUF9PV05fTkFNRVNQQUNFICovCisjZWxzZSAvKiBfU1RMUF9OT19FWENFUFRJT05fSEVBREVSICovCisKKy8qIGZicCA6IGFic2VuY2Ugb2YgPGV4Y2VwdGlvbj4gdXN1YWxseSBtZWFucyB0aGF0IHRob3NlCisgKiBmdW5jdGlvbnMgYXJlIG5vdCBnb2luZyB0byBiZSBjYWxsZWQgYnkgY29tcGlsZXIuCisgKiBTdGlsbCwgZGVmaW5lIHRoZW0gZm9yIHRoZSB1c2VyLgorICogZHVtczogUG9saWN5IG1vZGlmaWNhdGlvbiwgaWYgdGhlIGZ1bmN0aW9uIGRvIG5vdCBiZWhhdmUgbGlrZSB0aGUgU3RhbmRhcmQKKyAqICAgICAgIGRlZmluZWQgaXQgd2UgZG8gbm90IGdyYW50IGl0IGluIHRoZSBTVExwb3J0IG5hbWVzcGFjZS4gV2Ugd2lsbCBoYXZlCisgKiAgICAgICBjb21waWxlIHRpbWUgZXJyb3IgcmF0aGVyIHRoYW4gcnVudGltZSBlcnJvci4KKyAqLworI2lmIDAKKy8qCit0eXBlZGVmIHZvaWQgKCp1bmV4cGVjdGVkX2hhbmRsZXIpKCk7Cit1bmV4cGVjdGVkX2hhbmRsZXIgc2V0X3VuZXhwZWN0ZWQodW5leHBlY3RlZF9oYW5kbGVyIGYpIF9TVExQX05PVEhST1dfSU5IRVJFTlRMWTsKK3ZvaWQgdW5leHBlY3RlZCgpOworCit0eXBlZGVmIHZvaWQgKCp0ZXJtaW5hdGVfaGFuZGxlcikoKTsKK3Rlcm1pbmF0ZV9oYW5kbGVyIHNldF90ZXJtaW5hdGUodGVybWluYXRlX2hhbmRsZXIgZikgX1NUTFBfTk9USFJPV19JTkhFUkVOVExZOwordm9pZCB0ZXJtaW5hdGUoKTsKKworYm9vbCB1bmNhdWdodF9leGNlcHRpb24oKTsgLy8gbm90IGltcGxlbWVudGVkIHVuZGVyIG1wdyBhcyBvZiBKYW4vMTk5OQorKi8KKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfTk9fRVhDRVBUSU9OX0hFQURFUiAqLworCisjaWYgZGVmaW5lZCAoX1NUTFBfTk9fRVhDRVBUSU9OX0hFQURFUikgfHwgZGVmaW5lZCAoX1NUTFBfQlJPS0VOX0VYQ0VQVElPTl9DTEFTUykKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisvLyBzZWN0aW9uIDE4LjYuMQorY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgZXhjZXB0aW9uIHsKK3B1YmxpYzoKKyMgIGlmICFkZWZpbmVkKF9TVExQX1VTRV9OT19JT1NUUkVBTVMpICYmICFkZWZpbmVkKF9TVExQX0lOTElORV9FWENFUFRJT05fQ0xBU1MpCisgIGV4Y2VwdGlvbigpIF9TVExQX05PVEhST1c7CisgIHZpcnR1YWwgfmV4Y2VwdGlvbigpIF9TVExQX05PVEhST1c7CisgIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IF9TVExQX05PVEhST1c7CisjICBlbHNlCisgIGV4Y2VwdGlvbigpIF9TVExQX05PVEhST1cge30KKyAgdmlydHVhbCB+ZXhjZXB0aW9uKCkgX1NUTFBfTk9USFJPVyB7fQorICB2aXJ0dWFsIGNvbnN0IGNoYXIqIHdoYXQoKSBjb25zdCBfU1RMUF9OT1RIUk9XIHtyZXR1cm4gImNsYXNzIGV4Y2VwdGlvbiI7fQorIyAgZW5kaWYKK307CisKKy8vIHNlY3Rpb24gMTguNi4yLjEKK2NsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIGJhZF9leGNlcHRpb24gOiBwdWJsaWMgZXhjZXB0aW9uIHsKK3B1YmxpYzoKKyMgIGlmICFkZWZpbmVkKF9TVExQX1VTRV9OT19JT1NUUkVBTVMpICYmICFkZWZpbmVkKF9TVExQX0lOTElORV9FWENFUFRJT05fQ0xBU1MpCisgIGJhZF9leGNlcHRpb24oKSBfU1RMUF9OT1RIUk9XOworICB+YmFkX2V4Y2VwdGlvbigpIF9TVExQX05PVEhST1c7CisgIGNvbnN0IGNoYXIqIHdoYXQoKSBjb25zdCBfU1RMUF9OT1RIUk9XOworIyAgZWxzZQorICBiYWRfZXhjZXB0aW9uKCkgX1NUTFBfTk9USFJPVyB7fQorICB+YmFkX2V4Y2VwdGlvbigpIF9TVExQX05PVEhST1cge30KKyAgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IF9TVExQX05PVEhST1cge3JldHVybiAiY2xhc3MgYmFkX2V4Y2VwdGlvbiI7fQorIyAgZW5kaWYKK307CisKKy8vIGZvcndhcmQgZGVjbGFyYXRpb24KK2NsYXNzIF9fTmFtZWRfZXhjZXB0aW9uOworX1NUTFBfRU5EX05BTUVTUEFDRQorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9FWENFUFRJT04gKi8KZGlmZiAtLWdpdCBhL3N0bC9fZnN0cmVhbS5jIGIvc3RsL19mc3RyZWFtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQxNjg1ZAotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9fZnN0cmVhbS5jCkBAIC0wLDAgKzEsNzM3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisjaWZuZGVmIF9TVExQX0ZTVFJFQU1fQworI2RlZmluZSBfU1RMUF9GU1RSRUFNX0MKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9GU1RSRUFNX0gKKyMgIGluY2x1ZGUgPHN0bC9fZnN0cmVhbS5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfTElNSVRTCisjICBpbmNsdWRlIDxzdGwvX2xpbWl0cy5oPgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisjIGlmIGRlZmluZWQgKCBfU1RMUF9ORVNURURfVFlQRV9QQVJBTV9CVUcgKQorLy8gbm8gd2NoYXJfdCBpcyBzdXBwb3J0ZWQgZm9yIHRoaXMgbW9kZQorIyBkZWZpbmUgX19CRl9pbnRfdHlwZV9fIGludAorIyBkZWZpbmUgX19CRl9wb3NfdHlwZV9fIHN0cmVhbXBvcworIyBkZWZpbmUgX19CRl9vZmZfdHlwZV9fIHN0cmVhbW9mZgorIyBlbHNlCisjIGRlZmluZSBfX0JGX2ludF90eXBlX18gX1NUTFBfVFlQRU5BTUVfT05fUkVUVVJOX1RZUEUgYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjppbnRfdHlwZQorIyBkZWZpbmUgX19CRl9wb3NfdHlwZV9fIF9TVExQX1RZUEVOQU1FX09OX1JFVFVSTl9UWVBFIGJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6cG9zX3R5cGUKKyMgZGVmaW5lIF9fQkZfb2ZmX3R5cGVfXyBfU1RMUF9UWVBFTkFNRV9PTl9SRVRVUk5fVFlQRSBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46Om9mZl90eXBlCisjIGVuZGlmCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdWJsaWMgYmFzaWNfZmlsZWJ1Zjw+IG1lbWJlciBmdW5jdGlvbnMKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6YmFzaWNfZmlsZWJ1ZigpCisgICAgIDogIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KCksIF9NX2Jhc2UoKSwKKyAgICBfTV9jb25zdGFudF93aWR0aChmYWxzZSksIF9NX2Fsd2F5c19ub2NvbnYoZmFsc2UpLAorICAgIF9NX2ludF9idWZfZHluYW1pYyhmYWxzZSksCisgICAgX01faW5faW5wdXRfbW9kZShmYWxzZSksIF9NX2luX291dHB1dF9tb2RlKGZhbHNlKSwKKyAgICBfTV9pbl9lcnJvcl9tb2RlKGZhbHNlKSwgX01faW5fcHV0YmFja19tb2RlKGZhbHNlKSwKKyAgICBfTV9pbnRfYnVmKDApLCBfTV9pbnRfYnVmX0VPUygwKSwKKyAgICBfTV9leHRfYnVmKDApLCBfTV9leHRfYnVmX0VPUygwKSwKKyAgICBfTV9leHRfYnVmX2NvbnZlcnRlZCgwKSwgX01fZXh0X2J1Zl9lbmQoMCksCisgICAgX01fc3RhdGUoX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRChfU3RhdGVfdHlwZSkpLAorICAgIF9NX2VuZF9zdGF0ZShfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKF9TdGF0ZV90eXBlKSksCisgICAgX01fbW1hcF9iYXNlKDApLCBfTV9tbWFwX2xlbigwKSwKKyAgICBfTV9zYXZlZF9lYmFjaygwKSwgX01fc2F2ZWRfZ3B0cigwKSwgX01fc2F2ZWRfZWdwdHIoMCksCisgICAgX01fY29kZWN2dCgwKSwKKyAgICBfTV93aWR0aCgxKSwgX01fbWF4X3dpZHRoKDEpCit7CisgIHRoaXMtPl9NX3NldHVwX2NvZGVjdnQobG9jYWxlKCksIGZhbHNlKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6fmJhc2ljX2ZpbGVidWYoKSB7CisgIHRoaXMtPmNsb3NlKCk7CisgIF9NX2RlYWxsb2NhdGVfYnVmZmVycygpOworfQorCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitfU1RMUF9UWVBFTkFNRV9PTl9SRVRVUk5fVFlQRSBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46OmludF90eXBlCitiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46OnVuZGVyZmxvdygpIHsKKyAgcmV0dXJuIF9VbmRlcmZsb3c8X0NoYXJULCBfVHJhaXRzPjo6X01fZG9pdCh0aGlzKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPioKK2Jhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6Y2xvc2UoKSB7CisgIGJvb2wgX19vayA9IHRoaXMtPmlzX29wZW4oKTsKKworICBpZiAoX01faW5fb3V0cHV0X21vZGUpIHsKKyAgICBfX29rID0gX19vayAmJiAhX1RyYWl0czo6ZXFfaW50X3R5cGUodGhpcy0+b3ZlcmZsb3codHJhaXRzX3R5cGU6OmVvZigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3R5cGU6OmVvZigpKTsKKyAgICBfX29rID09IF9fb2sgJiYgdGhpcy0+X01fdW5zaGlmdCgpOworICB9CisgIGVsc2UgaWYgKF9NX2luX2lucHV0X21vZGUpCisgICAgICB0aGlzLT5fTV9leGl0X2lucHV0X21vZGUoKTsKKworICAvLyBOb3RlIG9yZGVyIG9mIGFyZ3VtZW50cy4gIFdlIGNsb3NlIHRoZSBmaWxlIGV2ZW4gaWYgX19vayBpcyBmYWxzZS4KKyAgX19vayA9IF9NX2Jhc2UuX01fY2xvc2UoKSAmJiBfX29rOworCisgIC8vIFJlc3RvcmUgdGhlIGluaXRpYWwgc3RhdGUsIGV4Y2VwdCB0aGF0IHdlIGRvbid0IGRlYWxsb2NhdGUgdGhlIGJ1ZmZlcgorICAvLyBvciBtZXNzIHdpdGggdGhlIGNhY2hlZCBjb2RlY3Z0IGluZm9ybWF0aW9uLgorICBfTV9zdGF0ZSA9IF9NX2VuZF9zdGF0ZSA9IF9TdGF0ZV90eXBlKCk7CisgIF9NX2V4dF9idWZfY29udmVydGVkID0gX01fZXh0X2J1Zl9lbmQgPSAwOworCisgIF9NX21tYXBfYmFzZSA9IDA7CisgIF9NX21tYXBfbGVuID0gMDsKKworICB0aGlzLT5zZXRnKDAsIDAsIDApOworICB0aGlzLT5zZXRwKDAsIDApOworCisgIF9NX3NhdmVkX2ViYWNrID0gX01fc2F2ZWRfZ3B0ciA9IF9NX3NhdmVkX2VncHRyID0gMDsKKworICBfTV9pbl9pbnB1dF9tb2RlID0gX01faW5fb3V0cHV0X21vZGUgPSBfTV9pbl9lcnJvcl9tb2RlID0gX01faW5fcHV0YmFja19tb2RlCisgICAgPSBmYWxzZTsKKworICByZXR1cm4gX19vayA/IHRoaXMgOiAwOworfQorCisvLyBUaGlzIG1lbWJlciBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbmV2ZXIgd2UgZXhpdCBpbnB1dCBtb2RlLgorLy8gSXQgdW5tYXBzIHRoZSBtZW1vcnktbWFwcGVkIGZpbGUsIGlmIGFueSwgYW5kIHNldHMKKy8vIF9NX2luX2lucHV0X21vZGUgdG8gZmFsc2UuCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgordm9pZCBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46Ol9NX2V4aXRfaW5wdXRfbW9kZSgpIHsKKyAgIGlmIChfTV9tbWFwX2Jhc2UgIT0gMCkKKyAgICAgX01fYmFzZS5fTV91bm1hcChfTV9tbWFwX2Jhc2UsIF9NX21tYXBfbGVuKTsKKyAgIF9NX2luX2lucHV0X21vZGUgPSBmYWxzZTsKKyAgIF9NX21tYXBfYmFzZSA9IDA7Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBiYXNpY19maWxlYnVmPD4gb3ZlcnJpZGRlbiBwcm90ZWN0ZWQgdmlydHVhbCBtZW1iZXIgZnVuY3Rpb25zCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitzdHJlYW1zaXplIGJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6c2hvd21hbnljKCkgeworICAvLyBJcyB0aGVyZSBhbnkgcG9zc2liaWxpdHkgdGhhdCByZWFkcyBjYW4gc3VjY2VlZD8KKyAgaWYgKCF0aGlzLT5pc19vcGVuKCkgfHwgX01faW5fb3V0cHV0X21vZGUgfHwgX01faW5fZXJyb3JfbW9kZSkKKyAgICByZXR1cm4gLTE7CisgIGVsc2UgaWYgKF9NX2luX3B1dGJhY2tfbW9kZSkKKyAgICByZXR1cm4gdGhpcy0+ZWdwdHIoKSAtIHRoaXMtPmdwdHIoKTsKKyAgZWxzZSBpZiAoX01fY29uc3RhbnRfd2lkdGgpIHsKKyAgICBzdHJlYW1vZmYgX19wb3MgID0gX01fYmFzZS5fTV9zZWVrKDAsIGlvc19iYXNlOjpjdXIpOworICAgIHN0cmVhbW9mZiBfX3NpemUgPSBfTV9iYXNlLl9NX2ZpbGVfc2l6ZSgpOworICAgIHJldHVybiBfX3BvcyA+PSAwICYmIF9fc2l6ZSA+IF9fcG9zID8gX19zaXplIC0gX19wb3MgOiAwOworICB9CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKworCisvLyBNYWtlIGEgcHV0YmFjayBwb3NpdGlvbiBhdmFpbGFibGUsIGlmIG5lY2Vzc2FyeSwgYnkgc3dpdGNoaW5nIHRvIGEKKy8vIHNwZWNpYWwgaW50ZXJuYWwgYnVmZmVyIHVzZWQgb25seSBmb3IgcHV0YmFjay4gIFRoZSBidWZmZXIgaXMKKy8vIFtfTV9wYmFja19idWYsIF9NX3BiYWNrX2J1ZiArIF9TX3BiYWNrX2J1Zl9zaXplKSwgYnV0IHRoZSBiYXNlCisvLyBjbGFzcyBvbmx5IHNlZXMgYSBwaWVjZSBvZiBpdCBhdCBhIHRpbWUuICAoV2Ugd2FudCB0byBtYWtlIHN1cmUKKy8vIHRoYXQgd2UgZG9uJ3QgdHJ5IHRvIHJlYWQgYSBjaGFyYWN0ZXIgdGhhdCBoYXNuJ3QgYmVlbiBpbml0aWFsaXplZC4pCisvLyBUaGUgZW5kIG9mIHRoZSBwdXRiYWNrIGJ1ZmZlciBpcyBhbHdheXMgX01fcGJhY2tfYnVmICsgX1NfcGJhY2tfYnVmX3NpemUsCisvLyBidXQgdGhlIGJlZ2lubmluZyBpcyB1c3VhbGx5IG5vdCBfTV9wYmFja19idWYuCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorX19CRl9pbnRfdHlwZV9fCitiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46OnBiYWNrZmFpbChpbnRfdHlwZSBfX2MpIHsKKyAgY29uc3QgaW50X3R5cGUgX19lb2YgPSB0cmFpdHNfdHlwZTo6ZW9mKCk7CisKKyAgLy8gSWYgd2UgYXJlbid0IGFscmVhZHkgaW4gaW5wdXQgbW9kZSwgcHVzaGJhY2sgaXMgaW1wb3NzaWJsZS4KKyAgaWYgKCFfTV9pbl9pbnB1dF9tb2RlKQorICAgIHJldHVybiBfX2VvZjsKKworICAvLyBXZSBjYW4gdXNlIHRoZSBvcmRpbmFyeSBnZXQgYnVmZmVyIGlmIHRoZXJlJ3MgZW5vdWdoIHNwYWNlLCBhbmQKKyAgLy8gaWYgaXQncyBhIGJ1ZmZlciB0aGF0IHdlJ3JlIGFsbG93ZWQgdG8gd3JpdGUgdG8uCisgIGlmICh0aGlzLT5ncHRyKCkgIT0gdGhpcy0+ZWJhY2soKSAmJgorICAgICAgKHRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfX2MsIF9fZW9mKSB8fAorICAgICAgIHRyYWl0c190eXBlOjplcSh0cmFpdHNfdHlwZTo6dG9fY2hhcl90eXBlKF9fYyksIHRoaXMtPmdwdHIoKVstMV0pIHx8CisgICAgICAgIV9NX21tYXBfYmFzZSkpIHsKKyAgICB0aGlzLT5nYnVtcCgtMSk7CisgICAgaWYgKHRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfX2MsIF9fZW9mKSB8fAorICAgICAgICB0cmFpdHNfdHlwZTo6ZXEodHJhaXRzX3R5cGU6OnRvX2NoYXJfdHlwZShfX2MpLCAqdGhpcy0+Z3B0cigpKSkKKyAgICAgIHJldHVybiB0cmFpdHNfdHlwZTo6dG9faW50X3R5cGUoKnRoaXMtPmdwdHIoKSk7CisgIH0KKyAgZWxzZSBpZiAoIXRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfX2MsIF9fZW9mKSkgeworICAgIC8vIEFyZSB3ZSBpbiB0aGUgcHV0YmFjayBidWZmZXIgYWxyZWFkeT8KKyAgICBfQ2hhclQqIF9fcGJhY2tfZW5kID0gX01fcGJhY2tfYnVmICsgX19TVEFUSUNfQ0FTVChpbnQsX1NfcGJhY2tfYnVmX3NpemUpOworICAgIGlmIChfTV9pbl9wdXRiYWNrX21vZGUpIHsKKyAgICAgIC8vIERvIHdlIGhhdmUgbW9yZSByb29tIGluIHRoZSBwdXRiYWNrIGJ1ZmZlcj8KKyAgICAgIGlmICh0aGlzLT5lYmFjaygpICE9IF9NX3BiYWNrX2J1ZikKKyAgICAgICAgdGhpcy0+c2V0Zyh0aGlzLT5lZ3B0cigpIC0gMSwgdGhpcy0+ZWdwdHIoKSAtIDEsIF9fcGJhY2tfZW5kKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIF9fZW9mOyAgICAgICAgICAgLy8gTm8gbW9yZSByb29tIGluIHRoZSBidWZmZXIsIHNvIGZhaWwuCisgICAgfQorICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAvLyBXZSdyZSBub3QgeWV0IGluIHRoZSBwdXRiYWNrIGJ1ZmZlci4KKyAgICAgIF9NX3NhdmVkX2ViYWNrID0gdGhpcy0+ZWJhY2soKTsKKyAgICAgIF9NX3NhdmVkX2dwdHIgID0gdGhpcy0+Z3B0cigpOworICAgICAgX01fc2F2ZWRfZWdwdHIgPSB0aGlzLT5lZ3B0cigpOworICAgICAgdGhpcy0+c2V0ZyhfX3BiYWNrX2VuZCAtIDEsIF9fcGJhY2tfZW5kIC0gMSwgX19wYmFja19lbmQpOworICAgICAgX01faW5fcHV0YmFja19tb2RlID0gdHJ1ZTsKKyAgICB9CisgIH0KKyAgZWxzZQorICAgIHJldHVybiBfX2VvZjsKKworICAvLyBXZSBoYXZlIG1hZGUgYSBwdXRiYWNrIHBvc2l0aW9uIGF2YWlsYWJsZS4gIEFzc2lnbiB0byBpdCwgYW5kIHJldHVybi4KKyAgKnRoaXMtPmdwdHIoKSA9IHRyYWl0c190eXBlOjp0b19jaGFyX3R5cGUoX19jKTsKKyAgcmV0dXJuIF9fYzsKK30KKworLy8gVGhpcyBtZW1iZXIgZnVuY3Rpb24gZmx1c2hlcyB0aGUgcHV0IGFyZWEsIGFuZCBhbHNvIG91dHB1dHMgdGhlCisvLyBjaGFyYWN0ZXIgX19jICh1bmxlc3MgX19jIGlzIGVvZikuICBJbnZhcmlhbnQ6IHdlIGFsd2F5cyBsZWF2ZSByb29tCisvLyBpbiB0aGUgaW50ZXJuYWwgYnVmZmVyIGZvciBvbmUgY2hhcmFjdGVyIG1vcmUgdGhhbiB0aGUgYmFzZSBjbGFzcyBrbm93cworLy8gYWJvdXQuICBXZSBzZWUgdGhlIGludGVybmFsIGJ1ZmZlciBhcyBbX01faW50X2J1ZiwgX01faW50X2J1Zl9FT1MpLCBidXQKKy8vIHRoZSBiYXNlIGNsYXNzIG9ubHkgc2VlcyBbX01faW50X2J1ZiwgX01faW50X2J1Zl9FT1MgLSAxKS4KK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitfX0JGX2ludF90eXBlX18KK2Jhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6b3ZlcmZsb3coaW50X3R5cGUgX19jKSB7CisgIC8vIFN3aXRjaCB0byBvdXRwdXQgbW9kZSwgaWYgbmVjZXNzYXJ5LgorICBpZiAoIV9NX2luX291dHB1dF9tb2RlKQorICAgIGlmICghX01fc3dpdGNoX3RvX291dHB1dF9tb2RlKCkpCisgICAgICByZXR1cm4gdHJhaXRzX3R5cGU6OmVvZigpOworCisgIF9DaGFyVCogX19pYmVnaW4gPSB0aGlzLT5fTV9pbnRfYnVmOworICBfQ2hhclQqIF9faWVuZCAgID0gdGhpcy0+cHB0cigpOworICB0aGlzLT5zZXRwKF9NX2ludF9idWYsIF9NX2ludF9idWZfRU9TIC0gMSk7CisKKyAgLy8gUHV0IF9fYyBhdCB0aGUgZW5kIG9mIHRoZSBpbnRlcm5hbCBidWZmZXIuCisgIGlmICghdHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9fYywgdHJhaXRzX3R5cGU6OmVvZigpKSkKKyAgICAqX19pZW5kKysgPSBfVHJhaXRzOjp0b19jaGFyX3R5cGUoX19jKTsKKworICAvLyBGb3IgdmFyaWFibGUtd2lkdGggZW5jb2RpbmdzLCBvdXRwdXQgbWF5IHRha2UgbW9yZSB0aGFuIG9uZSBwYXNzLgorICB3aGlsZSAoX19pYmVnaW4gIT0gX19pZW5kKSB7CisgICAgY29uc3QgX0NoYXJUKiBfX2luZXh0ID0gX19pYmVnaW47CisgICAgY2hhciogX19lbmV4dCAgICAgICAgID0gX01fZXh0X2J1ZjsKKyAgICB0eXBlbmFtZSBfQ29kZWN2dDo6cmVzdWx0IF9fc3RhdHVzCisgICAgICA9IF9NX2NvZGVjdnQtPm91dChfTV9zdGF0ZSwgX19pYmVnaW4sIF9faWVuZCwgX19pbmV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9NX2V4dF9idWYsIF9NX2V4dF9idWZfRU9TLCBfX2VuZXh0KTsKKyAgICBpZiAoX19zdGF0dXMgPT0gX0NvZGVjdnQ6Om5vY29udikgeworICAgICAgcmV0dXJuIF9Ob2NvbnZfb3V0cHV0PF9UcmFpdHM+OjpfTV9kb2l0KHRoaXMsIF9faWJlZ2luLCBfX2llbmQpCisgICAgICAgID8gdHJhaXRzX3R5cGU6Om5vdF9lb2YoX19jKQorICAgICAgICA6IF9NX291dHB1dF9lcnJvcigpOworICAgIH0KKworICAgIC8vIEZvciBhIGNvbnN0YW50LXdpZHRoIGVuY29kaW5nIHdlIGtub3cgdGhhdCB0aGUgZXh0ZXJuYWwgYnVmZmVyCisgICAgLy8gaXMgbGFyZ2UgZW5vdWdoLCBzbyBmYWlsdXJlIHRvIGNvbnN1bWUgdGhlIGVudGlyZSBpbnRlcm5hbCBidWZmZXIKKyAgICAvLyBvciB0byBwcm9kdWNlIHRoZSBjb3JyZWN0IG51bWJlciBvZiBleHRlcm5hbCBjaGFyYWN0ZXJzLCBpcyBhbiBlcnJvci4KKyAgICAvLyBGb3IgYSB2YXJpYWJsZS13aWR0aCBlbmNvZGluZywgaG93ZXZlciwgd2UgcmVxdWlyZSBvbmx5IHRoYXQgd2UKKyAgICAvLyBjb25zdW1lIGF0IGxlYXN0IG9uZSBpbnRlcm5hbCBjaGFyYWN0ZXIKKyAgICBlbHNlIGlmIChfX3N0YXR1cyAhPSBfQ29kZWN2dDo6ZXJyb3IgJiYKKyAgICAgICAgICAgICAoKChfX2luZXh0ID09IF9faWVuZCkgJiYKKyAgICAgICAgICAgICAgIChfX2VuZXh0IC0gX01fZXh0X2J1ZiA9PSBfTV93aWR0aCAqIChfX2llbmQgLSBfX2liZWdpbikpKSB8fAorICAgICAgICAgICAgICAoIV9NX2NvbnN0YW50X3dpZHRoICYmIF9faW5leHQgIT0gX19pYmVnaW4pKSkgeworICAgICAgICAvLyBXZSBzdWNjZXNzZnVsbHkgY29udmVydGVkIHBhcnQgb3IgYWxsIG9mIHRoZSBpbnRlcm5hbCBidWZmZXIuCisgICAgICBwdHJkaWZmX3QgX19uID0gX19lbmV4dCAtIF9NX2V4dF9idWY7CisgICAgICBpZiAoX01fd3JpdGUoX01fZXh0X2J1ZiwgX19uKSkKKyAgICAgICAgX19pYmVnaW4gKz0gX19pbmV4dCAtIF9faWJlZ2luOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gX01fb3V0cHV0X2Vycm9yKCk7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHJldHVybiBfTV9vdXRwdXRfZXJyb3IoKTsKKyAgfQorCisgIHJldHVybiB0cmFpdHNfdHlwZTo6bm90X2VvZihfX2MpOworfQorCisvLyBUaGlzIG1lbWJlciBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IEkvTyBoYXMgYmVlbgorLy8gcGVyZm9ybWVkIG9uIHRoZSBzdHJlYW0sIG90aGVyd2lzZSBpdCBoYXMgbm8gZWZmZWN0LgorLy8KKy8vIF9fYnVmID09IDAgJiYgX19uID09IDAgbWVhbnMgdG8gbWFrZSB0aGlzIHN0cmVhbSB1bmJ1ZmZlcmVkLgorLy8gX19idWYgIT0gMCAmJiBfX24gPiAwIG1lYW5zIHRvIHVzZSBfX2J1ZiBhcyB0aGUgc3RyZWFtJ3MgaW50ZXJuYWwKKy8vIGJ1ZmZlciwgcmF0aGVyIHRoYW4gdGhlIGJ1ZmZlciB0aGF0IHdvdWxkIG90aGVyd2lzZSBiZSBhbGxvY2F0ZWQKKy8vIGF1dG9tYXRpY2FsbHkuICBfX2J1ZiBtdXN0IGJlIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZiBfQ2hhclQgd2hvc2UKKy8vIHNpemUgaXMgYXQgbGVhc3QgX19uLgordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KgorYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjpzZXRidWYoX0NoYXJUKiBfX2J1Ziwgc3RyZWFtc2l6ZSBfX24pIHsKKyAgaWYgKCFfTV9pbl9pbnB1dF9tb2RlICYmISBfTV9pbl9vdXRwdXRfbW9kZSAmJiAhX01faW5fZXJyb3JfbW9kZSAmJgorICAgICAgX01faW50X2J1ZiA9PSAwKSB7CisgICAgaWYgKF9fYnVmID09IDAgJiYgX19uID09IDApCisgICAgICBfTV9hbGxvY2F0ZV9idWZmZXJzKDAsIDEpOworICAgIGVsc2UgaWYgKF9fYnVmICE9IDAgJiYgX19uID4gMCkKKyAgICAgIF9NX2FsbG9jYXRlX2J1ZmZlcnMoX19idWYsIF9fbik7CisgIH0KKyAgcmV0dXJuIHRoaXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitfX0JGX3Bvc190eXBlX18KK2Jhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6c2Vla29mZihvZmZfdHlwZSBfX29mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6c2Vla2RpciBfX3doZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6b3Blbm1vZGUgLyogZHVtbXkgKi8pIHsKKyAgaWYgKHRoaXMtPmlzX29wZW4oKSAmJgorICAgICAgKF9fb2ZmID09IDAgfHwgKF9NX2NvbnN0YW50X3dpZHRoICYmIHRoaXMtPl9NX2Jhc2UuX01faW5fYmluYXJ5X21vZGUoKSkpKSB7CisKKyAgICBpZiAoIV9NX3NlZWtfaW5pdChfX29mZiAhPSAwIHx8IF9fd2hlbmNlICE9IGlvc19iYXNlOjpjdXIpKQorICAgICAgcmV0dXJuIHBvc190eXBlKC0xKTsKKworICAgIC8vIFNlZWsgdG8gYmVnaW5uaW5nIG9yIGVuZCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHdlJ3JlIGluIGlucHV0IG1vZGUuCisgICAgaWYgKF9fd2hlbmNlID09IGlvc19iYXNlOjpiZWcgfHwgX193aGVuY2UgPT0gaW9zX2Jhc2U6OmVuZCkKKyAgICAgIHJldHVybiBfTV9zZWVrX3JldHVybihfTV9iYXNlLl9NX3NlZWsoX01fd2lkdGggKiBfX29mZiwgX193aGVuY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TdGF0ZV90eXBlKCkpOworCisgICAgLy8gU2VlayByZWxhdGl2ZSB0byBjdXJyZW50IHBvc2l0aW9uLiBDb21wbGljYXRlZCBpZiB3ZSdyZSBpbiBpbnB1dCBtb2RlLgorICAgIGVsc2UgaWYgKF9fd2hlbmNlID09IGlvc19iYXNlOjpjdXIpIHsKKyAgICAgIGlmICghX01faW5faW5wdXRfbW9kZSkKKyAgICAgICAgcmV0dXJuIF9NX3NlZWtfcmV0dXJuKF9NX2Jhc2UuX01fc2VlayhfTV93aWR0aCAqIF9fb2ZmLCBfX3doZW5jZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU3RhdGVfdHlwZSgpKTsKKyAgICAgIGVsc2UgaWYgKF9NX21tYXBfYmFzZSAhPSAwKSB7CisgICAgICAgIC8vIF9fb2ZmIGlzIHJlbGF0aXZlIHRvIGdwdHIoKS4gIFdlIG5lZWQgdG8gZG8gYSBiaXQgb2YgYXJpdGhtZXRpYworICAgICAgICAvLyB0byBnZXQgYW4gb2Zmc2V0IHJlbGF0aXZlIHRvIHRoZSBleHRlcm5hbCBmaWxlIHBvaW50ZXIuCisgICAgICAgIHN0cmVhbW9mZiBfX2FkanVzdCA9IF9NX21tYXBfbGVuIC0gKHRoaXMtPmdwdHIoKSAtIChfQ2hhclQqKSBfTV9tbWFwX2Jhc2UpOworCisgICAgICAgIC8vIGlmIF9fb2ZmID09IDAsIHdlIGRvIG5vdCBuZWVkIHRvIGV4aXQgaW5wdXQgbW9kZSBhbmQgdG8gc2hpZnQgZmlsZSBwb2ludGVyCisgICAgICAgIHJldHVybiBfX29mZiA9PSAwID8gcG9zX3R5cGUoX01fYmFzZS5fTV9zZWVrKDAsIGlvc19iYXNlOjpjdXIpIC0gX19hZGp1c3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogX01fc2Vla19yZXR1cm4oX01fYmFzZS5fTV9zZWVrKF9fb2ZmIC0gX19hZGp1c3QsIGlvc19iYXNlOjpjdXIpLCBfU3RhdGVfdHlwZSgpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKF9NX2NvbnN0YW50X3dpZHRoKSB7IC8vIEdldCBvciBzZXQgdGhlIHBvc2l0aW9uLgorICAgICAgICBzdHJlYW1vZmYgX19pYWRqID0gX01fd2lkdGggKiAodGhpcy0+Z3B0cigpIC0gdGhpcy0+ZWJhY2soKSk7CisKKyAgICAgICAgLy8gQ29tcGVuc2F0ZSBmb3Igb2Zmc2V0IHJlbGF0aXZlIHRvIGdwdHIgdmVyc3VzIG9mZnNldCByZWxhdGl2ZQorICAgICAgICAvLyB0byBleHRlcm5hbCBwb2ludGVyLiAgRm9yIGEgdGV4dC1vcmllbnRlZCBzdHJlYW0sIHdoZXJlIHRoZQorICAgICAgICAvLyBjb21wZW5zYXRpb24gaXMgbW9yZSB0aGFuIGp1c3QgcG9pbnRlciBhcml0aG1ldGljLCB3ZSBtYXkgZ2V0CisgICAgICAgIC8vIGJ1dCBub3Qgc2V0IHRoZSBjdXJyZW50IHBvc2l0aW9uLgorCisgICAgICAgIGlmIChfX2lhZGogPD0gX01fZXh0X2J1Zl9lbmQgLSBfTV9leHRfYnVmKSB7CisgICAgICAgICAgc3RyZWFtb2ZmIF9fZWFkaiA9ICBfTV9iYXNlLl9NX2dldF9vZmZzZXQoX01fZXh0X2J1ZiArIF9fU1RBVElDX0NBU1QocHRyZGlmZl90LCBfX2lhZGopLCBfTV9leHRfYnVmX2VuZCk7CisKKyAgICAgICAgICByZXR1cm4gX19vZmYgPT0gMCA/IHBvc190eXBlKF9NX2Jhc2UuX01fc2VlaygwLCBpb3NfYmFzZTo6Y3VyKSAtIF9fZWFkaikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF9NX3NlZWtfcmV0dXJuKF9NX2Jhc2UuX01fc2VlayhfX29mZiAtIF9fZWFkaiwgaW9zX2Jhc2U6OmN1ciksIF9TdGF0ZV90eXBlKCkpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBwb3NpdGlvbi4gIEVuY29kaW5nIGlzIHZhciB3aWR0aC4KKyAgICAgICAgLy8gR2V0IHBvc2l0aW9uIGluIGludGVybmFsIGJ1ZmZlci4KKyAgICAgICAgcHRyZGlmZl90IF9faXBvcyA9IHRoaXMtPmdwdHIoKSAtIHRoaXMtPmViYWNrKCk7CisKKyAgICAgICAgLy8gR2V0IGNvcnJlc3BvbmRpbmcgcG9zaXRpb24gaW4gZXh0ZXJuYWwgYnVmZmVyLgorICAgICAgICBfU3RhdGVfdHlwZSBfX3N0YXRlID0gX01fc3RhdGU7CisgICAgICAgIGludCBfX2Vwb3MgPSBfTV9jb2RlY3Z0LT5sZW5ndGgoX19zdGF0ZSwgX01fZXh0X2J1ZiwgX01fZXh0X2J1Zl9lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19pcG9zKTsKKworICAgICAgICBpZiAoX19lcG9zID49IDApIHsKKyAgICAgICAgICAvLyBTYW5pdHkgY2hlY2sgKGV4cGVuc2l2ZSk6IG1ha2Ugc3VyZSBfX2Vwb3MgaXMgdGhlIHJpZ2h0IGFuc3dlci4KKyAgICAgICAgICBfU3RhdGVfdHlwZSBfX3RtcF9zdGF0ZSA9IF9NX3N0YXRlOworICAgICAgICAgIF9GaWxlYnVmX1RtcF9CdWY8X0NoYXJUPiBfX2J1ZihfX2lwb3MpOworICAgICAgICAgIF9DaGFyVCogX19pYmVnaW4gPSBfX2J1Zi5fTV9wdHI7CisgICAgICAgICAgX0NoYXJUKiBfX2luZXh0ICA9IF9faWJlZ2luOworCisgICAgICAgICAgY29uc3QgY2hhciogX19kdW1teTsKKyAgICAgICAgICB0eXBlbmFtZSBfQ29kZWN2dDo6cmVzdWx0IF9fc3RhdHVzCisgICAgICAgICAgICA9IF9NX2NvZGVjdnQtPmluKF9fdG1wX3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTV9leHRfYnVmLCBfTV9leHRfYnVmICsgX19lcG9zLCBfX2R1bW15LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2liZWdpbiwgX19pYmVnaW4gKyBfX2lwb3MsIF9faW5leHQpOworICAgICAgICAgIGlmIChfX3N0YXR1cyAhPSBfQ29kZWN2dDo6ZXJyb3IgJiYKKyAgICAgICAgICAgICAgKF9fc3RhdHVzID09IF9Db2RlY3Z0Ojpub2NvbnYgfHwKKyAgICAgICAgICAgICAgIChfX2luZXh0ID09IF9faWJlZ2luICsgX19pcG9zICYmCisgICAgICAgICAgICAgICAgZXF1YWwodGhpcy0+ZWJhY2soKSwgdGhpcy0+Z3B0cigpLCBfX2liZWdpbiwgX1NUTFBfUFJJViBfRXFfdHJhaXRzPHRyYWl0c190eXBlPigpKSkpKSB7CisgICAgICAgICAgICAvLyBHZXQgdGhlIGN1cnJlbnQgcG9zaXRpb24gKGF0IHRoZSBlbmQgb2YgdGhlIGV4dGVybmFsIGJ1ZmZlciksCisgICAgICAgICAgICAvLyB0aGVuIGFkanVzdCBpdC4gIEFnYWluLCBpdCBtaWdodCBiZSBhIHRleHQtb3JpZW50ZWQgc3RyZWFtLgorICAgICAgICAgICAgc3RyZWFtb2ZmIF9fY3VyID0gX01fYmFzZS5fTV9zZWVrKDAsIGlvc19iYXNlOjpjdXIpOworICAgICAgICAgICAgc3RyZWFtb2ZmIF9fYWRqID0KKyAgICAgICAgICAgICAgX01fYmFzZS5fTV9nZXRfb2Zmc2V0KF9NX2V4dF9idWYsIF9NX2V4dF9idWYgKyBfX2Vwb3MpIC0KKyAgICAgICAgICAgICAgX01fYmFzZS5fTV9nZXRfb2Zmc2V0KF9NX2V4dF9idWYsIF9NX2V4dF9idWZfZW5kKTsKKyAgICAgICAgICAgIGlmIChfX2N1ciAhPSAtMSAmJiBfX2N1ciArIF9fYWRqID49IDApCisgICAgICAgICAgICAgIHJldHVybiBfX29mZiA9PSAwID8gcG9zX3R5cGUoX19jdXIgKyBfX2FkaikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfTV9zZWVrX3JldHVybihfX2N1ciArIF9fYWRqLCBfX3N0YXRlKTsKKyAgICAgICAgICAgICAgLy9yZXR1cm4gX01fc2Vla19yZXR1cm4oX19jdXIgKyBfX2FkaiwgX19zdGF0ZSk7CisgICAgICAgICAgfQorICAgICAgICAgIC8vIFdlIGZhaWxlZCB0aGUgc2FuaXR5IGNoZWNrIGhlcmUuCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgLy8gVW5yZWNvZ25pemVkIHZhbHVlIGZvciBfX3doZW5jZSBoZXJlLgorICB9CisKKyAgcmV0dXJuIHBvc190eXBlKC0xKTsKK30KKworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorX19CRl9wb3NfdHlwZV9fCitiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46OnNlZWtwb3MocG9zX3R5cGUgX19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Om9wZW5tb2RlIC8qIGR1bW15ICovKSB7CisgIGlmICh0aGlzLT5pc19vcGVuKCkpIHsKKyAgICBpZiAoIV9NX3NlZWtfaW5pdCh0cnVlKSkKKyAgICAgIHJldHVybiBwb3NfdHlwZSgtMSk7CisKKyAgICBzdHJlYW1vZmYgX19vZmYgPSBvZmZfdHlwZShfX3Bvcyk7CisgICAgaWYgKF9fb2ZmICE9IC0xICYmIF9NX2Jhc2UuX01fc2VlayhfX29mZiwgaW9zX2Jhc2U6OmJlZykgIT0gLTEpIHsKKyAgICAgIF9NX3N0YXRlID0gX19wb3Muc3RhdGUoKTsKKyAgICAgIHJldHVybiBfTV9zZWVrX3JldHVybihfX29mZiwgX19wb3Muc3RhdGUoKSk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHBvc190eXBlKC0xKTsKK30KKworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgoraW50IGJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6c3luYygpIHsKKyAgaWYgKF9NX2luX291dHB1dF9tb2RlKQorICAgIHJldHVybiB0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUodGhpcy0+b3ZlcmZsb3codHJhaXRzX3R5cGU6OmVvZigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190eXBlOjplb2YoKSkgPyAtMSA6IDA7CisgIHJldHVybiAwOworfQorCisKKy8vIENoYW5nZSB0aGUgZmlsZWJ1ZidzIGxvY2FsZS4gIFRoaXMgbWVtYmVyIGZ1bmN0aW9uIGhhcyBubyBlZmZlY3QKKy8vIHVubGVzcyBpdCBpcyBjYWxsZWQgYmVmb3JlIGFueSBJL08gaXMgcGVyZm9ybWVkIG9uIHRoZSBzdHJlYW0uCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgordm9pZCBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46OmltYnVlKGNvbnN0IGxvY2FsZSYgX19sb2MpIHsKKyAgaWYgKCFfTV9pbl9pbnB1dF9tb2RlICYmICFfTV9pbl9vdXRwdXRfbW9kZSAmJiAhX01faW5fZXJyb3JfbW9kZSkgeworICAgIHRoaXMtPl9NX3NldHVwX2NvZGVjdnQoX19sb2MpOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gYmFzaWNfZmlsZWJ1Zjw+IGhlbHBlciBmdW5jdGlvbnMuCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3Igc3dpdGNoaW5nIGJldHdlZW4gbW9kZXMuCisKKy8vIFRoaXMgbWVtYmVyIGZ1bmN0aW9uIGlzIGNhbGxlZCBpZiB3ZSdyZSBwZXJmb3JtaW5nIHRoZSBmaXJzdCBJL08KKy8vIG9wZXJhdGlvbiBvbiBhIGZpbGVidWYsIG9yIGlmIHdlJ3JlIHBlcmZvcm1pbmcgYW4gaW5wdXQgb3BlcmF0aW9uCisvLyBpbW1lZGlhdGVseSBhZnRlciBhIHNlZWsuCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYm9vbCBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46Ol9NX3N3aXRjaF90b19pbnB1dF9tb2RlKCkgeworICBpZiAodGhpcy0+aXNfb3BlbigpICYmICgoKGludClfTV9iYXNlLl9fb19tb2RlKCkgJiAoaW50KWlvc19iYXNlOjppbikgIT0gMCkKKyAgICAgICYmIChfTV9pbl9vdXRwdXRfbW9kZSA9PSAwKSAmJiAoX01faW5fZXJyb3JfbW9kZSA9PSAwKSkgeworICAgIGlmICghX01faW50X2J1ZiAmJiAhX01fYWxsb2NhdGVfYnVmZmVycygpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgX01fZXh0X2J1Zl9jb252ZXJ0ZWQgPSBfTV9leHRfYnVmOworICAgIF9NX2V4dF9idWZfZW5kICAgICAgID0gX01fZXh0X2J1ZjsKKworICAgIF9NX2VuZF9zdGF0ZSAgICA9IF9NX3N0YXRlOworCisgICAgX01faW5faW5wdXRfbW9kZSA9IHRydWU7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CisKKworLy8gVGhpcyBtZW1iZXIgZnVuY3Rpb24gaXMgY2FsbGVkIGlmIHdlJ3JlIHBlcmZvcm1pbmcgdGhlIGZpcnN0IEkvTworLy8gb3BlcmF0aW9uIG9uIGEgZmlsZWJ1Ziwgb3IgaWYgd2UncmUgcGVyZm9ybWluZyBhbiBvdXRwdXQgb3BlcmF0aW9uCisvLyBpbW1lZGlhdGVseSBhZnRlciBhIHNlZWsuCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYm9vbCBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46Ol9NX3N3aXRjaF90b19vdXRwdXRfbW9kZSgpIHsKKyAgaWYgKHRoaXMtPmlzX29wZW4oKSAmJiAoX01fYmFzZS5fX29fbW9kZSgpICYgKGludClpb3NfYmFzZTo6b3V0KSAmJgorICAgICAgX01faW5faW5wdXRfbW9kZSA9PSAwICYmIF9NX2luX2Vycm9yX21vZGUgPT0gMCkgeworCisgICAgaWYgKCFfTV9pbnRfYnVmICYmICFfTV9hbGxvY2F0ZV9idWZmZXJzKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBJbiBhcHBlbmQgbW9kZSwgZXZlcnkgd3JpdGUgZG9lcyBhbiBpbXBsaWNpdCBzZWVrIHRvIHRoZSBlbmQKKyAgICAvLyBvZiB0aGUgZmlsZS4gIFdoZW5ldmVyIGxlYXZpbmcgb3V0cHV0IG1vZGUsIHRoZSBlbmQgb2YgZmlsZQorICAgIC8vIGdldCBwdXQgaW4gdGhlIGluaXRpYWwgc2hpZnQgc3RhdGUuCisgICAgaWYgKF9NX2Jhc2UuX19vX21vZGUoKSAmIGlvc19iYXNlOjphcHApCisgICAgICBfTV9zdGF0ZSA9IF9TdGF0ZV90eXBlKCk7CisKKyAgICB0aGlzLT5zZXRwKF9NX2ludF9idWYsIF9NX2ludF9idWZfRU9TIC0gMSk7CisgICAgX01faW5fb3V0cHV0X21vZGUgPSB0cnVlOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgaW5wdXQKKworLy8gVGhpcyBtZW1iZXIgZnVuY3Rpb24gaXMgY2FsbGVkIGlmIHRoZXJlIGlzIGFuIGVycm9yIGR1cmluZyBpbnB1dC4KKy8vIEl0IHB1dHMgdGhlIGZpbGVidWYgaW4gZXJyb3IgbW9kZSwgY2xlYXIgdGhlIGdldCBhcmVhIGJ1ZmZlciwgYW5kCisvLyByZXR1cm5zIGVvZi4KKy8vIHJldHVybnMgZW9mLiAgRXJyb3IgbW9kZSBpcyBzdGlja3k7IGl0IGlzIGNsZWFyZWQgb25seSBieSBjbG9zZSBvcgorLy8gc2Vlay4KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK19fQkZfaW50X3R5cGVfXworYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjpfTV9pbnB1dF9lcnJvcigpIHsKKyAgIHRoaXMtPl9NX2V4aXRfaW5wdXRfbW9kZSgpOworICBfTV9pbl9vdXRwdXRfbW9kZSA9IGZhbHNlOworICBfTV9pbl9lcnJvcl9tb2RlID0gdHJ1ZTsKKyAgdGhpcy0+c2V0ZygwLCAwLCAwKTsKKyAgcmV0dXJuIHRyYWl0c190eXBlOjplb2YoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK19fQkZfaW50X3R5cGVfXworYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjpfTV91bmRlcmZsb3dfYXV4KCkgeworICAvLyBXZSBoYXZlIHRoZSBzdGF0ZSBhbmQgZmlsZSBwb3NpdGlvbiBmcm9tIHRoZSBlbmQgb2YgdGhlIGludGVybmFsCisgIC8vIGJ1ZmZlci4gIFRoaXMgcm91bmQsIHRoZXkgYmVjb21lIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGludGVybmFsIGJ1ZmZlci4KKyAgX01fc3RhdGUgICAgPSBfTV9lbmRfc3RhdGU7CisKKyAgLy8gRmlsbCB0aGUgZXh0ZXJuYWwgYnVmZmVyLiAgU3RhcnQgd2l0aCBhbnkgbGVmdG92ZXIgY2hhcmFjdGVycyB0aGF0CisgIC8vIGRpZG4ndCBnZXQgY29udmVydGVkIGxhc3QgdGltZS4KKyAgaWYgKF9NX2V4dF9idWZfZW5kID4gX01fZXh0X2J1Zl9jb252ZXJ0ZWQpCisKKyAgICBfTV9leHRfYnVmX2VuZCA9IGNvcHkoX01fZXh0X2J1Zl9jb252ZXJ0ZWQsIF9NX2V4dF9idWZfZW5kLCBfTV9leHRfYnVmKTsKKyAgICAvLyBib3JpcyA6IGNvcHlfYmFja3dhcmQgZGlkIG5vdCB3b3JrCisgICAgLy9fTV9leHRfYnVmX2VuZCA9IGNvcHlfYmFja3dhcmQoX01fZXh0X2J1Zl9jb252ZXJ0ZWQsIF9NX2V4dF9idWZfZW5kLAorICAgIC8vX01fZXh0X2J1ZisgKF9NX2V4dF9idWZfZW5kIC0gX01fZXh0X2J1Zl9jb252ZXJ0ZWQpKTsKKyAgZWxzZQorICAgIF9NX2V4dF9idWZfZW5kID0gX01fZXh0X2J1ZjsKKworICAvLyBOb3cgZmlsbCB0aGUgZXh0ZXJuYWwgYnVmZmVyIHdpdGggY2hhcmFjdGVycyBmcm9tIHRoZSBmaWxlLiAgVGhpcyBpcworICAvLyBhIGxvb3AgYmVjYXVzZSBvY2Nhc2lvbmFsbHkgd2UgZG9uJ3QgZ2V0IGVub3VnaCBleHRlcm5hbCBjaGFyYWN0ZXJzCisgIC8vIHRvIG1ha2UgcHJvZ3Jlc3MuCisgIGZvciAoOzspIHsKKyAgICBwdHJkaWZmX3QgX19uID0gX01fYmFzZS5fTV9yZWFkKF9NX2V4dF9idWZfZW5kLCBfTV9leHRfYnVmX0VPUyAtIF9NX2V4dF9idWZfZW5kKTsKKworICAgIC8vIERvbid0IGVudGVyIGVycm9yIG1vZGUgZm9yIGEgZmFpbGVkIHJlYWQuICBFcnJvciBtb2RlIGlzIHN0aWNreSwKKyAgICAvLyBhbmQgd2UgbWlnaHQgc3VjY2VlZCBpZiB3ZSB0cnkgYWdhaW4uCisgICAgaWYgKF9fbiA8PSAwKQorICAgICAgcmV0dXJuIHRyYWl0c190eXBlOjplb2YoKTsKKworICAgIC8vIENvbnZlcnQgdGhlIGV4dGVybmFsIGJ1ZmZlciB0byBpbnRlcm5hbCBjaGFyYWN0ZXJzLgorICAgIF9NX2V4dF9idWZfZW5kICs9IF9fbjsKKyAgICBjb25zdCBjaGFyKiAgIF9fZW5leHQ7CisgICAgX0NoYXJUKiBfX2luZXh0OworCisgICAgdHlwZW5hbWUgX0NvZGVjdnQ6OnJlc3VsdCBfX3N0YXR1cworICAgICAgPSBfTV9jb2RlY3Z0LT5pbihfTV9lbmRfc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgIF9NX2V4dF9idWYsIF9NX2V4dF9idWZfZW5kLCBfX2VuZXh0LAorICAgICAgICAgICAgICAgICAgICAgICBfTV9pbnRfYnVmLCBfTV9pbnRfYnVmX0VPUywgX19pbmV4dCk7CisKKyAgICAvLyBFcnJvciBjb25kaXRpb25zOiAoMSkgUmV0dXJuIHZhbHVlIG9mIGVycm9yLiAgKDIpIFByb2R1Y2luZyBpbnRlcm5hbAorICAgIC8vIGNoYXJhY3RlcnMgd2l0aG91dCBjb25zdW1pbmcgZXh0ZXJuYWwgY2hhcmFjdGVycy4gICgzKSBJbiBmaXhlZC13aWR0aAorICAgIC8vIGVuY29kaW5ncywgcHJvZHVjaW5nIGFuIGludGVybmFsIHNlcXVlbmNlIHdob3NlIGxlbmd0aCBpcyBpbmNvbnNpc3RlbnQKKyAgICAvLyB3aXRoIHRoYXQgb2YgdGhlIGludGVybmFsIHNlcXVlbmNlLiAgKDQpIEZhaWx1cmUgdG8gcHJvZHVjZSBhbnkKKyAgICAvLyBjaGFyYWN0ZXJzIGlmIHdlIGhhdmUgZW5vdWdoIGNoYXJhY3RlcnMgaW4gdGhlIGV4dGVybmFsIGJ1ZmZlciwgd2hlcmUKKyAgICAvLyAiZW5vdWdoIiBtZWFucyB0aGUgbGFyZ2VzdCBwb3NzaWJsZSB3aWR0aCBvZiBhIHNpbmdsZSBjaGFyYWN0ZXIuCisgICAgaWYgKF9fc3RhdHVzID09IF9Db2RlY3Z0Ojpub2NvbnYpCisgICAgICByZXR1cm4gX05vY29udl9pbnB1dDxfVHJhaXRzPjo6X01fZG9pdCh0aGlzKTsKKyAgICBlbHNlIGlmIChfX3N0YXR1cyA9PSBfQ29kZWN2dDo6ZXJyb3IgfHwKKyAgICAgICAgICAgICAoX19pbmV4dCAhPSBfTV9pbnRfYnVmICYmIF9fZW5leHQgPT0gX01fZXh0X2J1ZikgfHwKKyAgICAgICAgICAgICAoX01fY29uc3RhbnRfd2lkdGggJiYKKyAgICAgICAgICAgICAgLy8gICAgICAgICBfX2luZXh0IC0gX01faW50X2J1ZiAhPSBfTV93aWR0aCAqIChfX2VuZXh0IC0gX01fZXh0X2J1ZikpIHx8CisgICAgICAgICAgICAgIChfX2luZXh0IC0gX01faW50X2J1ZikgKiAgX01fd2lkdGggIT0gKF9fZW5leHQgLSBfTV9leHRfYnVmKSkgfHwKKyAgICAgICAgICAgICAoX19pbmV4dCA9PSBfTV9pbnRfYnVmICYmIF9fZW5leHQgLSBfTV9leHRfYnVmID49IF9NX21heF93aWR0aCkpCisgICAgICByZXR1cm4gX01faW5wdXRfZXJyb3IoKTsKKyAgICBlbHNlIGlmIChfX2luZXh0ICE9IF9NX2ludF9idWYpIHsKKyAgICAgIF9NX2V4dF9idWZfY29udmVydGVkID0gX01fZXh0X2J1ZiArIChfX2VuZXh0IC0gX01fZXh0X2J1Zik7CisgICAgICB0aGlzLT5zZXRnKF9NX2ludF9idWYsIF9NX2ludF9idWYsIF9faW5leHQpOworICAgICAgcmV0dXJuIHRyYWl0c190eXBlOjp0b19pbnRfdHlwZSgqX01faW50X2J1Zik7CisgICAgfQorICAgIC8vIFdlIG5lZWQgdG8gZ28gYXJvdW5kIHRoZSBsb29wIGFnYWluIHRvIGdldCBtb3JlIGV4dGVybmFsIGNoYXJhY3RlcnMuCisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIZWxwZXIgZnVuY3Rpb25zIGZvciBvdXRwdXQKKworLy8gVGhpcyBtZW1iZXIgZnVuY3Rpb24gaXMgY2FsbGVkIGlmIHRoZXJlIGlzIGFuIGVycm9yIGR1cmluZyBvdXRwdXQuCisvLyBJdCBwdXRzIHRoZSBmaWxlYnVmIGluIGVycm9yIG1vZGUsIGNsZWFyIHRoZSBwdXQgYXJlYSBidWZmZXIsIGFuZAorLy8gcmV0dXJucyBlb2YuICBFcnJvciBtb2RlIGlzIHN0aWNreTsgaXQgaXMgY2xlYXJlZCBvbmx5IGJ5IGNsb3NlIG9yCisvLyBzZWVrLgordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK19fQkZfaW50X3R5cGVfXworYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjpfTV9vdXRwdXRfZXJyb3IoKSB7CisgIF9NX2luX291dHB1dF9tb2RlID0gZmFsc2U7CisgIF9NX2luX2lucHV0X21vZGUgPSBmYWxzZTsKKyAgX01faW5fZXJyb3JfbW9kZSA9IHRydWU7CisgIHRoaXMtPnNldHAoMCwgMCk7CisgIHJldHVybiB0cmFpdHNfdHlwZTo6ZW9mKCk7Cit9CisKKworLy8gV3JpdGUgd2hhdGV2ZXIgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyBpcyBuZWNlc3NhcnkgdG8gZ2V0IGJhY2sgdG8KKy8vIHRoZSBpbml0aWFsIHNoaWZ0IHN0YXRlLiAgVGhpcyBmdW5jdGlvbiBvdmVyd3JpdGVzIHRoZSBleHRlcm5hbAorLy8gYnVmZmVyLCBjaGFuZ2VzIHRoZSBleHRlcm5hbCBmaWxlIHBvc2l0aW9uLCBhbmQgY2hhbmdlcyB0aGUgc3RhdGUuCisvLyBQcmVjb25kaXRpb246IHRoZSBpbnRlcm5hbCBidWZmZXIgaXMgZW1wdHkuCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYm9vbCBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46Ol9NX3Vuc2hpZnQoKSB7CisgIGlmIChfTV9pbl9vdXRwdXRfbW9kZSAmJiAhX01fY29uc3RhbnRfd2lkdGgpIHsKKyAgICB0eXBlbmFtZSBfQ29kZWN2dDo6cmVzdWx0IF9fc3RhdHVzOworICAgIGRvIHsKKyAgICAgIGNoYXIqIF9fZW5leHQgPSBfTV9leHRfYnVmOworICAgICAgX19zdGF0dXMgPSBfTV9jb2RlY3Z0LT51bnNoaWZ0KF9NX3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NX2V4dF9idWYsIF9NX2V4dF9idWZfRU9TLCBfX2VuZXh0KTsKKyAgICAgIGlmIChfX3N0YXR1cyA9PSBfQ29kZWN2dDo6bm9jb252IHx8CisgICAgICAgICAgKF9fZW5leHQgPT0gX01fZXh0X2J1ZiAmJiBfX3N0YXR1cyA9PSBfQ29kZWN2dDo6b2spKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIGVsc2UgaWYgKF9fc3RhdHVzID09IF9Db2RlY3Z0OjplcnJvcikKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgZWxzZSBpZiAoIV9NX3dyaXRlKF9NX2V4dF9idWYsIF9fZW5leHQgLSBfTV9leHRfYnVmKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gd2hpbGUgKF9fc3RhdHVzID09IF9Db2RlY3Z0OjpwYXJ0aWFsKTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgYnVmZmVyIGFsbG9jYXRpb24gYW5kIGRlYWxsb2NhdGlvbgorCisvLyBUaGlzIG1lbWJlciBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB3ZSdyZSBpbml0aWFsaXppbmcgYSBmaWxlYnVmJ3MKKy8vIGludGVybmFsIGFuZCBleHRlcm5hbCBidWZmZXJzLiAgVGhlIGFyZ3VtZW50IGlzIHRoZSBzaXplIG9mIHRoZQorLy8gaW50ZXJuYWwgYnVmZmVyOyB0aGUgZXh0ZXJuYWwgYnVmZmVyIGlzIHNpemVkIHVzaW5nIHRoZSBjaGFyYWN0ZXIKKy8vIHdpZHRoIGluIHRoZSBjdXJyZW50IGVuY29kaW5nLiAgUHJlY29uZGl0aW9uczogdGhlIGJ1ZmZlcnMgYXJlIGN1cnJlbnRseQorLy8gbnVsbC4gIF9fbiA+PSAxLiAgX19idWYgaXMgZWl0aGVyIGEgbnVsbCBwb2ludGVyIG9yIGEgcG9pbnRlciB0byBhbgorLy8gYXJyYXkgc2hvdyBzaXplIGlzIGF0IGxlYXN0IF9fbi4KKworLy8gV2UgbmVlZCBfX24gPj0gMSBmb3IgdHdvIGRpZmZlcmVudCByZWFzb25zLiAgRm9yIGlucHV0LCB0aGUgYmFzZQorLy8gY2xhc3MgYWx3YXlzIG5lZWRzIGEgYnVmZmVyIGJlY2F1c2Ugb2YgdGhlIHNlbWFudGljcyBvZiB1bmRlcmZsb3coKS4KKy8vIEZvciBvdXRwdXQsIHdlIHdhbnQgdG8gaGF2ZSBhbiBpbnRlcm5hbCBidWZmZXIgdGhhdCdzIGxhcmdlciBieSBvbmUKKy8vIGVsZW1lbnQgdGhhbiB0aGUgYnVmZmVyIHRoYXQgdGhlIGJhc2UgY2xhc3Mga25vd3MgYWJvdXQuICAoU2VlCisvLyBiYXNpY19maWxlYnVmPD46Om92ZXJmbG93KCkgZm9yIHRoZSByZWFzb24uKQordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jvb2wgYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjpfTV9hbGxvY2F0ZV9idWZmZXJzKF9DaGFyVCogX19idWYsIHN0cmVhbXNpemUgX19uKSB7CisgIC8vVGhlIG1ham9yIGh5cG90aGVzaXMgaW4gdGhlIGZvbGxvd2luZyBpbXBsZW1lbnRhdGlvbiBpcyB0aGF0IHNpemVfdCBpcyB1bnNpZ25lZC4KKyAgLy9XZSBhbHNvIG5lZWQgc3RyZWFtc2l6ZSBieXRlIHJlcHJlc2VudGF0aW9uIHRvIGJlIGxhcmdlciBvciBlcXVhbCB0byB0aGUgaW50CisgIC8vcmVwcmVzZW50YXRpb24gdG8gY29ycmVjdGx5IHN0b3JlIHRoZSBlbmNvZGluZyBpbmZvcm1hdGlvbi4KKyAgX1NUTFBfU1RBVElDX0FTU0VSVCghbnVtZXJpY19saW1pdHM8c2l6ZV90Pjo6aXNfc2lnbmVkICYmCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cmVhbXNpemUpID49IHNpemVvZihpbnQpKQorCisgIGlmIChfX2J1ZiA9PSAwKSB7CisgICAgc3RyZWFtc2l6ZSBfX2J1ZnNpemUgPSBfX24gKiBzaXplb2YoX0NoYXJUKTsKKyAgICAvL1dlIGZpcnN0IGNoZWNrIHRoYXQgdGhlIHN0cmVhbXNpemUgcmVwcmVzZW50YXRpb24gY2FuJ3Qgb3ZlcmZsb3cgYSBzaXplX3Qgb25lLgorICAgIC8vSWYgaXQgY2FuLCB3ZSBjaGVjayB0aGF0IF9fYnVmc2l6ZSBpcyBub3QgaGlnaGVyIHRoYW4gdGhlIHNpemVfdCBtYXggdmFsdWUuCisgICAgaWYgKChzaXplb2Yoc3RyZWFtc2l6ZSkgPiBzaXplb2Yoc2l6ZV90KSkgJiYKKyAgICAgICAgKF9fYnVmc2l6ZSA+IF9fU1RBVElDX0NBU1Qoc3RyZWFtc2l6ZSwgKG51bWVyaWNfbGltaXRzPHNpemVfdD46Om1heCkoKSkpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIF9NX2ludF9idWYgPSBfX1NUQVRJQ19DQVNUKF9DaGFyVCosIG1hbGxvYyhfX1NUQVRJQ19DQVNUKHNpemVfdCwgX19idWZzaXplKSkpOworICAgIGlmICghX01faW50X2J1ZikKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBfTV9pbnRfYnVmX2R5bmFtaWMgPSB0cnVlOworICB9CisgIGVsc2UgeworICAgIF9NX2ludF9idWYgPSBfX2J1ZjsKKyAgICBfTV9pbnRfYnVmX2R5bmFtaWMgPSBmYWxzZTsKKyAgfQorCisgIHN0cmVhbXNpemUgX19lYnVmc2l6ID0gKG1heCkoX19uICogX19TVEFUSUNfQ0FTVChzdHJlYW1zaXplLCBfTV93aWR0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19TVEFUSUNfQ0FTVChzdHJlYW1zaXplLCBfTV9jb2RlY3Z0LT5tYXhfbGVuZ3RoKCkpKTsKKyAgX01fZXh0X2J1ZiA9IDA7CisgIGlmICgoc2l6ZW9mKHN0cmVhbXNpemUpIDwgc2l6ZW9mKHNpemVfdCkpIHx8CisgICAgICAoKHNpemVvZihzdHJlYW1zaXplKSA9PSBzaXplb2Yoc2l6ZV90KSkgJiYgbnVtZXJpY19saW1pdHM8c3RyZWFtc2l6ZT46OmlzX3NpZ25lZCkgfHwKKyAgICAgIChfX2VidWZzaXogPD0gX19TVEFUSUNfQ0FTVChzdHJlYW1zaXplLCAobnVtZXJpY19saW1pdHM8c2l6ZV90Pjo6bWF4KSgpKSkpIHsKKyAgICBfTV9leHRfYnVmID0gX19TVEFUSUNfQ0FTVChjaGFyKiwgbWFsbG9jKF9fU1RBVElDX0NBU1Qoc2l6ZV90LCBfX2VidWZzaXopKSk7CisgIH0KKworICBpZiAoIV9NX2V4dF9idWYpIHsKKyAgICBfTV9kZWFsbG9jYXRlX2J1ZmZlcnMoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBfTV9pbnRfYnVmX0VPUyA9IF9NX2ludF9idWYgKyBfX1NUQVRJQ19DQVNUKHB0cmRpZmZfdCwgX19uKTsKKyAgX01fZXh0X2J1Zl9FT1MgPSBfTV9leHRfYnVmICsgX19TVEFUSUNfQ0FTVChwdHJkaWZmX3QsIF9fZWJ1ZnNpeik7CisgIHJldHVybiB0cnVlOworfQorCisvLyBBYmJyZXZpYXRpb24gZm9yIHRoZSBtb3N0IGNvbW1vbiBjYXNlLgordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jvb2wgYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjpfTV9hbGxvY2F0ZV9idWZmZXJzKCkgeworICAvLyBDaG9vc2UgYSBidWZmZXIgdGhhdCdzIGF0IGxlYXN0IDQwOTYgY2hhcmFjdGVycyBsb25nIGFuZCB0aGF0J3MgYQorICAvLyBtdWx0aXBsZSBvZiB0aGUgcGFnZSBzaXplLgorICBzdHJlYW1zaXplIF9fZGVmYXVsdF9idWZzaXogPQorICAgICgoX01fYmFzZS5fX3BhZ2Vfc2l6ZSgpICsgNDA5NVVMKSAvIF9NX2Jhc2UuX19wYWdlX3NpemUoKSkgKiBfTV9iYXNlLl9fcGFnZV9zaXplKCk7CisgIHJldHVybiBfTV9hbGxvY2F0ZV9idWZmZXJzKDAsIF9fZGVmYXVsdF9idWZzaXopOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgordm9pZCBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46Ol9NX2RlYWxsb2NhdGVfYnVmZmVycygpIHsKKyAgaWYgKF9NX2ludF9idWZfZHluYW1pYykKKyAgICBmcmVlKF9NX2ludF9idWYpOworICBmcmVlKF9NX2V4dF9idWYpOworICBfTV9pbnRfYnVmICAgICA9IDA7CisgIF9NX2ludF9idWZfRU9TID0gMDsKKyAgX01fZXh0X2J1ZiAgICAgPSAwOworICBfTV9leHRfYnVmX0VPUyA9IDA7Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIZWxwZXIgZnVuY3Rpb3NuIGZvciBzZWVrIGFuZCBpbWJ1ZQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYm9vbCBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46Ol9NX3NlZWtfaW5pdChib29sIF9fZG9fdW5zaGlmdCkgeworICAvLyBJZiB3ZSdyZSBpbiBlcnJvciBtb2RlLCBsZWF2ZSBpdC4KKyAgIF9NX2luX2Vycm9yX21vZGUgPSBmYWxzZTsKKworICAvLyBGbHVzaCB0aGUgb3V0cHV0IGJ1ZmZlciBpZiB3ZSdyZSBpbiBvdXRwdXQgbW9kZSwgYW5kIChjb25kaXRpb25hbGx5KQorICAvLyBlbWl0IGFuIHVuc2hpZnQgc2VxdWVuY2UuCisgIGlmIChfTV9pbl9vdXRwdXRfbW9kZSkgeworICAgIGJvb2wgX19vayA9ICF0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUodGhpcy0+b3ZlcmZsb3codHJhaXRzX3R5cGU6OmVvZigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190eXBlOjplb2YoKSk7CisgICAgaWYgKF9fZG9fdW5zaGlmdCkKKyAgICAgIF9fb2sgPSBfX29rICYmIHRoaXMtPl9NX3Vuc2hpZnQoKTsKKyAgICBpZiAoIV9fb2spIHsKKyAgICAgIF9NX2luX291dHB1dF9tb2RlID0gZmFsc2U7CisgICAgICBfTV9pbl9lcnJvcl9tb2RlID0gdHJ1ZTsKKyAgICAgIHRoaXMtPnNldHAoMCwgMCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgLy8gRGlzY2FyZCBwdXRiYWNrIGNoYXJhY3RlcnMsIGlmIGFueS4KKyAgaWYgKF9NX2luX2lucHV0X21vZGUgJiYgX01faW5fcHV0YmFja19tb2RlKQorICAgIF9NX2V4aXRfcHV0YmFja19tb2RlKCk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKworLyogQ2hhbmdlIHRoZSBmaWxlYnVmJ3MgbG9jYWxlLiAgVGhpcyBtZW1iZXIgZnVuY3Rpb24gaGFzIG5vIGVmZmVjdAorICogdW5sZXNzIGl0IGlzIGNhbGxlZCBiZWZvcmUgYW55IEkvTyBpcyBwZXJmb3JtZWQgb24gdGhlIHN0cmVhbS4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uIGNvbnN0cnVjdGlvbiBhbmQgb24gYW4gaW1idWUgY2FsbC4gSW4gdGhlCisgKiBjYXNlIG9mIHRoZSBjb25zdHJ1Y3Rpb24gdGhlIGNvZGVjdnQgZmFjZXQgbWlnaHQgYmUgYSBjdXN0b20gb25lIGlmCisgKiB0aGUgYmFzaWNfZmlsZWJ1ZiB1c2VyIGhhcyBpbnN0YW5jaWF0ZSBpdCB3aXRoIGEgY3VzdG9tIGNoYXJfdHJhaXRzLgorICogVGhlIHVzZXIgd2lsbCBoYXZlIHRvIGNhbGwgaW1idWUgYmVmb3JlIGFueSBJL08gb3BlcmF0aW9uLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgordm9pZCBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46Ol9NX3NldHVwX2NvZGVjdnQoY29uc3QgbG9jYWxlJiBfX2xvYywgYm9vbCBfX29uX2ltYnVlKSB7CisgIGlmIChoYXNfZmFjZXQ8X0NvZGVjdnQ+KF9fbG9jKSkgeworICAgIF9NX2NvZGVjdnQgPSAmdXNlX2ZhY2V0PF9Db2RlY3Z0PihfX2xvYykgOworICAgIGludCBfX2VuY29kaW5nICAgID0gX01fY29kZWN2dC0+ZW5jb2RpbmcoKTsKKworICAgIF9NX3dpZHRoICAgICAgICAgID0gKG1heCkoX19lbmNvZGluZywgMSk7CisgICAgX01fbWF4X3dpZHRoICAgICAgPSBfTV9jb2RlY3Z0LT5tYXhfbGVuZ3RoKCk7CisgICAgX01fY29uc3RhbnRfd2lkdGggPSBfX2VuY29kaW5nID4gMDsKKyAgICBfTV9hbHdheXNfbm9jb252ICA9IF9NX2NvZGVjdnQtPmFsd2F5c19ub2NvbnYoKTsKKyAgfQorICBlbHNlIHsKKyAgICBfTV9jb2RlY3Z0ID0gMDsKKyAgICBfTV93aWR0aCA9IF9NX21heF93aWR0aCA9IDE7CisgICAgX01fY29uc3RhbnRfd2lkdGggPSBfTV9hbHdheXNfbm9jb252ICA9IGZhbHNlOworICAgIGlmIChfX29uX2ltYnVlKSB7CisgICAgICAvL1RoaXMgY2FsbCB3aWxsIGdlbmVyYXRlIGFuIGV4Y2VwdGlvbiByZXBvcnRpbmcgdGhlIHByb2JsZW0uCisgICAgICB1c2VfZmFjZXQ8X0NvZGVjdnQ+KF9fbG9jKTsKKyAgICB9CisgIH0KK30KKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjIHVuZGVmIF9fQkZfaW50X3R5cGVfXworIyB1bmRlZiBfX0JGX3Bvc190eXBlX18KKyMgdW5kZWYgX19CRl9vZmZfdHlwZV9fCisKKyNlbmRpZiAvKiBfU1RMUF9GU1RSRUFNX0MgKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9fZnN0cmVhbS5oIGIvc3RsL19mc3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNiNjQzYwotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9fZnN0cmVhbS5oCkBAIC0wLDAgKzEsNzU3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworLy8gVGhpcyBoZWFkZXIgZGVmaW5lcyBjbGFzc2VzIGJhc2ljX2ZpbGVidWYsIGJhc2ljX2lmc3RyZWFtLAorLy8gYmFzaWNfb2ZzdHJlYW0sIGFuZCBiYXNpY19mc3RyZWFtLiAgVGhlc2UgY2xhc3NlcyByZXByZXNlbnQKKy8vIHN0cmVhbWJ1ZnMgYW5kIHN0cmVhbXMgd2hvc2Ugc291cmNlcyBvciBkZXN0aW5hdGlvbnMgYXJlIGZpbGVzLgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0ZTVFJFQU1fSAorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9GU1RSRUFNX0gKKworI2lmIGRlZmluZWQoX19zZ2kpICYmICFkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfU1RBTkRBUkRfQ19QTFVTX1BMVVMpCisjICBlcnJvciBUaGlzIGhlYWRlciBmaWxlIHJlcXVpcmVzIHRoZSAtTEFORzpzdGQgb3B0aW9uCisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9TVFJFQU1CVUYKKyMgIGluY2x1ZGUgPHN0bC9fc3RyZWFtYnVmLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9JU1RSRUFNCisjICBpbmNsdWRlIDxzdGwvX2lzdHJlYW0uaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NPREVDVlRfSAorIyAgaW5jbHVkZSA8c3RsL19jb2RlY3Z0Lmg+CisjZW5kaWYKKworI2lmICFkZWZpbmVkIChfU1RMUF9VU0VfVU5JWF9JTykgJiYgIWRlZmluZWQoX1NUTFBfVVNFX1dJTjMyX0lPKSAmJiBcCisgICAgIWRlZmluZWQgKF9TVExQX1VTRV9VTklYX0VNVUxBVElPTl9JTykgJiYgIWRlZmluZWQgKF9TVExQX1VTRV9TVERJT19JTykKKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfVU5JWCkgIHx8IGRlZmluZWQgKF9fQ1lHV0lOX18pIHx8IGRlZmluZWQgKF9fYW1pZ2Fvc19fKSB8fCBkZWZpbmVkIChfX0VNWF9fKQorLy8gb3Blbi9jbG9zZS9yZWFkL3dyaXRlCisjICAgIGRlZmluZSBfU1RMUF9VU0VfVU5JWF9JTworIyAgZWxpZiBkZWZpbmVkIChfU1RMUF9XSU4zMikKKy8vIENyZWF0ZUZpbGUvUmVhZEZpbGUvV3JpdGVGaWxlCisjICAgIGRlZmluZSBfU1RMUF9VU0VfV0lOMzJfSU8KKyMgIGVsaWYgZGVmaW5lZCAoX1NUTFBfV0lOMTYpIHx8IGRlZmluZWQgKF9TVExQX01BQykKKy8vIF9vcGVuL19yZWFkL193cml0ZQorIyAgICBkZWZpbmUgX1NUTFBfVVNFX1VOSVhfRU1VTEFUSU9OX0lPCisjICBlbHNlCisvLyBmb3Blbi9mcmVhZC9md3JpdGUKKyMgICAgZGVmaW5lIF9TVExQX1VTRV9TVERJT19JTworIyAgZW5kaWYgLyogX1NUTFBfVU5JWCAqLworI2VuZGlmIC8qIG1vZGUgc2VsZWN0aW9uICovCisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfV0lOMzJfSU8pCit0eXBlZGVmIHZvaWQqIF9TVExQX2ZkOworI2VsaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1VOSVhfRU1VTEFUSU9OX0lPKSB8fCBkZWZpbmVkIChfU1RMUF9VU0VfU1RESU9fSU8pIHx8IGRlZmluZWQgKF9TVExQX1VTRV9VTklYX0lPKQordHlwZWRlZiBpbnQgX1NUTFBfZmQ7CisjZWxzZQorIyAgZXJyb3IgIkNvbmZpZ3VyZSBpL28gISIKKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDbGFzcyBfRmlsZWJ1Zl9iYXNlLCBhIHByaXZhdGUgYmFzZSBjbGFzcyB0byBmYWN0b3Igb3V0IHRoZSBzeXN0ZW0tCisvLyBkZXBlbmRlbnQgY29kZSBmcm9tIGJhc2ljX2ZpbGVidWY8Pi4KKworY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgX0ZpbGVidWZfYmFzZSB7CitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgIC8vIE9wZW5pbmcgYW5kIGNsb3NpbmcgZmlsZXMuCisgIF9GaWxlYnVmX2Jhc2UoKTsKKworICBib29sIF9NX29wZW4oY29uc3QgY2hhciosIGlvc19iYXNlOjpvcGVubW9kZSwgbG9uZyBfX3Byb3RlY3Rpb24pOworICBib29sIF9NX29wZW4oY29uc3QgY2hhciosIGlvc19iYXNlOjpvcGVubW9kZSk7CisgIGJvb2wgX01fb3BlbihpbnQgX19pZCwgaW9zX2Jhc2U6Om9wZW5tb2RlID0gaW9zX2Jhc2U6Ol9fZGVmYXVsdF9tb2RlKTsKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfV0lOMzJfSU8pCisgIGJvb2wgX01fb3BlbihfU1RMUF9mZCBfX2lkLCBpb3NfYmFzZTo6b3Blbm1vZGUgPSBpb3NfYmFzZTo6X19kZWZhdWx0X21vZGUpOworI2VuZGlmIC8qIF9TVExQX1VTRV9XSU4zMl9JTyAqLworICBib29sIF9NX2Nsb3NlKCk7CisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgLy8gTG93LWxldmVsIEkvTywgbGlrZSBVbml4IHJlYWQvd3JpdGUKKyAgcHRyZGlmZl90IF9NX3JlYWQoY2hhciogX19idWYsICBwdHJkaWZmX3QgX19uKTsKKyAgc3RyZWFtb2ZmIF9NX3NlZWsoc3RyZWFtb2ZmIF9fb2Zmc2V0LCBpb3NfYmFzZTo6c2Vla2RpciBfX2Rpcik7CisgIHN0cmVhbW9mZiBfTV9maWxlX3NpemUoKTsKKyAgYm9vbCBfTV93cml0ZShjaGFyKiBfX2J1ZiwgIHB0cmRpZmZfdCBfX24pOworCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgIC8vIE1lbW9yeS1tYXBwZWQgSS9PLgorICB2b2lkKiBfTV9tbWFwKHN0cmVhbW9mZiBfX29mZnNldCwgc3RyZWFtb2ZmIF9fbGVuKTsKKyAgdm9pZCBfTV91bm1hcCh2b2lkKiBfX21tYXBfYmFzZSwgc3RyZWFtb2ZmIF9fbGVuKTsKKworcHVibGljOgorICAvLyBSZXR1cm5zIGEgdmFsdWUgbiBzdWNoIHRoYXQsIGlmIHBvcyBpcyB0aGUgZmlsZSBwb2ludGVyIGF0IHRoZQorICAvLyBiZWdpbm5pbmcgb2YgdGhlIHJhbmdlIFtmaXJzdCwgbGFzdCksIHBvcyArIG4gaXMgdGhlIGZpbGUgcG9pbnRlciBhdAorICAvLyB0aGUgZW5kLiAgT24gbWFueSBvcGVyYXRpbmcgc3lzdGVtcyBuID09IF9fbGFzdCAtIF9fZmlyc3QuCisgIC8vIEluIFVuaXgsIHdyaXRpbmcgbiBjaGFyYWN0ZXJzIGFsd2F5cyBidW1wcyB0aGUgZmlsZSBwb3NpdGlvbiBieSBuLgorICAvLyBJbiBXaW5kb3dzIHRleHQgbW9kZSwgaG93ZXZlciwgaXQgYnVtcHMgdGhlIGZpbGUgcG9zaXRpb24gYnkgbiArIG0sCisgIC8vIHdoZXJlIG0gaXMgdGhlIG51bWJlciBvZiBuZXdsaW5lcyBpbiB0aGUgcmFuZ2UuICBUaGF0J3MgYmVjYXVzZSBhbgorICAvLyBpbnRlcm5hbCBcbiBjb3JyZXNwb25kcyB0byBhbiBleHRlcm5hbCB0d28tY2hhcmFjdGVyIHNlcXVlbmNlLgorICBzdHJlYW1vZmYgX01fZ2V0X29mZnNldChjaGFyKiBfX2ZpcnN0LCBjaGFyKiBfX2xhc3QpIHsKKyNpZiBkZWZpbmVkIChfU1RMUF9VTklYKSB8fCBkZWZpbmVkIChfU1RMUF9NQUMpCisgICAgcmV0dXJuIF9fbGFzdCAtIF9fZmlyc3Q7CisjZWxzZSAvLyBkZWZpbmVkIChfU1RMUF9XSU4zMikgfHwgZGVmaW5lZCAoX1NUTFBfV0lOMTYpIHx8IGRlZmluZWQgKF9TVExQX0RPUykgfHwgZGVmaW5lZChOX1BMQVRfTkxNKQorICAgIHJldHVybiAoIChfTV9vcGVubW9kZSAmIGlvc19iYXNlOjpiaW5hcnkpICE9IDAgKQorICAgICAgPyAoX19sYXN0IC0gX19maXJzdCkKKyAgICAgIDogY291bnQoX19maXJzdCwgX19sYXN0LCAnXG4nKSArIChfX2xhc3QgLSBfX2ZpcnN0KTsKKyNlbmRpZgorICB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHdlJ3JlIGluIGJpbmFyeSBtb2RlIG9yIGlmIHdlJ3JlIHVzaW5nIGFuIE9TIG9yIGZpbGUKKyAgLy8gc3lzdGVtIHdoZXJlIHRoZXJlIGlzIG5vIGRpc3RpbmN0aW9uIGJldHdlZW4gdGV4dCBhbmQgYmluYXJ5IG1vZGUuCisgIGJvb2wgX01faW5fYmluYXJ5X21vZGUoKSBjb25zdCB7CisjaWYgZGVmaW5lZCAoX1NUTFBfVU5JWCkgfHwgZGVmaW5lZCAoX1NUTFBfTUFDKSAgfHwgZGVmaW5lZChfX0JFT1NfXykgfHwgZGVmaW5lZCAoX19hbWlnYW9zX18pCisgICAgcmV0dXJuIHRydWU7CisjZWxpZiBkZWZpbmVkIChfU1RMUF9XSU4zMikgfHwgZGVmaW5lZCAoX1NUTFBfV0lOMTYpIHx8IGRlZmluZWQgKF9TVExQX0RPUykgfHwgZGVmaW5lZCAoX1NUTFBfVk0pIHx8IGRlZmluZWQgKF9fRU1YX18pIHx8IGRlZmluZWQoTl9QTEFUX05MTSkKKyAgICByZXR1cm4gKF9NX29wZW5tb2RlICYgaW9zX2Jhc2U6OmJpbmFyeSkgIT0gMDsKKyNlbHNlCisjICBlcnJvciAiUG9ydCEiCisjZW5kaWYKKyAgfQorCisgIHN0YXRpYyB2b2lkIF9TX2luaXRpYWxpemUoKTsKKworcHJvdGVjdGVkOiAgICAgICAgICAgICAgICAgICAgICAvLyBTdGF0aWMgZGF0YSBtZW1iZXJzLgorICBzdGF0aWMgc2l6ZV90IF9NX3BhZ2Vfc2l6ZTsKKworcHJvdGVjdGVkOiAgICAgICAgICAgICAgICAgICAgICAvLyBEYXRhIG1lbWJlcnMuCisgIF9TVExQX2ZkIF9NX2ZpbGVfaWQ7CisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1NURElPX0lPKQorICAvLyBmb3Igc3RkaW8sIHRoZSB3aG9sZSBGSUxFKiBpcyBiZWluZyBrZXB0IGhlcmUKKyAgRklMRSogX01fZmlsZTsKKyNlbmRpZgorI2lmIGRlZmluZWQgKF9TVExQX1VTRV9XSU4zMl9JTykKKyAgX1NUTFBfZmQgX01fdmlld19pZDsKKyNlbmRpZgorCisgIGlvc19iYXNlOjpvcGVubW9kZSBfTV9vcGVubW9kZSAgICAgOworICB1bnNpZ25lZCBjaGFyICAgICAgX01faXNfb3BlbiAgICAgIDsKKyAgdW5zaWduZWQgY2hhciAgICAgIF9NX3Nob3VsZF9jbG9zZSA7CisgIHVuc2lnbmVkIGNoYXIgICAgICBfTV9yZWd1bGFyX2ZpbGUgOworCitwdWJsaWMgOgorICBzdGF0aWMgc2l6ZV90ICBfU1RMUF9DQUxMIF9fcGFnZV9zaXplKCkgeyByZXR1cm4gX01fcGFnZV9zaXplOyB9CisgIGludCAgX19vX21vZGUoKSBjb25zdCB7IHJldHVybiAoaW50KV9NX29wZW5tb2RlOyB9CisgIGJvb2wgX19pc19vcGVuKCkgICAgICBjb25zdCB7IHJldHVybiAoX01faXNfb3BlbiAhPTAgKTsgfQorICBib29sIF9fc2hvdWxkX2Nsb3NlKCkgY29uc3QgeyByZXR1cm4gKF9NX3Nob3VsZF9jbG9zZSAhPSAwKTsgfQorICBib29sIF9fcmVndWxhcl9maWxlKCkgY29uc3QgeyByZXR1cm4gKF9NX3JlZ3VsYXJfZmlsZSAhPSAwKTsgfQorICBfU1RMUF9mZCBfX2dldF9mZCgpIGNvbnN0IHsgcmV0dXJuIF9NX2ZpbGVfaWQ7IH0KK307CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ2xhc3MgYmFzaWNfZmlsZWJ1Zjw+LgorCisvLyBGb3J3YXJkIGRlY2xhcmF0aW9uIG9mIHR3byBoZWxwZXIgY2xhc3Nlcy4KK3RlbXBsYXRlIDxjbGFzcyBfVHJhaXRzPiBjbGFzcyBfTm9jb252X2lucHV0OworX1NUTFBfVEVNUExBVEVfTlVMTAorY2xhc3MgX05vY29udl9pbnB1dDxjaGFyX3RyYWl0czxjaGFyPiA+OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RyYWl0cz4gY2xhc3MgX05vY29udl9vdXRwdXQ7CitfU1RMUF9URU1QTEFURV9OVUxMCitjbGFzcyBfTm9jb252X291dHB1dDwgY2hhcl90cmFpdHM8Y2hhcj4gPjsKKworLy8gVGhlcmUgaXMgYSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIHVuZGVyZmxvdywgZm9yIGJhc2ljX2ZpbGVidWY8Y2hhcj4sCisvLyBpbiBmc3RyZWFtLmN4eC4KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2NsYXNzIF9VbmRlcmZsb3c7CisKK19TVExQX1RFTVBMQVRFX05VTEwgY2xhc3MgX1VuZGVyZmxvdzwgY2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPjsKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2NsYXNzIGJhc2ljX2ZpbGVidWYgOiBwdWJsaWMgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4geworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUeXBlcy4KKyAgdHlwZWRlZiBfQ2hhclQgICAgICAgICAgICAgICAgICAgICBjaGFyX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6aW50X3R5cGUgaW50X3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6cG9zX3R5cGUgcG9zX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6b2ZmX3R5cGUgb2ZmX3R5cGU7CisgIHR5cGVkZWYgX1RyYWl0cyAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3R5cGU7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpzdGF0ZV90eXBlIF9TdGF0ZV90eXBlOworICB0eXBlZGVmIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+IF9CYXNlOworICB0eXBlZGVmIGJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPiBfU2VsZjsKKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb25zdHJ1Y3RvcnMsIGRlc3RydWN0b3IuCisgIGJhc2ljX2ZpbGVidWYoKTsKKyAgfmJhc2ljX2ZpbGVidWYoKTsKKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPcGVuaW5nIGFuZCBjbG9zaW5nIGZpbGVzLgorICBib29sIGlzX29wZW4oKSBjb25zdCB7IHJldHVybiBfTV9iYXNlLl9faXNfb3BlbigpOyB9CisKKyAgX1NlbGYqIG9wZW4oY29uc3QgY2hhciogX19zLCBpb3NfYmFzZTo6b3Blbm1vZGUgX19tKSB7CisgICAgcmV0dXJuIF9NX2Jhc2UuX01fb3BlbihfX3MsIF9fbSkgPyB0aGlzIDogMDsKKyAgfQorCisjaWYgIWRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpCisgIC8vIFRoZXNlIHR3byB2ZXJzaW9uIG9mIG9wZW4oKSBhbmQgZmlsZSBkZXNjcmlwdG9yIGdldHRlciBhcmUgZXh0ZW5zaW9ucy4KKyAgX1NlbGYqIG9wZW4oY29uc3QgY2hhciogX19zLCBpb3NfYmFzZTo6b3Blbm1vZGUgX19tLAorICAgICAgICAgICAgICBsb25nIF9fcHJvdGVjdGlvbikgeworICAgIHJldHVybiBfTV9iYXNlLl9NX29wZW4oX19zLCBfX20sIF9fcHJvdGVjdGlvbikgPyB0aGlzIDogMDsKKyAgfQorCisgIF9TVExQX2ZkIGZkKCkgY29uc3QgeyByZXR1cm4gX01fYmFzZS5fX2dldF9mZCgpOyB9CisKKyAgX1NlbGYqIG9wZW4oaW50IF9faWQsIGlvc19iYXNlOjpvcGVubW9kZSBfSW5pdF9tb2RlID0gaW9zX2Jhc2U6Ol9fZGVmYXVsdF9tb2RlKSB7CisgICAgcmV0dXJuIHRoaXMtPl9NX29wZW4oX19pZCwgX0luaXRfbW9kZSk7CisgIH0KKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1dJTjMyX0lPKQorICBfU2VsZiogb3BlbihfU1RMUF9mZCBfX2lkLCBpb3NfYmFzZTo6b3Blbm1vZGUgX0luaXRfbW9kZSA9IGlvc19iYXNlOjpfX2RlZmF1bHRfbW9kZSkgeworICAgIHJldHVybiBfTV9iYXNlLl9NX29wZW4oX19pZCwgX0luaXRfbW9kZSkgPyB0aGlzIDogMDsKKyAgfQorIyAgZW5kaWYgLyogX1NUTFBfVVNFX1dJTjMyX0lPICovCisKKyNlbmRpZgorCisgIF9TZWxmKiBfTV9vcGVuKGludCBfX2lkLCBpb3NfYmFzZTo6b3Blbm1vZGUgX0luaXRfbW9kZSA9IGlvc19iYXNlOjpfX2RlZmF1bHRfbW9kZSkgeworICAgIHJldHVybiBfTV9iYXNlLl9NX29wZW4oX19pZCwgX0luaXRfbW9kZSkgPyB0aGlzIDogMDsKKyAgfQorCisgIF9TZWxmKiBjbG9zZSgpOworCitwcm90ZWN0ZWQ6ICAgICAgICAgICAgICAgICAgICAgIC8vIFZpcnR1YWwgZnVuY3Rpb25zIGZyb20gYmFzaWNfc3RyZWFtYnVmLgorICB2aXJ0dWFsIHN0cmVhbXNpemUgc2hvd21hbnljKCk7CisgIHZpcnR1YWwgaW50X3R5cGUgdW5kZXJmbG93KCk7CisKKyAgdmlydHVhbCBpbnRfdHlwZSBwYmFja2ZhaWwoaW50X3R5cGUgPSB0cmFpdHNfdHlwZTo6ZW9mKCkpOworICB2aXJ0dWFsIGludF90eXBlIG92ZXJmbG93KGludF90eXBlID0gdHJhaXRzX3R5cGU6OmVvZigpKTsKKworICB2aXJ0dWFsIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBzZXRidWYoY2hhcl90eXBlKiwgc3RyZWFtc2l6ZSk7CisgIHZpcnR1YWwgcG9zX3R5cGUgc2Vla29mZihvZmZfdHlwZSwgaW9zX2Jhc2U6OnNlZWtkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6b3Blbm1vZGUgPSBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0KTsKKyAgdmlydHVhbCBwb3NfdHlwZSBzZWVrcG9zKHBvc190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Om9wZW5tb2RlID0gaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6Om91dCk7CisKKyAgdmlydHVhbCBpbnQgc3luYygpOworICB2aXJ0dWFsIHZvaWQgaW1idWUoY29uc3QgbG9jYWxlJik7CisKK3ByaXZhdGU6ICAgICAgICAgICAgICAgICAgICAgICAgLy8gSGVscGVyIGZ1bmN0aW9ucy4KKworICAvLyBQcmVjb25kaXRpb246IHdlIGFyZSBjdXJyZW50bHkgaW4gcHV0YmFjayBpbnB1dCBtb2RlLiAgRWZmZWN0OgorICAvLyBzd2l0Y2hlcyBiYWNrIHRvIG9yZGluYXJ5IGlucHV0IG1vZGUuCisgIHZvaWQgX01fZXhpdF9wdXRiYWNrX21vZGUoKSB7CisgICAgdGhpcy0+c2V0ZyhfTV9zYXZlZF9lYmFjaywgX01fc2F2ZWRfZ3B0ciwgX01fc2F2ZWRfZWdwdHIpOworICAgIF9NX2luX3B1dGJhY2tfbW9kZSA9IGZhbHNlOworICB9CisgIGJvb2wgX01fc3dpdGNoX3RvX2lucHV0X21vZGUoKTsKKyAgdm9pZCBfTV9leGl0X2lucHV0X21vZGUoKTsKKyAgYm9vbCBfTV9zd2l0Y2hfdG9fb3V0cHV0X21vZGUoKTsKKworICBpbnRfdHlwZSBfTV9pbnB1dF9lcnJvcigpOworICBpbnRfdHlwZSBfTV91bmRlcmZsb3dfYXV4KCk7CisgIC8vICBmcmllbmQgY2xhc3MgX05vY29udl9pbnB1dDxfVHJhaXRzPjsKKyAgLy8gIGZyaWVuZCBjbGFzcyBfTm9jb252X291dHB1dDxfVHJhaXRzPjsKKyAgZnJpZW5kIGNsYXNzIF9VbmRlcmZsb3c8X0NoYXJULCBfVHJhaXRzPjsKKworICBpbnRfdHlwZSBfTV9vdXRwdXRfZXJyb3IoKTsKKyAgYm9vbCBfTV91bnNoaWZ0KCk7CisKKyAgYm9vbCBfTV9hbGxvY2F0ZV9idWZmZXJzKF9DaGFyVCogX19idWYsIHN0cmVhbXNpemUgX19uKTsKKyAgYm9vbCBfTV9hbGxvY2F0ZV9idWZmZXJzKCk7CisgIHZvaWQgX01fZGVhbGxvY2F0ZV9idWZmZXJzKCk7CisKKyAgcG9zX3R5cGUgX01fc2Vla19yZXR1cm4ob2ZmX3R5cGUgX19vZmYsIF9TdGF0ZV90eXBlIF9fc3RhdGUpIHsKKyAgICBpZiAoX19vZmYgIT0gLTEpIHsKKyAgICAgIGlmIChfTV9pbl9pbnB1dF9tb2RlKQorICAgICAgICBfTV9leGl0X2lucHV0X21vZGUoKTsKKyAgICAgIF9NX2luX2lucHV0X21vZGUgPSBmYWxzZTsKKyAgICAgIF9NX2luX291dHB1dF9tb2RlID0gZmFsc2U7CisgICAgICBfTV9pbl9wdXRiYWNrX21vZGUgPSBmYWxzZTsKKyAgICAgIF9NX2luX2Vycm9yX21vZGUgPSBmYWxzZTsKKyAgICAgIHRoaXMtPnNldGcoMCwgMCwgMCk7CisgICAgICB0aGlzLT5zZXRwKDAsIDApOworICAgIH0KKworICAgIHBvc190eXBlIF9fcmVzdWx0KF9fb2ZmKTsKKyAgICBfX3Jlc3VsdC5zdGF0ZShfX3N0YXRlKTsKKyAgICByZXR1cm4gX19yZXN1bHQ7CisgIH0KKworICBib29sIF9NX3NlZWtfaW5pdChib29sIF9fZG9fdW5zaGlmdCk7CisKKyAgdm9pZCBfTV9zZXR1cF9jb2RlY3Z0KGNvbnN0IGxvY2FsZSYsIGJvb2wgX19vbl9pbWJ1ZSA9IHRydWUpOworCitwcml2YXRlOiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERhdGEgbWVtYmVycyB1c2VkIGluIGFsbCBtb2Rlcy4KKworICBfRmlsZWJ1Zl9iYXNlIF9NX2Jhc2U7CisKK3ByaXZhdGU6ICAgICAgICAgICAgICAgICAgICAgICAgLy8gTG9jYWxlLXJlbGF0ZWQgaW5mb3JtYXRpb24uCisKKyAgdW5zaWduZWQgY2hhciBfTV9jb25zdGFudF93aWR0aDsKKyAgdW5zaWduZWQgY2hhciBfTV9hbHdheXNfbm9jb252OworCisgIC8vIHByaXZhdGU6ICAgICAgICAgICAgICAgICAgICAgICAgLy8gTW9kZSBmbGFncy4KKyAgdW5zaWduZWQgY2hhciBfTV9pbnRfYnVmX2R5bmFtaWM7ICAvLyBUcnVlIGlmIGludGVybmFsIGJ1ZmZlciBpcyBoZWFwIGFsbG9jYXRlZCwKKyAgLy8gZmFsc2UgaWYgaXQgd2FzIHN1cHBsaWVkIGJ5IHRoZSB1c2VyLgorICB1bnNpZ25lZCBjaGFyIF9NX2luX2lucHV0X21vZGU7CisgIHVuc2lnbmVkIGNoYXIgX01faW5fb3V0cHV0X21vZGU7CisgIHVuc2lnbmVkIGNoYXIgX01faW5fZXJyb3JfbW9kZTsKKyAgdW5zaWduZWQgY2hhciBfTV9pbl9wdXRiYWNrX21vZGU7CisKKyAgLy8gSW50ZXJuYWwgYnVmZmVyOiBjaGFyYWN0ZXJzIHNlZW4gYnkgdGhlIGZpbGVidWYncyBjbGllbnRzLgorICBfQ2hhclQqIF9NX2ludF9idWY7CisgIF9DaGFyVCogX01faW50X2J1Zl9FT1M7CisKKyAgLy8gRXh0ZXJuYWwgYnVmZmVyOiBjaGFyYWN0ZXJzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGV4dGVybmFsIGZpbGUuCisgIGNoYXIqIF9NX2V4dF9idWY7CisgIGNoYXIqIF9NX2V4dF9idWZfRU9TOworCisgIC8vIFRoZSByYW5nZSBbX01fZXh0X2J1ZiwgX01fZXh0X2J1Zl9jb252ZXJ0ZWQpIGNvbnRhaW5zIHRoZSBleHRlcm5hbAorICAvLyBjaGFyYWN0ZXJzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNlcXVlbmNlIGluIHRoZSBpbnRlcm5hbCBidWZmZXIuICBUaGUKKyAgLy8gcmFuZ2UgW19NX2V4dF9idWZfY29udmVydGVkLCBfTV9leHRfYnVmX2VuZCkgY29udGFpbnMgY2hhcmFjdGVycyB0aGF0CisgIC8vIGhhdmUgYmVlbiByZWFkIGludG8gdGhlIGV4dGVybmFsIGJ1ZmZlciBidXQgaGF2ZSBub3QgYmVlbiBjb252ZXJ0ZWQKKyAgLy8gdG8gYW4gaW50ZXJuYWwgc2VxdWVuY2UuCisgIGNoYXIqIF9NX2V4dF9idWZfY29udmVydGVkOworICBjaGFyKiBfTV9leHRfYnVmX2VuZDsKKworICAvLyBTdGF0ZSBjb3JyZXNwb25kaW5nIHRvIGJlZ2lubmluZyBvZiBpbnRlcm5hbCBidWZmZXIuCisgIF9TdGF0ZV90eXBlIF9NX3N0YXRlOworCitwcml2YXRlOiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERhdGEgbWVtYmVycyB1c2VkIG9ubHkgaW4gaW5wdXQgbW9kZS4KKworICAvLyBTaW1pbGFyIHRvIF9NX3N0YXRlIGV4Y2VwdCB0aGF0IGl0IGNvcnJlc3BvbmRzIHRvCisgIC8vIHRoZSBlbmQgb2YgdGhlIGludGVybmFsIGJ1ZmZlciBpbnN0ZWFkIG9mIHRoZSBiZWdpbm5pbmcuCisgIF9TdGF0ZV90eXBlIF9NX2VuZF9zdGF0ZTsKKworICAvLyBUaGlzIGlzIGEgbnVsbCBwb2ludGVyIHVubGVzcyB3ZSBhcmUgaW4gbW1hcCBpbnB1dCBtb2RlLgorICB2b2lkKiAgICAgX01fbW1hcF9iYXNlOworICBzdHJlYW1vZmYgX01fbW1hcF9sZW47CisKK3ByaXZhdGU6ICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGF0YSBtZW1iZXJzIHVzZWQgb25seSBpbiBwdXRiYWNrIG1vZGUuCisgIF9DaGFyVCogX01fc2F2ZWRfZWJhY2s7CisgIF9DaGFyVCogX01fc2F2ZWRfZ3B0cjsKKyAgX0NoYXJUKiBfTV9zYXZlZF9lZ3B0cjsKKworICB0eXBlZGVmIGNvZGVjdnQ8X0NoYXJULCBjaGFyLCBfU3RhdGVfdHlwZT4gX0NvZGVjdnQ7CisgIGNvbnN0IF9Db2RlY3Z0KiBfTV9jb2RlY3Z0OworCisgIGludCBfTV93aWR0aDsgICAgICAgICAgICAgICAgIC8vIFdpZHRoIG9mIHRoZSBlbmNvZGluZyAoaWYgY29uc3RhbnQpLCBlbHNlIDEKKyAgaW50IF9NX21heF93aWR0aDsgICAgICAgICAgICAgLy8gTGFyZ2VzdCBwb3NzaWJsZSB3aWR0aCBvZiBzaW5nbGUgY2hhcmFjdGVyLgorCisKKyAgZW51bSB7IF9TX3BiYWNrX2J1Zl9zaXplID0gOCB9OworICBfQ2hhclQgX01fcGJhY2tfYnVmW19TX3BiYWNrX2J1Zl9zaXplXTsKKworICAvLyBmb3IgX05vY29udl9vdXRwdXQKK3B1YmxpYzoKKyAgYm9vbCBfTV93cml0ZShjaGFyKiBfX2J1ZiwgIHB0cmRpZmZfdCBfX24pIHtyZXR1cm4gX01fYmFzZS5fTV93cml0ZShfX2J1ZiwgX19uKTsgfQorCitwdWJsaWM6CisgIGludF90eXBlCisgIF9NX2RvX25vY29udl9pbnB1dCgpIHsKKyAgICBfTV9leHRfYnVmX2NvbnZlcnRlZCA9IF9NX2V4dF9idWZfZW5kOworICAgIC8qIHRoaXMtPiAqLyBfQmFzZTo6c2V0ZygoY2hhcl90eXBlKilfTV9leHRfYnVmLCAoY2hhcl90eXBlKilfTV9leHRfYnVmLCAoY2hhcl90eXBlKilfTV9leHRfYnVmX2VuZCk7CisgICAgcmV0dXJuIHRyYWl0c190eXBlOjp0b19pbnRfdHlwZSgqX01fZXh0X2J1Zik7CisgIH0KK307CisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUKQorX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIGJhc2ljX2ZpbGVidWY8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPjsKKyMgIGlmICEgZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBiYXNpY19maWxlYnVmPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID47CisjICBlbmRpZgorI2VuZGlmIC8qIF9TVExQX1VTRV9URU1QTEFURV9FWFBPUlQgKi8KKworLy8gcHVibGljOgorLy8gaGVscGVyIGNsYXNzLgordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KK3N0cnVjdCBfRmlsZWJ1Zl9UbXBfQnVmIHsKKyAgX0NoYXJUKiBfTV9wdHI7CisgIF9GaWxlYnVmX1RtcF9CdWYocHRyZGlmZl90IF9fbikgOiBfTV9wdHIoMCkgeyBfTV9wdHIgPSBuZXcgX0NoYXJUW19fbl07IH0KKyAgfl9GaWxlYnVmX1RtcF9CdWYoKSB7IGRlbGV0ZVtdIF9NX3B0cjsgfQorfTsKKworCisvLworLy8gVGhpcyBjbGFzcyBoYWQgdG8gYmUgZGVzaWduZWQgdmVyeSBjYXJlZnVsbHkgdG8gd29yaworLy8gd2l0aCBWaXN1YWwgQysrLgorLy8KK3RlbXBsYXRlIDxjbGFzcyBfVHJhaXRzPgorY2xhc3MgX05vY29udl9vdXRwdXQgeworcHVibGljOgorICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OmNoYXJfdHlwZSBjaGFyX3R5cGU7CisgIHN0YXRpYyBib29sICBfU1RMUF9DQUxMIF9NX2RvaXQoYmFzaWNfZmlsZWJ1ZjxjaGFyX3R5cGUsIF9UcmFpdHMgPiosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl90eXBlKiwgY2hhcl90eXBlKikKKyAgeyByZXR1cm4gZmFsc2U7IH0KK307CisKK19TVExQX1RFTVBMQVRFX05VTEwKK2NsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIF9Ob2NvbnZfb3V0cHV0PCBjaGFyX3RyYWl0czxjaGFyPiA+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGJvb2wgIF9TVExQX0NBTEwKKyAgX01fZG9pdChiYXNpY19maWxlYnVmPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4qIF9fYnVmLAorICAgICAgICAgIGNoYXIqIF9fZmlyc3QsIGNoYXIqIF9fbGFzdCkgeworICAgIHB0cmRpZmZfdCBfX24gPSBfX2xhc3QgLSBfX2ZpcnN0OworICAgIHJldHVybiAoX19idWYtPl9NX3dyaXRlKF9fZmlyc3QsIF9fbikpOworICB9Cit9OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGJhc2ljX2ZpbGVidWY8PiBoZWxwZXIgZnVuY3Rpb25zLgorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3Igc3dpdGNoaW5nIGJldHdlZW4gbW9kZXMuCisKKy8vCisvLyBUaGlzIGNsYXNzIGhhZCB0byBiZSBkZXNpZ25lZCB2ZXJ5IGNhcmVmdWxseSB0byB3b3JrCisvLyB3aXRoIFZpc3VhbCBDKysuCisvLwordGVtcGxhdGUgPGNsYXNzIF9UcmFpdHM+CitjbGFzcyBfTm9jb252X2lucHV0IHsKK3B1YmxpYzoKKyAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjppbnRfdHlwZSBpbnRfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpjaGFyX3R5cGUgY2hhcl90eXBlOworCisgIHN0YXRpYyBpbmxpbmUgaW50X3R5cGUgX1NUTFBfQ0FMTAorICBfTV9kb2l0KGJhc2ljX2ZpbGVidWY8Y2hhcl90eXBlLCBfVHJhaXRzPiopCisgIHsgcmV0dXJuIF9UcmFpdHM6OmVvZigpOyB9Cit9OworCitfU1RMUF9URU1QTEFURV9OVUxMCitjbGFzcyBfTm9jb252X2lucHV0PGNoYXJfdHJhaXRzPGNoYXI+ID4geworcHVibGljOgorICBzdGF0aWMgaW5saW5lIGludCBfU1RMUF9DQUxMCisgIF9NX2RvaXQoYmFzaWNfZmlsZWJ1ZjxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+KiBfX2J1ZikgeworICAgIHJldHVybiBfX2J1Zi0+X01fZG9fbm9jb252X2lucHV0KCk7CisgIH0KK307CisKKy8vIHVuZGVyZmxvdygpIG1heSBiZSBjYWxsZWQgZm9yIG9uZSBvZiB0d28gcmVhc29ucy4gICgxKSBXZSd2ZQorLy8gYmVlbiBnb2luZyB0aHJvdWdoIHRoZSBzcGVjaWFsIHB1dGJhY2sgYnVmZmVyLCBhbmQgd2UgbmVlZCB0byBtb3ZlIGJhY2sKKy8vIHRvIHRoZSByZWd1bGFyIGludGVybmFsIGJ1ZmZlci4gICgyKSBXZSd2ZSBleGhhdXN0ZWQgdGhlIGludGVybmFsIGJ1ZmZlciwKKy8vIGFuZCB3ZSBuZWVkIHRvIHJlcGxlbnRpc2ggaXQuCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorY2xhc3MgX1VuZGVyZmxvdyB7CitwdWJsaWM6CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6aW50X3R5cGUgaW50X3R5cGU7CisgIHR5cGVkZWYgX1RyYWl0cyAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3R5cGU7CisKKyAgc3RhdGljIGludF90eXBlIF9TVExQX0NBTEwgX01fZG9pdChiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fdGhpcyk7Cit9OworCisKKy8vIFNwZWNpYWxpemF0aW9uIG9mIHVuZGVyZmxvdzogaWYgdGhlIGNoYXJhY3RlciB0eXBlIGlzIGNoYXIsIG1heWJlCisvLyB3ZSBjYW4gdXNlIG1tYXAgaW5zdGVhZCBvZiByZWFkLgorX1NUTFBfVEVNUExBVEVfTlVMTAorY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgX1VuZGVyZmxvdzwgY2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiB7CitwdWJsaWM6CisgIHR5cGVkZWYgY2hhcl90cmFpdHM8Y2hhcj46OmludF90eXBlIGludF90eXBlOworICB0eXBlZGVmIGNoYXJfdHJhaXRzPGNoYXI+IHRyYWl0c190eXBlOworICBzdGF0aWMgIGludCBfU1RMUF9DQUxMIF9NX2RvaXQoYmFzaWNfZmlsZWJ1ZjxjaGFyLCB0cmFpdHNfdHlwZSA+KiBfX3RoaXMpOworfTsKKworLy8gVGhlcmUgaXMgYSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIHVuZGVyZmxvdywgZm9yIGJhc2ljX2ZpbGVidWY8Y2hhcj4sCisvLyBpbiBmc3RyZWFtLmN4eC4KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK19TVExQX1RZUEVOQU1FX09OX1JFVFVSTl9UWVBFIF9VbmRlcmZsb3c8X0NoYXJULCBfVHJhaXRzPjo6aW50X3R5cGUgLy8gX1NUTFBfQ0FMTAorIF9VbmRlcmZsb3c8X0NoYXJULCBfVHJhaXRzPjo6X01fZG9pdChiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fdGhpcykgeworICBpZiAoIV9fdGhpcy0+X01faW5faW5wdXRfbW9kZSkgeworICAgIGlmICghX190aGlzLT5fTV9zd2l0Y2hfdG9faW5wdXRfbW9kZSgpKQorICAgICAgcmV0dXJuIHRyYWl0c190eXBlOjplb2YoKTsKKyAgfQorICBlbHNlIGlmIChfX3RoaXMtPl9NX2luX3B1dGJhY2tfbW9kZSkgeworICAgIF9fdGhpcy0+X01fZXhpdF9wdXRiYWNrX21vZGUoKTsKKyAgICBpZiAoX190aGlzLT5ncHRyKCkgIT0gX190aGlzLT5lZ3B0cigpKSB7CisgICAgICBpbnRfdHlwZSBfX2MgPSB0cmFpdHNfdHlwZTo6dG9faW50X3R5cGUoKl9fdGhpcy0+Z3B0cigpKTsKKyAgICAgIHJldHVybiBfX2M7CisgICAgfQorICB9CisKKyAgcmV0dXJuIF9fdGhpcy0+X01fdW5kZXJmbG93X2F1eCgpOworfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCkgJiYgIWRlZmluZWQgKF9TVExQX05PX1dDSEFSX1QpCitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgX1VuZGVyZmxvdzx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+OworI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ2xhc3MgYmFzaWNfaWZzdHJlYW08PgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorY2xhc3MgYmFzaWNfaWZzdHJlYW0gOiBwdWJsaWMgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+IHsKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHlwZXMKKyAgdHlwZWRlZiBfQ2hhclQgICAgICAgICAgICAgICAgICAgICBjaGFyX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6aW50X3R5cGUgaW50X3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6cG9zX3R5cGUgcG9zX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6b2ZmX3R5cGUgb2ZmX3R5cGU7CisgIHR5cGVkZWYgX1RyYWl0cyAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3R5cGU7CisKKyAgdHlwZWRlZiBiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPiAgICAgICAgICAgICAgICBfQmFzaWNfaW9zOworICB0eXBlZGVmIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgICAgICAgICAgIF9CYXNlOworICB0eXBlZGVmIGJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPiAgICAgICAgICAgIF9CdWY7CisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29uc3RydWN0b3JzLCBkZXN0cnVjdG9yLgorCisgIGJhc2ljX2lmc3RyZWFtKCkgOgorICAgIGJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+KCksICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4oMCksIF9NX2J1ZigpIHsKKyAgICAgIHRoaXMtPmluaXQoJl9NX2J1Zik7CisgIH0KKworICBleHBsaWNpdCBiYXNpY19pZnN0cmVhbShjb25zdCBjaGFyKiBfX3MsIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZCA9IGlvc19iYXNlOjppbikgOgorICAgIGJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+KCksICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4oMCksCisgICAgX01fYnVmKCkgeworICAgICAgdGhpcy0+aW5pdCgmX01fYnVmKTsKKyAgICAgIGlmICghX01fYnVmLm9wZW4oX19zLCBfX21vZCB8IGlvc19iYXNlOjppbikpCisgICAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKKyAgfQorCisjaWYgIWRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpCisgIGV4cGxpY2l0IGJhc2ljX2lmc3RyZWFtKGludCBfX2lkLCBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2QgPSBpb3NfYmFzZTo6aW4pIDoKKyAgICBiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPigpLCAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+KDApLCBfTV9idWYoKSB7CisgICAgdGhpcy0+aW5pdCgmX01fYnVmKTsKKyAgICBpZiAoIV9NX2J1Zi5vcGVuKF9faWQsIF9fbW9kIHwgaW9zX2Jhc2U6OmluKSkKKyAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKKyAgfQorICBiYXNpY19pZnN0cmVhbShjb25zdCBjaGFyKiBfX3MsIGlvc19iYXNlOjpvcGVubW9kZSBfX20sCisgICAgIGxvbmcgX19wcm90ZWN0aW9uKSA6CisgICAgYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz4oKSwgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPigwKSwgX01fYnVmKCkgeworICAgIHRoaXMtPmluaXQoJl9NX2J1Zik7CisgICAgaWYgKCFfTV9idWYub3BlbihfX3MsIF9fbSB8IGlvc19iYXNlOjppbiwgX19wcm90ZWN0aW9uKSkKKyAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKKyAgfQorCisjICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfV0lOMzJfSU8pCisgIGV4cGxpY2l0IGJhc2ljX2lmc3RyZWFtKF9TVExQX2ZkIF9faWQsIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZCA9IGlvc19iYXNlOjppbikgOgorICAgIGJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+KCksICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4oMCksIF9NX2J1ZigpIHsKKyAgICB0aGlzLT5pbml0KCZfTV9idWYpOworICAgIGlmICghX01fYnVmLm9wZW4oX19pZCwgX19tb2QgfCBpb3NfYmFzZTo6aW4pKQorICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworICB9CisjICBlbmRpZiAvKiBfU1RMUF9VU0VfV0lOMzJfSU8gKi8KKyNlbmRpZgorCisgIH5iYXNpY19pZnN0cmVhbSgpIHt9CisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlsZSBhbmQgYnVmZmVyIG9wZXJhdGlvbnMuCisgIGJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPiogcmRidWYoKSBjb25zdAorICAgIHsgcmV0dXJuIF9fQ09OU1RfQ0FTVChfQnVmKiwmX01fYnVmKTsgfQorCisgIGJvb2wgaXNfb3BlbigpIHsKKyAgICByZXR1cm4gdGhpcy0+cmRidWYoKS0+aXNfb3BlbigpOworICB9CisKKyAgdm9pZCBvcGVuKGNvbnN0IGNoYXIqIF9fcywgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kID0gaW9zX2Jhc2U6OmluKSB7CisgICAgaWYgKCF0aGlzLT5yZGJ1ZigpLT5vcGVuKF9fcywgX19tb2QgfCBpb3NfYmFzZTo6aW4pKQorICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworICB9CisKKyAgdm9pZCBjbG9zZSgpIHsKKyAgICBpZiAoIXRoaXMtPnJkYnVmKCktPmNsb3NlKCkpCisgICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7CisgIH0KKworcHJpdmF0ZToKKyAgYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+IF9NX2J1ZjsKK307CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDbGFzcyBiYXNpY19vZnN0cmVhbTw+CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitjbGFzcyBiYXNpY19vZnN0cmVhbSA6IHB1YmxpYyBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4geworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUeXBlcworICB0eXBlZGVmIF9DaGFyVCAgICAgICAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjppbnRfdHlwZSBpbnRfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpwb3NfdHlwZSBwb3NfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpvZmZfdHlwZSBvZmZfdHlwZTsKKyAgdHlwZWRlZiBfVHJhaXRzICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdHlwZTsKKworICB0eXBlZGVmIGJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+ICAgICAgICAgICAgICAgIF9CYXNpY19pb3M7CisgIHR5cGVkZWYgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICAgICAgICAgICAgX0Jhc2U7CisgIHR5cGVkZWYgYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+ICAgICAgICAgICAgX0J1ZjsKKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb25zdHJ1Y3RvcnMsIGRlc3RydWN0b3IuCisgIGJhc2ljX29mc3RyZWFtKCkgOgorICAgIGJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+KCksCisgICAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+KDApLCBfTV9idWYoKSB7CisgICAgICB0aGlzLT5pbml0KCZfTV9idWYpOworICB9CisgIGV4cGxpY2l0IGJhc2ljX29mc3RyZWFtKGNvbnN0IGNoYXIqIF9fcywgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kID0gaW9zX2Jhc2U6Om91dCkKKyAgICA6IGJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+KCksIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPigwKSwgX01fYnVmKCkgeworICAgIHRoaXMtPmluaXQoJl9NX2J1Zik7CisgICAgaWYgKCFfTV9idWYub3BlbihfX3MsIF9fbW9kIHwgaW9zX2Jhc2U6Om91dCkpCisgICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7CisgIH0KKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKQorICBleHBsaWNpdCBiYXNpY19vZnN0cmVhbShpbnQgX19pZCwgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kID0gaW9zX2Jhc2U6Om91dCkKKyAgICA6IGJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+KCksIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPigwKSwKKyAgICBfTV9idWYoKSB7CisgICB0aGlzLT5pbml0KCZfTV9idWYpOworICAgaWYgKCFfTV9idWYub3BlbihfX2lkLCBfX21vZCB8IGlvc19iYXNlOjpvdXQpKQorICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7CisgIH0KKyAgYmFzaWNfb2ZzdHJlYW0oY29uc3QgY2hhciogX19zLCBpb3NfYmFzZTo6b3Blbm1vZGUgX19tLCBsb25nIF9fcHJvdGVjdGlvbikgOgorICAgIGJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+KCksICBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4oMCksIF9NX2J1ZigpIHsKKyAgICB0aGlzLT5pbml0KCZfTV9idWYpOworICAgIGlmICghX01fYnVmLm9wZW4oX19zLCBfX20gfCBpb3NfYmFzZTo6b3V0LCBfX3Byb3RlY3Rpb24pKQorICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworICB9CisjICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfV0lOMzJfSU8pCisgIGV4cGxpY2l0IGJhc2ljX29mc3RyZWFtKF9TVExQX2ZkIF9faWQsIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZCA9IGlvc19iYXNlOjpvdXQpCisgICAgOiBiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPigpLCBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4oMCksCisgICAgX01fYnVmKCkgeworICAgdGhpcy0+aW5pdCgmX01fYnVmKTsKKyAgIGlmICghX01fYnVmLm9wZW4oX19pZCwgX19tb2QgfCBpb3NfYmFzZTo6b3V0KSkKKyAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworICB9CisjICBlbmRpZiAvKiBfU1RMUF9VU0VfV0lOMzJfSU8gKi8KKyNlbmRpZgorCisgIH5iYXNpY19vZnN0cmVhbSgpIHt9CisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlsZSBhbmQgYnVmZmVyIG9wZXJhdGlvbnMuCisgIGJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPiogcmRidWYoKSBjb25zdAorICAgIHsgcmV0dXJuIF9fQ09OU1RfQ0FTVChfQnVmKiwmX01fYnVmKTsgfQorCisgIGJvb2wgaXNfb3BlbigpIHsKKyAgICByZXR1cm4gdGhpcy0+cmRidWYoKS0+aXNfb3BlbigpOworICB9CisKKyAgdm9pZCBvcGVuKGNvbnN0IGNoYXIqIF9fcywgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kPSBpb3NfYmFzZTo6b3V0KSB7CisgICAgaWYgKCF0aGlzLT5yZGJ1ZigpLT5vcGVuKF9fcywgX19tb2QgfCBpb3NfYmFzZTo6b3V0KSkKKyAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKKyAgfQorCisgIHZvaWQgY2xvc2UoKSB7CisgICAgaWYgKCF0aGlzLT5yZGJ1ZigpLT5jbG9zZSgpKQorICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworICB9CisKK3ByaXZhdGU6CisgIGJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPiBfTV9idWY7Cit9OworCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ2xhc3MgYmFzaWNfZnN0cmVhbTw+CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitjbGFzcyBiYXNpY19mc3RyZWFtIDogcHVibGljIGJhc2ljX2lvc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4geworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUeXBlcworICB0eXBlZGVmIF9DaGFyVCAgICAgICAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjppbnRfdHlwZSBpbnRfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpwb3NfdHlwZSBwb3NfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpvZmZfdHlwZSBvZmZfdHlwZTsKKyAgdHlwZWRlZiBfVHJhaXRzICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdHlwZTsKKworICB0eXBlZGVmIGJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+ICAgICAgICAgICAgICAgIF9CYXNpY19pb3M7CisgIHR5cGVkZWYgYmFzaWNfaW9zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgICAgICAgICAgX0Jhc2U7CisgIHR5cGVkZWYgYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+ICAgICAgICAgICAgX0J1ZjsKKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb25zdHJ1Y3RvcnMsIGRlc3RydWN0b3IuCisKKyAgYmFzaWNfZnN0cmVhbSgpCisgICAgOiBiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPigpLCBiYXNpY19pb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+KDApLCBfTV9idWYoKSB7CisgICAgICB0aGlzLT5pbml0KCZfTV9idWYpOworICB9CisKKyAgZXhwbGljaXQgYmFzaWNfZnN0cmVhbShjb25zdCBjaGFyKiBfX3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kID0gaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6Om91dCkgOgorICAgIGJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+KCksIGJhc2ljX2lvc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4oMCksIF9NX2J1ZigpIHsKKyAgICAgIHRoaXMtPmluaXQoJl9NX2J1Zik7CisgICAgICBpZiAoIV9NX2J1Zi5vcGVuKF9fcywgX19tb2QpKQorICAgICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7CisgIH0KKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKQorICBleHBsaWNpdCBiYXNpY19mc3RyZWFtKGludCBfX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZCA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpIDoKKyAgICBiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPigpLCBiYXNpY19pb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+KDApLCBfTV9idWYoKSB7CisgICAgdGhpcy0+aW5pdCgmX01fYnVmKTsKKyAgICBpZiAoIV9NX2J1Zi5vcGVuKF9faWQsIF9fbW9kKSkKKyAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKKyAgfQorICBiYXNpY19mc3RyZWFtKGNvbnN0IGNoYXIqIF9fcywgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbSwgbG9uZyBfX3Byb3RlY3Rpb24pIDoKKyAgICBiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPigpLCAgYmFzaWNfaW9zdHJlYW08X0NoYXJULCBfVHJhaXRzPigwKSwgX01fYnVmKCkgeworICAgIHRoaXMtPmluaXQoJl9NX2J1Zik7CisgICAgaWYgKCFfTV9idWYub3BlbihfX3MsIF9fbSwgX19wcm90ZWN0aW9uKSkKKyAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKKyAgfQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1dJTjMyX0lPKQorICBleHBsaWNpdCBiYXNpY19mc3RyZWFtKF9TVExQX2ZkIF9faWQsCisgICAgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kID0gaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6Om91dCkgOgorICAgIGJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+KCksICBiYXNpY19pb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+KDApLCBfTV9idWYoKSB7CisgICAgdGhpcy0+aW5pdCgmX01fYnVmKTsKKyAgICBpZiAoIV9NX2J1Zi5vcGVuKF9faWQsIF9fbW9kKSkKKyAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKKyAgfQorIyAgZW5kaWYgLyogX1NUTFBfVVNFX1dJTjMyX0lPICovCisjZW5kaWYKKyAgfmJhc2ljX2ZzdHJlYW0oKSB7fQorCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpbGUgYW5kIGJ1ZmZlciBvcGVyYXRpb25zLgorCisgIGJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPiogcmRidWYoKSBjb25zdAorICAgIHsgcmV0dXJuIF9fQ09OU1RfQ0FTVChfQnVmKiwmX01fYnVmKTsgfQorCisgIGJvb2wgaXNfb3BlbigpIHsKKyAgICByZXR1cm4gdGhpcy0+cmRidWYoKS0+aXNfb3BlbigpOworICB9CisKKyAgdm9pZCBvcGVuKGNvbnN0IGNoYXIqIF9fcywKKyAgICAgIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZCA9CisgICAgICBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0KSB7CisgICAgaWYgKCF0aGlzLT5yZGJ1ZigpLT5vcGVuKF9fcywgX19tb2QpKQorICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworICB9CisKKyAgdm9pZCBjbG9zZSgpIHsKKyAgICBpZiAoIXRoaXMtPnJkYnVmKCktPmNsb3NlKCkpCisgICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7CisgIH0KKworcHJpdmF0ZToKKyAgYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+IF9NX2J1ZjsKKworI2lmIGRlZmluZWQgKF9TVExQX01TVkMpICYmIChfU1RMUF9NU1ZDID49IDEzMDAgJiYgX1NUTFBfTVNWQyA8PSAxMzEwKQorICB0eXBlZGVmIGJhc2ljX2ZzdHJlYW08X0NoYXJULCBfVHJhaXRzPiBfU2VsZjsKKyAgLy9leHBsaWNpdGVseSBkZWZpbmVkIGFzIHByaXZhdGUgdG8gYXZvaWQgd2FybmluZ3M6CisgIGJhc2ljX2ZzdHJlYW0oX1NlbGYgY29uc3QmKTsKKyAgX1NlbGYmIG9wZXJhdG9yID0gKF9TZWxmIGNvbnN0Jik7CisjZW5kaWYKK307CisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2lmIGRlZmluZWQgKF9TVExQX0VYUE9TRV9TVFJFQU1fSU1QTEVNRU5UQVRJT04pICYmICFkZWZpbmVkIChfU1RMUF9MSU5LX1RJTUVfSU5TVEFOVElBVElPTikKKyMgIGluY2x1ZGUgPHN0bC9fZnN0cmVhbS5jPgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCkKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBiYXNpY19pZnN0cmVhbTxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+OworX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIGJhc2ljX29mc3RyZWFtPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID47CitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgYmFzaWNfZnN0cmVhbTxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+OworIyAgaWYgISBkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQorX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIGJhc2ljX2lmc3RyZWFtPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID47CitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgYmFzaWNfb2ZzdHJlYW08d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPjsKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBiYXNpY19mc3RyZWFtPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID47CisjICBlbmRpZgorI2VuZGlmIC8qIF9TVExQX1VTRV9URU1QTEFURV9FWFBPUlQgKi8KKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYgLyogX1NUTFBfRlNUUkVBTSAqLworCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvX2Z1bmN0aW9uLmggYi9zdGwvX2Z1bmN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzlkNzg4OAotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9fZnVuY3Rpb24uaApAQCAtMCwwICsxLDQyNyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LTE5OTgKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKy8qIE5PVEU6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIFNUTCBoZWFkZXJzLgorICogICBZb3Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4KKyAqLworCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0ZVTkNUSU9OX0gKKyNkZWZpbmUgX1NUTFBfSU5URVJOQUxfRlVOQ1RJT05fSAorCisjaWZuZGVmIF9TVExQX1RZUEVfVFJBSVRTX0gKKyMgIGluY2x1ZGUgPHN0bC90eXBlX3RyYWl0cy5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfRlVOQ1RJT05fQkFTRV9ICisjICBpbmNsdWRlIDxzdGwvX2Z1bmN0aW9uX2Jhc2UuaD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBub3RfZXF1YWxfdG8gOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCwgX1RwLCBib29sPiB7CisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0IHsgcmV0dXJuIF9feCAhPSBfX3k7IH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgZ3JlYXRlciA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwLCBfVHAsIGJvb2w+IHsKKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QgeyByZXR1cm4gX194ID4gX195OyB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IGdyZWF0ZXJfZXF1YWwgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCwgX1RwLCBib29sPiB7CisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0IHsgcmV0dXJuIF9feCA+PSBfX3k7IH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgbGVzc19lcXVhbCA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwLCBfVHAsIGJvb2w+IHsKKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QgeyByZXR1cm4gX194IDw9IF9feTsgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBkaXZpZGVzIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAsIF9UcCwgX1RwPiB7CisgIF9UcCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QgeyByZXR1cm4gX194IC8gX195OyB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IG1vZHVsdXMgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCwgX1RwLCBfVHA+IHsKKyAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdCB7IHJldHVybiBfX3ggJSBfX3k7IH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgbmVnYXRlIDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPF9UcCwgX1RwPiB7CisgIF9UcCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194KSBjb25zdCB7IHJldHVybiAtX194OyB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IGxvZ2ljYWxfYW5kIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAsIF9UcCwgYm9vbD4geworICBib29sIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdCB7IHJldHVybiBfX3ggJiYgX195OyB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IGxvZ2ljYWxfb3IgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCwgX1RwLGJvb2w+IHsKKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QgeyByZXR1cm4gX194IHx8IF9feTsgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBsb2dpY2FsX25vdCA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxfVHAsIGJvb2w+IHsKKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194KSBjb25zdCB7IHJldHVybiAhX194OyB9Cit9OworCisjaWYgIWRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpCisvLyBpZGVudGl0eV9lbGVtZW50IChub3QgcGFydCBvZiB0aGUgQysrIHN0YW5kYXJkKS4KK3RlbXBsYXRlIDxjbGFzcyBfVHA+IGlubGluZSBfVHAgaWRlbnRpdHlfZWxlbWVudChwbHVzPF9UcD4pIHsgIHJldHVybiBfVHAoMCk7IH0KK3RlbXBsYXRlIDxjbGFzcyBfVHA+IGlubGluZSBfVHAgaWRlbnRpdHlfZWxlbWVudChtdWx0aXBsaWVzPF9UcD4pIHsgcmV0dXJuIF9UcCgxKTsgfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9CQVNFX1RZUEVERUZfQlVHKQorLy8gdGhpcyB3b3JrYXJvdW5kIGlzIG5lZWRlZCBmb3IgU3VuUHJvIDQuMC4xCisvLyBzdWdnZXN0ZWQgYnkgIk1hcnRpbiBBYmVybmV0aHkiIDxnbWFAcGFzdG9uLmNvLnVrPjoKKworLy8gV2UgaGF2ZSB0byBpbnRyb2R1Y2UgdGhlIFhYYXJ5X3ByZWRpY2F0ZV9hdXggc3RydWN0dXJlcyBpbiBvcmRlciB0bworLy8gYWNjZXNzIHRoZSBhcmd1bWVudCBhbmQgcmV0dXJuIHR5cGVzIG9mIHByZWRpY2F0ZSBmdW5jdGlvbnMgc3VwcGxpZWQKKy8vIGFzIHR5cGUgcGFyYW1ldGVycy4gU1VOIEMrKyA0LjAuMSBjb21waWxlciBnaXZlcyBlcnJvcnMgZm9yIHRlbXBsYXRlIHR5cGUgcGFyYW1ldGVycworLy8gb2YgdGhlIGZvcm0gJ25hbWUxOjpuYW1lMicsIHdoZXJlIG5hbWUxIGlzIGl0c2VsZiBhIHR5cGUgcGFyYW1ldGVyLgordGVtcGxhdGUgPGNsYXNzIF9QYWlyPgorc3RydWN0IF9fcGFpcl9hdXggOiBwcml2YXRlIF9QYWlyIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUGFpcjo6Zmlyc3RfdHlwZSBmaXJzdF90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9QYWlyOjpzZWNvbmRfdHlwZSBzZWNvbmRfdHlwZTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfT3BlcmF0aW9uPgorc3RydWN0IF9fdW5hcnlfZnVuX2F1eCA6IHByaXZhdGUgX09wZXJhdGlvbiB7CisgIHR5cGVkZWYgdHlwZW5hbWUgX09wZXJhdGlvbjo6YXJndW1lbnRfdHlwZSBhcmd1bWVudF90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9PcGVyYXRpb246OnJlc3VsdF90eXBlIHJlc3VsdF90eXBlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9PcGVyYXRpb24+CitzdHJ1Y3QgX19iaW5hcnlfZnVuX2F1eCAgOiBwcml2YXRlIF9PcGVyYXRpb24geworICB0eXBlZGVmIHR5cGVuYW1lIF9PcGVyYXRpb246OmZpcnN0X2FyZ3VtZW50X3R5cGUgZmlyc3RfYXJndW1lbnRfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfT3BlcmF0aW9uOjpzZWNvbmRfYXJndW1lbnRfdHlwZSBzZWNvbmRfYXJndW1lbnRfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfT3BlcmF0aW9uOjpyZXN1bHRfdHlwZSByZXN1bHRfdHlwZTsKK307CisKKyMgIGRlZmluZSBfX1VOQVJZX0FSRyhfX09wZXJhdGlvbixfX3R5cGUpICBfX3VuYXJ5X2Z1bl9hdXg8X19PcGVyYXRpb24+OjpfX3R5cGUKKyMgIGRlZmluZSBfX0JJTkFSWV9BUkcoX19PcGVyYXRpb24sX190eXBlKSAgX19iaW5hcnlfZnVuX2F1eDxfX09wZXJhdGlvbj46Ol9fdHlwZQorIyAgZGVmaW5lIF9fUEFJUl9BUkcoX19QYWlyLF9fdHlwZSkgIF9fcGFpcl9hdXg8X19QYWlyPjo6X190eXBlCisjZWxzZQorIyAgZGVmaW5lIF9fVU5BUllfQVJHKF9fT3BlcmF0aW9uLF9fdHlwZSkgIF9fT3BlcmF0aW9uOjpfX3R5cGUKKyMgIGRlZmluZSBfX0JJTkFSWV9BUkcoX19PcGVyYXRpb24sX190eXBlKSBfX09wZXJhdGlvbjo6X190eXBlCisjICBkZWZpbmUgX19QQUlSX0FSRyhfX1BhaXIsX190eXBlKSBfX1BhaXI6Ol9fdHlwZQorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfUHJlZGljYXRlPgorY2xhc3MgdW5hcnlfbmVnYXRlCisgICAgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248dHlwZW5hbWUgX19VTkFSWV9BUkcoX1ByZWRpY2F0ZSwgYXJndW1lbnRfdHlwZSksIGJvb2w+IHsKKyAgdHlwZWRlZiB1bmFyeV9mdW5jdGlvbjx0eXBlbmFtZSBfX1VOQVJZX0FSRyhfUHJlZGljYXRlLCBhcmd1bWVudF90eXBlKSwgYm9vbD4gX0Jhc2U7CitwdWJsaWM6CisgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmFyZ3VtZW50X3R5cGUgYXJndW1lbnRfdHlwZTsKK3ByaXZhdGU6CisgIHR5cGVkZWYgdHlwZW5hbWUgX19jYWxsX3RyYWl0czxhcmd1bWVudF90eXBlPjo6cGFyYW1fdHlwZSBfQXJnUGFyYW1UeXBlOworcHJvdGVjdGVkOgorICBfUHJlZGljYXRlIF9NX3ByZWQ7CitwdWJsaWM6CisgIGV4cGxpY2l0IHVuYXJ5X25lZ2F0ZShjb25zdCBfUHJlZGljYXRlJiBfX3gpIDogX01fcHJlZChfX3gpIHt9CisgIGJvb2wgb3BlcmF0b3IoKShfQXJnUGFyYW1UeXBlIF9feCkgY29uc3QgeworICAgIHJldHVybiAhX01fcHJlZChfX3gpOworICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1ByZWRpY2F0ZT4KK2lubGluZSB1bmFyeV9uZWdhdGU8X1ByZWRpY2F0ZT4KK25vdDEoY29uc3QgX1ByZWRpY2F0ZSYgX19wcmVkKSB7CisgIHJldHVybiB1bmFyeV9uZWdhdGU8X1ByZWRpY2F0ZT4oX19wcmVkKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9QcmVkaWNhdGU+CitjbGFzcyBiaW5hcnlfbmVnYXRlCisgICAgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPHR5cGVuYW1lIF9fQklOQVJZX0FSRyhfUHJlZGljYXRlLCBmaXJzdF9hcmd1bWVudF90eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX19CSU5BUllfQVJHKF9QcmVkaWNhdGUsIHNlY29uZF9hcmd1bWVudF90eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbD4geworICB0eXBlZGVmIGJpbmFyeV9mdW5jdGlvbjx0eXBlbmFtZSBfX0JJTkFSWV9BUkcoX1ByZWRpY2F0ZSwgZmlyc3RfYXJndW1lbnRfdHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9fQklOQVJZX0FSRyhfUHJlZGljYXRlLCBzZWNvbmRfYXJndW1lbnRfdHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2w+IF9CYXNlOworcHVibGljOgorICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpmaXJzdF9hcmd1bWVudF90eXBlIGZpcnN0X2FyZ3VtZW50X3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnNlY29uZF9hcmd1bWVudF90eXBlIHNlY29uZF9hcmd1bWVudF90eXBlOworcHJpdmF0ZToKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX2NhbGxfdHJhaXRzPGZpcnN0X2FyZ3VtZW50X3R5cGU+OjpwYXJhbV90eXBlIF9Gc3RBcmdQYXJhbVR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX19jYWxsX3RyYWl0czxzZWNvbmRfYXJndW1lbnRfdHlwZT46OnBhcmFtX3R5cGUgX1NuZEFyZ1BhcmFtVHlwZTsKK3Byb3RlY3RlZDoKKyAgX1ByZWRpY2F0ZSBfTV9wcmVkOworcHVibGljOgorICBleHBsaWNpdCBiaW5hcnlfbmVnYXRlKGNvbnN0IF9QcmVkaWNhdGUmIF9feCkgOiBfTV9wcmVkKF9feCkge30KKyAgYm9vbCBvcGVyYXRvcigpKF9Gc3RBcmdQYXJhbVR5cGUgX194LCBfU25kQXJnUGFyYW1UeXBlIF9feSkgY29uc3QgeworICAgIHJldHVybiAhX01fcHJlZChfX3gsIF9feSk7CisgIH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfUHJlZGljYXRlPgoraW5saW5lIGJpbmFyeV9uZWdhdGU8X1ByZWRpY2F0ZT4KK25vdDIoY29uc3QgX1ByZWRpY2F0ZSYgX19wcmVkKSB7CisgIHJldHVybiBiaW5hcnlfbmVnYXRlPF9QcmVkaWNhdGU+KF9fcHJlZCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfT3BlcmF0aW9uPgorY2xhc3MgYmluZGVyMXN0IDoKKyAgICBwdWJsaWMgdW5hcnlfZnVuY3Rpb248dHlwZW5hbWUgX19CSU5BUllfQVJHKF9PcGVyYXRpb24sIHNlY29uZF9hcmd1bWVudF90eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX19CSU5BUllfQVJHKF9PcGVyYXRpb24sIHJlc3VsdF90eXBlKSA+IHsKKyAgdHlwZWRlZiB1bmFyeV9mdW5jdGlvbjx0eXBlbmFtZSBfX0JJTkFSWV9BUkcoX09wZXJhdGlvbiwgc2Vjb25kX2FyZ3VtZW50X3R5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9fQklOQVJZX0FSRyhfT3BlcmF0aW9uLCByZXN1bHRfdHlwZSkgPiBfQmFzZTsKK3B1YmxpYzoKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6YXJndW1lbnRfdHlwZSBhcmd1bWVudF90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpyZXN1bHRfdHlwZSByZXN1bHRfdHlwZTsKK3ByaXZhdGU6CisgIHR5cGVkZWYgdHlwZW5hbWUgX19jYWxsX3RyYWl0czxhcmd1bWVudF90eXBlPjo6cGFyYW1fdHlwZSBfQXJnUGFyYW1UeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9fY2FsbF90cmFpdHM8dHlwZW5hbWUgX09wZXJhdGlvbjo6Zmlyc3RfYXJndW1lbnRfdHlwZT46OnBhcmFtX3R5cGUgX1ZhbHVlUGFyYW1UeXBlOworcHJvdGVjdGVkOgorICAvL29wIGlzIGEgU3RhbmRhcmQgbmFtZSAoMjAuMy42LjEpLCBkbyBubyBtYWtlIGl0IFNUTHBvcnQgbmFtaW5nIGNvbnZlbnRpb24gY29tcGxpYW50LgorICBfT3BlcmF0aW9uIG9wOworICB0eXBlbmFtZSBfT3BlcmF0aW9uOjpmaXJzdF9hcmd1bWVudF90eXBlIF9NX3ZhbHVlOworcHVibGljOgorICBiaW5kZXIxc3QoY29uc3QgX09wZXJhdGlvbiYgX194LCBfVmFsdWVQYXJhbVR5cGUgX195KQorICAgICAgOiBvcChfX3gpLCBfTV92YWx1ZShfX3kpIHt9CisKKyAgcmVzdWx0X3R5cGUgb3BlcmF0b3IoKShfQXJnUGFyYW1UeXBlIF9feCkgY29uc3QgeworICAgIHJldHVybiBvcChfTV92YWx1ZSwgX194KTsKKyAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9PcGVyYXRpb24sIGNsYXNzIF9UcD4KK2lubGluZSBiaW5kZXIxc3Q8X09wZXJhdGlvbj4KK2JpbmQxc3QoY29uc3QgX09wZXJhdGlvbiYgX19mbiwgY29uc3QgX1RwJiBfX3gpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfT3BlcmF0aW9uOjpmaXJzdF9hcmd1bWVudF90eXBlIF9BcmcxX3R5cGU7CisgIHJldHVybiBiaW5kZXIxc3Q8X09wZXJhdGlvbj4oX19mbiwgX0FyZzFfdHlwZShfX3gpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9PcGVyYXRpb24+CitjbGFzcyBiaW5kZXIybmQKKyAgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248dHlwZW5hbWUgX19CSU5BUllfQVJHKF9PcGVyYXRpb24sIGZpcnN0X2FyZ3VtZW50X3R5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfX0JJTkFSWV9BUkcoX09wZXJhdGlvbiwgcmVzdWx0X3R5cGUpPiB7CisgIHR5cGVkZWYgdW5hcnlfZnVuY3Rpb248dHlwZW5hbWUgX19CSU5BUllfQVJHKF9PcGVyYXRpb24sIGZpcnN0X2FyZ3VtZW50X3R5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9fQklOQVJZX0FSRyhfT3BlcmF0aW9uLCByZXN1bHRfdHlwZSk+IF9CYXNlOworcHVibGljOgorICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjphcmd1bWVudF90eXBlIGFyZ3VtZW50X3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnJlc3VsdF90eXBlIHJlc3VsdF90eXBlOworcHJpdmF0ZToKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX2NhbGxfdHJhaXRzPGFyZ3VtZW50X3R5cGU+OjpwYXJhbV90eXBlIF9BcmdQYXJhbVR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX19jYWxsX3RyYWl0czx0eXBlbmFtZSBfT3BlcmF0aW9uOjpzZWNvbmRfYXJndW1lbnRfdHlwZT46OnBhcmFtX3R5cGUgX1ZhbHVlUGFyYW1UeXBlOworcHJvdGVjdGVkOgorICAvL29wIGlzIGEgU3RhbmRhcmQgbmFtZSAoMjAuMy42LjMpLCBkbyBubyBtYWtlIGl0IFNUTHBvcnQgbmFtaW5nIGNvbnZlbnRpb24gY29tcGxpYW50LgorICBfT3BlcmF0aW9uIG9wOworICB0eXBlbmFtZSBfT3BlcmF0aW9uOjpzZWNvbmRfYXJndW1lbnRfdHlwZSB2YWx1ZTsKK3B1YmxpYzoKKyAgYmluZGVyMm5kKGNvbnN0IF9PcGVyYXRpb24mIF9feCwgX1ZhbHVlUGFyYW1UeXBlIF9feSkKKyAgICAgIDogb3AoX194KSwgdmFsdWUoX195KSB7fQorCisgIHJlc3VsdF90eXBlIG9wZXJhdG9yKCkoX0FyZ1BhcmFtVHlwZSBfX3gpIGNvbnN0IHsKKyAgICByZXR1cm4gb3AoX194LCB2YWx1ZSk7CisgIH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfT3BlcmF0aW9uLCBjbGFzcyBfVHA+CitpbmxpbmUgYmluZGVyMm5kPF9PcGVyYXRpb24+CitiaW5kMm5kKGNvbnN0IF9PcGVyYXRpb24mIF9fZm4sIGNvbnN0IF9UcCYgX194KSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgX09wZXJhdGlvbjo6c2Vjb25kX2FyZ3VtZW50X3R5cGUgX0FyZzJfdHlwZTsKKyAgcmV0dXJuIGJpbmRlcjJuZDxfT3BlcmF0aW9uPihfX2ZuLCBfQXJnMl90eXBlKF9feCkpOworfQorCisjaWYgIWRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpCisvLyB1bmFyeV9jb21wb3NlIGFuZCBiaW5hcnlfY29tcG9zZSAoZXh0ZW5zaW9ucywgbm90IHBhcnQgb2YgdGhlIHN0YW5kYXJkKS4KKwordGVtcGxhdGUgPGNsYXNzIF9PcGVyYXRpb24xLCBjbGFzcyBfT3BlcmF0aW9uMj4KK2NsYXNzIHVuYXJ5X2NvbXBvc2UgOgorICBwdWJsaWMgdW5hcnlfZnVuY3Rpb248dHlwZW5hbWUgX19VTkFSWV9BUkcoX09wZXJhdGlvbjIsIGFyZ3VtZW50X3R5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX19VTkFSWV9BUkcoX09wZXJhdGlvbjEsIHJlc3VsdF90eXBlKT4geworICB0eXBlZGVmIHVuYXJ5X2Z1bmN0aW9uPHR5cGVuYW1lIF9fVU5BUllfQVJHKF9PcGVyYXRpb24yLCBhcmd1bWVudF90eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfX1VOQVJZX0FSRyhfT3BlcmF0aW9uMSwgcmVzdWx0X3R5cGUpPiBfQmFzZTsKK3B1YmxpYzoKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6YXJndW1lbnRfdHlwZSBhcmd1bWVudF90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpyZXN1bHRfdHlwZSByZXN1bHRfdHlwZTsKK3ByaXZhdGU6CisgIHR5cGVkZWYgdHlwZW5hbWUgX19jYWxsX3RyYWl0czxhcmd1bWVudF90eXBlPjo6cGFyYW1fdHlwZSBfQXJnUGFyYW1UeXBlOworcHJvdGVjdGVkOgorICBfT3BlcmF0aW9uMSBfTV9mbjE7CisgIF9PcGVyYXRpb24yIF9NX2ZuMjsKK3B1YmxpYzoKKyAgdW5hcnlfY29tcG9zZShjb25zdCBfT3BlcmF0aW9uMSYgX194LCBjb25zdCBfT3BlcmF0aW9uMiYgX195KQorICAgIDogX01fZm4xKF9feCksIF9NX2ZuMihfX3kpIHt9CisKKyAgcmVzdWx0X3R5cGUgb3BlcmF0b3IoKShfQXJnUGFyYW1UeXBlIF9feCkgY29uc3QgeworICAgIHJldHVybiBfTV9mbjEoX01fZm4yKF9feCkpOworICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX09wZXJhdGlvbjEsIGNsYXNzIF9PcGVyYXRpb24yPgoraW5saW5lIHVuYXJ5X2NvbXBvc2U8X09wZXJhdGlvbjEsX09wZXJhdGlvbjI+Citjb21wb3NlMShjb25zdCBfT3BlcmF0aW9uMSYgX19mbjEsIGNvbnN0IF9PcGVyYXRpb24yJiBfX2ZuMikgeworICByZXR1cm4gdW5hcnlfY29tcG9zZTxfT3BlcmF0aW9uMSxfT3BlcmF0aW9uMj4oX19mbjEsIF9fZm4yKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9PcGVyYXRpb24xLCBjbGFzcyBfT3BlcmF0aW9uMiwgY2xhc3MgX09wZXJhdGlvbjM+CitjbGFzcyBiaW5hcnlfY29tcG9zZSA6CisgICAgcHVibGljIHVuYXJ5X2Z1bmN0aW9uPHR5cGVuYW1lIF9fVU5BUllfQVJHKF9PcGVyYXRpb24yLCBhcmd1bWVudF90eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX19CSU5BUllfQVJHKF9PcGVyYXRpb24xLCByZXN1bHRfdHlwZSk+IHsKKyAgdHlwZWRlZiB1bmFyeV9mdW5jdGlvbjx0eXBlbmFtZSBfX1VOQVJZX0FSRyhfT3BlcmF0aW9uMiwgYXJndW1lbnRfdHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX19CSU5BUllfQVJHKF9PcGVyYXRpb24xLCByZXN1bHRfdHlwZSk+IF9CYXNlOworcHVibGljOgorICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjphcmd1bWVudF90eXBlIGFyZ3VtZW50X3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnJlc3VsdF90eXBlIHJlc3VsdF90eXBlOworcHJpdmF0ZToKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX2NhbGxfdHJhaXRzPGFyZ3VtZW50X3R5cGU+OjpwYXJhbV90eXBlIF9BcmdQYXJhbVR5cGU7Citwcm90ZWN0ZWQ6CisgIF9PcGVyYXRpb24xIF9NX2ZuMTsKKyAgX09wZXJhdGlvbjIgX01fZm4yOworICBfT3BlcmF0aW9uMyBfTV9mbjM7CitwdWJsaWM6CisgIGJpbmFyeV9jb21wb3NlKGNvbnN0IF9PcGVyYXRpb24xJiBfX3gsIGNvbnN0IF9PcGVyYXRpb24yJiBfX3ksCisgICAgICAgICAgICAgICAgIGNvbnN0IF9PcGVyYXRpb24zJiBfX3opCisgICAgOiBfTV9mbjEoX194KSwgX01fZm4yKF9feSksIF9NX2ZuMyhfX3opIHsgfQorCisgIHJlc3VsdF90eXBlIG9wZXJhdG9yKCkoX0FyZ1BhcmFtVHlwZSBfX3gpIGNvbnN0IHsKKyAgICByZXR1cm4gX01fZm4xKF9NX2ZuMihfX3gpLCBfTV9mbjMoX194KSk7CisgIH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfT3BlcmF0aW9uMSwgY2xhc3MgX09wZXJhdGlvbjIsIGNsYXNzIF9PcGVyYXRpb24zPgoraW5saW5lIGJpbmFyeV9jb21wb3NlPF9PcGVyYXRpb24xLCBfT3BlcmF0aW9uMiwgX09wZXJhdGlvbjM+Citjb21wb3NlMihjb25zdCBfT3BlcmF0aW9uMSYgX19mbjEsIGNvbnN0IF9PcGVyYXRpb24yJiBfX2ZuMiwKKyAgICAgICAgIGNvbnN0IF9PcGVyYXRpb24zJiBfX2ZuMykgeworICByZXR1cm4gYmluYXJ5X2NvbXBvc2U8X09wZXJhdGlvbjEsX09wZXJhdGlvbjIsX09wZXJhdGlvbjM+KF9fZm4xLCBfX2ZuMiwgX19mbjMpOworfQorCisvLyBpZGVudGl0eSBpcyBhbiBleHRlbnNpb246IGl0IGlzIG5vdCBwYXJ0IG9mIHRoZSBzdGFuZGFyZC4KK3RlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCBpZGVudGl0eSA6IHB1YmxpYyBfU1RMUF9QUklWIF9JZGVudGl0eTxfVHA+IHt9OworLy8gc2VsZWN0MXN0IGFuZCBzZWxlY3QybmQgYXJlIGV4dGVuc2lvbnM6IHRoZXkgYXJlIG5vdCBwYXJ0IG9mIHRoZSBzdGFuZGFyZC4KK3RlbXBsYXRlIDxjbGFzcyBfUGFpcj4gc3RydWN0IHNlbGVjdDFzdCA6IHB1YmxpYyBfU1RMUF9QUklWIF9TZWxlY3Qxc3Q8X1BhaXI+IHt9OwordGVtcGxhdGUgPGNsYXNzIF9QYWlyPiBzdHJ1Y3Qgc2VsZWN0Mm5kIDogcHVibGljIF9TVExQX1BSSVYgX1NlbGVjdDJuZDxfUGFpcj4ge307CisKK3RlbXBsYXRlIDxjbGFzcyBfQXJnMSwgY2xhc3MgX0FyZzI+CitzdHJ1Y3QgcHJvamVjdDFzdCA6IHB1YmxpYyBfU1RMUF9QUklWIF9Qcm9qZWN0MXN0PF9BcmcxLCBfQXJnMj4ge307CisKK3RlbXBsYXRlIDxjbGFzcyBfQXJnMSwgY2xhc3MgX0FyZzI+CitzdHJ1Y3QgcHJvamVjdDJuZCA6IHB1YmxpYyBfU1RMUF9QUklWIF9Qcm9qZWN0Mm5kPF9BcmcxLCBfQXJnMj4ge307CisKKworLy8gY29uc3RhbnRfdm9pZF9mdW4sIGNvbnN0YW50X3VuYXJ5X2Z1biwgYW5kIGNvbnN0YW50X2JpbmFyeV9mdW4gYXJlCisvLyBleHRlbnNpb25zOiB0aGV5IGFyZSBub3QgcGFydCBvZiB0aGUgc3RhbmRhcmQuICAoVGhlIHNhbWUsIG9mIGNvdXJzZSwKKy8vIGlzIHRydWUgb2YgdGhlIGhlbHBlciBmdW5jdGlvbnMgY29uc3RhbnQwLCBjb25zdGFudDEsIGFuZCBjb25zdGFudDIuKQorCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfUmVzdWx0Pgorc3RydWN0IF9Db25zdGFudF92b2lkX2Z1biB7CisgIHR5cGVkZWYgX1Jlc3VsdCByZXN1bHRfdHlwZTsKKyAgcmVzdWx0X3R5cGUgX01fdmFsOworCisgIF9Db25zdGFudF92b2lkX2Z1bihjb25zdCByZXN1bHRfdHlwZSYgX192KSA6IF9NX3ZhbChfX3YpIHt9CisgIGNvbnN0IHJlc3VsdF90eXBlJiBvcGVyYXRvcigpKCkgY29uc3QgeyByZXR1cm4gX01fdmFsOyB9Cit9OworCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9SZXN1bHQ+CitzdHJ1Y3QgY29uc3RhbnRfdm9pZF9mdW4gOiBwdWJsaWMgX1NUTFBfUFJJViBfQ29uc3RhbnRfdm9pZF9mdW48X1Jlc3VsdD4geworICBjb25zdGFudF92b2lkX2Z1bihjb25zdCBfUmVzdWx0JiBfX3YpCisgICAgOiBfU1RMUF9QUklWIF9Db25zdGFudF92b2lkX2Z1bjxfUmVzdWx0PihfX3YpIHt9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1Jlc3VsdCwgX1NUTFBfREZMX1RNUExfUEFSQU0oIF9Bcmd1bWVudCAsIF9SZXN1bHQpID4KK3N0cnVjdCBjb25zdGFudF91bmFyeV9mdW4gOiBwdWJsaWMgX1NUTFBfUFJJViBfQ29uc3RhbnRfdW5hcnlfZnVuPF9SZXN1bHQsIF9Bcmd1bWVudD4geworICBjb25zdGFudF91bmFyeV9mdW4oY29uc3QgX1Jlc3VsdCYgX192KQorICAgIDogX1NUTFBfUFJJViBfQ29uc3RhbnRfdW5hcnlfZnVuPF9SZXN1bHQsIF9Bcmd1bWVudD4oX192KSB7fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9SZXN1bHQsIF9TVExQX0RGTF9UTVBMX1BBUkFNKCBfQXJnMSAsIF9SZXN1bHQpLCBfU1RMUF9ERkxfVE1QTF9QQVJBTSggX0FyZzIgLCBfQXJnMSkgPgorc3RydWN0IGNvbnN0YW50X2JpbmFyeV9mdW4KKyAgOiBwdWJsaWMgX1NUTFBfUFJJViBfQ29uc3RhbnRfYmluYXJ5X2Z1bjxfUmVzdWx0LCBfQXJnMSwgX0FyZzI+IHsKKyAgY29uc3RhbnRfYmluYXJ5X2Z1bihjb25zdCBfUmVzdWx0JiBfX3YpCisgICAgOiBfU1RMUF9QUklWIF9Db25zdGFudF9iaW5hcnlfZnVuPF9SZXN1bHQsIF9BcmcxLCBfQXJnMj4oX192KSB7fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9SZXN1bHQ+CitpbmxpbmUgY29uc3RhbnRfdm9pZF9mdW48X1Jlc3VsdD4gY29uc3RhbnQwKGNvbnN0IF9SZXN1bHQmIF9fdmFsKSB7CisgIHJldHVybiBjb25zdGFudF92b2lkX2Z1bjxfUmVzdWx0PihfX3ZhbCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfUmVzdWx0PgoraW5saW5lIGNvbnN0YW50X3VuYXJ5X2Z1bjxfUmVzdWx0LF9SZXN1bHQ+IGNvbnN0YW50MShjb25zdCBfUmVzdWx0JiBfX3ZhbCkgeworICByZXR1cm4gY29uc3RhbnRfdW5hcnlfZnVuPF9SZXN1bHQsX1Jlc3VsdD4oX192YWwpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1Jlc3VsdD4KK2lubGluZSBjb25zdGFudF9iaW5hcnlfZnVuPF9SZXN1bHQsX1Jlc3VsdCxfUmVzdWx0PgorY29uc3RhbnQyKGNvbnN0IF9SZXN1bHQmIF9fdmFsKSB7CisgIHJldHVybiBjb25zdGFudF9iaW5hcnlfZnVuPF9SZXN1bHQsX1Jlc3VsdCxfUmVzdWx0PihfX3ZhbCk7Cit9CisKKy8vIHN1YnRyYWN0aXZlX3JuZyBpcyBhbiBleHRlbnNpb246IGl0IGlzIG5vdCBwYXJ0IG9mIHRoZSBzdGFuZGFyZC4KKy8vIE5vdGU6IHRoaXMgY29kZSBhc3N1bWVzIHRoYXQgaW50IGlzIDMyIGJpdHMuCitjbGFzcyBzdWJ0cmFjdGl2ZV9ybmcgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248X1NUTFBfVUlOVDMyX1QsIF9TVExQX1VJTlQzMl9UPiB7Citwcml2YXRlOgorICBfU1RMUF9VSU5UMzJfVCBfTV90YWJsZVs1NV07CisgIF9TVExQX1VJTlQzMl9UIF9NX2luZGV4MTsKKyAgX1NUTFBfVUlOVDMyX1QgX01faW5kZXgyOworcHVibGljOgorICBfU1RMUF9VSU5UMzJfVCBvcGVyYXRvcigpKF9TVExQX1VJTlQzMl9UIF9fbGltaXQpIHsKKyAgICBfTV9pbmRleDEgPSAoX01faW5kZXgxICsgMSkgJSA1NTsKKyAgICBfTV9pbmRleDIgPSAoX01faW5kZXgyICsgMSkgJSA1NTsKKyAgICBfTV90YWJsZVtfTV9pbmRleDFdID0gX01fdGFibGVbX01faW5kZXgxXSAtIF9NX3RhYmxlW19NX2luZGV4Ml07CisgICAgcmV0dXJuIF9NX3RhYmxlW19NX2luZGV4MV0gJSBfX2xpbWl0OworICB9CisKKyAgdm9pZCBfTV9pbml0aWFsaXplKF9TVExQX1VJTlQzMl9UIF9fc2VlZCkgeworICAgIF9TVExQX1VJTlQzMl9UIF9fayA9IDE7CisgICAgX01fdGFibGVbNTRdID0gX19zZWVkOworICAgIF9TVExQX1VJTlQzMl9UIF9faTsKKyAgICBmb3IgKF9faSA9IDA7IF9faSA8IDU0OyBfX2krKykgeworICAgICAgICBfU1RMUF9VSU5UMzJfVCBfX2lpID0gKDIxICogKF9faSArIDEpICUgNTUpIC0gMTsKKyAgICAgICAgX01fdGFibGVbX19paV0gPSBfX2s7CisgICAgICAgIF9fayA9IF9fc2VlZCAtIF9fazsKKyAgICAgICAgX19zZWVkID0gX01fdGFibGVbX19paV07CisgICAgfQorICAgIGZvciAoaW50IF9fbG9vcCA9IDA7IF9fbG9vcCA8IDQ7IF9fbG9vcCsrKSB7CisgICAgICAgIGZvciAoX19pID0gMDsgX19pIDwgNTU7IF9faSsrKQorICAgICAgICAgICAgX01fdGFibGVbX19pXSA9IF9NX3RhYmxlW19faV0gLSBfTV90YWJsZVsoMSArIF9faSArIDMwKSAlIDU1XTsKKyAgICB9CisgICAgX01faW5kZXgxID0gMDsKKyAgICBfTV9pbmRleDIgPSAzMTsKKyAgfQorCisgIHN1YnRyYWN0aXZlX3JuZyh1bnNpZ25lZCBpbnQgX19zZWVkKSB7IF9NX2luaXRpYWxpemUoX19zZWVkKTsgfQorICBzdWJ0cmFjdGl2ZV9ybmcoKSB7IF9NX2luaXRpYWxpemUoMTYxODAzMzk4dWwpOyB9Cit9OworCisjZW5kaWYgLyogX1NUTFBfTk9fRVhURU5TSU9OUyAqLworCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNpbmNsdWRlIDxzdGwvX2Z1bmN0aW9uX2FkYXB0b3JzLmg+CisKKyNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9GVU5DVElPTl9IICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvX2Z1bmN0aW9uX2FkYXB0b3JzLmggYi9zdGwvX2Z1bmN0aW9uX2FkYXB0b3JzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWViODVlNwotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9fZnVuY3Rpb25fYWRhcHRvcnMuaApAQCAtMCwwICsxLDgwMiBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LTE5OTgKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogQ29weXJpZ2h0IChjKSAyMDAwCisgKiBQYXZlbCBLdXpuZXRzb3YKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEKKyAqIE1lcmlkaWFuJzkzCisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKy8qIE5PVEU6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIFNUTCBoZWFkZXJzLgorICogICBZb3Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4KKyAqLworCisvLyBUaGlzIGZpbGUgaGFzIG5vbyBtYWNybyBwcm90ZWN0aW9uIGFzIGl0IGlzIG1lYW50IHRvIGJlIGluY2x1ZGVkIHNldmVyYWwgdGltZXMKKy8vIGZyb20gb3RoZXIgaGVhZGVyLgorLy8gQWRhcHRvciBmdW5jdGlvbiBvYmplY3RzOiBwb2ludGVycyB0byBtZW1iZXIgZnVuY3Rpb25zLgorCisvLyBUaGVyZSBhcmUgYSB0b3RhbCBvZiAxNiA9IDJeNCBmdW5jdGlvbiBvYmplY3RzIGluIHRoaXMgZmFtaWx5LgorLy8gICgxKSBNZW1iZXIgZnVuY3Rpb25zIHRha2luZyBubyBhcmd1bWVudHMgdnMgbWVtYmVyIGZ1bmN0aW9ucyB0YWtpbmcKKy8vICAgICAgIG9uZSBhcmd1bWVudC4KKy8vICAoMikgQ2FsbCB0aHJvdWdoIHBvaW50ZXIgdnMgY2FsbCB0aHJvdWdoIHJlZmVyZW5jZS4KKy8vICAoMykgTWVtYmVyIGZ1bmN0aW9uIHdpdGggdm9pZCByZXR1cm4gdHlwZSB2cyBtZW1iZXIgZnVuY3Rpb24gd2l0aAorLy8gICAgICBub24tdm9pZCByZXR1cm4gdHlwZS4KKy8vICAoNCkgQ29uc3QgdnMgbm9uLWNvbnN0IG1lbWJlciBmdW5jdGlvbi4KKworLy8gTm90ZSB0aGF0IGNob2ljZSAoMykgaXMgbm90aGluZyBtb3JlIHRoYW4gYSB3b3JrYXJvdW5kOiBhY2NvcmRpbmcKKy8vICB0byB0aGUgZHJhZnQsIGNvbXBpbGVycyBzaG91bGQgaGFuZGxlIHZvaWQgYW5kIG5vbi12b2lkIHRoZSBzYW1lIHdheS4KKy8vICBUaGlzIGZlYXR1cmUgaXMgbm90IHlldCB3aWRlbHkgaW1wbGVtZW50ZWQsIHRob3VnaC4gIFlvdSBjYW4gb25seSB1c2UKKy8vICBtZW1iZXIgZnVuY3Rpb25zIHJldHVybmluZyB2b2lkIGlmIHlvdXIgY29tcGlsZXIgc3VwcG9ydHMgcGFydGlhbAorLy8gIHNwZWNpYWxpemF0aW9uLgorCisvLyBBbGwgb2YgdGhpcyBjb21wbGV4aXR5IGlzIGluIHRoZSBmdW5jdGlvbiBvYmplY3RzIHRoZW1zZWx2ZXMuICBZb3UgY2FuCisvLyAgaWdub3JlIGl0IGJ5IHVzaW5nIHRoZSBoZWxwZXIgZnVuY3Rpb24gbWVtX2Z1biBhbmQgbWVtX2Z1bl9yZWYsCisvLyAgd2hpY2ggY3JlYXRlIHdoaWNoZXZlciB0eXBlIG9mIGFkYXB0b3IgaXMgYXBwcm9wcmlhdGUuCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisvL1RoaXMgaW1wbGVtZW50YXRpb24gd2lsbCBvbmx5IGJlIHVzZWQgaWYgbmVlZGVkLCB0aGF0IGlzIHRvIHNheSB3aGVuIHRoZXJlIGlzIHRoZSByZXR1cm4gdm9pZCBidWcKKy8vYW5kIHdoZW4gdGhlcmUgaXMgbm8gcGFydGlhbCB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbgorI2lmIGRlZmluZWQoX1NUTFBfRE9OVF9SRVRVUk5fVk9JRCkgJiYgZGVmaW5lZCAoX1NUTFBfTk9fQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikgJiYgZGVmaW5lZChfU1RMUF9NRU1CRVJfVEVNUExBVEVfQ0xBU1NFUykKKwordGVtcGxhdGU8Y2xhc3MgX1Jlc3VsdCwgY2xhc3MgX1RwPgorY2xhc3MgX01lbV9mdW4wX3B0ciA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxfVHAqLCBfUmVzdWx0PiB7Citwcm90ZWN0ZWQ6CisgIHR5cGVkZWYgX1Jlc3VsdCAoX1RwOjoqX19mdW5fdHlwZSkgKCk7CisgIGV4cGxpY2l0IF9NZW1fZnVuMF9wdHIoX19mdW5fdHlwZSBfX2YpIDogX01fZihfX2YpIHt9CisKK3B1YmxpYzoKKyAgX1Jlc3VsdCBvcGVyYXRvciAoKShfVHAqIF9fcCkgY29uc3QgeyByZXR1cm4gKF9fcC0+Kl9NX2YpKCk7IH0KKworcHJpdmF0ZToKKyAgX19mdW5fdHlwZSBfTV9mOworfTsKKwordGVtcGxhdGU8Y2xhc3MgX1Jlc3VsdCwgY2xhc3MgX1RwLCBjbGFzcyBfQXJnPgorY2xhc3MgX01lbV9mdW4xX3B0ciA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwKixfQXJnLF9SZXN1bHQ+IHsKK3Byb3RlY3RlZDoKKyAgdHlwZWRlZiBfUmVzdWx0IChfVHA6OipfX2Z1bl90eXBlKSAoX0FyZyk7CisgIGV4cGxpY2l0IF9NZW1fZnVuMV9wdHIoX19mdW5fdHlwZSBfX2YpIDogX01fZihfX2YpIHt9CisKK3B1YmxpYzoKKyAgX1Jlc3VsdCBvcGVyYXRvciAoKShfVHAqIF9fcCwgX0FyZyBfX3gpIGNvbnN0IHsgcmV0dXJuIChfX3AtPipfTV9mKShfX3gpOyB9CisKK3ByaXZhdGU6CisgIF9fZnVuX3R5cGUgX01fZjsKK307CisKK3RlbXBsYXRlPGNsYXNzIF9SZXN1bHQsIGNsYXNzIF9UcD4KK2NsYXNzIF9Db25zdF9tZW1fZnVuMF9wdHIgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248Y29uc3QgX1RwKixfUmVzdWx0PiB7Citwcm90ZWN0ZWQ6CisgIHR5cGVkZWYgX1Jlc3VsdCAoX1RwOjoqX19mdW5fdHlwZSkgKCkgY29uc3Q7CisgIGV4cGxpY2l0IF9Db25zdF9tZW1fZnVuMF9wdHIoX19mdW5fdHlwZSBfX2YpIDogX01fZihfX2YpIHt9CisKK3B1YmxpYzoKKyAgX1Jlc3VsdCBvcGVyYXRvciAoKShjb25zdCBfVHAqIF9fcCkgY29uc3QgeyByZXR1cm4gKF9fcC0+Kl9NX2YpKCk7IH0KKworcHJpdmF0ZToKKyAgX19mdW5fdHlwZSBfTV9mOworfTsKKwordGVtcGxhdGU8Y2xhc3MgX1Jlc3VsdCwgY2xhc3MgX1RwLCBjbGFzcyBfQXJnPgorY2xhc3MgX0NvbnN0X21lbV9mdW4xX3B0ciA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248Y29uc3QgX1RwKixfQXJnLF9SZXN1bHQ+IHsKK3Byb3RlY3RlZDoKKyAgdHlwZWRlZiBfUmVzdWx0IChfVHA6OipfX2Z1bl90eXBlKSAoX0FyZykgY29uc3Q7CisgIGV4cGxpY2l0IF9Db25zdF9tZW1fZnVuMV9wdHIoX19mdW5fdHlwZSBfX2YpIDogX01fZihfX2YpIHt9CisKK3B1YmxpYzoKKyAgX1Jlc3VsdCBvcGVyYXRvciAoKShjb25zdCBfVHAqIF9fcCwgX0FyZyBfX3gpIGNvbnN0IHsKKyAgICByZXR1cm4gKF9fcC0+Kl9NX2YpKF9feCk7IH0KKworcHJpdmF0ZToKKyAgX19mdW5fdHlwZSBfTV9mOworfTsKKwordGVtcGxhdGU8Y2xhc3MgX1Jlc3VsdCwgY2xhc3MgX1RwPgorY2xhc3MgX01lbV9mdW4wX3JlZiA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxfVHAmLF9SZXN1bHQ+IHsKK3Byb3RlY3RlZDoKKyAgdHlwZWRlZiBfUmVzdWx0IChfVHA6OipfX2Z1bl90eXBlKSAoKTsKKyAgZXhwbGljaXQgX01lbV9mdW4wX3JlZihfX2Z1bl90eXBlIF9fZikgOiBfTV9mKF9fZikge30KKworcHVibGljOgorICBfUmVzdWx0IG9wZXJhdG9yICgpKF9UcCYgX19wKSBjb25zdCB7IHJldHVybiAoX19wLipfTV9mKSgpOyB9CisKK3ByaXZhdGU6CisgIF9fZnVuX3R5cGUgX01fZjsKK307CisKK3RlbXBsYXRlPGNsYXNzIF9SZXN1bHQsIGNsYXNzIF9UcCwgY2xhc3MgX0FyZz4KK2NsYXNzIF9NZW1fZnVuMV9yZWYgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCYsX0FyZyxfUmVzdWx0PiB7Citwcm90ZWN0ZWQ6CisgIHR5cGVkZWYgX1Jlc3VsdCAoX1RwOjoqX19mdW5fdHlwZSkgKF9BcmcpOworICBleHBsaWNpdCBfTWVtX2Z1bjFfcmVmKF9fZnVuX3R5cGUgX19mKSA6IF9NX2YoX19mKSB7fQorCitwdWJsaWM6CisgIF9SZXN1bHQgb3BlcmF0b3IgKCkoX1RwJiBfX3AsIF9BcmcgX194KSBjb25zdCB7IHJldHVybiAoX19wLipfTV9mKShfX3gpOyB9CisKK3ByaXZhdGU6CisgIF9fZnVuX3R5cGUgX01fZjsKK307CisKK3RlbXBsYXRlPGNsYXNzIF9SZXN1bHQsIGNsYXNzIF9UcD4KK2NsYXNzIF9Db25zdF9tZW1fZnVuMF9yZWYgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248Y29uc3QgX1RwJixfUmVzdWx0PiB7Citwcm90ZWN0ZWQ6CisgIHR5cGVkZWYgX1Jlc3VsdCAoX1RwOjoqX19mdW5fdHlwZSkgKCkgY29uc3Q7CisgIGV4cGxpY2l0IF9Db25zdF9tZW1fZnVuMF9yZWYoX19mdW5fdHlwZSBfX2YpIDogX01fZihfX2YpIHt9CisKK3B1YmxpYzoKKyAgX1Jlc3VsdCBvcGVyYXRvciAoKShjb25zdCBfVHAmIF9fcCkgY29uc3QgeyByZXR1cm4gKF9fcC4qX01fZikoKTsgfQorCitwcml2YXRlOgorICBfX2Z1bl90eXBlIF9NX2Y7Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBfUmVzdWx0LCBjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+CitjbGFzcyBfQ29uc3RfbWVtX2Z1bjFfcmVmIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxjb25zdCBfVHAmLF9BcmcsX1Jlc3VsdD4geworcHJvdGVjdGVkOgorICB0eXBlZGVmIF9SZXN1bHQgKF9UcDo6Kl9fZnVuX3R5cGUpIChfQXJnKSBjb25zdDsKKyAgZXhwbGljaXQgX0NvbnN0X21lbV9mdW4xX3JlZihfX2Z1bl90eXBlIF9fZikgOiBfTV9mKF9fZikge30KKworcHVibGljOgorICBfUmVzdWx0IG9wZXJhdG9yICgpKGNvbnN0IF9UcCYgX19wLCBfQXJnIF9feCkgY29uc3QgeyByZXR1cm4gKF9fcC4qX01fZikoX194KTsgfQorCitwcml2YXRlOgorICBfX2Z1bl90eXBlIF9NX2Y7Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBfUmVzdWx0Pgorc3RydWN0IF9NZW1fZnVuX3RyYWl0cyB7CisgIHRlbXBsYXRlPGNsYXNzIF9UcD4KKyAgc3RydWN0IF9BcmdzMCB7CisgICAgdHlwZWRlZiBfTWVtX2Z1bjBfcHRyPF9SZXN1bHQsX1RwPiAgICAgICAgICAgIF9QdHI7CisgICAgdHlwZWRlZiBfQ29uc3RfbWVtX2Z1bjBfcHRyPF9SZXN1bHQsX1RwPiAgICAgIF9QdHJfY29uc3Q7CisgICAgdHlwZWRlZiBfTWVtX2Z1bjBfcmVmPF9SZXN1bHQsX1RwPiAgICAgICAgICAgIF9SZWY7CisgICAgdHlwZWRlZiBfQ29uc3RfbWVtX2Z1bjBfcmVmPF9SZXN1bHQsX1RwPiAgICAgIF9SZWZfY29uc3Q7CisgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1RwLCBjbGFzcyBfQXJnPgorICBzdHJ1Y3QgX0FyZ3MxIHsKKyAgICB0eXBlZGVmIF9NZW1fZnVuMV9wdHI8X1Jlc3VsdCxfVHAsX0FyZz4gICAgICAgX1B0cjsKKyAgICB0eXBlZGVmIF9Db25zdF9tZW1fZnVuMV9wdHI8X1Jlc3VsdCxfVHAsX0FyZz4gX1B0cl9jb25zdDsKKyAgICB0eXBlZGVmIF9NZW1fZnVuMV9yZWY8X1Jlc3VsdCxfVHAsX0FyZz4gICAgICAgX1JlZjsKKyAgICB0eXBlZGVmIF9Db25zdF9tZW1fZnVuMV9yZWY8X1Jlc3VsdCxfVHAsX0FyZz4gX1JlZl9jb25zdDsKKyAgfTsKK307CisKK3RlbXBsYXRlPGNsYXNzIF9BcmcsIGNsYXNzIF9SZXN1bHQ+CitjbGFzcyBfUHRyX2Z1bjFfYmFzZSA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxfQXJnLCBfUmVzdWx0PiB7Citwcm90ZWN0ZWQ6CisgIHR5cGVkZWYgX1Jlc3VsdCAoKl9fZnVuX3R5cGUpIChfQXJnKTsKKyAgZXhwbGljaXQgX1B0cl9mdW4xX2Jhc2UoX19mdW5fdHlwZSBfX2YpIDogX01fZihfX2YpIHt9CisKK3B1YmxpYzoKKyAgX1Jlc3VsdCBvcGVyYXRvcigpKF9BcmcgX194KSBjb25zdCB7IHJldHVybiBfTV9mKF9feCk7IH0KKworcHJpdmF0ZToKKyAgX19mdW5fdHlwZSBfTV9mOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9BcmcxLCBjbGFzcyBfQXJnMiwgY2xhc3MgX1Jlc3VsdD4KK2NsYXNzIF9QdHJfZnVuMl9iYXNlIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfQXJnMSxfQXJnMixfUmVzdWx0PiB7Citwcm90ZWN0ZWQ6CisgIHR5cGVkZWYgX1Jlc3VsdCAoKl9fZnVuX3R5cGUpIChfQXJnMSwgX0FyZzIpOworICBleHBsaWNpdCBfUHRyX2Z1bjJfYmFzZShfX2Z1bl90eXBlIF9fZikgOiBfTV9mKF9fZikge30KKworcHVibGljOgorICBfUmVzdWx0IG9wZXJhdG9yKCkoX0FyZzEgX194LCBfQXJnMiBfX3kpIGNvbnN0IHsgcmV0dXJuIF9NX2YoX194LCBfX3kpOyB9CisKK3ByaXZhdGU6CisgIF9fZnVuX3R5cGUgX01fZjsKK307CisKK3RlbXBsYXRlPGNsYXNzIF9SZXN1bHQ+CitzdHJ1Y3QgX1B0cl9mdW5fdHJhaXRzIHsKKyAgdGVtcGxhdGU8Y2xhc3MgX0FyZz4gc3RydWN0IF9BcmdzMSB7CisgICAgdHlwZWRlZiBfUHRyX2Z1bjFfYmFzZTxfQXJnLF9SZXN1bHQ+IF9GdW47CisgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0FyZzEsIGNsYXNzIF9BcmcyPiBzdHJ1Y3QgX0FyZ3MyIHsKKyAgICB0eXBlZGVmIF9QdHJfZnVuMl9iYXNlPF9BcmcxLF9BcmcyLF9SZXN1bHQ+IF9GdW47CisgIH07Cit9OworCisvKlNwZWNpYWxpemF0aW9uIGZvciB2b2lkIHJldHVybiB0eXBlCisqLwordGVtcGxhdGU8Y2xhc3MgX1RwPgorY2xhc3MgX1ZvaWRfbWVtX2Z1bjBfcHRyIDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPF9UcCosdm9pZD4geworcHJvdGVjdGVkOgorICB0eXBlZGVmIHZvaWQgKF9UcDo6Kl9fZnVuX3R5cGUpICgpOworICBleHBsaWNpdCBfVm9pZF9tZW1fZnVuMF9wdHIoX19mdW5fdHlwZSBfX2YpIDogX01fZihfX2YpIHt9CisKK3B1YmxpYzoKKyAgdm9pZCBvcGVyYXRvciAoKShfVHAqIF9fcCkgY29uc3QgeyAoX19wLT4qX01fZikoKTsgfQorCitwcml2YXRlOgorICBfX2Z1bl90eXBlIF9NX2Y7Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+CitjbGFzcyBfVm9pZF9tZW1fZnVuMV9wdHIgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCosX0FyZyx2b2lkPiB7Citwcm90ZWN0ZWQ6CisgIHR5cGVkZWYgdm9pZCAoX1RwOjoqX19mdW5fdHlwZSkgKF9BcmcpOworICBleHBsaWNpdCBfVm9pZF9tZW1fZnVuMV9wdHIoX19mdW5fdHlwZSBfX2YpIDogX01fZihfX2YpIHt9CisKK3B1YmxpYzoKKyAgdm9pZCBvcGVyYXRvciAoKShfVHAqIF9fcCwgX0FyZyBfX3gpIGNvbnN0IHsgKF9fcC0+Kl9NX2YpKF9feCk7IH0KKworcHJpdmF0ZToKKyAgX19mdW5fdHlwZSBfTV9mOworfTsKKwordGVtcGxhdGU8Y2xhc3MgX1RwPgorY2xhc3MgX1ZvaWRfY29uc3RfbWVtX2Z1bjBfcHRyIDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPGNvbnN0IF9UcCosdm9pZD4geworcHJvdGVjdGVkOgorICB0eXBlZGVmIHZvaWQgKF9UcDo6Kl9fZnVuX3R5cGUpICgpIGNvbnN0OworICBleHBsaWNpdCBfVm9pZF9jb25zdF9tZW1fZnVuMF9wdHIoX19mdW5fdHlwZSBfX2YpIDogX01fZihfX2YpIHt9CisKK3B1YmxpYzoKKyAgdm9pZCBvcGVyYXRvciAoKShjb25zdCBfVHAqIF9fcCkgY29uc3QgeyAoX19wLT4qX01fZikoKTsgfQorCitwcml2YXRlOgorICBfX2Z1bl90eXBlIF9NX2Y7Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+CitjbGFzcyBfVm9pZF9jb25zdF9tZW1fZnVuMV9wdHIgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPGNvbnN0IF9UcCosX0FyZyx2b2lkPiB7Citwcm90ZWN0ZWQ6CisgIHR5cGVkZWYgdm9pZCAoX1RwOjoqX19mdW5fdHlwZSkgKF9BcmcpIGNvbnN0OworICBleHBsaWNpdCBfVm9pZF9jb25zdF9tZW1fZnVuMV9wdHIoX19mdW5fdHlwZSBfX2YpIDogX01fZihfX2YpIHt9CisKK3B1YmxpYzoKKyAgdm9pZCBvcGVyYXRvciAoKShjb25zdCBfVHAqIF9fcCwgX0FyZyBfX3gpIGNvbnN0IHsgKF9fcC0+Kl9NX2YpKF9feCk7IH0KKworcHJpdmF0ZToKKyAgX19mdW5fdHlwZSBfTV9mOworfTsKKwordGVtcGxhdGU8Y2xhc3MgX1RwPgorY2xhc3MgX1ZvaWRfbWVtX2Z1bjBfcmVmIDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPF9UcCYsdm9pZD4geworcHJvdGVjdGVkOgorICB0eXBlZGVmIHZvaWQgKF9UcDo6Kl9fZnVuX3R5cGUpICgpOworICBleHBsaWNpdCBfVm9pZF9tZW1fZnVuMF9yZWYoX19mdW5fdHlwZSBfX2YpIDogX01fZihfX2YpIHt9CisKK3B1YmxpYzoKKyAgdm9pZCBvcGVyYXRvciAoKShfVHAmIF9fcCkgY29uc3QgeyAoX19wLipfTV9mKSgpOyB9CisKK3ByaXZhdGU6CisgIF9fZnVuX3R5cGUgX01fZjsKK307CisKK3RlbXBsYXRlPGNsYXNzIF9UcCwgY2xhc3MgX0FyZz4KK2NsYXNzIF9Wb2lkX21lbV9mdW4xX3JlZiA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwJixfQXJnLHZvaWQ+IHsKK3Byb3RlY3RlZDoKKyAgdHlwZWRlZiB2b2lkIChfVHA6OipfX2Z1bl90eXBlKSAoX0FyZyk7CisgIGV4cGxpY2l0IF9Wb2lkX21lbV9mdW4xX3JlZihfX2Z1bl90eXBlIF9fZikgOiBfTV9mKF9fZikge30KKworcHVibGljOgorICB2b2lkIG9wZXJhdG9yICgpKF9UcCYgX19wLCBfQXJnIF9feCkgY29uc3QgeyAoX19wLipfTV9mKShfX3gpOyB9CisKK3ByaXZhdGU6CisgIF9fZnVuX3R5cGUgX01fZjsKK307CisKK3RlbXBsYXRlPGNsYXNzIF9UcD4KK2NsYXNzIF9Wb2lkX2NvbnN0X21lbV9mdW4wX3JlZiA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxjb25zdCBfVHAmLHZvaWQ+IHsKK3Byb3RlY3RlZDoKKyAgdHlwZWRlZiB2b2lkIChfVHA6OipfX2Z1bl90eXBlKSAoKSBjb25zdDsKKyAgZXhwbGljaXQgX1ZvaWRfY29uc3RfbWVtX2Z1bjBfcmVmKF9fZnVuX3R5cGUgX19mKSA6IF9NX2YoX19mKSB7fQorCitwdWJsaWM6CisgIHZvaWQgb3BlcmF0b3IgKCkoY29uc3QgX1RwJiBfX3ApIGNvbnN0IHsgKF9fcC4qX01fZikoKTsgfQorCitwcml2YXRlOgorICBfX2Z1bl90eXBlIF9NX2Y7Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+CitjbGFzcyBfVm9pZF9jb25zdF9tZW1fZnVuMV9yZWYgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPGNvbnN0IF9UcCYsX0FyZyx2b2lkPiB7Citwcm90ZWN0ZWQ6CisgIHR5cGVkZWYgdm9pZCAoX1RwOjoqX19mdW5fdHlwZSkgKF9BcmcpIGNvbnN0OworICBleHBsaWNpdCBfVm9pZF9jb25zdF9tZW1fZnVuMV9yZWYoX19mdW5fdHlwZSBfX2YpIDogX01fZihfX2YpIHt9CisKK3B1YmxpYzoKKyAgdm9pZCBvcGVyYXRvciAoKShjb25zdCBfVHAmIF9fcCwgX0FyZyBfX3gpIGNvbnN0IHsgKF9fcC4qX01fZikoX194KTsgfQorCitwcml2YXRlOgorICBfX2Z1bl90eXBlIF9NX2Y7Cit9OworCitfU1RMUF9URU1QTEFURV9OVUxMCitzdHJ1Y3QgX01lbV9mdW5fdHJhaXRzPHZvaWQ+IHsKKyAgdGVtcGxhdGU8Y2xhc3MgX1RwPiBzdHJ1Y3QgX0FyZ3MwIHsKKyAgICB0eXBlZGVmIF9Wb2lkX21lbV9mdW4wX3B0cjxfVHA+ICAgICAgICAgICAgIF9QdHI7CisgICAgdHlwZWRlZiBfVm9pZF9jb25zdF9tZW1fZnVuMF9wdHI8X1RwPiAgICAgICBfUHRyX2NvbnN0OworICAgIHR5cGVkZWYgX1ZvaWRfbWVtX2Z1bjBfcmVmPF9UcD4gICAgICAgICAgICAgX1JlZjsKKyAgICB0eXBlZGVmIF9Wb2lkX2NvbnN0X21lbV9mdW4wX3JlZjxfVHA+ICAgICAgIF9SZWZfY29uc3Q7CisgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1RwLCBjbGFzcyBfQXJnPiBzdHJ1Y3QgX0FyZ3MxIHsKKyAgICB0eXBlZGVmIF9Wb2lkX21lbV9mdW4xX3B0cjxfVHAsX0FyZz4gICAgICAgIF9QdHI7CisgICAgdHlwZWRlZiBfVm9pZF9jb25zdF9tZW1fZnVuMV9wdHI8X1RwLF9Bcmc+ICBfUHRyX2NvbnN0OworICAgIHR5cGVkZWYgX1ZvaWRfbWVtX2Z1bjFfcmVmPF9UcCxfQXJnPiAgICAgICAgX1JlZjsKKyAgICB0eXBlZGVmIF9Wb2lkX2NvbnN0X21lbV9mdW4xX3JlZjxfVHAsX0FyZz4gIF9SZWZfY29uc3Q7CisgIH07Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBfQXJnPgorY2xhc3MgX1B0cl92b2lkX2Z1bjFfYmFzZSA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxfQXJnLCB2b2lkPiB7Citwcm90ZWN0ZWQ6CisgIHR5cGVkZWYgdm9pZCAoKl9fZnVuX3R5cGUpIChfQXJnKTsKKyAgZXhwbGljaXQgX1B0cl92b2lkX2Z1bjFfYmFzZShfX2Z1bl90eXBlIF9fZikgOiBfTV9mKF9fZikge30KKworcHVibGljOgorICB2b2lkIG9wZXJhdG9yKCkoX0FyZyBfX3gpIGNvbnN0IHsgX01fZihfX3gpOyB9CisKK3ByaXZhdGU6CisgIF9fZnVuX3R5cGUgX01fZjsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfQXJnMSwgY2xhc3MgX0FyZzI+CitjbGFzcyBfUHRyX3ZvaWRfZnVuMl9iYXNlIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfQXJnMSxfQXJnMix2b2lkPiB7Citwcm90ZWN0ZWQ6CisgIHR5cGVkZWYgdm9pZCAoKl9fZnVuX3R5cGUpIChfQXJnMSwgX0FyZzIpOworICBleHBsaWNpdCBfUHRyX3ZvaWRfZnVuMl9iYXNlKF9fZnVuX3R5cGUgX19mKSA6IF9NX2YoX19mKSB7fQorCitwdWJsaWM6CisgIHZvaWQgb3BlcmF0b3IoKShfQXJnMSBfX3gsIF9BcmcyIF9feSkgY29uc3QgeyBfTV9mKF9feCwgX195KTsgfQorCitwcml2YXRlOgorICBfX2Z1bl90eXBlIF9NX2Y7Cit9OworCitfU1RMUF9URU1QTEFURV9OVUxMCitzdHJ1Y3QgX1B0cl9mdW5fdHJhaXRzPHZvaWQ+IHsKKyAgdGVtcGxhdGU8Y2xhc3MgX0FyZz4gc3RydWN0IF9BcmdzMSB7CisgICAgdHlwZWRlZiBfUHRyX3ZvaWRfZnVuMV9iYXNlPF9Bcmc+IF9GdW47CisgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0FyZzEsIGNsYXNzIF9BcmcyPiBzdHJ1Y3QgX0FyZ3MyIHsKKyAgICB0eXBlZGVmIF9QdHJfdm9pZF9mdW4yX2Jhc2U8X0FyZzEsX0FyZzI+IF9GdW47CisgIH07Cit9OworCisvLyBwYXZlbDogbmVlZCBleHRyYSBsZXZlbCBvZiBpbmhlcml0YW5jZSBoZXJlIHNpbmNlIE1TVkMrKyBkb2VzIG5vdAorLy8gYWNjZXB0IHRyYWl0cy1iYXNlZCBmYWtlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gZm9yIHRlbXBsYXRlCisvLyBhcmd1bWVudHMgb3RoZXIgdGhhbiBmaXJzdAorCit0ZW1wbGF0ZTxjbGFzcyBfUmVzdWx0LCBjbGFzcyBfQXJnPgorY2xhc3MgX1B0cl9mdW4xIDoKKyAgcHVibGljIF9QdHJfZnVuX3RyYWl0czxfUmVzdWx0Pjo6X1NUTFBfVEVNUExBVEUgX0FyZ3MxPF9Bcmc+OjpfRnVuIHsKK3Byb3RlY3RlZDoKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUHRyX2Z1bl90cmFpdHM8X1Jlc3VsdD46Ol9TVExQX1RFTVBMQVRFIF9BcmdzMTxfQXJnPjo6X0Z1biBfQmFzZTsKKyAgZXhwbGljaXQgX1B0cl9mdW4xKHR5cGVuYW1lIF9CYXNlOjpfX2Z1bl90eXBlIF9fZikgOiBfQmFzZShfX2YpIHt9Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBfUmVzdWx0LCBjbGFzcyBfQXJnMSwgY2xhc3MgX0FyZzI+CitjbGFzcyBfUHRyX2Z1bjIgOgorICBwdWJsaWMgX1B0cl9mdW5fdHJhaXRzPF9SZXN1bHQ+OjpfU1RMUF9URU1QTEFURSBfQXJnczI8X0FyZzEsX0FyZzI+OjpfRnVuIHsKK3Byb3RlY3RlZDoKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUHRyX2Z1bl90cmFpdHM8X1Jlc3VsdD46Ol9TVExQX1RFTVBMQVRFIF9BcmdzMjxfQXJnMSxfQXJnMj46Ol9GdW4gX0Jhc2U7CisgIGV4cGxpY2l0IF9QdHJfZnVuMih0eXBlbmFtZSBfQmFzZTo6X19mdW5fdHlwZSBfX2YpIDogX0Jhc2UoX19mKSB7fQorfTsKKworCisjZW5kaWYgLypfU1RMUF9ET05UX1JFVFVSTl9WT0lEICYmIF9TVExQX05PX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04gJiYgX1NUTFBfTUVNQkVSX1RFTVBMQVRFX0NMQVNTRVMqLworCisKKyNpZiAhZGVmaW5lZChfU1RMUF9ET05UX1JFVFVSTl9WT0lEKSB8fCAhZGVmaW5lZChfU1RMUF9OT19DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKSB8fCAhZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFX0NMQVNTRVMpCisKK3RlbXBsYXRlIDxjbGFzcyBfUmV0LCBjbGFzcyBfVHA+CitjbGFzcyBtZW1fZnVuX3QgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248X1RwKixfUmV0PiB7CisgIHR5cGVkZWYgX1JldCAoX1RwOjoqX19mdW5fdHlwZSkodm9pZCk7CitwdWJsaWM6CisgIGV4cGxpY2l0IG1lbV9mdW5fdChfX2Z1bl90eXBlIF9fcGYpIDogX01fZihfX3BmKSB7fQorICBfUmV0IG9wZXJhdG9yKCkoX1RwKiBfX3ApIGNvbnN0IHsgcmV0dXJuIChfX3AtPipfTV9mKSgpOyB9Citwcml2YXRlOgorICBfX2Z1bl90eXBlIF9NX2Y7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JldCwgY2xhc3MgX1RwPgorY2xhc3MgY29uc3RfbWVtX2Z1bl90IDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPGNvbnN0IF9UcCosX1JldD4geworICB0eXBlZGVmIF9SZXQgKF9UcDo6Kl9fZnVuX3R5cGUpKHZvaWQpIGNvbnN0OworcHVibGljOgorICBleHBsaWNpdCBjb25zdF9tZW1fZnVuX3QoX19mdW5fdHlwZSBfX3BmKSA6IF9NX2YoX19wZikge30KKyAgX1JldCBvcGVyYXRvcigpKGNvbnN0IF9UcCogX19wKSBjb25zdCB7IHJldHVybiAoX19wLT4qX01fZikoKTsgfQorcHJpdmF0ZToKKyAgX19mdW5fdHlwZSBfTV9mOworfTsKKworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JldCwgY2xhc3MgX1RwPgorY2xhc3MgbWVtX2Z1bl9yZWZfdCA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxfVHAsX1JldD4geworICB0eXBlZGVmIF9SZXQgKF9UcDo6Kl9fZnVuX3R5cGUpKHZvaWQpOworcHVibGljOgorICBleHBsaWNpdCBtZW1fZnVuX3JlZl90KF9fZnVuX3R5cGUgX19wZikgOiBfTV9mKF9fcGYpIHt9CisgIF9SZXQgb3BlcmF0b3IoKShfVHAmIF9fcikgY29uc3QgeyByZXR1cm4gKF9fci4qX01fZikoKTsgfQorcHJpdmF0ZToKKyAgX19mdW5fdHlwZSBfTV9mOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9SZXQsIGNsYXNzIF9UcD4KK2NsYXNzIGNvbnN0X21lbV9mdW5fcmVmX3QgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248X1RwLF9SZXQ+IHsKKyAgdHlwZWRlZiBfUmV0IChfVHA6OipfX2Z1bl90eXBlKSh2b2lkKSBjb25zdDsKK3B1YmxpYzoKKyAgZXhwbGljaXQgY29uc3RfbWVtX2Z1bl9yZWZfdChfX2Z1bl90eXBlIF9fcGYpIDogX01fZihfX3BmKSB7fQorICBfUmV0IG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3IpIGNvbnN0IHsgcmV0dXJuIChfX3IuKl9NX2YpKCk7IH0KK3ByaXZhdGU6CisgIF9fZnVuX3R5cGUgX01fZjsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfUmV0LCBjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+CitjbGFzcyBtZW1fZnVuMV90IDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAqLF9BcmcsX1JldD4geworICB0eXBlZGVmIF9SZXQgKF9UcDo6Kl9fZnVuX3R5cGUpKF9BcmcpOworcHVibGljOgorICBleHBsaWNpdCBtZW1fZnVuMV90KF9fZnVuX3R5cGUgX19wZikgOiBfTV9mKF9fcGYpIHt9CisgIF9SZXQgb3BlcmF0b3IoKShfVHAqIF9fcCwgX0FyZyBfX3gpIGNvbnN0IHsgcmV0dXJuIChfX3AtPipfTV9mKShfX3gpOyB9Citwcml2YXRlOgorICBfX2Z1bl90eXBlIF9NX2Y7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JldCwgY2xhc3MgX1RwLCBjbGFzcyBfQXJnPgorY2xhc3MgY29uc3RfbWVtX2Z1bjFfdCA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248Y29uc3QgX1RwKixfQXJnLF9SZXQ+IHsKKyAgdHlwZWRlZiBfUmV0IChfVHA6OipfX2Z1bl90eXBlKShfQXJnKSBjb25zdDsKK3B1YmxpYzoKKyAgZXhwbGljaXQgY29uc3RfbWVtX2Z1bjFfdChfX2Z1bl90eXBlIF9fcGYpIDogX01fZihfX3BmKSB7fQorICBfUmV0IG9wZXJhdG9yKCkoY29uc3QgX1RwKiBfX3AsIF9BcmcgX194KSBjb25zdAorICAgIHsgcmV0dXJuIChfX3AtPipfTV9mKShfX3gpOyB9Citwcml2YXRlOgorICBfX2Z1bl90eXBlIF9NX2Y7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JldCwgY2xhc3MgX1RwLCBjbGFzcyBfQXJnPgorY2xhc3MgbWVtX2Z1bjFfcmVmX3QgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCxfQXJnLF9SZXQ+IHsKKyAgdHlwZWRlZiBfUmV0IChfVHA6OipfX2Z1bl90eXBlKShfQXJnKTsKK3B1YmxpYzoKKyAgZXhwbGljaXQgbWVtX2Z1bjFfcmVmX3QoX19mdW5fdHlwZSBfX3BmKSA6IF9NX2YoX19wZikge30KKyAgX1JldCBvcGVyYXRvcigpKF9UcCYgX19yLCBfQXJnIF9feCkgY29uc3QgeyByZXR1cm4gKF9fci4qX01fZikoX194KTsgfQorcHJpdmF0ZToKKyAgX19mdW5fdHlwZSBfTV9mOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9SZXQsIGNsYXNzIF9UcCwgY2xhc3MgX0FyZz4KK2NsYXNzIGNvbnN0X21lbV9mdW4xX3JlZl90IDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAsX0FyZyxfUmV0PiB7CisgIHR5cGVkZWYgX1JldCAoX1RwOjoqX19mdW5fdHlwZSkoX0FyZykgY29uc3Q7CitwdWJsaWM6CisgIGV4cGxpY2l0IGNvbnN0X21lbV9mdW4xX3JlZl90KF9fZnVuX3R5cGUgX19wZikgOiBfTV9mKF9fcGYpIHt9CisgIF9SZXQgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9fciwgX0FyZyBfX3gpIGNvbnN0IHsgcmV0dXJuIChfX3IuKl9NX2YpKF9feCk7IH0KK3ByaXZhdGU6CisgIF9fZnVuX3R5cGUgX01fZjsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfQXJnLCBjbGFzcyBfUmVzdWx0PgorY2xhc3MgcG9pbnRlcl90b191bmFyeV9mdW5jdGlvbiA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxfQXJnLCBfUmVzdWx0PiB7Citwcm90ZWN0ZWQ6CisgIF9SZXN1bHQgKCpfTV9wdHIpKF9BcmcpOworcHVibGljOgorICBwb2ludGVyX3RvX3VuYXJ5X2Z1bmN0aW9uKCkge30KKyAgZXhwbGljaXQgcG9pbnRlcl90b191bmFyeV9mdW5jdGlvbihfUmVzdWx0ICgqX194KShfQXJnKSkgOiBfTV9wdHIoX194KSB7fQorICBfUmVzdWx0IG9wZXJhdG9yKCkoX0FyZyBfX3gpIGNvbnN0IHsgcmV0dXJuIF9NX3B0cihfX3gpOyB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0FyZzEsIGNsYXNzIF9BcmcyLCBjbGFzcyBfUmVzdWx0PgorY2xhc3MgcG9pbnRlcl90b19iaW5hcnlfZnVuY3Rpb24gOgorICBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9BcmcxLF9BcmcyLF9SZXN1bHQ+IHsKK3Byb3RlY3RlZDoKKyAgICBfUmVzdWx0ICgqX01fcHRyKShfQXJnMSwgX0FyZzIpOworcHVibGljOgorICAgIHBvaW50ZXJfdG9fYmluYXJ5X2Z1bmN0aW9uKCkge30KKyAgICBleHBsaWNpdCBwb2ludGVyX3RvX2JpbmFyeV9mdW5jdGlvbihfUmVzdWx0ICgqX194KShfQXJnMSwgX0FyZzIpKQorICAgICAgOiBfTV9wdHIoX194KSB7fQorICAgIF9SZXN1bHQgb3BlcmF0b3IoKShfQXJnMSBfX3gsIF9BcmcyIF9feSkgY29uc3QgeworICAgICAgcmV0dXJuIF9NX3B0cihfX3gsIF9feSk7CisgICAgfQorfTsKKworCisjaWYgZGVmaW5lZChfU1RMUF9ET05UX1JFVFVSTl9WT0lEKSAmJiAhZGVmaW5lZChfU1RMUF9OT19DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQorLy9QYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGZvciB0aGUgdm9pZCB0eXBlCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorY2xhc3MgbWVtX2Z1bl90PHZvaWQsIF9UcD4gOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248X1RwKix2b2lkPiB7CisgIHR5cGVkZWYgdm9pZCAoX1RwOjoqX19mdW5fdHlwZSkodm9pZCk7CitwdWJsaWM6CisgIGV4cGxpY2l0IG1lbV9mdW5fdCBfU1RMUF9QU1BFQzIodm9pZCxfVHApIChfX2Z1bl90eXBlIF9fcGYpIDogX01fZihfX3BmKSB7fQorICB2b2lkIG9wZXJhdG9yKCkoX1RwKiBfX3ApIGNvbnN0IHsgKF9fcC0+Kl9NX2YpKCk7IH0KK3ByaXZhdGU6CisgIF9fZnVuX3R5cGUgX01fZjsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitjbGFzcyBjb25zdF9tZW1fZnVuX3Q8dm9pZCwgX1RwPiA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxjb25zdCBfVHAqLHZvaWQ+IHsKKyAgdHlwZWRlZiB2b2lkIChfVHA6OipfX2Z1bl90eXBlKSh2b2lkKSBjb25zdDsKK3B1YmxpYzoKKyAgZXhwbGljaXQgY29uc3RfbWVtX2Z1bl90IF9TVExQX1BTUEVDMih2b2lkLF9UcCkgKF9fZnVuX3R5cGUgX19wZikgOiBfTV9mKF9fcGYpIHt9CisgIHZvaWQgb3BlcmF0b3IoKShjb25zdCBfVHAqIF9fcCkgY29uc3QgeyAoX19wLT4qX01fZikoKTsgfQorcHJpdmF0ZToKKyAgX19mdW5fdHlwZSBfTV9mOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2NsYXNzIG1lbV9mdW5fcmVmX3Q8dm9pZCwgX1RwPiA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxfVHAsdm9pZD4geworICB0eXBlZGVmIHZvaWQgKF9UcDo6Kl9fZnVuX3R5cGUpKHZvaWQpOworcHVibGljOgorICBleHBsaWNpdCBtZW1fZnVuX3JlZl90IF9TVExQX1BTUEVDMih2b2lkLF9UcCkgKF9fZnVuX3R5cGUgX19wZikgOiBfTV9mKF9fcGYpIHt9CisgIHZvaWQgb3BlcmF0b3IoKShfVHAmIF9fcikgY29uc3QgeyAoX19yLipfTV9mKSgpOyB9Citwcml2YXRlOgorICBfX2Z1bl90eXBlIF9NX2Y7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorY2xhc3MgY29uc3RfbWVtX2Z1bl9yZWZfdDx2b2lkLCBfVHA+IDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPF9UcCx2b2lkPiB7CisgIHR5cGVkZWYgdm9pZCAoX1RwOjoqX19mdW5fdHlwZSkodm9pZCkgY29uc3Q7CitwdWJsaWM6CisgIGV4cGxpY2l0IGNvbnN0X21lbV9mdW5fcmVmX3QgX1NUTFBfUFNQRUMyKHZvaWQsX1RwKSAoX19mdW5fdHlwZSBfX3BmKSA6IF9NX2YoX19wZikge30KKyAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX19yKSBjb25zdCB7IChfX3IuKl9NX2YpKCk7IH0KK3ByaXZhdGU6CisgIF9fZnVuX3R5cGUgX01fZjsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+CitjbGFzcyBtZW1fZnVuMV90PHZvaWQsIF9UcCwgX0FyZz4gOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCosX0FyZyx2b2lkPiB7CisgIHR5cGVkZWYgdm9pZCAoX1RwOjoqX19mdW5fdHlwZSkoX0FyZyk7CitwdWJsaWM6CisgIGV4cGxpY2l0IG1lbV9mdW4xX3QgX1NUTFBfUFNQRUMzKHZvaWQsX1RwLF9BcmcpIChfX2Z1bl90eXBlIF9fcGYpIDogX01fZihfX3BmKSB7fQorICB2b2lkIG9wZXJhdG9yKCkoX1RwKiBfX3AsIF9BcmcgX194KSBjb25zdCB7IChfX3AtPipfTV9mKShfX3gpOyB9Citwcml2YXRlOgorICBfX2Z1bl90eXBlIF9NX2Y7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQXJnPgorY2xhc3MgY29uc3RfbWVtX2Z1bjFfdDx2b2lkLCBfVHAsIF9Bcmc+CisgIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxjb25zdCBfVHAqLF9Bcmcsdm9pZD4geworICB0eXBlZGVmIHZvaWQgKF9UcDo6Kl9fZnVuX3R5cGUpKF9BcmcpIGNvbnN0OworcHVibGljOgorICBleHBsaWNpdCBjb25zdF9tZW1fZnVuMV90IF9TVExQX1BTUEVDMyh2b2lkLF9UcCxfQXJnKSAoX19mdW5fdHlwZSBfX3BmKSA6IF9NX2YoX19wZikge30KKyAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IF9UcCogX19wLCBfQXJnIF9feCkgY29uc3QgeyAoX19wLT4qX01fZikoX194KTsgfQorcHJpdmF0ZToKKyAgX19mdW5fdHlwZSBfTV9mOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FyZz4KK2NsYXNzIG1lbV9mdW4xX3JlZl90PHZvaWQsIF9UcCwgX0FyZz4KKyAgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCxfQXJnLHZvaWQ+IHsKKyAgdHlwZWRlZiB2b2lkIChfVHA6OipfX2Z1bl90eXBlKShfQXJnKTsKK3B1YmxpYzoKKyAgZXhwbGljaXQgbWVtX2Z1bjFfcmVmX3QgX1NUTFBfUFNQRUMzKHZvaWQsX1RwLF9BcmcpIChfX2Z1bl90eXBlIF9fcGYpIDogX01fZihfX3BmKSB7fQorICB2b2lkIG9wZXJhdG9yKCkoX1RwJiBfX3IsIF9BcmcgX194KSBjb25zdCB7IChfX3IuKl9NX2YpKF9feCk7IH0KK3ByaXZhdGU6CisgIF9fZnVuX3R5cGUgX01fZjsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+CitjbGFzcyBjb25zdF9tZW1fZnVuMV9yZWZfdDx2b2lkLCBfVHAsIF9Bcmc+CisgIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAsX0FyZyx2b2lkPiB7CisgIHR5cGVkZWYgdm9pZCAoX1RwOjoqX19mdW5fdHlwZSkoX0FyZykgY29uc3Q7CitwdWJsaWM6CisgIGV4cGxpY2l0IGNvbnN0X21lbV9mdW4xX3JlZl90IF9TVExQX1BTUEVDMyh2b2lkLF9UcCxfQXJnKSAoX19mdW5fdHlwZSBfX3BmKSA6IF9NX2YoX19wZikge30KKyAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX19yLCBfQXJnIF9feCkgY29uc3QgeyAoX19yLipfTV9mKShfX3gpOyB9Citwcml2YXRlOgorICBfX2Z1bl90eXBlIF9NX2Y7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0FyZz4KK2NsYXNzIHBvaW50ZXJfdG9fdW5hcnlfZnVuY3Rpb248X0FyZywgdm9pZD4gOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248X0FyZywgdm9pZD4geworICB0eXBlZGVmIHZvaWQgKCpfX2Z1bl90eXBlKShfQXJnKTsKKyAgX19mdW5fdHlwZSBfTV9wdHI7CitwdWJsaWM6CisgIHBvaW50ZXJfdG9fdW5hcnlfZnVuY3Rpb24oKSB7fQorICBleHBsaWNpdCBwb2ludGVyX3RvX3VuYXJ5X2Z1bmN0aW9uKF9fZnVuX3R5cGUgX194KSA6IF9NX3B0cihfX3gpIHt9CisgIHZvaWQgb3BlcmF0b3IoKShfQXJnIF9feCkgY29uc3QgeyBfTV9wdHIoX194KTsgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9BcmcxLCBjbGFzcyBfQXJnMj4KK2NsYXNzIHBvaW50ZXJfdG9fYmluYXJ5X2Z1bmN0aW9uPF9BcmcxLCBfQXJnMiwgdm9pZD4gOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9BcmcxLF9BcmcyLHZvaWQ+IHsKKyAgdHlwZWRlZiB2b2lkICgqX19mdW5fdHlwZSkoX0FyZzEsIF9BcmcyKTsKKyAgX19mdW5fdHlwZSBfTV9wdHI7CitwdWJsaWM6CisgIHBvaW50ZXJfdG9fYmluYXJ5X2Z1bmN0aW9uKCkge30KKyAgZXhwbGljaXQgcG9pbnRlcl90b19iaW5hcnlfZnVuY3Rpb24oX19mdW5fdHlwZSBfX3gpIDogX01fcHRyKF9feCkge30KKyAgdm9pZCBvcGVyYXRvcigpKF9BcmcxIF9feCwgX0FyZzIgX195KSBjb25zdCB7IF9NX3B0cihfX3gsIF9feSk7IH0KK307CisKKyNlbmRpZiAvKl9TVExQX0RPTlRfUkVUVVJOX1ZPSUQgJiYgIV9TVExQX05PX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04qLworCisjZWxzZSAvKiFfU1RMUF9ET05UX1JFVFVSTl9WT0lEIHx8ICFfU1RMUF9OT19DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OIHx8ICFfU1RMUF9NRU1CRVJfVEVNUExBVEVfQ0xBU1NFUyovCisKKy8vbWVtX2Z1bl90Cit0ZW1wbGF0ZSA8Y2xhc3MgX1Jlc3VsdCwgY2xhc3MgX1RwPgorY2xhc3MgbWVtX2Z1bl90IDoKKyAgcHVibGljIF9NZW1fZnVuX3RyYWl0czxfUmVzdWx0Pjo6X1NUTFBfVEVNUExBVEUgX0FyZ3MwPF9UcD46Ol9QdHIgeworICB0eXBlZGVmIHR5cGVuYW1lCisgICAgX01lbV9mdW5fdHJhaXRzPF9SZXN1bHQ+OjpfU1RMUF9URU1QTEFURSBfQXJnczA8X1RwPjo6X1B0ciBfQmFzZTsKK3B1YmxpYzoKKyAgZXhwbGljaXQgbWVtX2Z1bl90KHR5cGVuYW1lIF9CYXNlOjpfX2Z1bl90eXBlIF9fZikgOiBfQmFzZShfX2YpIHt9Cit9OworCisvL2NvbnN0X21lbV9mdW5fdAordGVtcGxhdGUgPGNsYXNzIF9SZXN1bHQsIGNsYXNzIF9UcD4KK2NsYXNzIGNvbnN0X21lbV9mdW5fdCA6CisgIHB1YmxpYyBfTWVtX2Z1bl90cmFpdHM8X1Jlc3VsdD46Ol9TVExQX1RFTVBMQVRFIF9BcmdzMDxfVHA+OjpfUHRyX2NvbnN0IHsKKyAgdHlwZWRlZiB0eXBlbmFtZQorICAgIF9NZW1fZnVuX3RyYWl0czxfUmVzdWx0Pjo6X1NUTFBfVEVNUExBVEUgX0FyZ3MwPF9UcD46Ol9QdHJfY29uc3QgX0Jhc2U7CitwdWJsaWM6CisgIGV4cGxpY2l0IGNvbnN0X21lbV9mdW5fdCh0eXBlbmFtZSBfQmFzZTo6X19mdW5fdHlwZSBfX2YpIDogX0Jhc2UoX19mKSB7fQorfTsKKworLy9tZW1fZnVuX3JlZl90Cit0ZW1wbGF0ZSA8Y2xhc3MgX1Jlc3VsdCwgY2xhc3MgX1RwPgorY2xhc3MgbWVtX2Z1bl9yZWZfdCA6CisgIHB1YmxpYyBfTWVtX2Z1bl90cmFpdHM8X1Jlc3VsdD46Ol9TVExQX1RFTVBMQVRFIF9BcmdzMDxfVHA+OjpfUmVmIHsKKyAgdHlwZWRlZiB0eXBlbmFtZQorICAgIF9NZW1fZnVuX3RyYWl0czxfUmVzdWx0Pjo6X1NUTFBfVEVNUExBVEUgX0FyZ3MwPF9UcD46Ol9SZWYgX0Jhc2U7CitwdWJsaWM6CisgIGV4cGxpY2l0IG1lbV9mdW5fcmVmX3QodHlwZW5hbWUgX0Jhc2U6Ol9fZnVuX3R5cGUgX19mKSA6IF9CYXNlKF9fZikge30KK307CisKKy8vY29uc3RfbWVtX2Z1bl9yZWZfdAordGVtcGxhdGUgPGNsYXNzIF9SZXN1bHQsIGNsYXNzIF9UcD4KK2NsYXNzIGNvbnN0X21lbV9mdW5fcmVmX3QgOgorICBwdWJsaWMgX01lbV9mdW5fdHJhaXRzPF9SZXN1bHQ+OjpfU1RMUF9URU1QTEFURSBfQXJnczA8X1RwPjo6X1JlZl9jb25zdCB7CisgIHR5cGVkZWYgdHlwZW5hbWUKKyAgICBfTWVtX2Z1bl90cmFpdHM8X1Jlc3VsdD46Ol9TVExQX1RFTVBMQVRFIF9BcmdzMDxfVHA+OjpfUmVmX2NvbnN0IF9CYXNlOworcHVibGljOgorICBleHBsaWNpdCBjb25zdF9tZW1fZnVuX3JlZl90KHR5cGVuYW1lIF9CYXNlOjpfX2Z1bl90eXBlIF9fZikgOiBfQmFzZShfX2YpIHt9Cit9OworCisvL21lbV9mdW4xX3QKK3RlbXBsYXRlIDxjbGFzcyBfUmVzdWx0LCBjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+CitjbGFzcyBtZW1fZnVuMV90IDoKKyAgcHVibGljIF9NZW1fZnVuX3RyYWl0czxfUmVzdWx0Pjo6X1NUTFBfVEVNUExBVEUgX0FyZ3MxPF9UcCxfQXJnPjo6X1B0ciB7CisgIHR5cGVkZWYgdHlwZW5hbWUKKyAgICBfTWVtX2Z1bl90cmFpdHM8X1Jlc3VsdD46Ol9TVExQX1RFTVBMQVRFIF9BcmdzMTxfVHAsX0FyZz46Ol9QdHIgX0Jhc2U7CitwdWJsaWM6CisgIGV4cGxpY2l0IG1lbV9mdW4xX3QodHlwZW5hbWUgX0Jhc2U6Ol9fZnVuX3R5cGUgX19mKSA6IF9CYXNlKF9fZikge30KK307CisKKy8vY29uc3RfbWVtX2Z1bjFfdAordGVtcGxhdGUgPGNsYXNzIF9SZXN1bHQsIGNsYXNzIF9UcCwgY2xhc3MgX0FyZz4KK2NsYXNzIGNvbnN0X21lbV9mdW4xX3QgOgorICBwdWJsaWMgX01lbV9mdW5fdHJhaXRzPF9SZXN1bHQ+OjpfU1RMUF9URU1QTEFURSBfQXJnczE8X1RwLF9Bcmc+OjpfUHRyX2NvbnN0IHsKKyAgdHlwZWRlZiB0eXBlbmFtZQorICAgIF9NZW1fZnVuX3RyYWl0czxfUmVzdWx0Pjo6X1NUTFBfVEVNUExBVEUgX0FyZ3MxPF9UcCxfQXJnPjo6X1B0cl9jb25zdCBfQmFzZTsKK3B1YmxpYzoKKyAgZXhwbGljaXQgY29uc3RfbWVtX2Z1bjFfdCh0eXBlbmFtZSBfQmFzZTo6X19mdW5fdHlwZSBfX2YpIDogX0Jhc2UoX19mKSB7fQorfTsKKworLy9tZW1fZnVuMV9yZWZfdAordGVtcGxhdGUgPGNsYXNzIF9SZXN1bHQsIGNsYXNzIF9UcCwgY2xhc3MgX0FyZz4KK2NsYXNzIG1lbV9mdW4xX3JlZl90IDoKKyAgcHVibGljIF9NZW1fZnVuX3RyYWl0czxfUmVzdWx0Pjo6X1NUTFBfVEVNUExBVEUgX0FyZ3MxPF9UcCxfQXJnPjo6X1JlZiB7CisgIHR5cGVkZWYgdHlwZW5hbWUKKyAgICBfTWVtX2Z1bl90cmFpdHM8X1Jlc3VsdD46Ol9TVExQX1RFTVBMQVRFIF9BcmdzMTxfVHAsX0FyZz46Ol9SZWYgX0Jhc2U7CitwdWJsaWM6CisgIGV4cGxpY2l0IG1lbV9mdW4xX3JlZl90KHR5cGVuYW1lIF9CYXNlOjpfX2Z1bl90eXBlIF9fZikgOiBfQmFzZShfX2YpIHt9Cit9OworCisvL2NvbnN0X21lbV9mdW4xX3QKK3RlbXBsYXRlIDxjbGFzcyBfUmVzdWx0LCBjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+CitjbGFzcyBjb25zdF9tZW1fZnVuMV9yZWZfdCA6CisgIHB1YmxpYyBfTWVtX2Z1bl90cmFpdHM8X1Jlc3VsdD46Ol9TVExQX1RFTVBMQVRFIF9BcmdzMTxfVHAsX0FyZz46Ol9SZWZfY29uc3QgeworICB0eXBlZGVmIHR5cGVuYW1lCisgICAgX01lbV9mdW5fdHJhaXRzPF9SZXN1bHQ+OjpfU1RMUF9URU1QTEFURSBfQXJnczE8X1RwLF9Bcmc+OjpfUmVmX2NvbnN0IF9CYXNlOworcHVibGljOgorICBleHBsaWNpdCBjb25zdF9tZW1fZnVuMV9yZWZfdCh0eXBlbmFtZSBfQmFzZTo6X19mdW5fdHlwZSBfX2YpIDogX0Jhc2UoX19mKSB7fQorfTsKKworCit0ZW1wbGF0ZSA8Y2xhc3MgX0FyZywgY2xhc3MgX1Jlc3VsdD4KK2NsYXNzIHBvaW50ZXJfdG9fdW5hcnlfZnVuY3Rpb24gOgorcHVibGljIF9QdHJfZnVuMTxfUmVzdWx0LF9Bcmc+IHsKKyAgdHlwZWRlZiB0eXBlbmFtZQorICAgIF9QdHJfZnVuMTxfUmVzdWx0LF9Bcmc+OjpfX2Z1bl90eXBlIF9fZnVuX3R5cGU7CitwdWJsaWM6CisgIGV4cGxpY2l0IHBvaW50ZXJfdG9fdW5hcnlfZnVuY3Rpb24oX19mdW5fdHlwZSBfX2YpCisgICAgOiBfUHRyX2Z1bjE8X1Jlc3VsdCxfQXJnPihfX2YpIHt9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0FyZzEsIGNsYXNzIF9BcmcyLCBjbGFzcyBfUmVzdWx0PgorY2xhc3MgcG9pbnRlcl90b19iaW5hcnlfZnVuY3Rpb24gOgorcHVibGljIF9QdHJfZnVuMjxfUmVzdWx0LF9BcmcxLF9BcmcyPiB7CisgIHR5cGVkZWYgdHlwZW5hbWUKKyAgICBfUHRyX2Z1bjI8X1Jlc3VsdCxfQXJnMSxfQXJnMj46Ol9fZnVuX3R5cGUgX19mdW5fdHlwZTsKK3B1YmxpYzoKKyAgZXhwbGljaXQgcG9pbnRlcl90b19iaW5hcnlfZnVuY3Rpb24oX19mdW5fdHlwZSBfX2YpCisgICAgOiBfUHRyX2Z1bjI8X1Jlc3VsdCxfQXJnMSxfQXJnMj4oX19mKSB7fQorfTsKKworI2VuZGlmIC8qIV9TVExQX0RPTlRfUkVUVVJOX1ZPSUQgfHwgIV9TVExQX05PX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04gfHwgIV9TVExQX01FTUJFUl9URU1QTEFURV9DTEFTU0VTKi8KKworCisjIGlmICFkZWZpbmVkIChfU1RMUF9NRU1CRVJfUE9JTlRFUl9QQVJBTV9CVUcpCisvLyBNZW1fZnVuIGFkYXB0b3IgaGVscGVyIGZ1bmN0aW9ucy4gIFRoZXJlIGFyZSBvbmx5IHR3bzoKKy8vICBtZW1fZnVuIGFuZCBtZW1fZnVuX3JlZi4gIChtZW1fZnVuMSBhbmQgbWVtX2Z1bjFfcmVmCisvLyAgYXJlIHByb3ZpZGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCBidXQgdGhleSBhcmUgbm8gbG9uZ2VyCisvLyAgcGFydCBvZiB0aGUgQysrIHN0YW5kYXJkLikKKwordGVtcGxhdGUgPGNsYXNzIF9SZXN1bHQsIGNsYXNzIF9UcD4KK2lubGluZSBtZW1fZnVuX3Q8X1Jlc3VsdCxfVHA+CittZW1fZnVuKF9SZXN1bHQgKF9UcDo6Kl9fZikoKSkgeyByZXR1cm4gbWVtX2Z1bl90PF9SZXN1bHQsX1RwPihfX2YpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfUmVzdWx0LCBjbGFzcyBfVHA+CitpbmxpbmUgY29uc3RfbWVtX2Z1bl90PF9SZXN1bHQsX1RwPgorbWVtX2Z1bihfUmVzdWx0IChfVHA6OipfX2YpKCkgY29uc3QpICB7IHJldHVybiBjb25zdF9tZW1fZnVuX3Q8X1Jlc3VsdCxfVHA+KF9fZik7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9SZXN1bHQsIGNsYXNzIF9UcD4KK2lubGluZSBtZW1fZnVuX3JlZl90PF9SZXN1bHQsX1RwPgorbWVtX2Z1bl9yZWYoX1Jlc3VsdCAoX1RwOjoqX19mKSgpKSAgeyByZXR1cm4gbWVtX2Z1bl9yZWZfdDxfUmVzdWx0LF9UcD4oX19mKTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1Jlc3VsdCwgY2xhc3MgX1RwPgoraW5saW5lIGNvbnN0X21lbV9mdW5fcmVmX3Q8X1Jlc3VsdCxfVHA+CittZW1fZnVuX3JlZihfUmVzdWx0IChfVHA6OipfX2YpKCkgY29uc3QpICB7IHJldHVybiBjb25zdF9tZW1fZnVuX3JlZl90PF9SZXN1bHQsX1RwPihfX2YpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfUmVzdWx0LCBjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+CitpbmxpbmUgbWVtX2Z1bjFfdDxfUmVzdWx0LF9UcCxfQXJnPgorbWVtX2Z1bihfUmVzdWx0IChfVHA6OipfX2YpKF9BcmcpKSB7IHJldHVybiBtZW1fZnVuMV90PF9SZXN1bHQsX1RwLF9Bcmc+KF9fZik7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9SZXN1bHQsIGNsYXNzIF9UcCwgY2xhc3MgX0FyZz4KK2lubGluZSBjb25zdF9tZW1fZnVuMV90PF9SZXN1bHQsX1RwLF9Bcmc+CittZW1fZnVuKF9SZXN1bHQgKF9UcDo6Kl9fZikoX0FyZykgY29uc3QpIHsgcmV0dXJuIGNvbnN0X21lbV9mdW4xX3Q8X1Jlc3VsdCxfVHAsX0FyZz4oX19mKTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1Jlc3VsdCwgY2xhc3MgX1RwLCBjbGFzcyBfQXJnPgoraW5saW5lIG1lbV9mdW4xX3JlZl90PF9SZXN1bHQsX1RwLF9Bcmc+CittZW1fZnVuX3JlZihfUmVzdWx0IChfVHA6OipfX2YpKF9BcmcpKSB7IHJldHVybiBtZW1fZnVuMV9yZWZfdDxfUmVzdWx0LF9UcCxfQXJnPihfX2YpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfUmVzdWx0LCBjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+CitpbmxpbmUgY29uc3RfbWVtX2Z1bjFfcmVmX3Q8X1Jlc3VsdCxfVHAsX0FyZz4KK21lbV9mdW5fcmVmKF9SZXN1bHQgKF9UcDo6Kl9fZikoX0FyZykgY29uc3QpIHsgcmV0dXJuIGNvbnN0X21lbV9mdW4xX3JlZl90PF9SZXN1bHQsX1RwLF9Bcmc+KF9fZik7IH0KKworIyBpZiAhKGRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpIHx8IGRlZmluZWQgKF9TVExQX05PX0FOQUNIUk9OSVNNUykpCisvLyAgbWVtX2Z1bjEgYW5kIG1lbV9mdW4xX3JlZiBhcmUgbm8gbG9uZ2VyIHBhcnQgb2YgdGhlIEMrKyBzdGFuZGFyZCwKKy8vICBidXQgdGhleSBhcmUgcHJvdmlkZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCit0ZW1wbGF0ZSA8Y2xhc3MgX1Jlc3VsdCwgY2xhc3MgX1RwLCBjbGFzcyBfQXJnPgoraW5saW5lIG1lbV9mdW4xX3Q8X1Jlc3VsdCxfVHAsX0FyZz4KK21lbV9mdW4xKF9SZXN1bHQgKF9UcDo6Kl9fZikoX0FyZykpIHsgcmV0dXJuIG1lbV9mdW4xX3Q8X1Jlc3VsdCxfVHAsX0FyZz4oX19mKTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1Jlc3VsdCwgY2xhc3MgX1RwLCBjbGFzcyBfQXJnPgoraW5saW5lIGNvbnN0X21lbV9mdW4xX3Q8X1Jlc3VsdCxfVHAsX0FyZz4KK21lbV9mdW4xKF9SZXN1bHQgKF9UcDo6Kl9fZikoX0FyZykgY29uc3QpIHsgcmV0dXJuIGNvbnN0X21lbV9mdW4xX3Q8X1Jlc3VsdCxfVHAsX0FyZz4oX19mKTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1Jlc3VsdCwgY2xhc3MgX1RwLCBjbGFzcyBfQXJnPgoraW5saW5lIG1lbV9mdW4xX3JlZl90PF9SZXN1bHQsX1RwLF9Bcmc+CittZW1fZnVuMV9yZWYoX1Jlc3VsdCAoX1RwOjoqX19mKShfQXJnKSkgeyByZXR1cm4gbWVtX2Z1bjFfcmVmX3Q8X1Jlc3VsdCxfVHAsX0FyZz4oX19mKTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1Jlc3VsdCwgY2xhc3MgX1RwLCBjbGFzcyBfQXJnPgoraW5saW5lIGNvbnN0X21lbV9mdW4xX3JlZl90PF9SZXN1bHQsX1RwLF9Bcmc+CittZW1fZnVuMV9yZWYoX1Jlc3VsdCAoX1RwOjoqX19mKShfQXJnKSBjb25zdCkgeyByZXR1cm4gY29uc3RfbWVtX2Z1bjFfcmVmX3Q8X1Jlc3VsdCxfVHAsX0FyZz4oX19mKTsgfQorCisjIGVuZGlmIC8qIF9TVExQX05PX0VYVEVOU0lPTlMgKi8KKworIyBlbmRpZiAvKiBfU1RMUF9NRU1CRVJfUE9JTlRFUl9QQVJBTV9CVUcgKi8KKwordGVtcGxhdGUgPGNsYXNzIF9BcmcsIGNsYXNzIF9SZXN1bHQ+CitpbmxpbmUgcG9pbnRlcl90b191bmFyeV9mdW5jdGlvbjxfQXJnLCBfUmVzdWx0PgorcHRyX2Z1bihfUmVzdWx0ICgqX19mKShfQXJnKSkKK3sgcmV0dXJuIHBvaW50ZXJfdG9fdW5hcnlfZnVuY3Rpb248X0FyZywgX1Jlc3VsdD4oX19mKTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0FyZzEsIGNsYXNzIF9BcmcyLCBjbGFzcyBfUmVzdWx0PgoraW5saW5lIHBvaW50ZXJfdG9fYmluYXJ5X2Z1bmN0aW9uPF9BcmcxLF9BcmcyLF9SZXN1bHQ+CitwdHJfZnVuKF9SZXN1bHQgKCpfX2YpKF9BcmcxLCBfQXJnMikpCit7IHJldHVybiBwb2ludGVyX3RvX2JpbmFyeV9mdW5jdGlvbjxfQXJnMSxfQXJnMixfUmVzdWx0PihfX2YpOyB9CisKK19TVExQX0VORF9OQU1FU1BBQ0UKZGlmZiAtLWdpdCBhL3N0bC9fZnVuY3Rpb25fYmFzZS5oIGIvc3RsL19mdW5jdGlvbl9iYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJiOWI5NAotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9fZnVuY3Rpb25fYmFzZS5oCkBAIC0wLDAgKzEsMjA3IEBACisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYtMTk5OAorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBNb3Njb3cgQ2VudGVyIGZvciBTUEFSQyBUZWNobm9sb2d5CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworLyogTk9URTogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgU1RMIGhlYWRlcnMuCisgKiAgIFlvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LgorICovCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfRlVOQ1RJT05fQkFTRV9ICisjZGVmaW5lIF9TVExQX0lOVEVSTkFMX0ZVTkNUSU9OX0JBU0VfSAorCisjaWYgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikgJiYgIWRlZmluZWQgKF9TVExQX1RZUEVfVFJBSVRTX0gpCisjICBpbmNsdWRlIDxzdGwvdHlwZV90cmFpdHMuaD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9BcmcsIGNsYXNzIF9SZXN1bHQ+CitzdHJ1Y3QgdW5hcnlfZnVuY3Rpb24geworICB0eXBlZGVmIF9BcmcgYXJndW1lbnRfdHlwZTsKKyAgdHlwZWRlZiBfUmVzdWx0IHJlc3VsdF90eXBlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9BcmcxLCBjbGFzcyBfQXJnMiwgY2xhc3MgX1Jlc3VsdD4KK3N0cnVjdCBiaW5hcnlfZnVuY3Rpb24geworICB0eXBlZGVmIF9BcmcxIGZpcnN0X2FyZ3VtZW50X3R5cGU7CisgIHR5cGVkZWYgX0FyZzIgc2Vjb25kX2FyZ3VtZW50X3R5cGU7CisgIHR5cGVkZWYgX1Jlc3VsdCByZXN1bHRfdHlwZTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgZXF1YWxfdG8gOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCwgX1RwLCBib29sPiB7CisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0IHsgcmV0dXJuIF9feCA9PSBfX3k7IH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgbGVzcyA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwLF9UcCxib29sPgorI2lmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pCisvKiBsZXNzIGlzIHRoZSBkZWZhdWx0IHRlbXBsYXRlIHBhcmFtZXRlciBmb3IgbWFueSBTVEwgY29udGFpbmVycywgdG8gZnVsbHkgdXNlCisgKiB0aGUgbW92ZSBjb25zdHJ1Y3RvciBmZWF0dXJlIHdlIG5lZWQgdG8ga25vdyB0aGF0IHRoZSBkZWZhdWx0IGxlc3MgaXMganVzdCBhCisgKiBmdW5jdG9yLgorICovCisgICAgICAgICAgICAgICwgcHVibGljIF9fc3RscG9ydF9jbGFzczxsZXNzPF9UcD4gPgorI2VuZGlmCit7CisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0IHsgcmV0dXJuIF9feCA8IF9feTsgfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikgJiYgZGVmaW5lZCAoX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EKQorICAvL1RoaXMgaXMgZm9yIGEgdmVyeSBzcGVjaWFsIGNvbXBpbGVyIGNvbmZpZzogcGFydGlhbCB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbgorICAvL2J1dCBubyB0ZW1wbGF0ZSBmdW5jdGlvbiBwYXJ0aWFsIG9yZGVyaW5nLgorICB2b2lkIHN3YXAobGVzczxfVHA+Jikge30KKyNlbmRpZgorfTsKKworI2lmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9fdHlwZV90cmFpdHM8bGVzczxfVHA+ID4geworI2lmICFkZWZpbmVkIChfX0JPUkxBTkRDX18pCisgIHR5cGVkZWYgdHlwZW5hbWUgX0lzU1RMcG9ydENsYXNzPGxlc3M8X1RwPiA+OjpfUmV0IF9TVExwb3J0TGVzczsKKyNlbHNlCisgIGVudW0geyBfSXMgPSBfSXNTVExwb3J0Q2xhc3M8bGVzczxfVHA+ID46Ol9JcyB9OworICB0eXBlZGVmIHR5cGVuYW1lIF9fYm9vbDJ0eXBlPF9Jcz46Ol9SZXQgX1NUTHBvcnRMZXNzOworI2VuZGlmCisgIHR5cGVkZWYgX1NUTHBvcnRMZXNzIGhhc190cml2aWFsX2RlZmF1bHRfY29uc3RydWN0b3I7CisgIHR5cGVkZWYgX1NUTHBvcnRMZXNzIGhhc190cml2aWFsX2NvcHlfY29uc3RydWN0b3I7CisgIHR5cGVkZWYgX1NUTHBvcnRMZXNzIGhhc190cml2aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3I7CisgIHR5cGVkZWYgX1NUTHBvcnRMZXNzIGhhc190cml2aWFsX2Rlc3RydWN0b3I7CisgIHR5cGVkZWYgX1NUTHBvcnRMZXNzIGlzX1BPRF90eXBlOworfTsKKyNlbmRpZgorCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitsZXNzPF9UcD4gX19sZXNzKF9UcCogKSB7IHJldHVybiBsZXNzPF9UcD4oKTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorZXF1YWxfdG88X1RwPiBfX2VxdWFsX3RvKF9UcCogKSB7IHJldHVybiBlcXVhbF90bzxfVHA+KCk7IH0KKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgcGx1cyA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwLCBfVHAsIF9UcD4geworICBfVHAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0IHsgcmV0dXJuIF9feCArIF9feTsgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBtaW51cyA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwLCBfVHAsIF9UcD4geworICBfVHAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0IHsgcmV0dXJuIF9feCAtIF9feTsgfQorfTsKKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorcGx1czxfVHA+IF9fcGx1cyhfVHAqICkgeyByZXR1cm4gcGx1czxfVHA+KCk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK21pbnVzPF9UcD4gX19taW51cyhfVHAqICkgeyByZXR1cm4gbWludXM8X1RwPigpOyB9CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IG11bHRpcGxpZXMgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCwgX1RwLCBfVHA+IHsKKyAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdCB7IHJldHVybiBfX3ggKiBfX3k7IH0KK307CisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9QYWlyPgorc3RydWN0IF9TZWxlY3Qxc3QgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248X1BhaXIsIHR5cGVuYW1lIF9QYWlyOjpmaXJzdF90eXBlPiB7CisgIGNvbnN0IHR5cGVuYW1lIF9QYWlyOjpmaXJzdF90eXBlJiBvcGVyYXRvcigpKGNvbnN0IF9QYWlyJiBfX3gpIGNvbnN0IHsKKyAgICByZXR1cm4gX194LmZpcnN0OworICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1BhaXI+CitzdHJ1Y3QgX1NlbGVjdDJuZCA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxfUGFpciwgdHlwZW5hbWUgX1BhaXI6OnNlY29uZF90eXBlPiB7CisgIGNvbnN0IHR5cGVuYW1lIF9QYWlyOjpzZWNvbmRfdHlwZSYgb3BlcmF0b3IoKShjb25zdCBfUGFpciYgX194KSBjb25zdCB7CisgICAgcmV0dXJuIF9feC5zZWNvbmQ7CisgIH0KK307CisKKy8vIHByb2plY3Qxc3QgYW5kIHByb2plY3QybmQgYXJlIGV4dGVuc2lvbnM6IHRoZXkgYXJlIG5vdCBwYXJ0IG9mIHRoZSBzdGFuZGFyZAordGVtcGxhdGUgPGNsYXNzIF9BcmcxLCBjbGFzcyBfQXJnMj4KK3N0cnVjdCBfUHJvamVjdDFzdCA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X0FyZzEsIF9BcmcyLCBfQXJnMT4geworICBfQXJnMSBvcGVyYXRvcigpKGNvbnN0IF9BcmcxJiBfX3gsIGNvbnN0IF9BcmcyJikgY29uc3QgeyByZXR1cm4gX194OyB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0FyZzEsIGNsYXNzIF9BcmcyPgorc3RydWN0IF9Qcm9qZWN0Mm5kIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfQXJnMSwgX0FyZzIsIF9BcmcyPiB7CisgIF9BcmcyIG9wZXJhdG9yKCkoY29uc3QgX0FyZzEmLCBjb25zdCBfQXJnMiYgX195KSBjb25zdCB7IHJldHVybiBfX3k7IH0KK307CisKKyNpZiBkZWZpbmVkIChfU1RMUF9NVUxUSV9DT05TVF9URU1QTEFURV9BUkdfQlVHKQorLy8gZmJwIDogc29ydCBvZiBzZWxlY3Qxc3QganVzdCBmb3IgbWFwcwordGVtcGxhdGUgPGNsYXNzIF9QYWlyLCBjbGFzcyBfV2hhdGV2ZXI+CisvLyBKREogKENXIFBybzEgZG9lc24ndCBsaWtlIGNvbnN0IHdoZW4gZmlyc3RfdHlwZSBpcyBhbHNvIGNvbnN0KQorc3RydWN0IF9fU2VsZWN0MXN0X2hpbnQgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248X1BhaXIsIF9XaGF0ZXZlcj4geworICAgIGNvbnN0IF9XaGF0ZXZlciYgb3BlcmF0b3IgKCkgKGNvbnN0IF9QYWlyJiBfX3gpIGNvbnN0IHsgcmV0dXJuIF9feC5maXJzdDsgfQorfTsKKyMgIGRlZmluZSAgX1NUTFBfU0VMRUNUMVNUKF9feCxfX3kpIF9TVExQX1BSSVYgX19TZWxlY3Qxc3RfaGludDwgX194LCBfX3kgPgorI2Vsc2UKKyMgIGRlZmluZSAgX1NUTFBfU0VMRUNUMVNUKF9feCwgX195KSBfU1RMUF9QUklWIF9TZWxlY3Qxc3Q8IF9feCA+CisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfSWRlbnRpdHkgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248X1RwLF9UcD4geworICBjb25zdCBfVHAmIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gpIGNvbnN0IHsgcmV0dXJuIF9feDsgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9SZXN1bHQsIGNsYXNzIF9Bcmd1bWVudD4KK3N0cnVjdCBfQ29uc3RhbnRfdW5hcnlfZnVuIHsKKyAgdHlwZWRlZiBfQXJndW1lbnQgYXJndW1lbnRfdHlwZTsKKyAgdHlwZWRlZiAgX1Jlc3VsdCAgcmVzdWx0X3R5cGU7CisgIHJlc3VsdF90eXBlIF9NX3ZhbDsKKworICBfQ29uc3RhbnRfdW5hcnlfZnVuKGNvbnN0IHJlc3VsdF90eXBlJiBfX3YpIDogX01fdmFsKF9fdikge30KKyAgY29uc3QgcmVzdWx0X3R5cGUmIG9wZXJhdG9yKCkoY29uc3QgX0FyZ3VtZW50JikgY29uc3QgeyByZXR1cm4gX01fdmFsOyB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1Jlc3VsdCwgY2xhc3MgX0FyZzEsIGNsYXNzIF9BcmcyPgorc3RydWN0IF9Db25zdGFudF9iaW5hcnlfZnVuIHsKKyAgdHlwZWRlZiAgX0FyZzEgICBmaXJzdF9hcmd1bWVudF90eXBlOworICB0eXBlZGVmICBfQXJnMiAgIHNlY29uZF9hcmd1bWVudF90eXBlOworICB0eXBlZGVmICBfUmVzdWx0IHJlc3VsdF90eXBlOworICBfUmVzdWx0IF9NX3ZhbDsKKworICBfQ29uc3RhbnRfYmluYXJ5X2Z1bihjb25zdCBfUmVzdWx0JiBfX3YpIDogX01fdmFsKF9fdikge30KKyAgY29uc3QgcmVzdWx0X3R5cGUmIG9wZXJhdG9yKCkoY29uc3QgX0FyZzEmLCBjb25zdCBfQXJnMiYpIGNvbnN0IHsKKyAgICByZXR1cm4gX01fdmFsOworICB9Cit9OworCisvLyBpZGVudGl0eV9lbGVtZW50IChub3QgcGFydCBvZiB0aGUgQysrIHN0YW5kYXJkKS4KK3RlbXBsYXRlIDxjbGFzcyBfVHA+IGlubGluZSBfVHAgX19pZGVudGl0eV9lbGVtZW50KHBsdXM8X1RwPikgeyAgcmV0dXJuIF9UcCgwKTsgfQordGVtcGxhdGUgPGNsYXNzIF9UcD4gaW5saW5lIF9UcCBfX2lkZW50aXR5X2VsZW1lbnQobXVsdGlwbGllczxfVHA+KSB7IHJldHVybiBfVHAoMSk7IH0KKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2VuZGlmIC8qIF9TVExQX0lOVEVSTkFMX0ZVTkNUSU9OX0JBU0VfSCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RsL19oYXNoX2Z1bi5oIGIvc3RsL19oYXNoX2Z1bi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNjlmZjAKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvX2hhc2hfZnVuLmgKQEAgLTAsMCArMSwxNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYtMTk5OAorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIEhld2xldHQtUGFja2FyZCBDb21wYW55IG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICovCisKKy8qIE5PVEU6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIFNUTCBoZWFkZXJzLgorICogICBZb3Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4KKyAqLworCisjaWZuZGVmIF9TVExQX0hBU0hfRlVOX0gKKyNkZWZpbmUgX1NUTFBfSEFTSF9GVU5fSAorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NTVERERUYKKyMgIGluY2x1ZGUgPHN0bC9fY3N0ZGRlZi5oPgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleT4gc3RydWN0IGhhc2ggeyB9OworCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK2lubGluZSBzaXplX3QgX19zdGxfaGFzaF9zdHJpbmcoY29uc3QgY2hhciogX19zKSB7CisgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgIHVuc2lnbmVkIGxvbmcgX19oID0gMDsKKyAgZm9yICggOyAqX19zOyArK19fcykKKyAgICBfX2ggPSA1Kl9faCArICpfX3M7CisKKyAgcmV0dXJuIHNpemVfdChfX2gpOworfQorCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKworX1NUTFBfVEVNUExBVEVfTlVMTAorc3RydWN0IGhhc2g8Y2hhcio+IHsKKyAgc2l6ZV90IG9wZXJhdG9yKCkoY29uc3QgY2hhciogX19zKSBjb25zdCB7CisgICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKKyAgICByZXR1cm4gX1NUTFBfUFJJViBfX3N0bF9oYXNoX3N0cmluZyhfX3MpOworICB9Cit9OworCitfU1RMUF9URU1QTEFURV9OVUxMCitzdHJ1Y3QgaGFzaDxjb25zdCBjaGFyKj4geworICBzaXplX3Qgb3BlcmF0b3IoKShjb25zdCBjaGFyKiBfX3MpIGNvbnN0IHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKQorICAgIHJldHVybiBfU1RMUF9QUklWIF9fc3RsX2hhc2hfc3RyaW5nKF9fcyk7CisgIH0KK307CisKK19TVExQX1RFTVBMQVRFX05VTEwgc3RydWN0IGhhc2g8Y2hhcj4geworICBzaXplX3Qgb3BlcmF0b3IoKShjaGFyIF9feCkgY29uc3QgeyByZXR1cm4gX194OyB9Cit9OworX1NUTFBfVEVNUExBVEVfTlVMTCBzdHJ1Y3QgaGFzaDx1bnNpZ25lZCBjaGFyPiB7CisgIHNpemVfdCBvcGVyYXRvcigpKHVuc2lnbmVkIGNoYXIgX194KSBjb25zdCB7IHJldHVybiBfX3g7IH0KK307CisjaWYgIWRlZmluZWQgKF9TVExQX05PX1NJR05FRF9CVUlMVElOUykKK19TVExQX1RFTVBMQVRFX05VTEwgc3RydWN0IGhhc2g8c2lnbmVkIGNoYXI+IHsKKyAgc2l6ZV90IG9wZXJhdG9yKCkodW5zaWduZWQgY2hhciBfX3gpIGNvbnN0IHsgcmV0dXJuIF9feDsgfQorfTsKKyNlbmRpZgorX1NUTFBfVEVNUExBVEVfTlVMTCBzdHJ1Y3QgaGFzaDxzaG9ydD4geworICBzaXplX3Qgb3BlcmF0b3IoKShzaG9ydCBfX3gpIGNvbnN0IHsgcmV0dXJuIF9feDsgfQorfTsKK19TVExQX1RFTVBMQVRFX05VTEwgc3RydWN0IGhhc2g8dW5zaWduZWQgc2hvcnQ+IHsKKyAgc2l6ZV90IG9wZXJhdG9yKCkodW5zaWduZWQgc2hvcnQgX194KSBjb25zdCB7IHJldHVybiBfX3g7IH0KK307CitfU1RMUF9URU1QTEFURV9OVUxMIHN0cnVjdCBoYXNoPGludD4geworICBzaXplX3Qgb3BlcmF0b3IoKShpbnQgX194KSBjb25zdCB7IHJldHVybiBfX3g7IH0KK307CisKKyNpZiBkZWZpbmVkIChfV0lONjQpIHx8ICFkZWZpbmVkIChfU1RMUF9NU1ZDKSB8fCAoX1NUTFBfTVNWQyA8IDEzMDApCitfU1RMUF9URU1QTEFURV9OVUxMIHN0cnVjdCBoYXNoPHVuc2lnbmVkIGludD4geworICBzaXplX3Qgb3BlcmF0b3IoKSh1bnNpZ25lZCBpbnQgX194KSBjb25zdCB7IHJldHVybiBfX3g7IH0KK307CisjZWxzZQorLyogTVNWQyAuTmV0IHNpbmNlIDIwMDIgaGFzIGEgNjQgYml0cyBwb3J0YWJpbGl0eSB3YXJuaW5nIGZlYXR1cmUuIHR5cGVkZWYKKyAqIGxpa2Ugc2l6ZV90IGFyZSB0YWdnZWQgYXMgcG90ZW50aWFsIDY0IGJpdHMgdmFyaWFibGVzIG1ha2luZyB0aGVtIGRpZmZlcmVudCBmcm9tCisgKiB1bnNpZ25lZCBpbnQuIFRvIGF2b2lkIHRoZSB3YXJuaW5nIHdoZW4gYSBoYXNoIGNvbnRhaW5lciBpcyBpbnN0YW5jaWF0ZWQgd2l0aAorICogdGhlIHNpemVfdCBrZXkgd2UgcHJlZmVyIHRvIGdyYW50IHRoZSBzaXplX3Qgc3BlY2lhbGl6YXRpb24gcmF0aGVyIHRoYW4gdGhlCisgKiB1bnNpZ25lZCBpbnQgb25lLgorICovCitfU1RMUF9URU1QTEFURV9OVUxMIHN0cnVjdCBoYXNoPHNpemVfdD4geworICBzaXplX3Qgb3BlcmF0b3IoKShzaXplX3QgX194KSBjb25zdCB7IHJldHVybiBfX3g7IH0KK307CisjZW5kaWYKKworX1NUTFBfVEVNUExBVEVfTlVMTCBzdHJ1Y3QgaGFzaDxsb25nPiB7CisgIHNpemVfdCBvcGVyYXRvcigpKGxvbmcgX194KSBjb25zdCB7IHJldHVybiBfX3g7IH0KK307CitfU1RMUF9URU1QTEFURV9OVUxMIHN0cnVjdCBoYXNoPHVuc2lnbmVkIGxvbmc+IHsKKyAgc2l6ZV90IG9wZXJhdG9yKCkodW5zaWduZWQgbG9uZyBfX3gpIGNvbnN0IHsgcmV0dXJuIF9feDsgfQorfTsKKworI2lmIGRlZmluZWQgKF9TVExQX0xPTkdfTE9ORykKK19TVExQX1RFTVBMQVRFX05VTEwgc3RydWN0IGhhc2g8X1NUTFBfTE9OR19MT05HPiB7CisgIHNpemVfdCBvcGVyYXRvcigpKF9TVExQX0xPTkdfTE9ORyB4KSBjb25zdCB7IHJldHVybiAoc2l6ZV90KXg7IH0KK307CitfU1RMUF9URU1QTEFURV9OVUxMIHN0cnVjdCBoYXNoPHVuc2lnbmVkIF9TVExQX0xPTkdfTE9ORz4geworICBzaXplX3Qgb3BlcmF0b3IoKSh1bnNpZ25lZCBfU1RMUF9MT05HX0xPTkcgeCkgY29uc3QgeyByZXR1cm4gKHNpemVfdCl4OyB9Cit9OworI2VuZGlmCisKK19TVExQX1RFTVBMQVRFX05VTEwKK3N0cnVjdCBoYXNoPHZvaWQgKj4KK3sKKyAgICB1bmlvbiBfX3ZwIHsKKyAgICAgICAgc2l6ZV90IHM7CisgICAgICAgIHZvaWQgICpwOworICAgIH07CisKKyAgICBzaXplX3Qgb3BlcmF0b3IoKSh2b2lkICpfX3gpIGNvbnN0CisgICAgICB7CisgICAgICAgIF9fdnAgdnA7CisgICAgICAgIHZwLnAgPSBfX3g7CisgICAgICAgIHJldHVybiB2cC5zOworICAgICAgfQorfTsKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYgLyogX1NUTFBfSEFTSF9GVU5fSCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RsL19oYXNoX21hcC5oIGIvc3RsL19oYXNoX21hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjY2YzZTUKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvX2hhc2hfbWFwLmgKQEAgLTAsMCArMSw1MDAgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisvKiBOT1RFOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBTVEwgaGVhZGVycy4KKyAqICAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuCisgKi8KKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9IQVNIX01BUF9ICisjZGVmaW5lIF9TVExQX0lOVEVSTkFMX0hBU0hfTUFQX0gKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9IQVNIVEFCTEVfSAorIyAgaW5jbHVkZSA8c3RsL19oYXNodGFibGUuaD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworLy9TcGVjaWZpYyBpdGVyYXRvciB0cmFpdHMgY3JlYXRpb24KK19TVExQX0NSRUFURV9IQVNIX0lURVJBVE9SX1RSQUlUUyhIYXNoTWFwVHJhaXRzVCwgdHJhaXRzKQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBfU1RMUF9ERkxfVE1QTF9QQVJBTShfSGFzaEZjbixoYXNoPF9LZXk+KSwKKyAgICAgICAgICBfU1RMUF9ERkxfVE1QTF9QQVJBTShfRXF1YWxLZXksZXF1YWxfdG88X0tleT4pLAorICAgICAgICAgIF9TVExQX0RFRkFVTFRfUEFJUl9BTExPQ0FUT1JfU0VMRUNUKGNvbnN0IF9LZXksIF9UcCkgPgorY2xhc3MgaGFzaF9tYXAKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUEFSVElBTF9TUEVDX1dPUktBUk9VTkQpCisgICAgICAgICAgICAgICA6IHB1YmxpYyBfX3N0bHBvcnRfY2xhc3M8aGFzaF9tYXA8X0tleSwgX1RwLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+ID4KKyNlbmRpZgoreworcHJpdmF0ZToKKyAgdHlwZWRlZiBoYXNoX21hcDxfS2V5LCBfVHAsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz4gX1NlbGY7CitwdWJsaWM6CisgIHR5cGVkZWYgX0tleSBrZXlfdHlwZTsKKyAgdHlwZWRlZiBfVHAgZGF0YV90eXBlOworICB0eXBlZGVmIF9UcCBtYXBwZWRfdHlwZTsKKyNpZiAhZGVmaW5lZCAoX19ETUNfXykKKyAgdHlwZWRlZiBwYWlyPGNvbnN0IGtleV90eXBlLCBkYXRhX3R5cGU+IHZhbHVlX3R5cGU7CisjZWxzZQorICAvKiBETUMgZ29lcyB0b28gZmFyIGluIHRlbXBsYXRlIGluc3RhbmNpYXRpb24gYW5kIHRyaWVzIHRvIGZ1bGx5IGluc3RhbmNpYXRlCisgICAqIHNsaXN0PHBhaXI8Y29uc3QgaW50LCBzdHJpbmc+ID4gZm9yIGluc3RhbmNlLiBUaGUgZ2VuZXJhdGlvbiBvZiBhc3NpZ25tZW50CisgICAqIG9wZXJhdG9yIGZhaWxzIG9mIGNvdXJzZSBzbyB3ZSBhcmUgZm9yY2UgdG8gdXNlIG11dGFibGUga2V5IGZvciB0aGlzIGNvbXBpbGVyLgorICAgKi8KKyAgdHlwZWRlZiBwYWlyPGtleV90eXBlLCBkYXRhX3R5cGU+IHZhbHVlX3R5cGU7CisjZW5kaWYKK3ByaXZhdGU6CisgIC8vU3BlY2lmaWMgaXRlcmF0b3IgdHJhaXRzIGNyZWF0aW9uCisgIHR5cGVkZWYgX1NUTFBfUFJJViBfSGFzaE1hcFRyYWl0c1Q8dmFsdWVfdHlwZT4gX0hhc2hNYXBUcmFpdHM7CisKK3B1YmxpYzoKKyAgdHlwZWRlZiBoYXNodGFibGU8dmFsdWVfdHlwZSwga2V5X3R5cGUsIF9IYXNoRmNuLCBfSGFzaE1hcFRyYWl0cywKKyAgICAgICAgICAgICAgICAgICAgX1NUTFBfU0VMRUNUMVNUKHZhbHVlX3R5cGUsIF9LZXkpLCBfRXF1YWxLZXksIF9BbGxvYyA+IF9IdDsKKworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6aGFzaGVyIGhhc2hlcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmtleV9lcXVhbCBrZXlfZXF1YWw7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OnNpemVfdHlwZSBzaXplX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6cG9pbnRlciBwb2ludGVyOworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6Y29uc3RfcG9pbnRlciBjb25zdF9wb2ludGVyOworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6cmVmZXJlbmNlIHJlZmVyZW5jZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9yZWZlcmVuY2U7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6Oml0ZXJhdG9yIGl0ZXJhdG9yOworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmFsbG9jYXRvcl90eXBlIGFsbG9jYXRvcl90eXBlOworCisgIGhhc2hlciBoYXNoX2Z1bmN0KCkgY29uc3QgeyByZXR1cm4gX01faHQuaGFzaF9mdW5jdCgpOyB9CisgIGtleV9lcXVhbCBrZXlfZXEoKSBjb25zdCB7IHJldHVybiBfTV9odC5rZXlfZXEoKTsgfQorICBhbGxvY2F0b3JfdHlwZSBnZXRfYWxsb2NhdG9yKCkgY29uc3QgeyByZXR1cm4gX01faHQuZ2V0X2FsbG9jYXRvcigpOyB9CisKK3ByaXZhdGU6CisgIF9IdCBfTV9odDsKKyAgX1NUTFBfS0VZX1RZUEVfRk9SX0NPTlRfRVhUKGtleV90eXBlKQorcHVibGljOgorICBoYXNoX21hcCgpIDogX01faHQoMTAwLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpIHt9CisgIGV4cGxpY2l0IGhhc2hfbWFwKHNpemVfdHlwZSBfX24pCisgICAgOiBfTV9odChfX24sIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkge30KKyAgaGFzaF9tYXAoc2l6ZV90eXBlIF9fbiwgY29uc3QgaGFzaGVyJiBfX2hmKQorICAgIDogX01faHQoX19uLCBfX2hmLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkge30KKyAgaGFzaF9tYXAoc2l6ZV90eXBlIF9fbiwgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLAorICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9NX2h0KF9fbiwgX19oZiwgX19lcWwsIF9fYSkge30KKworICBoYXNoX21hcChfX21vdmVfc291cmNlPF9TZWxmPiBzcmMpCisgICAgOiBfTV9odChfX21vdmVfc291cmNlPF9IdD4oc3JjLmdldCgpLl9NX2h0KSkgeworICB9CisKKyNpZmRlZiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgaGFzaF9tYXAoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wpCisgICAgOiBfTV9odCgxMDAsIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9CisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgaGFzaF9tYXAoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsIHNpemVfdHlwZSBfX24pCisgICAgOiBfTV9odChfX24sIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9CisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgaGFzaF9tYXAoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsIHNpemVfdHlwZSBfX24sCisgICAgICAgICAgIGNvbnN0IGhhc2hlciYgX19oZikKKyAgICA6IF9NX2h0KF9fbiwgX19oZiwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCisgICAgeyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZiwgX19sKTsgfQorIyBpZmRlZiBfU1RMUF9ORUVEU19FWFRSQV9URU1QTEFURV9DT05TVFJVQ1RPUlMKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICBoYXNoX21hcChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbiwKKyAgICAgICAgICAgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsKQorICAgIDogX01faHQoX19uLCBfX2hmLCBfX2VxbCwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9CisjIGVuZGlmCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgaGFzaF9tYXAoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsIHNpemVfdHlwZSBfX24sCisgICAgICAgICAgIGNvbnN0IGhhc2hlciYgX19oZiwgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCwKKyAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSBfU1RMUF9BTExPQ0FUT1JfVFlQRV9ERkwpCisgICAgOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBfX2EpCisgICAgeyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZiwgX19sKTsgfQorCisjZWxzZQorICBoYXNoX21hcChjb25zdCB2YWx1ZV90eXBlKiBfX2YsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbCkKKyAgICA6IF9NX2h0KDEwMCwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQorICAgIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCk7IH0KKyAgaGFzaF9tYXAoY29uc3QgdmFsdWVfdHlwZSogX19mLCBjb25zdCB2YWx1ZV90eXBlKiBfX2wsIHNpemVfdHlwZSBfX24pCisgICAgOiBfTV9odChfX24sIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9CisgIGhhc2hfbWFwKGNvbnN0IHZhbHVlX3R5cGUqIF9fZiwgY29uc3QgdmFsdWVfdHlwZSogX19sLCBzaXplX3R5cGUgX19uLAorICAgICAgICAgICBjb25zdCBoYXNoZXImIF9faGYpCisgICAgOiBfTV9odChfX24sIF9faGYsIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQorICAgIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCk7IH0KKyAgaGFzaF9tYXAoY29uc3QgdmFsdWVfdHlwZSogX19mLCBjb25zdCB2YWx1ZV90eXBlKiBfX2wsIHNpemVfdHlwZSBfX24sCisgICAgICAgICAgIGNvbnN0IGhhc2hlciYgX19oZiwgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCwKKyAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBfX2EpCisgICAgeyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZiwgX19sKTsgfQorCisgIGhhc2hfbWFwKGNvbnN0X2l0ZXJhdG9yIF9fZiwgY29uc3RfaXRlcmF0b3IgX19sKQorICAgIDogX01faHQoMTAwLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCisgICAgeyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZiwgX19sKTsgfQorICBoYXNoX21hcChjb25zdF9pdGVyYXRvciBfX2YsIGNvbnN0X2l0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbikKKyAgICA6IF9NX2h0KF9fbiwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQorICAgIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCk7IH0KKyAgaGFzaF9tYXAoY29uc3RfaXRlcmF0b3IgX19mLCBjb25zdF9pdGVyYXRvciBfX2wsIHNpemVfdHlwZSBfX24sCisgICAgICAgICAgIGNvbnN0IGhhc2hlciYgX19oZikKKyAgICA6IF9NX2h0KF9fbiwgX19oZiwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCisgICAgeyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZiwgX19sKTsgfQorICBoYXNoX21hcChjb25zdF9pdGVyYXRvciBfX2YsIGNvbnN0X2l0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbiwKKyAgICAgICAgICAgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLAorICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9NX2h0KF9fbiwgX19oZiwgX19lcWwsIF9fYSkKKyAgICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9CisjZW5kaWYgLypfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisKK3B1YmxpYzoKKyAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCB7IHJldHVybiBfTV9odC5zaXplKCk7IH0KKyAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgeyByZXR1cm4gX01faHQubWF4X3NpemUoKTsgfQorICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gX01faHQuZW1wdHkoKTsgfQorICB2b2lkIHN3YXAoX1NlbGYmIF9faHMpIHsgX01faHQuc3dhcChfX2hzLl9NX2h0KTsgfQorICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIF9NX2h0LmJlZ2luKCk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gX01faHQuZW5kKCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBfTV9odC5iZWdpbigpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmVuZCgpOyB9CisKK3B1YmxpYzoKKyAgcGFpcjxpdGVyYXRvcixib29sPiBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopCisgIHsgcmV0dXJuIF9NX2h0Lmluc2VydF91bmlxdWUoX19vYmopOyB9CisjaWZkZWYgX1NUTFBfTUVNQkVSX1RFTVBMQVRFUworICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZvaWQgaW5zZXJ0KF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sKQorICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLF9fbCk7IH0KKyNlbHNlCisgIHZvaWQgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUqIF9fZiwgY29uc3QgdmFsdWVfdHlwZSogX19sKQorICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLF9fbCk7IH0KKyAgdm9pZCBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19mLCBjb25zdF9pdGVyYXRvciBfX2wpCisgIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCk7IH0KKyNlbmRpZiAvKl9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKyAgcGFpcjxpdGVyYXRvcixib29sPiBpbnNlcnRfbm9yZXNpemUoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopCisgIHsgcmV0dXJuIF9NX2h0Lmluc2VydF91bmlxdWVfbm9yZXNpemUoX19vYmopOyB9CisKKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIGl0ZXJhdG9yIGZpbmQoY29uc3QgX0tUJiBfX2tleSkgeyByZXR1cm4gX01faHQuZmluZChfX2tleSk7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIGNvbnN0X2l0ZXJhdG9yIGZpbmQoY29uc3QgX0tUJiBfX2tleSkgY29uc3QgeyByZXR1cm4gX01faHQuZmluZChfX2tleSk7IH0KKworICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgX1RwJiBvcGVyYXRvcltdKGNvbnN0IF9LVCYgX19rZXkpIHsKKyAgICBpdGVyYXRvciBfX2l0ID0gX01faHQuZmluZChfX2tleSk7CisgICAgcmV0dXJuIChfX2l0ID09IF9NX2h0LmVuZCgpID8KKyAgICAgIF9NX2h0Ll9NX2luc2VydCh2YWx1ZV90eXBlKF9fa2V5LCBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKF9UcCkpKS5zZWNvbmQgOgorICAgICAgKCpfX2l0KS5zZWNvbmQgKTsKKyAgfQorCisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBzaXplX3R5cGUgY291bnQoY29uc3QgX0tUJiBfX2tleSkgY29uc3QgeyByZXR1cm4gX01faHQuY291bnQoX19rZXkpOyB9CisKKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIHBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPiBlcXVhbF9yYW5nZShjb25zdCBfS1QmIF9fa2V5KQorICB7IHJldHVybiBfTV9odC5lcXVhbF9yYW5nZShfX2tleSk7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIHBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPiBlcXVhbF9yYW5nZShjb25zdCBfS1QmIF9fa2V5KSBjb25zdAorICB7IHJldHVybiBfTV9odC5lcXVhbF9yYW5nZShfX2tleSk7IH0KKworICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgc2l6ZV90eXBlIGVyYXNlKGNvbnN0IF9LVCYgX19rZXkpIHtyZXR1cm4gX01faHQuZXJhc2UoX19rZXkpOyB9CisgIHZvaWQgZXJhc2UoaXRlcmF0b3IgX19pdCkgeyBfTV9odC5lcmFzZShfX2l0KTsgfQorICB2b2lkIGVyYXNlKGl0ZXJhdG9yIF9fZiwgaXRlcmF0b3IgX19sKSB7IF9NX2h0LmVyYXNlKF9fZiwgX19sKTsgfQorICB2b2lkIGNsZWFyKCkgeyBfTV9odC5jbGVhcigpOyB9CisKKyAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9faGludCkgeyBfTV9odC5yZXNpemUoX19oaW50KTsgfQorICBzaXplX3R5cGUgYnVja2V0X2NvdW50KCkgY29uc3QgeyByZXR1cm4gX01faHQuYnVja2V0X2NvdW50KCk7IH0KKyAgc2l6ZV90eXBlIG1heF9idWNrZXRfY291bnQoKSBjb25zdCB7IHJldHVybiBfTV9odC5tYXhfYnVja2V0X2NvdW50KCk7IH0KKyAgc2l6ZV90eXBlIGVsZW1zX2luX2J1Y2tldChzaXplX3R5cGUgX19uKSBjb25zdAorICB7IHJldHVybiBfTV9odC5lbGVtc19pbl9idWNrZXQoX19uKTsgfQorfTsKKworLy9TcGVjaWZpYyBpdGVyYXRvciB0cmFpdHMgY3JlYXRpb24KK19TVExQX0NSRUFURV9IQVNIX0lURVJBVE9SX1RSQUlUUyhIYXNoTXVsdGltYXBUcmFpdHNULCB0cmFpdHMpCisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIF9TVExQX0RGTF9UTVBMX1BBUkFNKF9IYXNoRmNuLGhhc2g8X0tleT4pLAorICAgICAgICAgIF9TVExQX0RGTF9UTVBMX1BBUkFNKF9FcXVhbEtleSxlcXVhbF90bzxfS2V5PiksCisgICAgICAgICAgX1NUTFBfREVGQVVMVF9QQUlSX0FMTE9DQVRPUl9TRUxFQ1QoY29uc3QgX0tleSwgX1RwKSA+CitjbGFzcyBoYXNoX211bHRpbWFwCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EKQorICAgICAgICAgICAgICAgICAgICA6IHB1YmxpYyBfX3N0bHBvcnRfY2xhc3M8aGFzaF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz4gPgorI2VuZGlmCit7Citwcml2YXRlOgorICB0eXBlZGVmIGhhc2hfbXVsdGltYXA8X0tleSwgX1RwLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+IF9TZWxmOworcHVibGljOgorICB0eXBlZGVmIF9LZXkga2V5X3R5cGU7CisgIHR5cGVkZWYgX1RwIGRhdGFfdHlwZTsKKyAgdHlwZWRlZiBfVHAgbWFwcGVkX3R5cGU7CisjaWYgIWRlZmluZWQgKF9fRE1DX18pCisgIHR5cGVkZWYgcGFpcjxjb25zdCBrZXlfdHlwZSwgZGF0YV90eXBlPiB2YWx1ZV90eXBlOworI2Vsc2UKKyAgdHlwZWRlZiBwYWlyPGtleV90eXBlLCBkYXRhX3R5cGU+IHZhbHVlX3R5cGU7CisjZW5kaWYKK3ByaXZhdGU6CisgIC8vU3BlY2lmaWMgaXRlcmF0b3IgdHJhaXRzIGNyZWF0aW9uCisgIHR5cGVkZWYgX1NUTFBfUFJJViBfSGFzaE11bHRpbWFwVHJhaXRzVDx2YWx1ZV90eXBlPiBfSGFzaE11bHRpbWFwVHJhaXRzOworCitwdWJsaWM6CisgIHR5cGVkZWYgaGFzaHRhYmxlPHZhbHVlX3R5cGUsIGtleV90eXBlLCBfSGFzaEZjbiwgX0hhc2hNdWx0aW1hcFRyYWl0cywKKyAgICAgICAgICAgICAgICAgICAgX1NUTFBfU0VMRUNUMVNUKHZhbHVlX3R5cGUsICBfS2V5KSwgX0VxdWFsS2V5LCBfQWxsb2MgPiBfSHQ7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6Omhhc2hlciBoYXNoZXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjprZXlfZXF1YWwga2V5X2VxdWFsOworCisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpzaXplX3R5cGUgc2l6ZV90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OnBvaW50ZXIgcG9pbnRlcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmNvbnN0X3BvaW50ZXIgY29uc3RfcG9pbnRlcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OnJlZmVyZW5jZSByZWZlcmVuY2U7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpjb25zdF9yZWZlcmVuY2UgY29uc3RfcmVmZXJlbmNlOworCisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjppdGVyYXRvciBpdGVyYXRvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOworCisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKKworICBoYXNoZXIgaGFzaF9mdW5jdCgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0Lmhhc2hfZnVuY3QoKTsgfQorICBrZXlfZXF1YWwga2V5X2VxKCkgY29uc3QgeyByZXR1cm4gX01faHQua2V5X2VxKCk7IH0KKyAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmdldF9hbGxvY2F0b3IoKTsgfQorCitwcml2YXRlOgorICBfSHQgX01faHQ7CisgIF9TVExQX0tFWV9UWVBFX0ZPUl9DT05UX0VYVChrZXlfdHlwZSkKK3B1YmxpYzoKKyAgaGFzaF9tdWx0aW1hcCgpIDogX01faHQoMTAwLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpIHt9CisgIGV4cGxpY2l0IGhhc2hfbXVsdGltYXAoc2l6ZV90eXBlIF9fbikKKyAgICA6IF9NX2h0KF9fbiwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKSB7fQorICBoYXNoX211bHRpbWFwKHNpemVfdHlwZSBfX24sIGNvbnN0IGhhc2hlciYgX19oZikKKyAgICA6IF9NX2h0KF9fbiwgX19oZiwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpIHt9CisgIGhhc2hfbXVsdGltYXAoc2l6ZV90eXBlIF9fbiwgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLAorICAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX01faHQoX19uLCBfX2hmLCBfX2VxbCwgX19hKSB7fQorCisgIGhhc2hfbXVsdGltYXAoX19tb3ZlX3NvdXJjZTxfU2VsZj4gc3JjKQorICAgIDogX01faHQoX19tb3ZlX3NvdXJjZTxfSHQ+KHNyYy5nZXQoKS5fTV9odCkpIHsKKyAgfQorCisjaWZkZWYgX1NUTFBfTUVNQkVSX1RFTVBMQVRFUworICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIGhhc2hfbXVsdGltYXAoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wpCisgICAgOiBfTV9odCgxMDAsIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsIF9fbCk7IH0KKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICBoYXNoX211bHRpbWFwKF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLCBzaXplX3R5cGUgX19uKQorICAgIDogX01faHQoX19uLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCisgICAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLCBfX2wpOyB9CisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgaGFzaF9tdWx0aW1hcChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbiwKKyAgICAgICAgICAgICAgICBjb25zdCBoYXNoZXImIF9faGYpCisgICAgOiBfTV9odChfX24sIF9faGYsIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQorICAgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZiwgX19sKTsgfQorIyAgaWZkZWYgX1NUTFBfTkVFRFNfRVhUUkFfVEVNUExBVEVfQ09OU1RSVUNUT1JTCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgaGFzaF9tdWx0aW1hcChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbiwKKyAgICAgICAgICAgICAgICBjb25zdCBoYXNoZXImIF9faGYsIGNvbnN0IGtleV9lcXVhbCYgX19lcWwpCisgICAgOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBhbGxvY2F0b3JfdHlwZSgpKQorICAgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZiwgX19sKTsgfQorIyAgZW5kaWYKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICBoYXNoX211bHRpbWFwKF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLCBzaXplX3R5cGUgX19uLAorICAgICAgICAgICAgICAgIGNvbnN0IGhhc2hlciYgX19oZiwgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCwKKyAgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hIF9TVExQX0FMTE9DQVRPUl9UWVBFX0RGTCkKKyAgICA6IF9NX2h0KF9fbiwgX19oZiwgX19lcWwsIF9fYSkKKyAgICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsIF9fbCk7IH0KKworI2Vsc2UKKyAgaGFzaF9tdWx0aW1hcChjb25zdCB2YWx1ZV90eXBlKiBfX2YsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbCkKKyAgICA6IF9NX2h0KDEwMCwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQorICAgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZiwgX19sKTsgfQorICBoYXNoX211bHRpbWFwKGNvbnN0IHZhbHVlX3R5cGUqIF9fZiwgY29uc3QgdmFsdWVfdHlwZSogX19sLCBzaXplX3R5cGUgX19uKQorICAgIDogX01faHQoX19uLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCisgICAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLCBfX2wpOyB9CisgIGhhc2hfbXVsdGltYXAoY29uc3QgdmFsdWVfdHlwZSogX19mLCBjb25zdCB2YWx1ZV90eXBlKiBfX2wsIHNpemVfdHlwZSBfX24sCisgICAgICAgICAgICAgICAgY29uc3QgaGFzaGVyJiBfX2hmKQorICAgIDogX01faHQoX19uLCBfX2hmLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsIF9fbCk7IH0KKyAgaGFzaF9tdWx0aW1hcChjb25zdCB2YWx1ZV90eXBlKiBfX2YsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbCwgc2l6ZV90eXBlIF9fbiwKKyAgICAgICAgICAgICAgICBjb25zdCBoYXNoZXImIF9faGYsIGNvbnN0IGtleV9lcXVhbCYgX19lcWwsCisgICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBfX2EpCisgICAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLCBfX2wpOyB9CisKKyAgaGFzaF9tdWx0aW1hcChjb25zdF9pdGVyYXRvciBfX2YsIGNvbnN0X2l0ZXJhdG9yIF9fbCkKKyAgICA6IF9NX2h0KDEwMCwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQorICAgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZiwgX19sKTsgfQorICBoYXNoX211bHRpbWFwKGNvbnN0X2l0ZXJhdG9yIF9fZiwgY29uc3RfaXRlcmF0b3IgX19sLCBzaXplX3R5cGUgX19uKQorICAgIDogX01faHQoX19uLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCisgICAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLCBfX2wpOyB9CisgIGhhc2hfbXVsdGltYXAoY29uc3RfaXRlcmF0b3IgX19mLCBjb25zdF9pdGVyYXRvciBfX2wsIHNpemVfdHlwZSBfX24sCisgICAgICAgICAgICAgICAgY29uc3QgaGFzaGVyJiBfX2hmKQorICAgIDogX01faHQoX19uLCBfX2hmLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsIF9fbCk7IH0KKyAgaGFzaF9tdWx0aW1hcChjb25zdF9pdGVyYXRvciBfX2YsIGNvbnN0X2l0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbiwKKyAgICAgICAgICAgICAgICBjb25zdCBoYXNoZXImIF9faGYsIGNvbnN0IGtleV9lcXVhbCYgX19lcWwsCisgICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBfX2EpCisgICAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLCBfX2wpOyB9CisjZW5kaWYgLypfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisKK3B1YmxpYzoKKyAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCB7IHJldHVybiBfTV9odC5zaXplKCk7IH0KKyAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgeyByZXR1cm4gX01faHQubWF4X3NpemUoKTsgfQorICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gX01faHQuZW1wdHkoKTsgfQorICB2b2lkIHN3YXAoX1NlbGYmIF9faHMpIHsgX01faHQuc3dhcChfX2hzLl9NX2h0KTsgfQorCisgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gX01faHQuYmVnaW4oKTsgfQorICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBfTV9odC5lbmQoKTsgfQorICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmJlZ2luKCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gX01faHQuZW5kKCk7IH0KKworcHVibGljOgorICBpdGVyYXRvciBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopCisgICAgeyByZXR1cm4gX01faHQuaW5zZXJ0X2VxdWFsKF9fb2JqKTsgfQorI2lmZGVmIF9TVExQX01FTUJFUl9URU1QTEFURVMKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICB2b2lkIGluc2VydChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCkKKyAgICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsX19sKTsgfQorI2Vsc2UKKyAgdm9pZCBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSogX19mLCBjb25zdCB2YWx1ZV90eXBlKiBfX2wpIHsKKyAgICBfTV9odC5pbnNlcnRfZXF1YWwoX19mLF9fbCk7CisgIH0KKyAgdm9pZCBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19mLCBjb25zdF9pdGVyYXRvciBfX2wpCisgICAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLCBfX2wpOyB9CisjZW5kaWYgLypfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisgIGl0ZXJhdG9yIGluc2VydF9ub3Jlc2l6ZShjb25zdCB2YWx1ZV90eXBlJiBfX29iaikKKyAgICB7IHJldHVybiBfTV9odC5pbnNlcnRfZXF1YWxfbm9yZXNpemUoX19vYmopOyB9CisKKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIGl0ZXJhdG9yIGZpbmQoY29uc3QgX0tUJiBfX2tleSkgeyByZXR1cm4gX01faHQuZmluZChfX2tleSk7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIGNvbnN0X2l0ZXJhdG9yIGZpbmQoY29uc3QgX0tUJiBfX2tleSkgY29uc3QgeyByZXR1cm4gX01faHQuZmluZChfX2tleSk7IH0KKworICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgc2l6ZV90eXBlIGNvdW50KGNvbnN0IF9LVCYgX19rZXkpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmNvdW50KF9fa2V5KTsgfQorCisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBwYWlyPGl0ZXJhdG9yLCBpdGVyYXRvcj4KKyAgZXF1YWxfcmFuZ2UoY29uc3QgX0tUJiBfX2tleSkgeyByZXR1cm4gX01faHQuZXF1YWxfcmFuZ2UoX19rZXkpOyB9CisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4KKyAgZXF1YWxfcmFuZ2UoY29uc3QgX0tUJiBfX2tleSkgY29uc3QgeyByZXR1cm4gX01faHQuZXF1YWxfcmFuZ2UoX19rZXkpOyB9CisKKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIHNpemVfdHlwZSBlcmFzZShjb25zdCBfS1QmIF9fa2V5KSB7cmV0dXJuIF9NX2h0LmVyYXNlKF9fa2V5KTsgfQorICB2b2lkIGVyYXNlKGl0ZXJhdG9yIF9faXQpIHsgX01faHQuZXJhc2UoX19pdCk7IH0KKyAgdm9pZCBlcmFzZShpdGVyYXRvciBfX2YsIGl0ZXJhdG9yIF9fbCkgeyBfTV9odC5lcmFzZShfX2YsIF9fbCk7IH0KKyAgdm9pZCBjbGVhcigpIHsgX01faHQuY2xlYXIoKTsgfQorCitwdWJsaWM6CisgIHZvaWQgcmVzaXplKHNpemVfdHlwZSBfX2hpbnQpIHsgX01faHQucmVzaXplKF9faGludCk7IH0KKyAgc2l6ZV90eXBlIGJ1Y2tldF9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmJ1Y2tldF9jb3VudCgpOyB9CisgIHNpemVfdHlwZSBtYXhfYnVja2V0X2NvdW50KCkgY29uc3QgeyByZXR1cm4gX01faHQubWF4X2J1Y2tldF9jb3VudCgpOyB9CisgIHNpemVfdHlwZSBlbGVtc19pbl9idWNrZXQoc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgeyByZXR1cm4gX01faHQuZWxlbXNfaW5fYnVja2V0KF9fbik7IH0KK307CisKKyNkZWZpbmUgX1NUTFBfVEVNUExBVEVfSEVBREVSIHRlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IYXNoRmNuLCBjbGFzcyBfRXFsS2V5LCBjbGFzcyBfQWxsb2M+CisjZGVmaW5lIF9TVExQX1RFTVBMQVRFX0NPTlRBSU5FUiBoYXNoX21hcDxfS2V5LF9UcCxfSGFzaEZjbixfRXFsS2V5LF9BbGxvYz4KKyNpbmNsdWRlIDxzdGwvX3JlbG9wc19oYXNoX2NvbnQuaD4KKyN1bmRlZiBfU1RMUF9URU1QTEFURV9DT05UQUlORVIKKyNkZWZpbmUgX1NUTFBfVEVNUExBVEVfQ09OVEFJTkVSIGhhc2hfbXVsdGltYXA8X0tleSxfVHAsX0hhc2hGY24sX0VxbEtleSxfQWxsb2M+CisjaW5jbHVkZSA8c3RsL19yZWxvcHNfaGFzaF9jb250Lmg+CisjdW5kZWYgX1NUTFBfVEVNUExBVEVfQ09OVEFJTkVSCisjdW5kZWYgX1NUTFBfVEVNUExBVEVfSEVBREVSCisKKyNpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2hGbiwgIGNsYXNzIF9FcUtleSwgY2xhc3MgX0FsbG9jPgorc3RydWN0IF9fbW92ZV90cmFpdHM8aGFzaF9tYXA8X0tleSwgX1RwLCBfSGFzaEZuLCBfRXFLZXksIF9BbGxvYz4gPiA6CisgIF9TVExQX1BSSVYgX19tb3ZlX3RyYWl0c19oZWxwPHR5cGVuYW1lIGhhc2hfbWFwPF9LZXksIF9UcCwgX0hhc2hGbiwgX0VxS2V5LCBfQWxsb2M+OjpfSHQ+Cit7fTsKKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2hGbiwgIGNsYXNzIF9FcUtleSwgY2xhc3MgX0FsbG9jPgorc3RydWN0IF9fbW92ZV90cmFpdHM8aGFzaF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoRm4sIF9FcUtleSwgX0FsbG9jPiA+IDoKKyAgX1NUTFBfUFJJViBfX21vdmVfdHJhaXRzX2hlbHA8dHlwZW5hbWUgaGFzaF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoRm4sIF9FcUtleSwgX0FsbG9jPjo6X0h0Pgore307CisKKy8vIFNwZWNpYWxpemF0aW9uIG9mIGluc2VydF9pdGVyYXRvciBzbyB0aGF0IGl0IHdpbGwgd29yayBmb3IgaGFzaF9tYXAKKy8vIGFuZCBoYXNoX211bHRpbWFwLgordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2hGbiwgIGNsYXNzIF9FcUtleSwgY2xhc3MgX0FsbG9jPgorY2xhc3MgaW5zZXJ0X2l0ZXJhdG9yPGhhc2hfbWFwPF9LZXksIF9UcCwgX0hhc2hGbiwgX0VxS2V5LCBfQWxsb2M+ID4geworcHJvdGVjdGVkOgorICB0eXBlZGVmIGhhc2hfbWFwPF9LZXksIF9UcCwgX0hhc2hGbiwgX0VxS2V5LCBfQWxsb2M+IF9Db250YWluZXI7CisgIF9Db250YWluZXIqIGNvbnRhaW5lcjsKK3B1YmxpYzoKKyAgdHlwZWRlZiBfQ29udGFpbmVyICAgICAgICAgIGNvbnRhaW5lcl90eXBlOworICB0eXBlZGVmIG91dHB1dF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CisgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKworICBpbnNlcnRfaXRlcmF0b3IoX0NvbnRhaW5lciYgX194KSA6IGNvbnRhaW5lcigmX194KSB7fQorICBpbnNlcnRfaXRlcmF0b3IoX0NvbnRhaW5lciYgX194LCB0eXBlbmFtZSBfQ29udGFpbmVyOjppdGVyYXRvcikKKyAgICA6IGNvbnRhaW5lcigmX194KSB7fQorICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mCisgIG9wZXJhdG9yPShjb25zdCB0eXBlbmFtZSBfQ29udGFpbmVyOjp2YWx1ZV90eXBlJiBfX3ZhbCkgeworICAgIGNvbnRhaW5lci0+aW5zZXJ0KF9fdmFsKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JiBvcGVyYXRvciooKSB7IHJldHVybiAqdGhpczsgfQorICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mIG9wZXJhdG9yKysoKSB7IHJldHVybiAqdGhpczsgfQorICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mIG9wZXJhdG9yKysoaW50KSB7IHJldHVybiAqdGhpczsgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2hGbiwgIGNsYXNzIF9FcUtleSwgY2xhc3MgX0FsbG9jPgorY2xhc3MgaW5zZXJ0X2l0ZXJhdG9yPGhhc2hfbXVsdGltYXA8X0tleSwgX1RwLCBfSGFzaEZuLCBfRXFLZXksIF9BbGxvYz4gPiB7Citwcm90ZWN0ZWQ6CisgIHR5cGVkZWYgaGFzaF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoRm4sIF9FcUtleSwgX0FsbG9jPiBfQ29udGFpbmVyOworICBfQ29udGFpbmVyKiBjb250YWluZXI7CisgIHR5cGVuYW1lIF9Db250YWluZXI6Oml0ZXJhdG9yIGl0ZXI7CitwdWJsaWM6CisgIHR5cGVkZWYgX0NvbnRhaW5lciAgICAgICAgICBjb250YWluZXJfdHlwZTsKKyAgdHlwZWRlZiBvdXRwdXRfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OworICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisKKyAgaW5zZXJ0X2l0ZXJhdG9yKF9Db250YWluZXImIF9feCkgOiBjb250YWluZXIoJl9feCkge30KKyAgaW5zZXJ0X2l0ZXJhdG9yKF9Db250YWluZXImIF9feCwgdHlwZW5hbWUgX0NvbnRhaW5lcjo6aXRlcmF0b3IpCisgICAgOiBjb250YWluZXIoJl9feCkge30KKyAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JgorICBvcGVyYXRvcj0oY29uc3QgdHlwZW5hbWUgX0NvbnRhaW5lcjo6dmFsdWVfdHlwZSYgX192YWwpIHsKKyAgICBjb250YWluZXItPmluc2VydChfX3ZhbCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYgb3BlcmF0b3IqKCkgeyByZXR1cm4gKnRoaXM7IH0KKyAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JiBvcGVyYXRvcisrKCkgeyByZXR1cm4gKnRoaXM7IH0KKyAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JiBvcGVyYXRvcisrKGludCkgeyByZXR1cm4gKnRoaXM7IH0KK307CisjZW5kaWYgLyogX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTiAqLworCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9IQVNIX01BUF9IICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvX2hhc2hfc2V0LmggYi9zdGwvX2hhc2hfc2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgwMGRjMQotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9faGFzaF9zZXQuaApAQCAtMCwwICsxLDQ4MyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKy8qIE5PVEU6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIFNUTCBoZWFkZXJzLgorICogICBZb3Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4KKyAqLworCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0hBU0hfU0VUX0gKKyNkZWZpbmUgX1NUTFBfSU5URVJOQUxfSEFTSF9TRVRfSAorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0hBU0hUQUJMRV9ICisjICBpbmNsdWRlIDxzdGwvX2hhc2h0YWJsZS5oPgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisvL1NwZWNpZmljIGl0ZXJhdG9yIHRyYWl0cyBjcmVhdGlvbgorX1NUTFBfQ1JFQVRFX0hBU0hfSVRFUkFUT1JfVFJBSVRTKEhhc2hTZXRUcmFpdHNULCBDb25zdF90cmFpdHMpCisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsdWUsIF9TVExQX0RGTF9UTVBMX1BBUkFNKF9IYXNoRmNuLGhhc2g8X1ZhbHVlPiksCisgICAgICAgICAgX1NUTFBfREZMX1RNUExfUEFSQU0oX0VxdWFsS2V5LGVxdWFsX3RvPF9WYWx1ZT4pLAorICAgICAgICAgIF9TVExQX0RFRkFVTFRfQUxMT0NBVE9SX1NFTEVDVChfVmFsdWUpID4KK2NsYXNzIGhhc2hfc2V0CisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EKQorICAgICAgICAgICAgICAgOiBwdWJsaWMgX19zdGxwb3J0X2NsYXNzPGhhc2hfc2V0PF9WYWx1ZSwgX0hhc2hGY24sIF9FcXVhbEtleSwgX0FsbG9jPiA+CisjZW5kaWYKK3sKKyAgdHlwZWRlZiBoYXNoX3NldDxfVmFsdWUsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz4gX1NlbGY7CisgIC8vU3BlY2lmaWMgaXRlcmF0b3IgdHJhaXRzIGNyZWF0aW9uCisgIHR5cGVkZWYgX1NUTFBfUFJJViBfSGFzaFNldFRyYWl0c1Q8X1ZhbHVlPiBfSGFzaFNldFRyYWl0czsKK3B1YmxpYzoKKyAgdHlwZWRlZiBoYXNodGFibGU8X1ZhbHVlLCBfVmFsdWUsIF9IYXNoRmNuLAorICAgICAgICAgICAgICAgICAgICBfSGFzaFNldFRyYWl0cywgX1NUTFBfUFJJViBfSWRlbnRpdHk8X1ZhbHVlPiwgX0VxdWFsS2V5LCBfQWxsb2M+IF9IdDsKK3B1YmxpYzoKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmtleV90eXBlIGtleV90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6aGFzaGVyIGhhc2hlcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmtleV9lcXVhbCBrZXlfZXF1YWw7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OnNpemVfdHlwZSBzaXplX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6cG9pbnRlciAgICAgICAgIHBvaW50ZXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpjb25zdF9wb2ludGVyICAgY29uc3RfcG9pbnRlcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OnJlZmVyZW5jZSAgICAgICByZWZlcmVuY2U7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpjb25zdF9yZWZlcmVuY2UgY29uc3RfcmVmZXJlbmNlOworCisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjppdGVyYXRvciBpdGVyYXRvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOworCisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKKworICBoYXNoZXIgaGFzaF9mdW5jdCgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0Lmhhc2hfZnVuY3QoKTsgfQorICBrZXlfZXF1YWwga2V5X2VxKCkgY29uc3QgeyByZXR1cm4gX01faHQua2V5X2VxKCk7IH0KKyAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmdldF9hbGxvY2F0b3IoKTsgfQorCitwcml2YXRlOgorICBfSHQgX01faHQ7CisgIF9TVExQX0tFWV9UWVBFX0ZPUl9DT05UX0VYVChrZXlfdHlwZSkKKworcHVibGljOgorICBoYXNoX3NldCgpCisgICAgOiBfTV9odCgxMDAsIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkge30KKyAgZXhwbGljaXQgaGFzaF9zZXQoc2l6ZV90eXBlIF9fbikKKyAgICA6IF9NX2h0KF9fbiwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKSB7fQorICBoYXNoX3NldChzaXplX3R5cGUgX19uLCBjb25zdCBoYXNoZXImIF9faGYpCisgICAgOiBfTV9odChfX24sIF9faGYsIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKSB7fQorI2lmICFkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQorICBoYXNoX3NldChzaXplX3R5cGUgX19uLCBjb25zdCBoYXNoZXImIF9faGYsIGNvbnN0IGtleV9lcXVhbCYgX19lcWwsCisgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorI2Vsc2UKKyAgaGFzaF9zZXQoc2l6ZV90eXBlIF9fbiwgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsKQorICAgIDogX01faHQoX19uLCBfX2hmLCBfX2VxbCwgYWxsb2NhdG9yX3R5cGUoKSkge30KKyAgaGFzaF9zZXQoc2l6ZV90eXBlIF9fbiwgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLAorICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorI2VuZGlmCisgICAgOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBfX2EpIHt9CisKKyAgaGFzaF9zZXQoX19tb3ZlX3NvdXJjZTxfU2VsZj4gc3JjKQorICAgIDogX01faHQoX19tb3ZlX3NvdXJjZTxfSHQ+KHNyYy5nZXQoKS5fTV9odCkpIHt9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIGhhc2hfc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sKQorICAgIDogX01faHQoMTAwLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCisgICAgeyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZiwgX19sKTsgfQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIGhhc2hfc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLCBzaXplX3R5cGUgX19uKQorICAgIDogX01faHQoX19uLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCisgICAgeyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZiwgX19sKTsgfQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIGhhc2hfc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLCBzaXplX3R5cGUgX19uLAorICAgICAgICAgICBjb25zdCBoYXNoZXImIF9faGYpCisgICAgOiBfTV9odChfX24sIF9faGYsIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQorICAgIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCk7IH0KKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICBoYXNoX3NldChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbiwKKyAgICAgICAgICAgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLAorICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hIF9TVExQX0FMTE9DQVRPUl9UWVBFX0RGTCkKKyAgICA6IF9NX2h0KF9fbiwgX19oZiwgX19lcWwsIF9fYSkKKyAgICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9CisjICBpZiBkZWZpbmVkIChfU1RMUF9ORUVEU19FWFRSQV9URU1QTEFURV9DT05TVFJVQ1RPUlMpCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgaGFzaF9zZXQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsIHNpemVfdHlwZSBfX24sCisgICAgICAgICAgIGNvbnN0IGhhc2hlciYgX19oZiwgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCkKKyAgICA6IF9NX2h0KF9fbiwgX19oZiwgX19lcWwsIGFsbG9jYXRvcl90eXBlKCkpCisgICAgeyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZiwgX19sKTsgfQorIyAgZW5kaWYKKyNlbHNlCisgIGhhc2hfc2V0KGNvbnN0IHZhbHVlX3R5cGUqIF9fZiwgY29uc3QgdmFsdWVfdHlwZSogX19sKQorICAgIDogX01faHQoMTAwLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCisgICAgeyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZiwgX19sKTsgfQorICBoYXNoX3NldChjb25zdCB2YWx1ZV90eXBlKiBfX2YsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbCwgc2l6ZV90eXBlIF9fbikKKyAgICA6IF9NX2h0KF9fbiwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQorICAgIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCk7IH0KKyAgaGFzaF9zZXQoY29uc3QgdmFsdWVfdHlwZSogX19mLCBjb25zdCB2YWx1ZV90eXBlKiBfX2wsIHNpemVfdHlwZSBfX24sCisgICAgICAgICAgIGNvbnN0IGhhc2hlciYgX19oZikKKyAgICA6IF9NX2h0KF9fbiwgX19oZiwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCisgICAgeyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZiwgX19sKTsgfQorICBoYXNoX3NldChjb25zdCB2YWx1ZV90eXBlKiBfX2YsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbCwgc2l6ZV90eXBlIF9fbiwKKyAgICAgICAgICAgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLAorICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9NX2h0KF9fbiwgX19oZiwgX19lcWwsIF9fYSkKKyAgICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9CisKKyAgaGFzaF9zZXQoY29uc3RfaXRlcmF0b3IgX19mLCBjb25zdF9pdGVyYXRvciBfX2wpCisgICAgOiBfTV9odCgxMDAsIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9CisgIGhhc2hfc2V0KGNvbnN0X2l0ZXJhdG9yIF9fZiwgY29uc3RfaXRlcmF0b3IgX19sLCBzaXplX3R5cGUgX19uKQorICAgIDogX01faHQoX19uLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCisgICAgeyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZiwgX19sKTsgfQorICBoYXNoX3NldChjb25zdF9pdGVyYXRvciBfX2YsIGNvbnN0X2l0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbiwKKyAgICAgICAgICAgY29uc3QgaGFzaGVyJiBfX2hmKQorICAgIDogX01faHQoX19uLCBfX2hmLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9CisgIGhhc2hfc2V0KGNvbnN0X2l0ZXJhdG9yIF9fZiwgY29uc3RfaXRlcmF0b3IgX19sLCBzaXplX3R5cGUgX19uLAorICAgICAgICAgICBjb25zdCBoYXNoZXImIF9faGYsIGNvbnN0IGtleV9lcXVhbCYgX19lcWwsCisgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX01faHQoX19uLCBfX2hmLCBfX2VxbCwgX19hKQorICAgIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCk7IH0KKyNlbmRpZiAvKl9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKworcHVibGljOgorICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LnNpemUoKTsgfQorICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCB7IHJldHVybiBfTV9odC5tYXhfc2l6ZSgpOyB9CisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBfTV9odC5lbXB0eSgpOyB9CisgIHZvaWQgc3dhcChfU2VsZiYgX19ocykgeyBfTV9odC5zd2FwKF9faHMuX01faHQpOyB9CisKKyAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBfTV9odC5iZWdpbigpOyB9CisgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIF9NX2h0LmVuZCgpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gX01faHQuYmVnaW4oKTsgfQorICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBfTV9odC5lbmQoKTsgfQorCitwdWJsaWM6CisgIHBhaXI8aXRlcmF0b3IsIGJvb2w+IGluc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX29iaikKKyAgeyByZXR1cm4gX01faHQuaW5zZXJ0X3VuaXF1ZShfX29iaik7IH0KKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZvaWQgaW5zZXJ0KF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sKQorI2Vsc2UKKyAgdm9pZCBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19mLCBjb25zdF9pdGVyYXRvciBfX2wpCisgIHtfTV9odC5pbnNlcnRfdW5pcXVlKF9fZiwgX19sKTsgfQorICB2b2lkIGluc2VydChjb25zdCB2YWx1ZV90eXBlKiBfX2YsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbCkKKyNlbmRpZgorICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLF9fbCk7IH0KKworICBwYWlyPGl0ZXJhdG9yLCBib29sPiBpbnNlcnRfbm9yZXNpemUoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopCisgIHsgcmV0dXJuIF9NX2h0Lmluc2VydF91bmlxdWVfbm9yZXNpemUoX19vYmopOyB9CisKKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIGl0ZXJhdG9yIGZpbmQoY29uc3QgX0tUJiBfX2tleSkgeyByZXR1cm4gX01faHQuZmluZChfX2tleSk7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIGNvbnN0X2l0ZXJhdG9yIGZpbmQoY29uc3QgX0tUJiBfX2tleSkgY29uc3QgeyByZXR1cm4gX01faHQuZmluZChfX2tleSk7IH0KKworICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgc2l6ZV90eXBlIGNvdW50KGNvbnN0IF9LVCYgX19rZXkpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmNvdW50KF9fa2V5KTsgfQorCisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBwYWlyPGl0ZXJhdG9yLCBpdGVyYXRvcj4gZXF1YWxfcmFuZ2UoY29uc3QgX0tUJiBfX2tleSkKKyAgeyByZXR1cm4gX01faHQuZXF1YWxfcmFuZ2UoX19rZXkpOyB9CisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4gZXF1YWxfcmFuZ2UoY29uc3QgX0tUJiBfX2tleSkgY29uc3QKKyAgeyByZXR1cm4gX01faHQuZXF1YWxfcmFuZ2UoX19rZXkpOyB9CisKKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIHNpemVfdHlwZSBlcmFzZShjb25zdCBfS1QmIF9fa2V5KSB7cmV0dXJuIF9NX2h0LmVyYXNlKF9fa2V5KTsgfQorICB2b2lkIGVyYXNlKGl0ZXJhdG9yIF9faXQpIHsgX01faHQuZXJhc2UoX19pdCk7IH0KKyAgdm9pZCBlcmFzZShpdGVyYXRvciBfX2YsIGl0ZXJhdG9yIF9fbCkgeyBfTV9odC5lcmFzZShfX2YsIF9fbCk7IH0KKyAgdm9pZCBjbGVhcigpIHsgX01faHQuY2xlYXIoKTsgfQorCitwdWJsaWM6CisgIHZvaWQgcmVzaXplKHNpemVfdHlwZSBfX2hpbnQpIHsgX01faHQucmVzaXplKF9faGludCk7IH0KKyAgc2l6ZV90eXBlIGJ1Y2tldF9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmJ1Y2tldF9jb3VudCgpOyB9CisgIHNpemVfdHlwZSBtYXhfYnVja2V0X2NvdW50KCkgY29uc3QgeyByZXR1cm4gX01faHQubWF4X2J1Y2tldF9jb3VudCgpOyB9CisgIHNpemVfdHlwZSBlbGVtc19pbl9idWNrZXQoc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgeyByZXR1cm4gX01faHQuZWxlbXNfaW5fYnVja2V0KF9fbik7IH0KK307CisKKy8vU3BlY2lmaWMgaXRlcmF0b3IgdHJhaXRzIGNyZWF0aW9uCitfU1RMUF9DUkVBVEVfSEFTSF9JVEVSQVRPUl9UUkFJVFMoSGFzaE11bHRpc2V0VHJhaXRzVCwgQ29uc3RfdHJhaXRzKQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbHVlLCBfU1RMUF9ERkxfVE1QTF9QQVJBTShfSGFzaEZjbixoYXNoPF9WYWx1ZT4pLAorICAgICAgICAgIF9TVExQX0RGTF9UTVBMX1BBUkFNKF9FcXVhbEtleSxlcXVhbF90bzxfVmFsdWU+KSwKKyAgICAgICAgICBfU1RMUF9ERUZBVUxUX0FMTE9DQVRPUl9TRUxFQ1QoX1ZhbHVlKSA+CitjbGFzcyBoYXNoX211bHRpc2V0CisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EKQorICAgICAgICAgICAgICAgICAgICA6IHB1YmxpYyBfX3N0bHBvcnRfY2xhc3M8aGFzaF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz4gPgorI2VuZGlmCit7CisgIHR5cGVkZWYgaGFzaF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz4gX1NlbGY7CisgIC8vU3BlY2lmaWMgaXRlcmF0b3IgdHJhaXRzIGNyZWF0aW9uCisgIHR5cGVkZWYgX1NUTFBfUFJJViBfSGFzaE11bHRpc2V0VHJhaXRzVDxfVmFsdWU+IF9IYXNoTXVsdGlzZXRUcmFpdHM7CitwdWJsaWM6CisgIHR5cGVkZWYgaGFzaHRhYmxlPF9WYWx1ZSwgX1ZhbHVlLCBfSGFzaEZjbiwKKyAgICAgICAgICAgICAgICAgICAgX0hhc2hNdWx0aXNldFRyYWl0cywgX1NUTFBfUFJJViBfSWRlbnRpdHk8X1ZhbHVlPiwgX0VxdWFsS2V5LCBfQWxsb2M+IF9IdDsKKworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6a2V5X3R5cGUga2V5X3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpoYXNoZXIgaGFzaGVyOworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6a2V5X2VxdWFsIGtleV9lcXVhbDsKKworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6c2l6ZV90eXBlIHNpemVfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpwb2ludGVyICAgICAgIHBvaW50ZXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpjb25zdF9wb2ludGVyIGNvbnN0X3BvaW50ZXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpyZWZlcmVuY2UgcmVmZXJlbmNlOworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X3JlZmVyZW5jZTsKKworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6aXRlcmF0b3IgaXRlcmF0b3I7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKKworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7CisKKyAgaGFzaGVyIGhhc2hfZnVuY3QoKSBjb25zdCB7IHJldHVybiBfTV9odC5oYXNoX2Z1bmN0KCk7IH0KKyAga2V5X2VxdWFsIGtleV9lcSgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmtleV9lcSgpOyB9CisgIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdCB7IHJldHVybiBfTV9odC5nZXRfYWxsb2NhdG9yKCk7IH0KKworcHJpdmF0ZToKKyAgX0h0IF9NX2h0OworICBfU1RMUF9LRVlfVFlQRV9GT1JfQ09OVF9FWFQoa2V5X3R5cGUpCisKK3B1YmxpYzoKKyAgaGFzaF9tdWx0aXNldCgpCisgICAgOiBfTV9odCgxMDAsIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkge30KKyAgZXhwbGljaXQgaGFzaF9tdWx0aXNldChzaXplX3R5cGUgX19uKQorICAgIDogX01faHQoX19uLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpIHt9CisgIGhhc2hfbXVsdGlzZXQoc2l6ZV90eXBlIF9fbiwgY29uc3QgaGFzaGVyJiBfX2hmKQorICAgIDogX01faHQoX19uLCBfX2hmLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkge30KKyAgaGFzaF9tdWx0aXNldChzaXplX3R5cGUgX19uLCBjb25zdCBoYXNoZXImIF9faGYsIGNvbnN0IGtleV9lcXVhbCYgX19lcWwpCisgICAgOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBhbGxvY2F0b3JfdHlwZSgpKSB7fQorICBoYXNoX211bHRpc2V0KHNpemVfdHlwZSBfX24sIGNvbnN0IGhhc2hlciYgX19oZiwgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCwKKyAgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgIDogX01faHQoX19uLCBfX2hmLCBfX2VxbCwgX19hKSB7fQorCisgIGhhc2hfbXVsdGlzZXQoX19tb3ZlX3NvdXJjZTxfU2VsZj4gc3JjKQorICAgIDogX01faHQoX19tb3ZlX3NvdXJjZTxfSHQ+KHNyYy5nZXQoKS5fTV9odCkpIHt9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIGhhc2hfbXVsdGlzZXQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wpCisgICAgOiBfTV9odCgxMDAsIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsIF9fbCk7IH0KKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICBoYXNoX211bHRpc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLCBzaXplX3R5cGUgX19uKQorICAgIDogX01faHQoX19uLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCisgICAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLCBfX2wpOyB9CisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgaGFzaF9tdWx0aXNldChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbiwKKyAgICAgICAgICAgICAgICBjb25zdCBoYXNoZXImIF9faGYpCisgICAgOiBfTV9odChfX24sIF9faGYsIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQorICAgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZiwgX19sKTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgaGFzaF9tdWx0aXNldChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbiwKKyAgICAgICAgICAgICAgICBjb25zdCBoYXNoZXImIF9faGYsIGNvbnN0IGtleV9lcXVhbCYgX19lcWwsCisgICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSBfU1RMUF9BTExPQ0FUT1JfVFlQRV9ERkwpCisgICAgOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBfX2EpCisgICAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLCBfX2wpOyB9CisjICBpZiBkZWZpbmVkIChfU1RMUF9ORUVEU19FWFRSQV9URU1QTEFURV9DT05TVFJVQ1RPUlMpCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgaGFzaF9tdWx0aXNldChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbiwKKyAgICAgICAgICAgICAgICBjb25zdCBoYXNoZXImIF9faGYsIGNvbnN0IGtleV9lcXVhbCYgX19lcWwpCisgICAgOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBhbGxvY2F0b3JfdHlwZSgpKQorICAgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZiwgX19sKTsgfQorIyAgZW5kaWYKKyNlbHNlCisgIGhhc2hfbXVsdGlzZXQoY29uc3QgdmFsdWVfdHlwZSogX19mLCBjb25zdCB2YWx1ZV90eXBlKiBfX2wpCisgICAgOiBfTV9odCgxMDAsIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsIF9fbCk7IH0KKyAgaGFzaF9tdWx0aXNldChjb25zdCB2YWx1ZV90eXBlKiBfX2YsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbCwgc2l6ZV90eXBlIF9fbikKKyAgICA6IF9NX2h0KF9fbiwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQorICAgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZiwgX19sKTsgfQorICBoYXNoX211bHRpc2V0KGNvbnN0IHZhbHVlX3R5cGUqIF9fZiwgY29uc3QgdmFsdWVfdHlwZSogX19sLCBzaXplX3R5cGUgX19uLAorICAgICAgICAgICAgICAgIGNvbnN0IGhhc2hlciYgX19oZikKKyAgICA6IF9NX2h0KF9fbiwgX19oZiwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCisgICAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLCBfX2wpOyB9CisgIGhhc2hfbXVsdGlzZXQoY29uc3QgdmFsdWVfdHlwZSogX19mLCBjb25zdCB2YWx1ZV90eXBlKiBfX2wsIHNpemVfdHlwZSBfX24sCisgICAgICAgICAgICAgICAgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLAorICAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX01faHQoX19uLCBfX2hmLCBfX2VxbCwgX19hKQorICAgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZiwgX19sKTsgfQorCisgIGhhc2hfbXVsdGlzZXQoY29uc3RfaXRlcmF0b3IgX19mLCBjb25zdF9pdGVyYXRvciBfX2wpCisgICAgOiBfTV9odCgxMDAsIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsIF9fbCk7IH0KKyAgaGFzaF9tdWx0aXNldChjb25zdF9pdGVyYXRvciBfX2YsIGNvbnN0X2l0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbikKKyAgICA6IF9NX2h0KF9fbiwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQorICAgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZiwgX19sKTsgfQorICBoYXNoX211bHRpc2V0KGNvbnN0X2l0ZXJhdG9yIF9fZiwgY29uc3RfaXRlcmF0b3IgX19sLCBzaXplX3R5cGUgX19uLAorICAgICAgICAgICAgICAgIGNvbnN0IGhhc2hlciYgX19oZikKKyAgICA6IF9NX2h0KF9fbiwgX19oZiwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCisgICAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLCBfX2wpOyB9CisgIGhhc2hfbXVsdGlzZXQoY29uc3RfaXRlcmF0b3IgX19mLCBjb25zdF9pdGVyYXRvciBfX2wsIHNpemVfdHlwZSBfX24sCisgICAgICAgICAgICAgICAgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLAorICAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX01faHQoX19uLCBfX2hmLCBfX2VxbCwgX19hKQorICAgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZiwgX19sKTsgfQorI2VuZGlmIC8qX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworCitwdWJsaWM6CisgIHNpemVfdHlwZSBzaXplKCkgY29uc3QgeyByZXR1cm4gX01faHQuc2l6ZSgpOyB9CisgIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0Lm1heF9zaXplKCk7IH0KKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmVtcHR5KCk7IH0KKyAgdm9pZCBzd2FwKF9TZWxmJiBocykgeyBfTV9odC5zd2FwKGhzLl9NX2h0KTsgfQorCisgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gX01faHQuYmVnaW4oKTsgfQorICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBfTV9odC5lbmQoKTsgfQorICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmJlZ2luKCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gX01faHQuZW5kKCk7IH0KKworcHVibGljOgorICBpdGVyYXRvciBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopIHsgcmV0dXJuIF9NX2h0Lmluc2VydF9lcXVhbChfX29iaik7IH0KKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZvaWQgaW5zZXJ0KF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sKQorICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsX19sKTsgfQorI2Vsc2UKKyAgdm9pZCBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSogX19mLCBjb25zdCB2YWx1ZV90eXBlKiBfX2wpCisgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZixfX2wpOyB9CisgIHZvaWQgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9fZiwgY29uc3RfaXRlcmF0b3IgX19sKQorICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsIF9fbCk7IH0KKyNlbmRpZiAvKl9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKyAgaXRlcmF0b3IgaW5zZXJ0X25vcmVzaXplKGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKQorICB7IHJldHVybiBfTV9odC5pbnNlcnRfZXF1YWxfbm9yZXNpemUoX19vYmopOyB9CisKKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIGl0ZXJhdG9yIGZpbmQoY29uc3QgX0tUJiBfX2tleSkgeyByZXR1cm4gX01faHQuZmluZChfX2tleSk7IH0KKworICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgY29uc3RfaXRlcmF0b3IgZmluZChjb25zdCBfS1QmIF9fa2V5KSBjb25zdCB7IHJldHVybiBfTV9odC5maW5kKF9fa2V5KTsgfQorCisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBzaXplX3R5cGUgY291bnQoY29uc3QgX0tUJiBfX2tleSkgY29uc3QgeyByZXR1cm4gX01faHQuY291bnQoX19rZXkpOyB9CisKKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIHBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPiBlcXVhbF9yYW5nZShjb25zdCBfS1QmIF9fa2V5KQorICB7IHJldHVybiBfTV9odC5lcXVhbF9yYW5nZShfX2tleSk7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIHBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPiBlcXVhbF9yYW5nZShjb25zdCBfS1QmIF9fa2V5KSBjb25zdAorICB7IHJldHVybiBfTV9odC5lcXVhbF9yYW5nZShfX2tleSk7IH0KKworICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgc2l6ZV90eXBlIGVyYXNlKGNvbnN0IF9LVCYgX19rZXkpIHtyZXR1cm4gX01faHQuZXJhc2UoX19rZXkpOyB9CisgIHZvaWQgZXJhc2UoaXRlcmF0b3IgX19pdCkgeyBfTV9odC5lcmFzZShfX2l0KTsgfQorICB2b2lkIGVyYXNlKGl0ZXJhdG9yIF9fZiwgaXRlcmF0b3IgX19sKSB7IF9NX2h0LmVyYXNlKF9fZiwgX19sKTsgfQorICB2b2lkIGNsZWFyKCkgeyBfTV9odC5jbGVhcigpOyB9CisKK3B1YmxpYzoKKyAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9faGludCkgeyBfTV9odC5yZXNpemUoX19oaW50KTsgfQorICBzaXplX3R5cGUgYnVja2V0X2NvdW50KCkgY29uc3QgeyByZXR1cm4gX01faHQuYnVja2V0X2NvdW50KCk7IH0KKyAgc2l6ZV90eXBlIG1heF9idWNrZXRfY291bnQoKSBjb25zdCB7IHJldHVybiBfTV9odC5tYXhfYnVja2V0X2NvdW50KCk7IH0KKyAgc2l6ZV90eXBlIGVsZW1zX2luX2J1Y2tldChzaXplX3R5cGUgX19uKSBjb25zdAorICB7IHJldHVybiBfTV9odC5lbGVtc19pbl9idWNrZXQoX19uKTsgfQorfTsKKworI2RlZmluZSBfU1RMUF9URU1QTEFURV9IRUFERVIgdGVtcGxhdGUgPGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0hhc2hGY24sIGNsYXNzIF9FcXVhbEtleSwgY2xhc3MgX0FsbG9jPgorI2RlZmluZSBfU1RMUF9URU1QTEFURV9DT05UQUlORVIgaGFzaF9zZXQ8X1ZhbHVlLF9IYXNoRmNuLF9FcXVhbEtleSxfQWxsb2M+CisKKyNpbmNsdWRlIDxzdGwvX3JlbG9wc19oYXNoX2NvbnQuaD4KKworI3VuZGVmIF9TVExQX1RFTVBMQVRFX0NPTlRBSU5FUgorI2RlZmluZSBfU1RMUF9URU1QTEFURV9DT05UQUlORVIgaGFzaF9tdWx0aXNldDxfVmFsdWUsX0hhc2hGY24sX0VxdWFsS2V5LF9BbGxvYz4KKyNpbmNsdWRlIDxzdGwvX3JlbG9wc19oYXNoX2NvbnQuaD4KKworI3VuZGVmIF9TVExQX1RFTVBMQVRFX0NPTlRBSU5FUgorI3VuZGVmIF9TVExQX1RFTVBMQVRFX0hFQURFUgorCisvLyBTcGVjaWFsaXphdGlvbiBvZiBpbnNlcnRfaXRlcmF0b3Igc28gdGhhdCBpdCB3aWxsIHdvcmsgZm9yIGhhc2hfc2V0CisvLyBhbmQgaGFzaF9tdWx0aXNldC4KKworI2lmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaEZjbiwgY2xhc3MgX0VxdWFsS2V5LCBjbGFzcyBfQWxsb2M+CitzdHJ1Y3QgX19tb3ZlX3RyYWl0czxoYXNoX3NldDxfVmFsdWUsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz4gPiA6CisgIF9TVExQX1BSSVYgX19tb3ZlX3RyYWl0c19hdXg8dHlwZW5hbWUgaGFzaF9zZXQ8X1ZhbHVlLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+OjpfSHQ+Cit7fTsKKwordGVtcGxhdGUgPGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0hhc2hGY24sIGNsYXNzIF9FcXVhbEtleSwgY2xhc3MgX0FsbG9jPgorc3RydWN0IF9fbW92ZV90cmFpdHM8aGFzaF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz4gPiA6CisgIF9TVExQX1BSSVYgX19tb3ZlX3RyYWl0c19hdXg8dHlwZW5hbWUgaGFzaF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz46Ol9IdD4KK3t9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaEZjbiwgY2xhc3MgX0VxdWFsS2V5LCBjbGFzcyBfQWxsb2M+CitjbGFzcyBpbnNlcnRfaXRlcmF0b3I8aGFzaF9zZXQ8X1ZhbHVlLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+ID4geworcHJvdGVjdGVkOgorICB0eXBlZGVmIGhhc2hfc2V0PF9WYWx1ZSwgX0hhc2hGY24sIF9FcXVhbEtleSwgX0FsbG9jPiBfQ29udGFpbmVyOworICBfQ29udGFpbmVyKiBjb250YWluZXI7CitwdWJsaWM6CisgIHR5cGVkZWYgX0NvbnRhaW5lciAgICAgICAgICBjb250YWluZXJfdHlwZTsKKyAgdHlwZWRlZiBvdXRwdXRfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OworICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisKKyAgaW5zZXJ0X2l0ZXJhdG9yKF9Db250YWluZXImIF9feCkgOiBjb250YWluZXIoJl9feCkge30KKyAgaW5zZXJ0X2l0ZXJhdG9yKF9Db250YWluZXImIF9feCwgdHlwZW5hbWUgX0NvbnRhaW5lcjo6aXRlcmF0b3IpCisgICAgOiBjb250YWluZXIoJl9feCkge30KKyAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JgorICBvcGVyYXRvcj0oY29uc3QgdHlwZW5hbWUgX0NvbnRhaW5lcjo6dmFsdWVfdHlwZSYgX192YWwpIHsKKyAgICBjb250YWluZXItPmluc2VydChfX3ZhbCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYgb3BlcmF0b3IqKCkgeyByZXR1cm4gKnRoaXM7IH0KKyAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JiBvcGVyYXRvcisrKCkgeyByZXR1cm4gKnRoaXM7IH0KKyAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JiBvcGVyYXRvcisrKGludCkgeyByZXR1cm4gKnRoaXM7IH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsdWUsIGNsYXNzIF9IYXNoRmNuLCBjbGFzcyBfRXF1YWxLZXksIGNsYXNzIF9BbGxvYz4KK2NsYXNzIGluc2VydF9pdGVyYXRvcjxoYXNoX211bHRpc2V0PF9WYWx1ZSwgX0hhc2hGY24sIF9FcXVhbEtleSwgX0FsbG9jPiA+IHsKK3Byb3RlY3RlZDoKKyAgdHlwZWRlZiBoYXNoX211bHRpc2V0PF9WYWx1ZSwgX0hhc2hGY24sIF9FcXVhbEtleSwgX0FsbG9jPiBfQ29udGFpbmVyOworICBfQ29udGFpbmVyKiBjb250YWluZXI7CisgIHR5cGVuYW1lIF9Db250YWluZXI6Oml0ZXJhdG9yIGl0ZXI7CitwdWJsaWM6CisgIHR5cGVkZWYgX0NvbnRhaW5lciAgICAgICAgICBjb250YWluZXJfdHlwZTsKKyAgdHlwZWRlZiBvdXRwdXRfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OworICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisKKyAgaW5zZXJ0X2l0ZXJhdG9yKF9Db250YWluZXImIF9feCkgOiBjb250YWluZXIoJl9feCkge30KKyAgaW5zZXJ0X2l0ZXJhdG9yKF9Db250YWluZXImIF9feCwgdHlwZW5hbWUgX0NvbnRhaW5lcjo6aXRlcmF0b3IpCisgICAgOiBjb250YWluZXIoJl9feCkge30KKyAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JgorICBvcGVyYXRvcj0oY29uc3QgdHlwZW5hbWUgX0NvbnRhaW5lcjo6dmFsdWVfdHlwZSYgX192YWwpIHsKKyAgICBjb250YWluZXItPmluc2VydChfX3ZhbCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYgb3BlcmF0b3IqKCkgeyByZXR1cm4gKnRoaXM7IH0KKyAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JiBvcGVyYXRvcisrKCkgeyByZXR1cm4gKnRoaXM7IH0KKyAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JiBvcGVyYXRvcisrKGludCkgeyByZXR1cm4gKnRoaXM7IH0KK307CisjZW5kaWYgLyogX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTiAqLworCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9IQVNIX1NFVF9IICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvX2hhc2h0YWJsZS5jIGIvc3RsL19oYXNodGFibGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWRhZmEyCi0tLSAvZGV2L251bGwKKysrIGIvc3RsL19oYXNodGFibGUuYwpAQCAtMCwwICsxLDQ3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBNb3Njb3cgQ2VudGVyIGZvciBTUEFSQyBUZWNobm9sb2d5CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKyNpZm5kZWYgX1NUTFBfSEFTSFRBQkxFX0MKKyNkZWZpbmUgX1NUTFBfSEFTSFRBQkxFX0MKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9IQVNIVEFCTEVfSAorIyAgaW5jbHVkZSA8c3RsL19oYXNodGFibGUuaD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworI2lmIGRlZmluZWQgKF9TVExQX0VYUE9TRV9HTE9CQUxTX0lNUExFTUVOVEFUSU9OKQorCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKKyMgIGRlZmluZSBfX1BSSU1FX0xJU1RfQk9EWSB7IFwKKyAgN3VsLCAgICAgICAgICAyM3VsLCBcCisgIDUzdWwsICAgICAgICAgOTd1bCwgICAgICAgICAxOTN1bCwgICAgICAgMzg5dWwsICAgICAgIDc2OXVsLCAgICAgIFwKKyAgMTU0M3VsLCAgICAgICAzMDc5dWwsICAgICAgIDYxNTF1bCwgICAgICAxMjI4OXVsLCAgICAgMjQ1OTN1bCwgICAgXAorICA0OTE1N3VsLCAgICAgIDk4MzE3dWwsICAgICAgMTk2NjEzdWwsICAgIDM5MzI0MXVsLCAgICA3ODY0MzN1bCwgICBcCisgIDE1NzI4Njl1bCwgICAgMzE0NTczOXVsLCAgICA2MjkxNDY5dWwsICAgMTI1ODI5MTd1bCwgIDI1MTY1ODQzdWwsIFwKKyAgNTAzMzE2NTN1bCwgICAxMDA2NjMzMTl1bCwgIDIwMTMyNjYxMXVsLCA0MDI2NTMxODl1bCwgODA1MzA2NDU3dWwsXAorICAxNjEwNjEyNzQxdWwsIDMyMjEyMjU0NzN1bCwgNDI5NDk2NzI5MXVsICBcCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfRHVtbXk+CitzaXplX3QgX1NUTFBfQ0FMTAorX1N0bF9wcmltZTxfRHVtbXk+OjpfU19tYXhfbmJfYnVja2V0cygpIHsKKyAgY29uc3Qgc2l6ZV90IF9saXN0W10gPSBfX1BSSU1FX0xJU1RfQk9EWTsKKyMgIGlmbmRlZiBfX01XRVJLU19fCisgIHJldHVybiBfbGlzdFsoc2l6ZW9mKF9saXN0KS9zaXplb2YoX2xpc3RbMF0pKSAtIDFdOworIyAgZWxzZQorICByZXR1cm4gX2xpc3RbMzAvc2l6ZW9mKHNpemVfdCkgLSAxXTsgLy8gc3R1cGlkIE1XRVJLUyEKKyMgIGVuZGlmCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfRHVtbXk+CitzaXplX3QgX1NUTFBfQ0FMTAorX1N0bF9wcmltZTxfRHVtbXk+OjpfU19uZXh0X3NpemUoc2l6ZV90IF9fbikgeworICBzdGF0aWMgY29uc3Qgc2l6ZV90IF9saXN0W10gPSBfX1BSSU1FX0xJU1RfQk9EWTsKKyAgY29uc3Qgc2l6ZV90KiBfX2ZpcnN0ID0gX2xpc3Q7CisjICBpZm5kZWYgX19NV0VSS1NfXworICBjb25zdCBzaXplX3QqIF9fbGFzdCA9ICBfbGlzdCArIChzaXplb2YoX2xpc3QpL3NpemVvZihfbGlzdFswXSkpOworIyAgZWxzZQorICBjb25zdCBzaXplX3QqIF9fbGFzdCA9ICBfbGlzdCArICgzMC9zaXplb2Yoc2l6ZV90KSk7IC8vIHN0dXBpZCBNV0VSS1MKKyMgIGVuZGlmCisgIGNvbnN0IHNpemVfdCogcG9zID0gX19sb3dlcl9ib3VuZChfX2ZpcnN0LCBfX2xhc3QsIF9fbiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2xlc3MoKHNpemVfdCopMCksIF9fbGVzcygoc2l6ZV90KikwKSwgKHB0cmRpZmZfdCopMCk7CisgIHJldHVybiAocG9zID09IF9fbGFzdCA/ICooX19sYXN0IC0gMSkgOiAqcG9zKTsKK30KKworIyAgdW5kZWYgX19QUklNRV9MSVNUX0JPRFkKKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpCisjICBkZWZpbmUgaGFzaHRhYmxlIF9TVExQX05PTl9EQkdfTkFNRShoYXNodGFibGUpCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisjZW5kaWYKKworLy8gZmJwOiB0aGVzZSBkZWZpbmVzIGFyZSBmb3Igb3V0bGluZSBtZXRob2RzIGRlZmluaXRpb25zLgorLy8gbmVlZGVkIHRvIGRlZmluaXRpb25zIHRvIGJlIHBvcnRhYmxlLiBTaG91bGQgbm90IGJlIHVzZWQgaW4gbWV0aG9kIGJvZGllcy4KKworI2lmIGRlZmluZWQgKCBfU1RMUF9ORVNURURfVFlQRV9QQVJBTV9CVUcgKQorIyAgZGVmaW5lIF9fc2l6ZV90eXBlX18gICAgICAgc2l6ZV90CisjICBkZWZpbmUgc2l6ZV90eXBlICAgICAgICAgICBzaXplX3QKKyMgIGRlZmluZSB2YWx1ZV90eXBlICAgICAgICAgIF9WYWwKKyMgIGRlZmluZSBrZXlfdHlwZSAgICAgICAgICAgIF9LZXkKKyMgIGRlZmluZSBfX3JlZmVyZW5jZV9fICAgICAgIF9WYWwmCisKKyMgIGRlZmluZSBfX2l0ZXJhdG9yX18gICAgICAgIF9IdF9pdGVyYXRvcjxfVmFsLCBfU1RMUF9IRUFERVJfVFlQRU5BTUUgX1RyYWl0czo6X05vbkNvbnN0VHJhaXRzLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0tleSwgX0hGLCBfRXhLLCBfRXFLLCBfQWxsPgorIyAgZGVmaW5lIF9fY29uc3RfaXRlcmF0b3JfXyAgX0h0X2l0ZXJhdG9yPF9WYWwsIF9TVExQX0hFQURFUl9UWVBFTkFNRSBfVHJhaXRzOjpfQ29uc3RUcmFpdHMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfS2V5LCBfSEYsIF9FeEssIF9FcUssIF9BbGw+CisjZWxzZQorIyAgZGVmaW5lIF9fc2l6ZV90eXBlX18gICAgICAgX1NUTFBfVFlQRU5BTUVfT05fUkVUVVJOX1RZUEUgaGFzaHRhYmxlPF9WYWwsIF9LZXksIF9IRiwgX1RyYWl0cywgX0V4SywgX0VxSywgX0FsbD46OnNpemVfdHlwZQorIyAgZGVmaW5lIF9fcmVmZXJlbmNlX18gICAgICAgX1NUTFBfVFlQRU5BTUVfT05fUkVUVVJOX1RZUEUgIGhhc2h0YWJsZTxfVmFsLCBfS2V5LCBfSEYsIF9UcmFpdHMsIF9FeEssIF9FcUssIF9BbGw+OjpyZWZlcmVuY2UKKyMgIGRlZmluZSBfX2l0ZXJhdG9yX18gICAgICAgIF9TVExQX1RZUEVOQU1FX09OX1JFVFVSTl9UWVBFIGhhc2h0YWJsZTxfVmFsLCBfS2V5LCBfSEYsIF9UcmFpdHMsIF9FeEssIF9FcUssIF9BbGw+OjppdGVyYXRvcgorIyAgZGVmaW5lIF9fY29uc3RfaXRlcmF0b3JfXyAgX1NUTFBfVFlQRU5BTUVfT05fUkVUVVJOX1RZUEUgaGFzaHRhYmxlPF9WYWwsIF9LZXksIF9IRiwgX1RyYWl0cywgX0V4SywgX0VxSywgX0FsbD46OmNvbnN0X2l0ZXJhdG9yCisjZW5kaWYKKworLyoKKyAqIFRoaXMgbWV0aG9kIGlzIHRvbyBkaWZmaWN1bHQgdG8gaW1wbGVtZW50IGZvciBoYXNodGFibGUgdGhhdCBkbyBub3QKKyAqIHJlcXVpcmUgYSBzb3J0ZWQgb3BlcmF0aW9uIG9uIHRoZSBzdG9yZWQgdHlwZS4KK3RlbXBsYXRlIDxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSEYsCisgICAgICAgICAgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0V4SywgY2xhc3MgX0VxSywgY2xhc3MgX0FsbD4KK2Jvb2wgaGFzaHRhYmxlPF9WYWwsX0tleSxfSEYsX1RyYWl0cyxfRXhLLF9FcUssX0FsbD46Ol9NX2VxdWFsKAorICAgICAgICAgICAgICBjb25zdCBoYXNodGFibGU8X1ZhbCxfS2V5LF9IRixfVHJhaXRzLF9FeEssX0VxSyxfQWxsPiYgX19odDEsCisgICAgICAgICAgICAgIGNvbnN0IGhhc2h0YWJsZTxfVmFsLF9LZXksX0hGLF9UcmFpdHMsX0V4SyxfRXFLLF9BbGw+JiBfX2h0MikgeworICByZXR1cm4gX19odDEuX01fYnVja2V0cyA9PSBfX2h0Mi5fTV9idWNrZXRzICYmCisgICAgICAgICBfX2h0MS5fTV9lbGVtcyA9PSBfX2h0Mi5fTV9lbGVtczsKK30KKyovCisKKy8qIFJldHVybnMgdGhlIGl0ZXJhdG9yIGJlZm9yZSB0aGUgZmlyc3QgaXRlcmF0b3Igb2YgdGhlIGJ1Y2tldCBfX24gYW5kIHNldAorICogX19uIHRvIHRoZSBmaXJzdCBwcmV2aW91cyBidWNrZXQgaGF2aW5nIHRoZSBzYW1lIGZpcnN0IGl0ZXJhdG9yIGFzIGJ1Y2tldAorICogX19uLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3MgX0hGLAorICAgICAgICAgIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9FeEssIGNsYXNzIF9FcUssIGNsYXNzIF9BbGw+CitfX2l0ZXJhdG9yX18KK2hhc2h0YWJsZTxfVmFsLF9LZXksX0hGLF9UcmFpdHMsX0V4SyxfRXFLLF9BbGw+CisgIDo6X01fYmVmb3JlX2JlZ2luKHNpemVfdHlwZSAmX19uKSBjb25zdCB7CisgIHJldHVybiBfU19iZWZvcmVfYmVnaW4oX01fZWxlbXMsIF9NX2J1Y2tldHMsIF9fbik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSEYsCisgICAgICAgICAgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0V4SywgY2xhc3MgX0VxSywgY2xhc3MgX0FsbD4KK19faXRlcmF0b3JfXworaGFzaHRhYmxlPF9WYWwsX0tleSxfSEYsX1RyYWl0cyxfRXhLLF9FcUssX0FsbD4KKyAgOjpfU19iZWZvcmVfYmVnaW4oY29uc3QgX0VsZW1zQ29udCYgX19lbGVtcywgY29uc3QgX0J1Y2tldFZlY3RvciYgX19idWNrZXRzLAorICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgJl9fbikgeworICBfRWxlbXNDb250ICZfX211dGFibGVfZWxlbXMgPSBfX0NPTlNUX0NBU1QoX0VsZW1zQ29udCYsIF9fZWxlbXMpOworICB0eXBlbmFtZSBfQnVja2V0VmVjdG9yOjpjb25zdF9pdGVyYXRvciBfX2Jwb3MoX19idWNrZXRzLmJlZ2luKCkgKyBfX24pOworCisgIF9FbGVtc0l0ZSBfX3BvcygqX19icG9zKTsKKyAgaWYgKF9fcG9zID09IF9fbXV0YWJsZV9lbGVtcy5iZWdpbigpKSB7CisgICAgX19uID0gMDsKKyAgICByZXR1cm4gX19tdXRhYmxlX2VsZW1zLmJlZm9yZV9iZWdpbigpOworICB9CisKKyAgdHlwZW5hbWUgX0J1Y2tldFZlY3Rvcjo6Y29uc3RfaXRlcmF0b3IgX19iY3VyKF9fYnBvcyk7CisgIF9CdWNrZXRUeXBlICpfX3Bvc19ub2RlID0gX19wb3MuX01fbm9kZTsKKyAgZm9yICgtLV9fYmN1cjsgX19wb3Nfbm9kZSA9PSAqX19iY3VyOyAtLV9fYmN1cik7CisKKyAgX19uID0gX19iY3VyIC0gX19idWNrZXRzLmJlZ2luKCkgKyAxOworICBfRWxlbXNJdGUgX19jdXIoKl9fYmN1cik7CisgIF9FbGVtc0l0ZSBfX3ByZXYgPSBfX2N1cisrOworICBmb3IgKDsgX19jdXIgIT0gX19wb3M7ICsrX19wcmV2LCArK19fY3VyKTsKKyAgcmV0dXJuIF9fcHJldjsKK30KKworCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3MgX0hGLAorICAgICAgICAgIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9FeEssIGNsYXNzIF9FcUssIGNsYXNzIF9BbGw+CitfX2l0ZXJhdG9yX18KK2hhc2h0YWJsZTxfVmFsLF9LZXksX0hGLF9UcmFpdHMsX0V4SyxfRXFLLF9BbGw+CisgIDo6X01faW5zZXJ0X25vcmVzaXplKHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKSB7CisgIC8vV2UgYWx3YXlzIGluc2VydCB0aGlzIGVsZW1lbnQgYXMgMXN0IGluIHRoZSBidWNrZXQgdG8gbm90IGJyZWFrCisgIC8vdGhlIGVsZW1lbnRzIG9yZGVyIGFzIGVxdWFsIGVsZW1lbnRzIG11c3QgYmUga2VwdCBuZXh0IHRvIGVhY2ggb3RoZXIuCisgIHNpemVfdHlwZSBfX3ByZXYgPSBfX247CisgIF9FbGVtc0l0ZSBfX3BvcyA9IF9NX2JlZm9yZV9iZWdpbihfX3ByZXYpLl9NX2l0ZTsKKworICBmaWxsKF9NX2J1Y2tldHMuYmVnaW4oKSArIF9fcHJldiwgX01fYnVja2V0cy5iZWdpbigpICsgX19uICsgMSwKKyAgICAgICBfTV9lbGVtcy5pbnNlcnRfYWZ0ZXIoX19wb3MsIF9fb2JqKS5fTV9ub2RlKTsKKyAgKytfTV9udW1fZWxlbWVudHM7CisgIHJldHVybiBpdGVyYXRvcihfRWxlbXNJdGUoX01fYnVja2V0c1tfX25dKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSEYsCisgICAgICAgICAgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0V4SywgY2xhc3MgX0VxSywgY2xhc3MgX0FsbD4KK3BhaXI8X19pdGVyYXRvcl9fLCBib29sPgoraGFzaHRhYmxlPF9WYWwsX0tleSxfSEYsX1RyYWl0cyxfRXhLLF9FcUssX0FsbD4KKyAgOjppbnNlcnRfdW5pcXVlX25vcmVzaXplKGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKSB7CisgIGNvbnN0IHNpemVfdHlwZSBfX24gPSBfTV9ia3RfbnVtKF9fb2JqKTsKKyAgX0VsZW1zSXRlIF9fY3VyKF9NX2J1Y2tldHNbX19uXSk7CisgIF9FbGVtc0l0ZSBfX2xhc3QoX01fYnVja2V0c1tfX24gKyAxXSk7CisKKyAgaWYgKF9fY3VyICE9IF9fbGFzdCkgeworICAgIGZvciAoOyBfX2N1ciAhPSBfX2xhc3Q7ICsrX19jdXIpIHsKKyAgICAgIGlmIChfTV9lcXVhbHMoX01fZ2V0X2tleSgqX19jdXIpLCBfTV9nZXRfa2V5KF9fb2JqKSkpIHsKKyAgICAgICAgLy9XZSBjaGVjayB0aGF0IGVxdWl2YWxlbnQga2V5cyBoYXZlIGVxdWFscyBoYXNoIGNvZGUgYXMgb3RoZXJ3aXNlLCBvbiByZXNpemUsCisgICAgICAgIC8vZXF1aXZhbGVudCB2YWx1ZSBtaWdodCBub3QgYmUgaW4gdGhlIHNhbWUgYnVja2V0CisgICAgICAgIF9TVExQX0FTU0VSVChfTV9oYXNoKF9NX2dldF9rZXkoKl9fY3VyKSkgPT0gX01faGFzaChfTV9nZXRfa2V5KF9fb2JqKSkpCisgICAgICAgIHJldHVybiBwYWlyPGl0ZXJhdG9yLCBib29sPihpdGVyYXRvcihfX2N1ciksIGZhbHNlKTsKKyAgICAgIH0KKyAgICB9CisgICAgLyogSGVyZSB3ZSBkbyBub3QgcmVseSBvbiB0aGUgX01faW5zZXJ0X25vcmVzaXplIG1ldGhvZCBhcyB3ZSBrbm93CisgICAgICogdGhhdCB3ZSBjYW5ub3QgYnJlYWsgZWxlbWVudCBvcmRlcnMsIGVsZW1lbnRzIGFyZSB1bmlxdWUsIGFuZAorICAgICAqIGluc2VydGlvbiBhZnRlciB0aGUgZmlyc3QgYnVja2V0IGVsZW1lbnQgaXMgZmFzdGVyIHRoYW4gd2hhdCBpcworICAgICAqIGRvbmUgaW4gX01faW5zZXJ0X25vcmVzaXplLgorICAgICAqLworICAgIF9fY3VyID0gX01fZWxlbXMuaW5zZXJ0X2FmdGVyKF9FbGVtc0l0ZShfTV9idWNrZXRzW19fbl0pLCBfX29iaik7CisgICAgKytfTV9udW1fZWxlbWVudHM7CisgICAgcmV0dXJuIHBhaXI8aXRlcmF0b3IsIGJvb2w+KGl0ZXJhdG9yKF9fY3VyKSwgdHJ1ZSk7CisgIH0KKworICByZXR1cm4gcGFpcjxpdGVyYXRvciwgYm9vbD4oX01faW5zZXJ0X25vcmVzaXplKF9fbiwgX19vYmopLCB0cnVlKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IRiwKKyAgICAgICAgICBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfRXhLLCBjbGFzcyBfRXFLLCBjbGFzcyBfQWxsPgorX19pdGVyYXRvcl9fCitoYXNodGFibGU8X1ZhbCxfS2V5LF9IRixfVHJhaXRzLF9FeEssX0VxSyxfQWxsPgorICA6Omluc2VydF9lcXVhbF9ub3Jlc2l6ZShjb25zdCB2YWx1ZV90eXBlJiBfX29iaikgeworICBjb25zdCBzaXplX3R5cGUgX19uID0gX01fYmt0X251bShfX29iaik7CisgIHsKKyAgICBfRWxlbXNJdGUgX19jdXIoX01fYnVja2V0c1tfX25dKTsKKyAgICBfRWxlbXNJdGUgX19sYXN0KF9NX2J1Y2tldHNbX19uICsgMV0pOworCisgICAgZm9yICg7IF9fY3VyICE9IF9fbGFzdDsgKytfX2N1cikgeworICAgICAgaWYgKF9NX2VxdWFscyhfTV9nZXRfa2V5KCpfX2N1ciksIF9NX2dldF9rZXkoX19vYmopKSkgeworICAgICAgICAvL1dlIGNoZWNrIHRoYXQgZXF1aXZhbGVudCBrZXlzIGhhdmUgZXF1YWxzIGhhc2ggY29kZSBhcyBvdGhlcndpc2UsIG9uIHJlc2l6ZSwKKyAgICAgICAgLy9lcXVpdmFsZW50IHZhbHVlIG1pZ2h0IG5vdCBiZSBpbiB0aGUgc2FtZSBidWNrZXQKKyAgICAgICAgX1NUTFBfQVNTRVJUKF9NX2hhc2goX01fZ2V0X2tleSgqX19jdXIpKSA9PSBfTV9oYXNoKF9NX2dldF9rZXkoX19vYmopKSkKKyAgICAgICAgKytfTV9udW1fZWxlbWVudHM7CisgICAgICAgIHJldHVybiBfTV9lbGVtcy5pbnNlcnRfYWZ0ZXIoX19jdXIsIF9fb2JqKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gX01faW5zZXJ0X25vcmVzaXplKF9fbiwgX19vYmopOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3MgX0hGLAorICAgICAgICAgIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9FeEssIGNsYXNzIF9FcUssIGNsYXNzIF9BbGw+CitfX3JlZmVyZW5jZV9fCitoYXNodGFibGU8X1ZhbCxfS2V5LF9IRixfVHJhaXRzLF9FeEssX0VxSyxfQWxsPgorICA6Ol9NX2luc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX29iaikgeworICByZXNpemUoX01fbnVtX2VsZW1lbnRzICsgMSk7CisgIHJldHVybiAqaW5zZXJ0X3VuaXF1ZV9ub3Jlc2l6ZShfX29iaikuZmlyc3Q7Cit9CisKKy8qCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3MgX0hGLAorICAgICAgICAgIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9FeEssIGNsYXNzIF9FcUssIGNsYXNzIF9BbGw+CitfX3JlZmVyZW5jZV9fCitoYXNodGFibGU8X1ZhbCxfS2V5LF9IRixfVHJhaXRzLF9FeEssX0VxSyxfQWxsPgorICA6OmZpbmRfb3JfaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKSB7CisgIF9Ob2RlKiBfX2ZpcnN0ID0gX01fZmluZChfTV9nZXRfa2V5KF9fb2JqKSk7CisgIGlmIChfX2ZpcnN0KQorICAgIHJldHVybiBfX2ZpcnN0LT5fTV92YWw7CisgIGVsc2UKKyAgICByZXR1cm4gX01faW5zZXJ0KF9fb2JqKTsKK30KKyovCisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSEYsCisgICAgICAgICAgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0V4SywgY2xhc3MgX0VxSywgY2xhc3MgX0FsbD4KK19fc2l6ZV90eXBlX18KK2hhc2h0YWJsZTxfVmFsLF9LZXksX0hGLF9UcmFpdHMsX0V4SyxfRXFLLF9BbGw+CisgIDo6ZXJhc2UoY29uc3Qga2V5X3R5cGUmIF9fa2V5KSB7CisgIGNvbnN0IHNpemVfdHlwZSBfX24gPSBfTV9ia3RfbnVtX2tleShfX2tleSk7CisKKyAgX0VsZW1zSXRlIF9fY3VyKF9NX2J1Y2tldHNbX19uXSk7CisgIF9FbGVtc0l0ZSBfX2xhc3QoX01fYnVja2V0c1tfX24gKyAxXSk7CisgIGlmIChfX2N1ciA9PSBfX2xhc3QpCisgICAgcmV0dXJuIDA7CisKKyAgc2l6ZV90eXBlIF9fZXJhc2VkID0gMDsKKyAgaWYgKF9NX2VxdWFscyhfTV9nZXRfa2V5KCpfX2N1ciksIF9fa2V5KSkgeworICAgIC8vV2UgbG9vayBmb3IgdGhlIHBvcyBiZWZvcmUgX19jdXI6CisgICAgc2l6ZV90eXBlIF9fcHJldl9iID0gX19uOworICAgIF9FbGVtc0l0ZSBfX3ByZXYgPSBfTV9iZWZvcmVfYmVnaW4oX19wcmV2X2IpLl9NX2l0ZTsKKyAgICBkbyB7CisgICAgICBfX2N1ciA9IF9NX2VsZW1zLmVyYXNlX2FmdGVyKF9fcHJldik7CisgICAgICArK19fZXJhc2VkOworICAgIH0gd2hpbGUgKChfX2N1ciAhPSBfX2xhc3QpICYmIF9NX2VxdWFscyhfTV9nZXRfa2V5KCpfX2N1ciksIF9fa2V5KSk7CisgICAgZmlsbChfTV9idWNrZXRzLmJlZ2luKCkgKyBfX3ByZXZfYiwgX01fYnVja2V0cy5iZWdpbigpICsgX19uICsgMSwgX19jdXIuX01fbm9kZSk7CisgIH0KKyAgZWxzZSB7CisgICAgX0VsZW1zSXRlIF9fcHJldiA9IF9fY3VyKys7CisgICAgZm9yICg7IF9fY3VyICE9IF9fbGFzdDsgKytfX3ByZXYsICsrX19jdXIpIHsKKyAgICAgIGlmIChfTV9lcXVhbHMoX01fZ2V0X2tleSgqX19jdXIpLCBfX2tleSkpIHsKKyAgICAgICAgZG8geworICAgICAgICAgIF9fY3VyID0gX01fZWxlbXMuZXJhc2VfYWZ0ZXIoX19wcmV2KTsKKyAgICAgICAgICArK19fZXJhc2VkOworICAgICAgICB9IHdoaWxlICgoX19jdXIgIT0gX19sYXN0KSAmJiBfTV9lcXVhbHMoX01fZ2V0X2tleSgqX19jdXIpLCBfX2tleSkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBfTV9udW1fZWxlbWVudHMgLT0gX19lcmFzZWQ7CisgIHJldHVybiBfX2VyYXNlZDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IRiwKKyAgICAgICAgICBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfRXhLLCBjbGFzcyBfRXFLLCBjbGFzcyBfQWxsPgordm9pZCBoYXNodGFibGU8X1ZhbCxfS2V5LF9IRixfVHJhaXRzLF9FeEssX0VxSyxfQWxsPgorICA6OmVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9faXQpIHsKKyAgY29uc3Qgc2l6ZV90eXBlIF9fbiA9IF9NX2JrdF9udW0oKl9faXQpOworICBfRWxlbXNJdGUgX19jdXIoX01fYnVja2V0c1tfX25dKTsKKworICBpZiAoX19jdXIgPT0gX19pdC5fTV9pdGUpIHsKKyAgICBzaXplX3R5cGUgX19wcmV2X2IgPSBfX247CisgICAgX0VsZW1zSXRlIF9fcHJldiA9IF9NX2JlZm9yZV9iZWdpbihfX3ByZXZfYikuX01faXRlOworICAgIGZpbGwoX01fYnVja2V0cy5iZWdpbigpICsgX19wcmV2X2IsIF9NX2J1Y2tldHMuYmVnaW4oKSArIF9fbiArIDEsCisgICAgICAgICBfTV9lbGVtcy5lcmFzZV9hZnRlcihfX3ByZXYpLl9NX25vZGUpOworICAgIC0tX01fbnVtX2VsZW1lbnRzOworICB9CisgIGVsc2UgeworICAgIF9FbGVtc0l0ZSBfX3ByZXYgPSBfX2N1cisrOworICAgIF9FbGVtc0l0ZSBfX2xhc3QoX01fYnVja2V0c1tfX24gKyAxXSk7CisgICAgZm9yICg7IF9fY3VyICE9IF9fbGFzdDsgKytfX3ByZXYsICsrX19jdXIpIHsKKyAgICAgIGlmIChfX2N1ciA9PSBfX2l0Ll9NX2l0ZSkgeworICAgICAgICBfTV9lbGVtcy5lcmFzZV9hZnRlcihfX3ByZXYpOworICAgICAgICAtLV9NX251bV9lbGVtZW50czsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSEYsCisgICAgICAgICAgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0V4SywgY2xhc3MgX0VxSywgY2xhc3MgX0FsbD4KK3ZvaWQgaGFzaHRhYmxlPF9WYWwsX0tleSxfSEYsX1RyYWl0cyxfRXhLLF9FcUssX0FsbD4KKyAgOjplcmFzZShjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpIHsKKyAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorICAgIHJldHVybjsKKyAgc2l6ZV90eXBlIF9fZl9idWNrZXQgPSBfTV9ia3RfbnVtKCpfX2ZpcnN0KTsKKyAgc2l6ZV90eXBlIF9fbF9idWNrZXQgPSBfX2xhc3QgIT0gZW5kKCkgPyBfTV9ia3RfbnVtKCpfX2xhc3QpIDogKF9NX2J1Y2tldHMuc2l6ZSgpIC0gMSk7CisKKyAgX0VsZW1zSXRlIF9fY3VyKF9NX2J1Y2tldHNbX19mX2J1Y2tldF0pOworICBfRWxlbXNJdGUgX19wcmV2OworICBpZiAoX19jdXIgPT0gX19maXJzdC5fTV9pdGUpIHsKKyAgICBfX3ByZXYgPSBfTV9iZWZvcmVfYmVnaW4oX19mX2J1Y2tldCkuX01faXRlOworICB9CisgIGVsc2UgeworICAgIF9FbGVtc0l0ZSBfX2xhc3QoX01fYnVja2V0c1srK19fZl9idWNrZXRdKTsKKyAgICBfX3ByZXYgPSBfX2N1cisrOworICAgIGZvciAoOyAoX19jdXIgIT0gX19sYXN0KSAmJiAoX19jdXIgIT0gX19maXJzdC5fTV9pdGUpOyArK19fcHJldiwgKytfX2N1cik7CisgIH0KKyAgLy9XZSBkbyBub3QgdXNlIHRoZSBzbGlzdDo6ZXJhc2VfYWZ0ZXIgbWV0aG9kIHRha2luZyBhIHJhbmdlIHRvIGNvdW50IHRoZQorICAvL251bWJlciBvZiBlcmFzZWQgZWxlbWVudHM6CisgIHdoaWxlIChfX2N1ciAhPSBfX2xhc3QuX01faXRlKSB7CisgICAgX19jdXIgPSBfTV9lbGVtcy5lcmFzZV9hZnRlcihfX3ByZXYpOworICAgIC0tX01fbnVtX2VsZW1lbnRzOworICB9CisgIGZpbGwoX01fYnVja2V0cy5iZWdpbigpICsgX19mX2J1Y2tldCwgX01fYnVja2V0cy5iZWdpbigpICsgX19sX2J1Y2tldCArIDEsIF9fY3VyLl9NX25vZGUpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3MgX0hGLAorICAgICAgICAgIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9FeEssIGNsYXNzIF9FcUssIGNsYXNzIF9BbGw+Cit2b2lkIGhhc2h0YWJsZTxfVmFsLF9LZXksX0hGLF9UcmFpdHMsX0V4SyxfRXFLLF9BbGw+CisgIDo6cmVoYXNoKHNpemVfdHlwZSBfX251bV9idWNrZXRzX2hpbnQpIHsKKyAgaWYgKChidWNrZXRfY291bnQoKSA+PSBfX251bV9idWNrZXRzX2hpbnQpICYmCisgICAgICAobWF4X2xvYWRfZmFjdG9yKCkgPiBsb2FkX2ZhY3RvcigpKSkKKyAgICByZXR1cm47CisKKyAgLy9IZXJlIGlmIG1heF9sb2FkX2ZhY3RvciBpcyBsb3dlciB0aGFuIDEuMCB0aGUgcmVzdWx0aW5nIHZhbHVlIG1pZ2h0IG5vdCBiZSByZXByZXNlbnRhYmxlCisgIC8vYXMgYSBzaXplX3R5cGUuIFRoZSByZXN1bHQgY29uY2VybmluZyB0aGUgcmVzcGVjdCBvZiB0aGUgbWF4X2xvYWRfZmFjdG9yIHdpbGwgdGhlbiBiZQorICAvL3VuZGVmaW5lZC4KKyAgX19udW1fYnVja2V0c19oaW50ID0gKG1heCkgKF9fbnVtX2J1Y2tldHNfaGludCwgKHNpemVfdHlwZSkoKGZsb2F0KXNpemUoKSAvIG1heF9sb2FkX2ZhY3RvcigpKSk7CisgIHNpemVfdHlwZSBfX251bV9idWNrZXRzID0gX1NUTFBfUFJJViBfU3RsX3ByaW1lX3R5cGU6Ol9TX25leHRfc2l6ZShfX251bV9idWNrZXRzX2hpbnQpOworICBfTV9yZWhhc2goX19udW1fYnVja2V0cyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSEYsCisgICAgICAgICAgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0V4SywgY2xhc3MgX0VxSywgY2xhc3MgX0FsbD4KK3ZvaWQgaGFzaHRhYmxlPF9WYWwsX0tleSxfSEYsX1RyYWl0cyxfRXhLLF9FcUssX0FsbD4KKyAgOjpyZXNpemUoc2l6ZV90eXBlIF9fbnVtX2VsZW1lbnRzX2hpbnQpIHsKKyAgaWYgKCgoZmxvYXQpX19udW1fZWxlbWVudHNfaGludCAvIChmbG9hdClidWNrZXRfY291bnQoKSA8PSBtYXhfbG9hZF9mYWN0b3IoKSkgJiYKKyAgICAgIChtYXhfbG9hZF9mYWN0b3IoKSA+PSBsb2FkX2ZhY3RvcigpKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIHNpemVfdHlwZSBfX251bV9idWNrZXRzX2hpbnQgPSAoc2l6ZV90eXBlKSgoZmxvYXQpKG1heCkgKF9fbnVtX2VsZW1lbnRzX2hpbnQsIHNpemUoKSkgLyBtYXhfbG9hZF9mYWN0b3IoKSk7CisgIHNpemVfdHlwZSBfX251bV9idWNrZXRzID0gX1NUTFBfUFJJViBfU3RsX3ByaW1lX3R5cGU6Ol9TX25leHRfc2l6ZShfX251bV9idWNrZXRzX2hpbnQpOworI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHKQorICBfTV9jaGVjaygpOworI2VuZGlmCisgIF9NX3JlaGFzaChfX251bV9idWNrZXRzKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IRiwKKyAgICAgICAgICBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfRXhLLCBjbGFzcyBfRXFLLCBjbGFzcyBfQWxsPgordm9pZCBoYXNodGFibGU8X1ZhbCxfS2V5LF9IRixfVHJhaXRzLF9FeEssX0VxSyxfQWxsPgorICA6Ol9NX3JlaGFzaChzaXplX3R5cGUgX19udW1fYnVja2V0cykgeworICBfRWxlbXNDb250IF9fdG1wX2VsZW1zKF9NX2VsZW1zLmdldF9hbGxvY2F0b3IoKSk7CisgIF9CdWNrZXRWZWN0b3IgX190bXAoX19udW1fYnVja2V0cyArIDEsIF9fU1RBVElDX0NBU1QoX0J1Y2tldFR5cGUqLCAwKSwgX01fYnVja2V0cy5nZXRfYWxsb2NhdG9yKCkpOworICBfRWxlbXNJdGUgX19jdXIsIF9fbGFzdChfTV9lbGVtcy5lbmQoKSk7CisgIHdoaWxlICghX01fZWxlbXMuZW1wdHkoKSkgeworICAgIF9fY3VyID0gX01fZWxlbXMuYmVnaW4oKTsKKyAgICBzaXplX3R5cGUgX19uZXdfYnVja2V0ID0gX01fYmt0X251bSgqX19jdXIsIF9fbnVtX2J1Y2tldHMpOworICAgIF9FbGVtc0l0ZSBfX2l0ZShfX2N1ciksIF9fYmVmb3JlX2l0ZShfX2N1cik7CisgICAgZm9yICgrK19faXRlOworICAgICAgICAgX19pdGUgIT0gX19sYXN0ICYmIF9NX2VxdWFscyhfTV9nZXRfa2V5KCpfX2N1ciksIF9NX2dldF9rZXkoKl9faXRlKSk7CisgICAgICAgICArK19faXRlLCArK19fYmVmb3JlX2l0ZSk7CisgICAgc2l6ZV90eXBlIF9fcHJldl9idWNrZXQgPSBfX25ld19idWNrZXQ7CisgICAgX0VsZW1zSXRlICBfX3ByZXYgPSBfU19iZWZvcmVfYmVnaW4oX190bXBfZWxlbXMsIF9fdG1wLCBfX3ByZXZfYnVja2V0KS5fTV9pdGU7CisgICAgX190bXBfZWxlbXMuc3BsaWNlX2FmdGVyKF9fcHJldiwgX01fZWxlbXMsIF9NX2VsZW1zLmJlZm9yZV9iZWdpbigpLCBfX2JlZm9yZV9pdGUpOworICAgIGZpbGwoX190bXAuYmVnaW4oKSArIF9fcHJldl9idWNrZXQsIF9fdG1wLmJlZ2luKCkgKyBfX25ld19idWNrZXQgKyAxLCBfX2N1ci5fTV9ub2RlKTsKKyAgfQorICBfTV9lbGVtcy5zd2FwKF9fdG1wX2VsZW1zKTsKKyAgX01fYnVja2V0cy5zd2FwKF9fdG1wKTsKK30KKworI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHKQordGVtcGxhdGUgPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IRiwKKyAgICAgICAgICBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfRXhLLCBjbGFzcyBfRXFLLCBjbGFzcyBfQWxsPgordm9pZCBoYXNodGFibGU8X1ZhbCxfS2V5LF9IRixfVHJhaXRzLF9FeEssX0VxSyxfQWxsPjo6X01fY2hlY2soKSBjb25zdCB7CisgIC8vV2UgY2hlY2sgdGhhdCBoYXNoIGNvZGUgb2Ygc3RvcmVkIGtleXMgaGF2ZW4ndCBjaGFuZ2UgYW5kIGFsc28gdGhhdCBlcXVpdmFsZW50CisgIC8vcmVsYXRpb24gaGFzbid0IGJlZW4gbW9kaWZpZWQKKyAgc2l6ZV90IF9fbnVtX2J1Y2tldHMgPSBidWNrZXRfY291bnQoKTsKKyAgZm9yIChzaXplX3QgX19iID0gMDsgX19iIDwgX19udW1fYnVja2V0czsgKytfX2IpIHsKKyAgICBfRWxlbXNJdGUgX19jdXIoX01fYnVja2V0c1tfX2JdKSwgX19sYXN0KF9NX2J1Y2tldHNbX19iICsgMV0pOworICAgIF9FbGVtc0l0ZSBfX2ZzdChfX2N1ciksIF9fc25kKF9fY3VyKTsKKyAgICBmb3IgKDsgX19jdXIgIT0gX19sYXN0OyArK19fY3VyKSB7CisgICAgICBfU1RMUF9BU1NFUlQoIF9NX2JrdF9udW0oKl9fY3VyLCBfX251bV9idWNrZXRzKSA9PSBfX2IgKQorICAgICAgX1NUTFBfQVNTRVJUKCAhX01fZXF1YWxzKF9NX2dldF9rZXkoKl9fZnN0KSwgX01fZ2V0X2tleSgqX19jdXIpKSB8fCBfTV9lcXVhbHMoX01fZ2V0X2tleSgqX19zbmQpLCBfTV9nZXRfa2V5KCpfX2N1cikpICkKKyAgICAgIGlmIChfX2ZzdCAhPSBfX3NuZCkKKyAgICAgICAgKytfX2ZzdDsKKyAgICAgIGlmIChfX3NuZCAhPSBfX2N1cikKKyAgICAgICAgKytfX3NuZDsKKyAgICB9CisgIH0KK30KKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3MgX0hGLAorICAgICAgICAgIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9FeEssIGNsYXNzIF9FcUssIGNsYXNzIF9BbGw+Cit2b2lkIGhhc2h0YWJsZTxfVmFsLF9LZXksX0hGLF9UcmFpdHMsX0V4SyxfRXFLLF9BbGw+OjpjbGVhcigpIHsKKyAgX01fZWxlbXMuY2xlYXIoKTsKKyAgX01fYnVja2V0cy5hc3NpZ24oX01fYnVja2V0cy5zaXplKCksIF9fU1RBVElDX0NBU1QoX0J1Y2tldFR5cGUqLCAwKSk7CisgIF9NX251bV9lbGVtZW50cyA9IDA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSEYsCisgICAgICAgICAgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0V4SywgY2xhc3MgX0VxSywgY2xhc3MgX0FsbD4KK3ZvaWQgaGFzaHRhYmxlPF9WYWwsX0tleSxfSEYsX1RyYWl0cyxfRXhLLF9FcUssX0FsbD4KKyAgOjpfTV9jb3B5X2Zyb20oY29uc3QgaGFzaHRhYmxlPF9WYWwsX0tleSxfSEYsX1RyYWl0cyxfRXhLLF9FcUssX0FsbD4mIF9faHQpIHsKKyAgX01fZWxlbXMuY2xlYXIoKTsKKyAgX01fZWxlbXMuaW5zZXJ0KF9NX2VsZW1zLmVuZCgpLCBfX2h0Ll9NX2VsZW1zLmJlZ2luKCksIF9faHQuX01fZWxlbXMuZW5kKCkpOworICBfTV9idWNrZXRzLnJlc2l6ZShfX2h0Ll9NX2J1Y2tldHMuc2l6ZSgpKTsKKyAgX0VsZW1zQ29uc3RJdGUgX19zcmMoX19odC5fTV9lbGVtcy5iZWdpbigpKSwgX19zcmNfZW5kKF9faHQuX01fZWxlbXMuZW5kKCkpOworICBfRWxlbXNJdGUgX19kc3QoX01fZWxlbXMuYmVnaW4oKSk7CisgIHR5cGVuYW1lIF9CdWNrZXRWZWN0b3I6OmNvbnN0X2l0ZXJhdG9yIF9fc3JjX2IoX19odC5fTV9idWNrZXRzLmJlZ2luKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3NyY19lbmRfYihfX2h0Ll9NX2J1Y2tldHMuZW5kKCkpOworICB0eXBlbmFtZSBfQnVja2V0VmVjdG9yOjppdGVyYXRvciBfX2RzdF9iKF9NX2J1Y2tldHMuYmVnaW4oKSksIF9fZHN0X2VuZF9iKF9NX2J1Y2tldHMuZW5kKCkpOworICBmb3IgKDsgX19zcmMgIT0gX19zcmNfZW5kOyArK19fc3JjLCArK19fZHN0KSB7CisgICAgZm9yICg7IF9fc3JjX2IgIT0gX19zcmNfZW5kX2I7ICsrX19zcmNfYiwgKytfX2RzdF9iKSB7CisgICAgICBpZiAoKl9fc3JjX2IgPT0gX19zcmMuX01fbm9kZSkgeworICAgICAgICAqX19kc3RfYiA9IF9fZHN0Ll9NX25vZGU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBmaWxsKF9fZHN0X2IsIF9fZHN0X2VuZF9iLCBfX1NUQVRJQ19DQVNUKF9CdWNrZXRUeXBlKiwgMCkpOworICBfTV9udW1fZWxlbWVudHMgPSBfX2h0Ll9NX251bV9lbGVtZW50czsKKyAgX01fbWF4X2xvYWRfZmFjdG9yID0gX19odC5fTV9tYXhfbG9hZF9mYWN0b3I7Cit9CisKKyN1bmRlZiBfX2l0ZXJhdG9yX18KKyN1bmRlZiBjb25zdF9pdGVyYXRvcgorI3VuZGVmIF9fc2l6ZV90eXBlX18KKyN1bmRlZiBfX3JlZmVyZW5jZV9fCisjdW5kZWYgc2l6ZV90eXBlCisjdW5kZWYgdmFsdWVfdHlwZQorI3VuZGVmIGtleV90eXBlCisjdW5kZWYgX19zdGxfbnVtX3ByaW1lcworCisjaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpCisjICB1bmRlZiBoYXNodGFibGUKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorI2VuZGlmCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2VuZGlmIC8qICBfU1RMUF9IQVNIVEFCTEVfQyAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RsL19oYXNodGFibGUuaCBiL3N0bC9faGFzaHRhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY1MzkzMQotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9faGFzaHRhYmxlLmgKQEAgLTAsMCArMSw2ODIgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisvKiBOT1RFOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBTVEwgaGVhZGVycy4KKyAqICAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuCisgKi8KKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9IQVNIVEFCTEVfSAorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9IQVNIVEFCTEVfSAorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX1ZFQ1RPUl9ICisjICBpbmNsdWRlIDxzdGwvX3ZlY3Rvci5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfU0xJU1RfSAorIyAgaW5jbHVkZSA8c3RsL19zbGlzdC5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfSVRFUkFUT1JfSAorIyAgaW5jbHVkZSA8c3RsL19pdGVyYXRvci5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfRlVOQ1RJT05fQkFTRV9ICisjICBpbmNsdWRlIDxzdGwvX2Z1bmN0aW9uX2Jhc2UuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0FMR09CQVNFX0gKKyMgIGluY2x1ZGUgPHN0bC9fYWxnb2Jhc2UuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0hBU0hfRlVOX0gKKyMgIGluY2x1ZGUgPHN0bC9faGFzaF9mdW4uaD4KKyNlbmRpZgorCisvKgorICogSGFzaHRhYmxlIGNsYXNzLCB1c2VkIHRvIGltcGxlbWVudCB0aGUgaGFzaGVkIGFzc29jaWF0aXZlIGNvbnRhaW5lcnMKKyAqIGhhc2hfc2V0LCBoYXNoX21hcCwgaGFzaF9tdWx0aXNldCwgaGFzaF9tdWx0aW1hcCwKKyAqIHVub3JkZXJlZF9zZXQsIHVub3JkZXJlZF9tYXAsIHVub3JkZXJlZF9tdWx0aXNldCwgdW5vcmRlcmVkX211bHRpbWFwLgorICovCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCkKKy8vRXhwb3J0IG9mIHRoZSBjbGFzc2VzIHVzZWQgdG8gcmVwcmVzZW50IGJ1Y2tldHMgaW4gdGhlIGhhc2h0YWJsZSBpbXBsZW1lbnRhdGlvbi4KKyMgIGlmICFkZWZpbmVkIChfU1RMUF9VU0VfUFRSX1NQRUNJQUxJWkFUSU9OUykKKy8vSWYgcG9pbnRlciBzcGVjaWFsaXphdGlvbiBpcyBlbmFibGVkIHZlY3RvcjxfU2xpc3Rfbm9kZV9iYXNlKj4gd2lsbCB1c2UgdGhlIHZvaWQqCisvL3N0b3JhZ2UgdHlwZSBmb3Igd2hpY2ggaW50ZXJuYWwgY2xhc3NlcyBoYXZlIGFscmVhZHkgYmVlbiBleHBvcnRlZC4KK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBhbGxvY2F0b3I8X1NUTFBfUFJJViBfU2xpc3Rfbm9kZV9iYXNlKj47CisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBfU1RMUF9hbGxvY19wcm94eTxfU2xpc3Rfbm9kZV9iYXNlKiosIF9TbGlzdF9ub2RlX2Jhc2UqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRvcjxfU2xpc3Rfbm9kZV9iYXNlKj4gPjsKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBfVmVjdG9yX2Jhc2U8X1NsaXN0X25vZGVfYmFzZSosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRvcjxfU2xpc3Rfbm9kZV9iYXNlKj4gPjsKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorIyAgZW5kaWYKKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisjICAgIGRlZmluZSBfU1RMUF9OT05fREJHX1ZFQ1RPUiBfU1RMUF9OT05fREJHX05BTUUodmVjdG9yKQorX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIF9fY29uc3RydWN0X2NoZWNrZXI8X1NUTFBfTk9OX0RCR19WRUNUT1I8X1NsaXN0X25vZGVfYmFzZSosIGFsbG9jYXRvcjxfU2xpc3Rfbm9kZV9iYXNlKj4gPiA+OworX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIF9TVExQX05PTl9EQkdfVkVDVE9SPF9TbGlzdF9ub2RlX2Jhc2UqLCBhbGxvY2F0b3I8X1NsaXN0X25vZGVfYmFzZSo+ID47CisjICAgIHVuZGVmIF9TVExQX05PTl9EQkdfVkVDVE9SCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKyMgIGVuZGlmCisKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyB2ZWN0b3I8X1NUTFBfUFJJViBfU2xpc3Rfbm9kZV9iYXNlKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yPF9TVExQX1BSSVYgX1NsaXN0X25vZGVfYmFzZSo+ID47CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHKQorIyAgZGVmaW5lIGhhc2h0YWJsZSBfU1RMUF9OT05fREJHX05BTUUoaGFzaHRhYmxlKQorX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorI2VuZGlmCisKKy8vIHNvbWUgY29tcGlsZXJzIHJlcXVpcmUgdGhlIG5hbWVzIG9mIHRlbXBsYXRlIHBhcmFtZXRlcnMgdG8gYmUgdGhlIHNhbWUKK3RlbXBsYXRlIDxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSEYsCisgICAgICAgICAgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0V4SywgY2xhc3MgX0VxSywgY2xhc3MgX0FsbD4KK2NsYXNzIGhhc2h0YWJsZTsKKworI2lmICFkZWZpbmVkIChfU1RMUF9ERUJVRykKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0Jhc2VJdGUsIGNsYXNzIF9UcmFpdHM+CitzdHJ1Y3QgX0h0X2l0ZXJhdG9yIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpfQ29uc3RUcmFpdHMgX0NvbnN0VHJhaXRzOworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6Ol9Ob25Db25zdFRyYWl0cyBfTm9uQ29uc3RUcmFpdHM7CisKKyAgdHlwZWRlZiBfSHRfaXRlcmF0b3I8X0Jhc2VJdGUsX1RyYWl0cz4gX1NlbGY7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6cG9pbnRlciBwb2ludGVyOworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OnJlZmVyZW5jZSByZWZlcmVuY2U7CisgIHR5cGVkZWYgZm9yd2FyZF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CisgIHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKKyAgdHlwZWRlZiBzaXplX3Qgc2l6ZV90eXBlOworCisgIHR5cGVkZWYgX0h0X2l0ZXJhdG9yPF9CYXNlSXRlLCBfTm9uQ29uc3RUcmFpdHM+IGl0ZXJhdG9yOworICB0eXBlZGVmIF9IdF9pdGVyYXRvcjxfQmFzZUl0ZSwgX0NvbnN0VHJhaXRzPiBjb25zdF9pdGVyYXRvcjsKKworICBfSHRfaXRlcmF0b3IoKSB7fQorICAvL2NvcHkgY29uc3RydWN0b3IgZm9yIGl0ZXJhdG9yIGFuZCBjb25zdHJ1Y3RvciBmcm9tIGl0ZXJhdG9yIGZvciBjb25zdF9pdGVyYXRvcgorICBfSHRfaXRlcmF0b3IoY29uc3QgaXRlcmF0b3ImIF9faXQpIDogX01faXRlKF9faXQuX01faXRlKSB7fQorICBfSHRfaXRlcmF0b3IoX0Jhc2VJdGUgX19pdCkgOiBfTV9pdGUoX19pdCkge30KKworICByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3QgeworICAgIHJldHVybiAqX01faXRlOworICB9CisgIF9TVExQX0RFRklORV9BUlJPV19PUEVSQVRPUgorCisgIF9TZWxmJiBvcGVyYXRvcisrKCkgeworICAgICsrX01faXRlOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBfU2VsZiBvcGVyYXRvcisrKGludCkgeworICAgIF9TZWxmIF9fdG1wID0gKnRoaXM7CisgICAgKysqdGhpczsKKyAgICByZXR1cm4gX190bXA7CisgIH0KKworICBib29sIG9wZXJhdG9yID09IChjb25zdF9pdGVyYXRvciBfX3JocykgY29uc3QgeworICAgIHJldHVybiBfTV9pdGUgPT0gX19yaHMuX01faXRlOworICB9CisgIGJvb2wgb3BlcmF0b3IgIT0gKGNvbnN0X2l0ZXJhdG9yIF9fcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIF9NX2l0ZSAhPSBfX3Jocy5fTV9pdGU7CisgIH0KKworICBfQmFzZUl0ZSBfTV9pdGU7Cit9OworCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKworI2lmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pCit0ZW1wbGF0ZSA8Y2xhc3MgX0Jhc2VJdGUsIGNsYXNzIF9UcmFpdHM+CitzdHJ1Y3QgX190eXBlX3RyYWl0czxfU1RMUF9QUklWIF9IdF9pdGVyYXRvcjxfQmFzZUl0ZSwgX1RyYWl0cz4gPiB7CisgIHR5cGVkZWYgX19mYWxzZV90eXBlICAgaGFzX3RyaXZpYWxfZGVmYXVsdF9jb25zdHJ1Y3RvcjsKKyAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9jb3B5X2NvbnN0cnVjdG9yOworICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3I7CisgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjsKKyAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgICBpc19QT0RfdHlwZTsKK307CisjZW5kaWYgLyogX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTiAqLworCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX09MRF9IUF9JVEVSQVRPUl9RVUVSSUVTKQordGVtcGxhdGUgPGNsYXNzIF9CYXNlSXRlLCBjbGFzcyBfVHJhaXRzPgoraW5saW5lCisjICBpZiBkZWZpbmVkIChfU1RMUF9ORVNURURfVFlQRV9QQVJBTV9CVUcpCitfU1RMUF9UWVBFTkFNRV9PTl9SRVRVUk5fVFlQRSBfVHJhaXRzOjp2YWx1ZV90eXBlICoKKyMgIGVsc2UKK19TVExQX1RZUEVOQU1FX09OX1JFVFVSTl9UWVBFIF9TVExQX1BSSVYgX0h0X2l0ZXJhdG9yPF9CYXNlSXRlLF9UcmFpdHM+Ojp2YWx1ZV90eXBlICoKKyMgIGVuZGlmCit2YWx1ZV90eXBlKGNvbnN0IF9TVExQX1BSSVYgX0h0X2l0ZXJhdG9yPF9CYXNlSXRlLF9UcmFpdHM+JikgeworICB0eXBlZGVmIHR5cGVuYW1lIF9TVExQX1BSSVYgX0h0X2l0ZXJhdG9yPF9CYXNlSXRlLF9UcmFpdHM+Ojp2YWx1ZV90eXBlIF9WYWw7CisgIHJldHVybiAoX1ZhbCopIDA7Cit9Cit0ZW1wbGF0ZSA8Y2xhc3MgX0Jhc2VJdGUsIGNsYXNzIF9UcmFpdHM+CitpbmxpbmUgZm9yd2FyZF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnkoY29uc3QgX1NUTFBfUFJJViBfSHRfaXRlcmF0b3I8X0Jhc2VJdGUsX1RyYWl0cz4mKQoreyByZXR1cm4gZm9yd2FyZF9pdGVyYXRvcl90YWcoKTsgfQordGVtcGxhdGUgPGNsYXNzIF9CYXNlSXRlLCBjbGFzcyBfVHJhaXRzPgoraW5saW5lIHB0cmRpZmZfdCogZGlzdGFuY2VfdHlwZShjb25zdCBfU1RMUF9QUklWIF9IdF9pdGVyYXRvcjxfQmFzZUl0ZSxfVHJhaXRzPiYpCit7IHJldHVybiAocHRyZGlmZl90KikgMDsgfQorI2VuZGlmCisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9EdW1teT4KK2NsYXNzIF9TdGxfcHJpbWUgeworcHVibGljOgorICAvL1JldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ1Y2tldHMgaGFuZGxlZCBieSB0aGUgaGFzaHRhYmxlIGltcGxlbWVudGF0aW9uCisgIHN0YXRpYyBzaXplX3QgX1NUTFBfQ0FMTCBfU19tYXhfbmJfYnVja2V0cygpOworCisgIC8vUmV0dXJucyB0aGUgYnVja2V0IHNpemUgbmV4dCB0byBhIHJlcXVpcmVkIHNpemUKKyAgc3RhdGljIHNpemVfdCBfU1RMUF9DQUxMIF9TX25leHRfc2l6ZShzaXplX3QpOworfTsKKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9URU1QTEFURV9FWFBPUlQpCitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgX1N0bF9wcmltZTxib29sPjsKKyNlbmRpZgorCit0eXBlZGVmIF9TdGxfcHJpbWU8Ym9vbD4gX1N0bF9wcmltZV90eXBlOworCisjaWYgIWRlZmluZWQgKF9TVExQX0RFQlVHKQorX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisjZW5kaWYKKworLyoKKyAqIEhhc2h0YWJsZXMgaGFuZGxlIGFsbG9jYXRvcnMgYSBiaXQgZGlmZmVyZW50bHkgdGhhbiBvdGhlciBjb250YWluZXJzCisgKiBkby4gSWYgd2UncmUgdXNpbmcgc3RhbmRhcmQtY29uZm9ybWluZyBhbGxvY2F0b3JzLCB0aGVuIGEgaGFzaHRhYmxlCisgKiB1bmNvbmRpdGlvbmFsbHkgaGFzIGEgbWVtYmVyIHZhcmlhYmxlIHRvIGhvbGQgaXRzIGFsbG9jYXRvciwgZXZlbiBpZgorICogaXQgc28gaGFwcGVucyB0aGF0IGFsbCBpbnN0YW5jZXMgb2YgdGhlIGFsbG9jYXRvciB0eXBlIGFyZSBpZGVudGljYWwuCisgKiBUaGlzIGlzIGJlY2F1c2UsIGZvciBoYXNodGFibGVzLCB0aGlzIGV4dHJhIHN0b3JhZ2UgaXMgbmVnbGlnaWJsZS4KKyAqIEFkZGl0aW9uYWxseSwgYSBiYXNlIGNsYXNzIHdvdWxkbid0IHNlcnZlIGFueSBvdGhlciBwdXJwb3NlczsgaXQKKyAqIHdvdWxkbid0LCBmb3IgZXhhbXBsZSwgc2ltcGxpZnkgdGhlIGV4Y2VwdGlvbi1oYW5kbGluZyBjb2RlLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3MgX0hGLAorICAgICAgICAgIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9FeEssIGNsYXNzIF9FcUssIGNsYXNzIF9BbGw+CitjbGFzcyBoYXNodGFibGUgeworICB0eXBlZGVmIGhhc2h0YWJsZTxfVmFsLCBfS2V5LCBfSEYsIF9UcmFpdHMsIF9FeEssIF9FcUssIF9BbGw+IF9TZWxmOworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6Ol9Ob25Db25zdFRyYWl0cyBfTm9uQ29uc3RUcmFpdHM7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6X0NvbnN0VHJhaXRzIF9Db25zdFRyYWl0czsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpfTm9uQ29uc3RMb2NhbFRyYWl0cyBfTm9uQ29uc3RMb2NhbFRyYWl0czsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpfQ29uc3RMb2NhbFRyYWl0cyBfQ29uc3RMb2NhbFRyYWl0czsKKworcHVibGljOgorICB0eXBlZGVmIF9LZXkga2V5X3R5cGU7CisgIHR5cGVkZWYgX1ZhbCB2YWx1ZV90eXBlOworICB0eXBlZGVmIF9IRiBoYXNoZXI7CisgIHR5cGVkZWYgX0VxSyBrZXlfZXF1YWw7CisKKyAgdHlwZWRlZiBzaXplX3QgICAgICAgICAgICBzaXplX3R5cGU7CisgIHR5cGVkZWYgcHRyZGlmZl90ICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9Ob25Db25zdFRyYWl0czo6cG9pbnRlciBwb2ludGVyOworICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUqIGNvbnN0X3BvaW50ZXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgX05vbkNvbnN0VHJhaXRzOjpyZWZlcmVuY2UgcmVmZXJlbmNlOworICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmIGNvbnN0X3JlZmVyZW5jZTsKKyAgdHlwZWRlZiBmb3J3YXJkX2l0ZXJhdG9yX3RhZyBfSXRlcmF0b3JfY2F0ZWdvcnk7CisKKyAgaGFzaGVyIGhhc2hfZnVuY3QoKSBjb25zdCB7IHJldHVybiBfTV9oYXNoOyB9CisgIGtleV9lcXVhbCBrZXlfZXEoKSBjb25zdCB7IHJldHVybiBfTV9lcXVhbHM7IH0KKworcHJpdmF0ZToKKyAgX1NUTFBfRk9SQ0VfQUxMT0NBVE9SUyhfVmFsLCBfQWxsKQorI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHKQorICB0eXBlZGVmIF9TVExQX1BSSVYgX1NUTFBfTk9OX0RCR19OQU1FKHNsaXN0KTx2YWx1ZV90eXBlLCBfQWxsPiBfRWxlbXNDb250OworI2Vsc2UKKyAgdHlwZWRlZiBzbGlzdDx2YWx1ZV90eXBlLCBfQWxsPiBfRWxlbXNDb250OworI2VuZGlmCisgIHR5cGVkZWYgdHlwZW5hbWUgX0VsZW1zQ29udDo6aXRlcmF0b3IgX0VsZW1zSXRlOworICB0eXBlZGVmIHR5cGVuYW1lIF9FbGVtc0NvbnQ6OmNvbnN0X2l0ZXJhdG9yIF9FbGVtc0NvbnN0SXRlOworICB0eXBlZGVmIF9TVExQX1BSSVYgX1NsaXN0X25vZGVfYmFzZSBfQnVja2V0VHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2NfdHJhaXRzPF9CdWNrZXRUeXBlKiwgX0FsbD46OmFsbG9jYXRvcl90eXBlIF9NX2J1Y2tldF9hbGxvY2F0b3JfdHlwZTsKKyAgLyoKKyAgICogV2UgYXJlIGdvaW5nIHRvIHVzZSB2ZWN0b3Igb2YgX1NsaXN0X25vZGVfYmFzZSBwb2ludGVycyBmb3IgMiByZWFzb25zOgorICAgKiAgLSBsaW1pdCBjb2RlIGJsb2F0LCBhbGwgaGFzaHRhYmxlIGluc3RhbmNpYXRpb24gdXNlIHRoZSBzYW1lIGJ1Y2tldHMgcmVwcmVzZW50YXRpb24uCisgICAqICAtIGF2b2lkIF9TVExQX0RFQlVHIHBlcmZvcm1hbmNlIHRyb3VibGU6IHdpdGggYSB2ZWN0b3Igb2YgaXRlcmF0b3Igb24gc2xpc3QgdGhlIHJlc2l6ZQorICAgKiAgICBtZXRob2Qgd291bGQgYmUgdG9vIHNsb3cgYmVjYXVzZSB0aGUgc2xpc3Q6OnNwbGljZV9hZnRlciBtZXRob2QgYmVjb21lIGxpbmVhciBvbgorICAgKiAgICB0aGUgbnVtYmVyIG9mIGl0ZXJhdG9ycyBpbiB0aGUgYnVja2V0cyByYXRoZXIgdGhhbiBjb25zdGFudCBpbiB0aW1lIGFzIHRoZSBpdGVyYXRvcgorICAgKiAgICBoYXMgdG8gYmUgbW92ZSBmcm9tIGEgc2xpc3QgdG8gdGhlIG90aGVyLgorICAgKi8KKyNpZiBkZWZpbmVkIChfU1RMUF9ERUJVRykKKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9TVExQX05PTl9EQkdfTkFNRSh2ZWN0b3IpPF9CdWNrZXRUeXBlKiwgX01fYnVja2V0X2FsbG9jYXRvcl90eXBlPiBfQnVja2V0VmVjdG9yOworI2Vsc2UKKyAgdHlwZWRlZiB2ZWN0b3I8X0J1Y2tldFR5cGUqLCBfTV9idWNrZXRfYWxsb2NhdG9yX3R5cGU+IF9CdWNrZXRWZWN0b3I7CisjZW5kaWYKKworICBoYXNoZXIgICAgICAgICAgICAgICAgX01faGFzaDsKKyAga2V5X2VxdWFsICAgICAgICAgICAgIF9NX2VxdWFsczsKKyAgX0V4SyAgICAgICAgICAgICAgICAgIF9NX2dldF9rZXk7CisgIF9FbGVtc0NvbnQgICAgICAgICAgICBfTV9lbGVtczsKKyAgX0J1Y2tldFZlY3RvciAgICAgICAgIF9NX2J1Y2tldHM7CisgIHNpemVfdHlwZSAgICAgICAgICAgICBfTV9udW1fZWxlbWVudHM7CisgIGZsb2F0ICAgICAgICAgICAgICAgICBfTV9tYXhfbG9hZF9mYWN0b3I7CisgIF9TVExQX0tFWV9UWVBFX0ZPUl9DT05UX0VYVChrZXlfdHlwZSkKKworcHVibGljOgorICB0eXBlZGVmIF9TVExQX1BSSVYgX0h0X2l0ZXJhdG9yPF9FbGVtc0l0ZSwgX05vbkNvbnN0VHJhaXRzPiBpdGVyYXRvcjsKKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9IdF9pdGVyYXRvcjxfRWxlbXNJdGUsIF9Db25zdFRyYWl0cz4gY29uc3RfaXRlcmF0b3I7CisgIC8vVE9ETzogQXZvaWRzIHRoaXMgZGVidWcgY2hlY2sgYW5kIG1ha2UgdGhlIGxvY2FsX2l0ZXJhdG9yIGRpZmZlcmVudCBmcm9tCisgIC8vaXRlcmF0b3IgaW4gZGVidWcgbW9kZSB0b28uCisjaWYgIWRlZmluZWQgKF9TVExQX0RFQlVHKQorICB0eXBlZGVmIF9TVExQX1BSSVYgX0h0X2l0ZXJhdG9yPF9FbGVtc0l0ZSwgX05vbkNvbnN0TG9jYWxUcmFpdHM+IGxvY2FsX2l0ZXJhdG9yOworICB0eXBlZGVmIF9TVExQX1BSSVYgX0h0X2l0ZXJhdG9yPF9FbGVtc0l0ZSwgX0NvbnN0TG9jYWxUcmFpdHM+IGNvbnN0X2xvY2FsX2l0ZXJhdG9yOworI2Vsc2UKKyAgdHlwZWRlZiBpdGVyYXRvciAgICAgICBsb2NhbF9pdGVyYXRvcjsKKyAgdHlwZWRlZiBjb25zdF9pdGVyYXRvciBjb25zdF9sb2NhbF9pdGVyYXRvcjsKKyNlbmRpZgorCisgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jX3RyYWl0czxfVmFsLCBfQWxsPjo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7CisgIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdCB7IHJldHVybiBfTV9lbGVtcy5nZXRfYWxsb2NhdG9yKCk7IH0KKworI2lmICFkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQorICBoYXNodGFibGUoc2l6ZV90eXBlIF9fbiwKKyAgICAgICAgICAgIGNvbnN0IF9IRiYgIF9faGYsCisgICAgICAgICAgICBjb25zdCBfRXFLJiBfX2VxbCwKKyAgICAgICAgICAgIGNvbnN0IF9FeEsmIF9fZXh0LAorICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisjZWxzZQorICBoYXNodGFibGUoc2l6ZV90eXBlIF9fbiwKKyAgICAgICAgICAgIGNvbnN0IF9IRiYgIF9faGYsCisgICAgICAgICAgICBjb25zdCBfRXFLJiBfX2VxbCwKKyAgICAgICAgICAgIGNvbnN0IF9FeEsmIF9fZXh0KQorICAgIDogX01faGFzaChfX2hmKSwKKyAgICAgIF9NX2VxdWFscyhfX2VxbCksCisgICAgICBfTV9nZXRfa2V5KF9fZXh0KSwKKyAgICAgIF9NX2VsZW1zKGFsbG9jYXRvcl90eXBlKCkpLAorICAgICAgX01fYnVja2V0cyhfU1RMUF9DT05WRVJUX0FMTE9DQVRPUihfX2EsIF9CdWNrZXRUeXBlKikpLAorICAgICAgX01fbnVtX2VsZW1lbnRzKDApLAorICAgICAgX01fbWF4X2xvYWRfZmFjdG9yKDEuMGYpCisgIHsgX01faW5pdGlhbGl6ZV9idWNrZXRzKF9fbik7IH0KKworICBoYXNodGFibGUoc2l6ZV90eXBlIF9fbiwKKyAgICAgICAgICAgIGNvbnN0IF9IRiYgIF9faGYsCisgICAgICAgICAgICBjb25zdCBfRXFLJiBfX2VxbCwKKyAgICAgICAgICAgIGNvbnN0IF9FeEsmIF9fZXh0LAorICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyNlbmRpZgorICAgIDogX01faGFzaChfX2hmKSwKKyAgICAgIF9NX2VxdWFscyhfX2VxbCksCisgICAgICBfTV9nZXRfa2V5KF9fZXh0KSwKKyAgICAgIF9NX2VsZW1zKF9fYSksCisgICAgICBfTV9idWNrZXRzKF9TVExQX0NPTlZFUlRfQUxMT0NBVE9SKF9fYSwgX0J1Y2tldFR5cGUqKSksCisgICAgICBfTV9udW1fZWxlbWVudHMoMCksCisgICAgICBfTV9tYXhfbG9hZF9mYWN0b3IoMS4wZikKKyAgeyBfTV9pbml0aWFsaXplX2J1Y2tldHMoX19uKTsgfQorCisjaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCisgIGhhc2h0YWJsZShzaXplX3R5cGUgX19uLAorICAgICAgICAgICAgY29uc3QgX0hGJiAgICBfX2hmLAorICAgICAgICAgICAgY29uc3QgX0VxSyYgICBfX2VxbCwKKyAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorI2Vsc2UKKyAgaGFzaHRhYmxlKHNpemVfdHlwZSBfX24sCisgICAgICAgICAgICBjb25zdCBfSEYmICAgIF9faGYsCisgICAgICAgICAgICBjb25zdCBfRXFLJiAgIF9fZXFsKQorICAgIDogX01faGFzaChfX2hmKSwKKyAgICAgIF9NX2VxdWFscyhfX2VxbCksCisgICAgICBfTV9nZXRfa2V5KF9FeEsoKSksCisgICAgICBfTV9lbGVtcyhhbGxvY2F0b3JfdHlwZSgpKSwKKyAgICAgIF9NX2J1Y2tldHMoX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoX19hLCBfQnVja2V0VHlwZSopKSwKKyAgICAgIF9NX251bV9lbGVtZW50cygwKSwKKyAgICAgIF9NX21heF9sb2FkX2ZhY3RvcigxLjBmKQorICB7IF9NX2luaXRpYWxpemVfYnVja2V0cyhfX24pOyB9CisKKyAgaGFzaHRhYmxlKHNpemVfdHlwZSBfX24sCisgICAgICAgICAgICBjb25zdCBfSEYmICAgIF9faGYsCisgICAgICAgICAgICBjb25zdCBfRXFLJiAgIF9fZXFsLAorICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyNlbmRpZgorICAgIDogX01faGFzaChfX2hmKSwKKyAgICAgIF9NX2VxdWFscyhfX2VxbCksCisgICAgICBfTV9nZXRfa2V5KF9FeEsoKSksCisgICAgICBfTV9lbGVtcyhfX2EpLAorICAgICAgX01fYnVja2V0cyhfU1RMUF9DT05WRVJUX0FMTE9DQVRPUihfX2EsIF9CdWNrZXRUeXBlKikpLAorICAgICAgX01fbnVtX2VsZW1lbnRzKDApLAorICAgICAgX01fbWF4X2xvYWRfZmFjdG9yKDEuMGYpCisgIHsgX01faW5pdGlhbGl6ZV9idWNrZXRzKF9fbik7IH0KKworICBoYXNodGFibGUoY29uc3QgX1NlbGYmIF9faHQpCisgICAgOiBfTV9oYXNoKF9faHQuX01faGFzaCksCisgICAgICBfTV9lcXVhbHMoX19odC5fTV9lcXVhbHMpLAorICAgICAgX01fZ2V0X2tleShfX2h0Ll9NX2dldF9rZXkpLAorICAgICAgX01fZWxlbXMoX19odC5nZXRfYWxsb2NhdG9yKCkpLAorICAgICAgX01fYnVja2V0cyhfU1RMUF9DT05WRVJUX0FMTE9DQVRPUihfX2h0LmdldF9hbGxvY2F0b3IoKSwgX0J1Y2tldFR5cGUqKSksCisgICAgICBfTV9udW1fZWxlbWVudHMoMCksCisgICAgICBfTV9tYXhfbG9hZF9mYWN0b3IoMS4wZikKKyAgeyBfTV9jb3B5X2Zyb20oX19odCk7IH0KKworICBoYXNodGFibGUoX19tb3ZlX3NvdXJjZTxfU2VsZj4gc3JjKQorICAgIDogX01faGFzaChfU1RMUF9QUklWIF9Bc01vdmVTb3VyY2Uoc3JjLmdldCgpLl9NX2hhc2gpKSwKKyAgICAgIF9NX2VxdWFscyhfU1RMUF9QUklWIF9Bc01vdmVTb3VyY2Uoc3JjLmdldCgpLl9NX2VxdWFscykpLAorICAgICAgX01fZ2V0X2tleShfU1RMUF9QUklWIF9Bc01vdmVTb3VyY2Uoc3JjLmdldCgpLl9NX2dldF9rZXkpKSwKKyAgICAgIF9NX2VsZW1zKF9fbW92ZV9zb3VyY2U8X0VsZW1zQ29udD4oc3JjLmdldCgpLl9NX2VsZW1zKSksCisgICAgICBfTV9idWNrZXRzKF9fbW92ZV9zb3VyY2U8X0J1Y2tldFZlY3Rvcj4oc3JjLmdldCgpLl9NX2J1Y2tldHMpKSwKKyAgICAgIF9NX251bV9lbGVtZW50cyhzcmMuZ2V0KCkuX01fbnVtX2VsZW1lbnRzKSwKKyAgICAgIF9NX21heF9sb2FkX2ZhY3RvcihzcmMuZ2V0KCkuX01fbWF4X2xvYWRfZmFjdG9yKSB7fQorCisgIF9TZWxmJiBvcGVyYXRvcj0gKGNvbnN0IF9TZWxmJiBfX2h0KSB7CisgICAgaWYgKCZfX2h0ICE9IHRoaXMpIHsKKyAgICAgIGNsZWFyKCk7CisgICAgICBfTV9oYXNoID0gX19odC5fTV9oYXNoOworICAgICAgX01fZXF1YWxzID0gX19odC5fTV9lcXVhbHM7CisgICAgICBfTV9nZXRfa2V5ID0gX19odC5fTV9nZXRfa2V5OworICAgICAgX01fY29weV9mcm9tKF9faHQpOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB+aGFzaHRhYmxlKCkgeyBjbGVhcigpOyB9CisKKyAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCB7IHJldHVybiBfTV9udW1fZWxlbWVudHM7IH0KKyAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgeyByZXR1cm4gc2l6ZV90eXBlKC0xKTsgfQorICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gc2l6ZSgpID09IDA7IH0KKworICB2b2lkIHN3YXAoX1NlbGYmIF9faHQpIHsKKyAgICBfU1RMUF9TVEQ6OnN3YXAoX01faGFzaCwgX19odC5fTV9oYXNoKTsKKyAgICBfU1RMUF9TVEQ6OnN3YXAoX01fZXF1YWxzLCBfX2h0Ll9NX2VxdWFscyk7CisgICAgX1NUTFBfU1REOjpzd2FwKF9NX2dldF9rZXksIF9faHQuX01fZ2V0X2tleSk7CisgICAgX01fZWxlbXMuc3dhcChfX2h0Ll9NX2VsZW1zKTsKKyAgICBfTV9idWNrZXRzLnN3YXAoX19odC5fTV9idWNrZXRzKTsKKyAgICBfU1RMUF9TVEQ6OnN3YXAoX01fbnVtX2VsZW1lbnRzLCBfX2h0Ll9NX251bV9lbGVtZW50cyk7CisgICAgX1NUTFBfU1REOjpzd2FwKF9NX21heF9sb2FkX2ZhY3RvciwgX19odC5fTV9tYXhfbG9hZF9mYWN0b3IpOworICB9CisKKyAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBfTV9lbGVtcy5iZWdpbigpOyB9CisgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIF9NX2VsZW1zLmVuZCgpOyB9CisgIGxvY2FsX2l0ZXJhdG9yIGJlZ2luKHNpemVfdHlwZSBfX24pIHsgcmV0dXJuIF9FbGVtc0l0ZShfTV9idWNrZXRzW19fbl0pOyB9CisgIGxvY2FsX2l0ZXJhdG9yIGVuZChzaXplX3R5cGUgX19uKSB7IHJldHVybiBfRWxlbXNJdGUoX01fYnVja2V0c1tfX24gKyAxXSk7IH0KKworICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIF9fQ09OU1RfQ0FTVChfRWxlbXNDb250JiwgX01fZWxlbXMpLmJlZ2luKCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gX19DT05TVF9DQVNUKF9FbGVtc0NvbnQmLCBfTV9lbGVtcykuZW5kKCk7IH0KKyAgY29uc3RfbG9jYWxfaXRlcmF0b3IgYmVnaW4oc2l6ZV90eXBlIF9fbikgY29uc3QgeyByZXR1cm4gX0VsZW1zSXRlKF9NX2J1Y2tldHNbX19uXSk7IH0KKyAgY29uc3RfbG9jYWxfaXRlcmF0b3IgZW5kKHNpemVfdHlwZSBfX24pIGNvbnN0IHsgcmV0dXJuIF9FbGVtc0l0ZShfTV9idWNrZXRzW19fbiArIDFdKTsgfQorCisgIC8vc3RhdGljIGJvb2wgX1NUTFBfQ0FMTCBfTV9lcXVhbCAoY29uc3QgX1NlbGYmLCBjb25zdCBfU2VsZiYpOworCitwdWJsaWM6CisgIC8vVGhlIG51bWJlciBvZiBidWNrZXRzIGlzIHNpemUoKSAtIDEgYmVjYXVzZSB0aGUgbGFzdCBidWNrZXQgYWx3YXlzIGNvbnRhaW5zCisgIC8vX01fZWxlbXMuZW5kKCkgdG8gbWFrZSBhbGdvIGVhc2llciB0byBpbXBsZW1lbnQuCisgIHNpemVfdHlwZSBidWNrZXRfY291bnQoKSBjb25zdCB7IHJldHVybiBfTV9idWNrZXRzLnNpemUoKSAtIDE7IH0KKyAgc2l6ZV90eXBlIG1heF9idWNrZXRfY291bnQoKSBjb25zdCB7IHJldHVybiBfU1RMUF9QUklWIF9TdGxfcHJpbWVfdHlwZTo6X1NfbWF4X25iX2J1Y2tldHMoKTsgfQorICBzaXplX3R5cGUgZWxlbXNfaW5fYnVja2V0KHNpemVfdHlwZSBfX2J1Y2tldCkgY29uc3QKKyAgeyByZXR1cm4gZGlzdGFuY2UoX0VsZW1zSXRlKF9NX2J1Y2tldHNbX19idWNrZXRdKSwgX0VsZW1zSXRlKF9NX2J1Y2tldHNbX19idWNrZXQgKyAxXSkpOyB9CisKKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIHNpemVfdHlwZSBidWNrZXQoY29uc3QgX0tUJiBfX2spIGNvbnN0IHsgcmV0dXJuIF9NX2JrdF9udW1fa2V5KF9fayk7IH0KKworICAvLyBoYXNoIHBvbGljeQorICBmbG9hdCBsb2FkX2ZhY3RvcigpIGNvbnN0IHsgcmV0dXJuIChmbG9hdClzaXplKCkgLyAoZmxvYXQpYnVja2V0X2NvdW50KCk7IH0KKyAgZmxvYXQgbWF4X2xvYWRfZmFjdG9yKCkgY29uc3QgeyByZXR1cm4gX01fbWF4X2xvYWRfZmFjdG9yOyB9CisgIHZvaWQgbWF4X2xvYWRfZmFjdG9yKGZsb2F0IF9feikgeyBfTV9tYXhfbG9hZF9mYWN0b3IgPSBfX3o7fQorCisgIHBhaXI8aXRlcmF0b3IsIGJvb2w+IGluc2VydF91bmlxdWUoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopIHsKKyAgICByZXNpemUoX01fbnVtX2VsZW1lbnRzICsgMSk7CisgICAgcmV0dXJuIGluc2VydF91bmlxdWVfbm9yZXNpemUoX19vYmopOworICB9CisKKyAgaXRlcmF0b3IgaW5zZXJ0X2VxdWFsKGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKSB7CisgICAgcmVzaXplKF9NX251bV9lbGVtZW50cyArIDEpOworICAgIHJldHVybiBpbnNlcnRfZXF1YWxfbm9yZXNpemUoX19vYmopOworICB9CisKK3Byb3RlY3RlZDoKKyAgaXRlcmF0b3IgX01faW5zZXJ0X25vcmVzaXplKHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKTsKK3B1YmxpYzoKKyAgcGFpcjxpdGVyYXRvciwgYm9vbD4gaW5zZXJ0X3VuaXF1ZV9ub3Jlc2l6ZShjb25zdCB2YWx1ZV90eXBlJiBfX29iaik7CisgIGl0ZXJhdG9yIGluc2VydF9lcXVhbF9ub3Jlc2l6ZShjb25zdCB2YWx1ZV90eXBlJiBfX29iaik7CisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZvaWQgaW5zZXJ0X3VuaXF1ZShfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCkKKyAgeyBpbnNlcnRfdW5pcXVlKF9fZiwgX19sLCBfU1RMUF9JVEVSQVRPUl9DQVRFR09SWShfX2YsIF9JbnB1dEl0ZXJhdG9yKSk7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZvaWQgaW5zZXJ0X2VxdWFsKF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sKQorICB7IGluc2VydF9lcXVhbChfX2YsIF9fbCwgX1NUTFBfSVRFUkFUT1JfQ0FURUdPUlkoX19mLCBfSW5wdXRJdGVyYXRvcikpOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICB2b2lkIGluc2VydF91bmlxdWUoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnB1dF9pdGVyYXRvcl90YWcgJikgeworICAgIGZvciAoIDsgX19mICE9IF9fbDsgKytfX2YpCisgICAgICBpbnNlcnRfdW5pcXVlKCpfX2YpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICB2b2lkIGluc2VydF9lcXVhbChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5wdXRfaXRlcmF0b3JfdGFnICYpIHsKKyAgICBmb3IgKCA7IF9fZiAhPSBfX2w7ICsrX19mKQorICAgICAgaW5zZXJ0X2VxdWFsKCpfX2YpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CisgIHZvaWQgaW5zZXJ0X3VuaXF1ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX2wsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3J3YXJkX2l0ZXJhdG9yX3RhZyAmKSB7CisgICAgc2l6ZV90eXBlIF9fbiA9IGRpc3RhbmNlKF9fZiwgX19sKTsKKyAgICByZXNpemUoX01fbnVtX2VsZW1lbnRzICsgX19uKTsKKyAgICBmb3IgKCA7IF9fbiA+IDA7IC0tX19uLCArK19fZikKKyAgICAgIGluc2VydF91bmlxdWVfbm9yZXNpemUoKl9fZik7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KKyAgdm9pZCBpbnNlcnRfZXF1YWwoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX19sLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3J3YXJkX2l0ZXJhdG9yX3RhZyAmKSB7CisgICAgc2l6ZV90eXBlIF9fbiA9IGRpc3RhbmNlKF9fZiwgX19sKTsKKyAgICByZXNpemUoX01fbnVtX2VsZW1lbnRzICsgX19uKTsKKyAgICBmb3IgKCA7IF9fbiA+IDA7IC0tX19uLCArK19fZikKKyAgICAgIGluc2VydF9lcXVhbF9ub3Jlc2l6ZSgqX19mKTsKKyAgfQorCisjZWxzZSAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisgIHZvaWQgaW5zZXJ0X3VuaXF1ZShjb25zdCB2YWx1ZV90eXBlKiBfX2YsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbCkgeworICAgIHNpemVfdHlwZSBfX24gPSBfX2wgLSBfX2Y7CisgICAgcmVzaXplKF9NX251bV9lbGVtZW50cyArIF9fbik7CisgICAgZm9yICggOyBfX24gPiAwOyAtLV9fbiwgKytfX2YpCisgICAgICBpbnNlcnRfdW5pcXVlX25vcmVzaXplKCpfX2YpOworICB9CisKKyAgdm9pZCBpbnNlcnRfZXF1YWwoY29uc3QgdmFsdWVfdHlwZSogX19mLCBjb25zdCB2YWx1ZV90eXBlKiBfX2wpIHsKKyAgICBzaXplX3R5cGUgX19uID0gX19sIC0gX19mOworICAgIHJlc2l6ZShfTV9udW1fZWxlbWVudHMgKyBfX24pOworICAgIGZvciAoIDsgX19uID4gMDsgLS1fX24sICsrX19mKQorICAgICAgaW5zZXJ0X2VxdWFsX25vcmVzaXplKCpfX2YpOworICB9CisKKyAgdm9pZCBpbnNlcnRfdW5pcXVlKGNvbnN0X2l0ZXJhdG9yIF9fZiwgY29uc3RfaXRlcmF0b3IgX19sKSB7CisgICAgc2l6ZV90eXBlIF9fbiA9IGRpc3RhbmNlKF9fZiwgX19sKTsKKyAgICByZXNpemUoX01fbnVtX2VsZW1lbnRzICsgX19uKTsKKyAgICBmb3IgKCA7IF9fbiA+IDA7IC0tX19uLCArK19fZikKKyAgICAgIGluc2VydF91bmlxdWVfbm9yZXNpemUoKl9fZik7CisgIH0KKworICB2b2lkIGluc2VydF9lcXVhbChjb25zdF9pdGVyYXRvciBfX2YsIGNvbnN0X2l0ZXJhdG9yIF9fbCkgeworICAgIHNpemVfdHlwZSBfX24gPSBkaXN0YW5jZShfX2YsIF9fbCk7CisgICAgcmVzaXplKF9NX251bV9lbGVtZW50cyArIF9fbik7CisgICAgZm9yICggOyBfX24gPiAwOyAtLV9fbiwgKytfX2YpCisgICAgICBpbnNlcnRfZXF1YWxfbm9yZXNpemUoKl9fZik7CisgIH0KKyNlbmRpZiAvKl9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKworICAvL3JlZmVyZW5jZSBmaW5kX29yX2luc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX29iaik7CisKK3ByaXZhdGU6CisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBfRWxlbXNJdGUgX01fZmluZChjb25zdCBfS1QmIF9fa2V5KSBjb25zdCB7CisgICAgc2l6ZV90eXBlIF9fbiA9IF9NX2JrdF9udW1fa2V5KF9fa2V5KTsKKyAgICBfRWxlbXNJdGUgX19maXJzdChfTV9idWNrZXRzW19fbl0pOworICAgIF9FbGVtc0l0ZSBfX2xhc3QoX01fYnVja2V0c1tfX24gKyAxXSk7CisgICAgZm9yICggOyAoX19maXJzdCAhPSBfX2xhc3QpICYmICFfTV9lcXVhbHMoX01fZ2V0X2tleSgqX19maXJzdCksIF9fa2V5KTsgKytfX2ZpcnN0KTsKKyAgICBpZiAoX19maXJzdCAhPSBfX2xhc3QpCisgICAgICByZXR1cm4gX19maXJzdDsKKyAgICBlbHNlCisgICAgICByZXR1cm4gX19DT05TVF9DQVNUKF9FbGVtc0NvbnQmLCBfTV9lbGVtcykuZW5kKCk7CisgIH0KKworcHVibGljOgorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgaXRlcmF0b3IgZmluZChjb25zdCBfS1QmIF9fa2V5KSB7IHJldHVybiBfTV9maW5kKF9fa2V5KTsgfQorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgY29uc3RfaXRlcmF0b3IgZmluZChjb25zdCBfS1QmIF9fa2V5KSBjb25zdCB7IHJldHVybiBfTV9maW5kKF9fa2V5KTsgfQorCisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBzaXplX3R5cGUgY291bnQoY29uc3QgX0tUJiBfX2tleSkgY29uc3QgeworICAgIGNvbnN0IHNpemVfdHlwZSBfX24gPSBfTV9ia3RfbnVtX2tleShfX2tleSk7CisKKyAgICBfRWxlbXNJdGUgX19jdXIoX01fYnVja2V0c1tfX25dKTsKKyAgICBfRWxlbXNJdGUgX19sYXN0KF9NX2J1Y2tldHNbX19uICsgMV0pOworICAgIGZvciAoOyBfX2N1ciAhPSBfX2xhc3Q7ICsrX19jdXIpIHsKKyAgICAgIGlmIChfTV9lcXVhbHMoX01fZ2V0X2tleSgqX19jdXIpLCBfX2tleSkpIHsKKyAgICAgICAgc2l6ZV90eXBlIF9fcmVzdWx0ID0gMTsKKyAgICAgICAgZm9yICgrK19fY3VyOworICAgICAgICAgICAgIF9fY3VyICE9IF9fbGFzdCAmJiBfTV9lcXVhbHMoX01fZ2V0X2tleSgqX19jdXIpLCBfX2tleSk7CisgICAgICAgICAgICAgKytfX3Jlc3VsdCwgKytfX2N1cik7CisgICAgICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7CisgIH0KKworICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgcGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+IGVxdWFsX3JhbmdlKGNvbnN0IF9LVCYgX19rZXkpIHsKKyAgICB0eXBlZGVmIHBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPiBfUGlpOworICAgIGNvbnN0IHNpemVfdHlwZSBfX24gPSBfTV9ia3RfbnVtX2tleShfX2tleSk7CisKKyAgICBmb3IgKF9FbGVtc0l0ZSBfX2ZpcnN0KF9NX2J1Y2tldHNbX19uXSksIF9fbGFzdChfTV9idWNrZXRzW19fbiArIDFdKTsKKyAgICAgICAgIF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpIHsKKyAgICAgIGlmIChfTV9lcXVhbHMoX01fZ2V0X2tleSgqX19maXJzdCksIF9fa2V5KSkgeworICAgICAgICBfRWxlbXNJdGUgX19jdXIoX19maXJzdCk7CisgICAgICAgIGZvciAoKytfX2N1cjsgKF9fY3VyICE9IF9fbGFzdCkgJiYgX01fZXF1YWxzKF9NX2dldF9rZXkoKl9fY3VyKSwgX19rZXkpOyArK19fY3VyKTsKKyAgICAgICAgcmV0dXJuIF9QaWkoX19maXJzdCwgX19jdXIpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gX1BpaShlbmQoKSwgZW5kKCkpOworICB9CisKKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIHBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPiBlcXVhbF9yYW5nZShjb25zdCBfS1QmIF9fa2V5KSBjb25zdCB7CisgICAgdHlwZWRlZiBwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4gX1BpaTsKKyAgICBjb25zdCBzaXplX3R5cGUgX19uID0gX01fYmt0X251bV9rZXkoX19rZXkpOworCisgICAgZm9yIChfRWxlbXNJdGUgX19maXJzdChfTV9idWNrZXRzW19fbl0pLCBfX2xhc3QoX01fYnVja2V0c1tfX24gKyAxXSk7CisgICAgICAgICBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KSB7CisgICAgICBpZiAoX01fZXF1YWxzKF9NX2dldF9rZXkoKl9fZmlyc3QpLCBfX2tleSkpIHsKKyAgICAgICAgX0VsZW1zSXRlIF9fY3VyKF9fZmlyc3QpOworICAgICAgICBmb3IgKCsrX19jdXI7IChfX2N1ciAhPSBfX2xhc3QpICYmIF9NX2VxdWFscyhfTV9nZXRfa2V5KCpfX2N1ciksIF9fa2V5KTsgKytfX2N1cik7CisgICAgICAgIHJldHVybiBfUGlpKF9fZmlyc3QsIF9fY3VyKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIF9QaWkoZW5kKCksIGVuZCgpKTsKKyAgfQorCisgIHNpemVfdHlwZSBlcmFzZShjb25zdCBrZXlfdHlwZSYgX19rZXkpOworICB2b2lkIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9faXQpOworICB2b2lkIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCk7CisKK3ByaXZhdGU6CisgIHZvaWQgX01fcmVoYXNoKHNpemVfdHlwZSBfX251bV9idWNrZXRzKTsKKyNpZiBkZWZpbmVkIChfU1RMUF9ERUJVRykKKyAgdm9pZCBfTV9jaGVjaygpIGNvbnN0OworI2VuZGlmCisKK3B1YmxpYzoKKyAgdm9pZCByZWhhc2goc2l6ZV90eXBlIF9fbnVtX2J1Y2tldHNfaGludCk7CisgIHZvaWQgcmVzaXplKHNpemVfdHlwZSBfX251bV9lbGVtZW50c19oaW50KTsKKyAgdm9pZCBjbGVhcigpOworCisgIC8vIHRoaXMgaXMgZm9yIGhhc2hfbWFwOjpvcGVyYXRvcltdCisgIHJlZmVyZW5jZSBfTV9pbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopOworCitwcml2YXRlOgorICAvL19fbiBpcyBzZXQgdG8gdGhlIGZpcnN0IGJ1Y2tldCB0aGF0IGhhcyB0byBiZSBtb2RpZmllZCBpZiBhbnkKKyAgLy9lcmFzZS9pbnNlcnQgb3BlcmF0aW9uIGlzIGRvbmUgYWZ0ZXIgdGhlIHJldHVybmVkIGl0ZXJhdG9yLgorICBpdGVyYXRvciBfTV9iZWZvcmVfYmVnaW4oc2l6ZV90eXBlICZfX24pIGNvbnN0OworCisgIHN0YXRpYyBpdGVyYXRvciBfU19iZWZvcmVfYmVnaW4oY29uc3QgX0VsZW1zQ29udCYgX19lbGVtcywgY29uc3QgX0J1Y2tldFZlY3RvciYgX19idWNrZXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSAmX19uKTsKKworICB2b2lkIF9NX2luaXRpYWxpemVfYnVja2V0cyhzaXplX3R5cGUgX19uKSB7CisgICAgY29uc3Qgc2l6ZV90eXBlIF9fbl9idWNrZXRzID0gX1NUTFBfUFJJViBfU3RsX3ByaW1lX3R5cGU6Ol9TX25leHRfc2l6ZShfX24pICsgMTsKKyAgICBfTV9idWNrZXRzLnJlc2VydmUoX19uX2J1Y2tldHMpOworICAgIF9NX2J1Y2tldHMuYXNzaWduKF9fbl9idWNrZXRzLCBfX1NUQVRJQ19DQVNUKF9CdWNrZXRUeXBlKiwgMCkpOworICB9CisKKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIHNpemVfdHlwZSBfTV9ia3RfbnVtX2tleShjb25zdCBfS1QmIF9fa2V5KSBjb25zdAorICB7IHJldHVybiBfTV9ia3RfbnVtX2tleShfX2tleSwgYnVja2V0X2NvdW50KCkpOyB9CisKKyAgc2l6ZV90eXBlIF9NX2JrdF9udW0oY29uc3QgdmFsdWVfdHlwZSYgX19vYmopIGNvbnN0CisgIHsgcmV0dXJuIF9NX2JrdF9udW1fa2V5KF9NX2dldF9rZXkoX19vYmopKTsgfQorCisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBzaXplX3R5cGUgX01fYmt0X251bV9rZXkoY29uc3QgX0tUJiBfX2tleSwgc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgeyByZXR1cm4gX01faGFzaChfX2tleSkgJSBfX247IH0KKworICBzaXplX3R5cGUgX01fYmt0X251bShjb25zdCB2YWx1ZV90eXBlJiBfX29iaiwgc2l6ZV90IF9fbikgY29uc3QKKyAgeyByZXR1cm4gX01fYmt0X251bV9rZXkoX01fZ2V0X2tleShfX29iaiksIF9fbik7IH0KKworICB2b2lkIF9NX2NvcHlfZnJvbShjb25zdCBfU2VsZiYgX19odCk7Cit9OworCisjaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpCisjICB1bmRlZiBoYXNodGFibGUKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorI2VuZGlmCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2lmICFkZWZpbmVkIChfU1RMUF9MSU5LX1RJTUVfSU5TVEFOVElBVElPTikKKyMgIGluY2x1ZGUgPHN0bC9faGFzaHRhYmxlLmM+CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHKQorIyAgaW5jbHVkZSA8c3RsL2RlYnVnL19oYXNodGFibGUuaD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworI2RlZmluZSBfU1RMUF9URU1QTEFURV9IRUFERVIgdGVtcGxhdGUgPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IRiwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0V4SywgY2xhc3MgX0VxSywgY2xhc3MgX0FsbD4KKyNkZWZpbmUgX1NUTFBfVEVNUExBVEVfQ09OVEFJTkVSIGhhc2h0YWJsZTxfVmFsLF9LZXksX0hGLF9UcmFpdHMsX0V4SyxfRXFLLF9BbGw+CisjaW5jbHVkZSA8c3RsL19yZWxvcHNfaGFzaF9jb250Lmg+CisjdW5kZWYgX1NUTFBfVEVNUExBVEVfQ09OVEFJTkVSCisjdW5kZWYgX1NUTFBfVEVNUExBVEVfSEVBREVSCisKKyNpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQordGVtcGxhdGUgPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IRiwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0V4SywgY2xhc3MgX0VxSywgY2xhc3MgX0FsbD4KK3N0cnVjdCBfX21vdmVfdHJhaXRzPGhhc2h0YWJsZTxfVmFsLCBfS2V5LCBfSEYsIF9UcmFpdHMsIF9FeEssIF9FcUssIF9BbGw+ID4geworICAvL0hhc2h0YWJsZXMgYXJlIG1vdmFibGU6CisgIHR5cGVkZWYgX19zdGxwX21vdmFibGUgaW1wbGVtZW50ZWQ7CisKKyAgLy9Db21wbGV0ZW5lc3MgZGVwZW5kcyBvbiBtYW55IHRlbXBsYXRlIHBhcmFtZXRlcnMsIGZvciB0aGUgbW9tZW50IHdlIGNvbnNpZGVyIGl0IG5vdCBjb21wbGV0ZToKKyAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgY29tcGxldGU7Cit9OworI2VuZGlmCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2VuZGlmIC8qIF9TVExQX0lOVEVSTkFMX0hBU0hUQUJMRV9IICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvX2hlYXAuYyBiL3N0bC9faGVhcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YWIwNDkKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvX2hlYXAuYwpAQCAtMCwwICsxLDI0NiBAQAorLyoKKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworI2lmbmRlZiBfU1RMUF9IRUFQX0MKKyNkZWZpbmUgX1NUTFBfSEVBUF9DCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfSEVBUF9ICisjIGluY2x1ZGUgPHN0bC9faGVhcC5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfSVRFUkFUT1JfQkFTRV9ICisjIGluY2x1ZGUgPHN0bC9faXRlcmF0b3JfYmFzZS5oPgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBjbGFzcyBfRGlzdGFuY2UsIGNsYXNzIF9UcD4KK19TVExQX0lOTElORV9MT09QCit2b2lkCitfX3B1c2hfaGVhcChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwKKyAgICAgICAgICAgIF9EaXN0YW5jZSBfX2hvbGVJbmRleCwgX0Rpc3RhbmNlIF9fdG9wSW5kZXgsIF9UcCBfX3ZhbCkKK3sKKyAgX0Rpc3RhbmNlIF9fcGFyZW50ID0gKF9faG9sZUluZGV4IC0gMSkgLyAyOworICB3aGlsZSAoX19ob2xlSW5kZXggPiBfX3RvcEluZGV4ICYmICooX19maXJzdCArIF9fcGFyZW50KSA8IF9fdmFsKSB7CisgICAgKihfX2ZpcnN0ICsgX19ob2xlSW5kZXgpID0gKihfX2ZpcnN0ICsgX19wYXJlbnQpOworICAgIF9faG9sZUluZGV4ID0gX19wYXJlbnQ7CisgICAgX19wYXJlbnQgPSAoX19ob2xlSW5kZXggLSAxKSAvIDI7CisgIH0KKyAgKihfX2ZpcnN0ICsgX19ob2xlSW5kZXgpID0gX192YWw7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIGNsYXNzIF9EaXN0YW5jZSwgY2xhc3MgX1RwPgoraW5saW5lIHZvaWQKK19fcHVzaF9oZWFwX2F1eChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwKKyAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0LCBfRGlzdGFuY2UqLCBfVHAqKQoreworICBfX3B1c2hfaGVhcChfX2ZpcnN0LCBfRGlzdGFuY2UoKF9fbGFzdCAtIF9fZmlyc3QpIC0gMSksIF9EaXN0YW5jZSgwKSwKKyAgICAgICAgICAgICAgX1RwKCooX19sYXN0IC0gMSkpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4KK3ZvaWQKK3B1c2hfaGVhcChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCkKK3sKKyAgX19wdXNoX2hlYXBfYXV4KF9fZmlyc3QsIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgIF9TVExQX0RJU1RBTkNFX1RZUEUoX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yKSwgX1NUTFBfVkFMVUVfVFlQRShfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IpKTsKK30KKworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBjbGFzcyBfRGlzdGFuY2UsIGNsYXNzIF9UcCwKKyAgICAgICAgICBjbGFzcyBfQ29tcGFyZT4KK19TVExQX0lOTElORV9MT09QCit2b2lkCitfX3B1c2hfaGVhcChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX0Rpc3RhbmNlIF9faG9sZUluZGV4LAorICAgICAgICAgICAgX0Rpc3RhbmNlIF9fdG9wSW5kZXgsIF9UcCBfX3ZhbCwgX0NvbXBhcmUgX19jb21wKQoreworICBfRGlzdGFuY2UgX19wYXJlbnQgPSAoX19ob2xlSW5kZXggLSAxKSAvIDI7CisgIHdoaWxlIChfX2hvbGVJbmRleCA+IF9fdG9wSW5kZXggJiYgX19jb21wKCooX19maXJzdCArIF9fcGFyZW50KSwgX192YWwpKSB7CisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoIV9fY29tcChfX3ZhbCwgKihfX2ZpcnN0ICsgX19wYXJlbnQpKSwgX1N0bE1zZ19JTlZBTElEX1NUUklDVF9XRUFLX1BSRURJQ0FURSkKKyAgICAqKF9fZmlyc3QgKyBfX2hvbGVJbmRleCkgPSAqKF9fZmlyc3QgKyBfX3BhcmVudCk7CisgICAgX19ob2xlSW5kZXggPSBfX3BhcmVudDsKKyAgICBfX3BhcmVudCA9IChfX2hvbGVJbmRleCAtIDEpIC8gMjsKKyAgfQorICAqKF9fZmlyc3QgKyBfX2hvbGVJbmRleCkgPSBfX3ZhbDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgY2xhc3MgX0NvbXBhcmUsCisgICAgICAgICAgY2xhc3MgX0Rpc3RhbmNlLCBjbGFzcyBfVHA+CitpbmxpbmUgdm9pZAorX19wdXNoX2hlYXBfYXV4KF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LAorICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsIF9Db21wYXJlIF9fY29tcCwKKyAgICAgICAgICAgICAgICBfRGlzdGFuY2UqLCBfVHAqKQoreworICBfX3B1c2hfaGVhcChfX2ZpcnN0LCBfRGlzdGFuY2UoKF9fbGFzdCAtIF9fZmlyc3QpIC0gMSksIF9EaXN0YW5jZSgwKSwKKyAgICAgICAgICAgICAgX1RwKCooX19sYXN0IC0gMSkpLCBfX2NvbXApOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBjbGFzcyBfQ29tcGFyZT4KK3ZvaWQKK3B1c2hfaGVhcChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICBfQ29tcGFyZSBfX2NvbXApCit7CisgIF9fcHVzaF9oZWFwX2F1eChfX2ZpcnN0LCBfX2xhc3QsIF9fY29tcCwKKyAgICAgICAgICAgICAgICAgIF9TVExQX0RJU1RBTkNFX1RZUEUoX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yKSwgX1NUTFBfVkFMVUVfVFlQRShfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgY2xhc3MgX0Rpc3RhbmNlLCBjbGFzcyBfVHA+Cit2b2lkCitfX2FkanVzdF9oZWFwKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfRGlzdGFuY2UgX19ob2xlSW5kZXgsCisgICAgICAgICAgICAgIF9EaXN0YW5jZSBfX2xlbiwgX1RwIF9fdmFsKSB7CisgIF9EaXN0YW5jZSBfX3RvcEluZGV4ID0gX19ob2xlSW5kZXg7CisgIF9EaXN0YW5jZSBfX3NlY29uZENoaWxkID0gMiAqIF9faG9sZUluZGV4ICsgMjsKKyAgd2hpbGUgKF9fc2Vjb25kQ2hpbGQgPCBfX2xlbikgeworICAgIGlmICgqKF9fZmlyc3QgKyBfX3NlY29uZENoaWxkKSA8ICooX19maXJzdCArIChfX3NlY29uZENoaWxkIC0gMSkpKQorICAgICAgX19zZWNvbmRDaGlsZC0tOworICAgICooX19maXJzdCArIF9faG9sZUluZGV4KSA9ICooX19maXJzdCArIF9fc2Vjb25kQ2hpbGQpOworICAgIF9faG9sZUluZGV4ID0gX19zZWNvbmRDaGlsZDsKKyAgICBfX3NlY29uZENoaWxkID0gMiAqIChfX3NlY29uZENoaWxkICsgMSk7CisgIH0KKyAgaWYgKF9fc2Vjb25kQ2hpbGQgPT0gX19sZW4pIHsKKyAgICAqKF9fZmlyc3QgKyBfX2hvbGVJbmRleCkgPSAqKF9fZmlyc3QgKyAoX19zZWNvbmRDaGlsZCAtIDEpKTsKKyAgICBfX2hvbGVJbmRleCA9IF9fc2Vjb25kQ2hpbGQgLSAxOworICB9CisgIF9fcHVzaF9oZWFwKF9fZmlyc3QsIF9faG9sZUluZGV4LCBfX3RvcEluZGV4LCBfX3ZhbCk7Cit9CisKKwordGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgY2xhc3MgX1RwPgoraW5saW5lIHZvaWQKK19fcG9wX2hlYXBfYXV4KF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0LCBfVHAqKSB7CisgIF9fcG9wX2hlYXAoX19maXJzdCwgX19sYXN0IC0gMSwgX19sYXN0IC0gMSwKKyAgICAgICAgICAgICBfVHAoKihfX2xhc3QgLSAxKSksIF9TVExQX0RJU1RBTkNFX1RZUEUoX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+Cit2b2lkIHBvcF9oZWFwKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LAorICAgICAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0KSB7CisgIF9fcG9wX2hlYXBfYXV4KF9fZmlyc3QsIF9fbGFzdCwgX1NUTFBfVkFMVUVfVFlQRShfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgY2xhc3MgX0Rpc3RhbmNlLAorICAgICAgICAgIGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmU+Cit2b2lkCitfX2FkanVzdF9oZWFwKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfRGlzdGFuY2UgX19ob2xlSW5kZXgsCisgICAgICAgICAgICAgIF9EaXN0YW5jZSBfX2xlbiwgX1RwIF9fdmFsLCBfQ29tcGFyZSBfX2NvbXApCit7CisgIF9EaXN0YW5jZSBfX3RvcEluZGV4ID0gX19ob2xlSW5kZXg7CisgIF9EaXN0YW5jZSBfX3NlY29uZENoaWxkID0gMiAqIF9faG9sZUluZGV4ICsgMjsKKyAgd2hpbGUgKF9fc2Vjb25kQ2hpbGQgPCBfX2xlbikgeworICAgIGlmIChfX2NvbXAoKihfX2ZpcnN0ICsgX19zZWNvbmRDaGlsZCksICooX19maXJzdCArIChfX3NlY29uZENoaWxkIC0gMSkpKSkgeworICAgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoIV9fY29tcCgqKF9fZmlyc3QgKyAoX19zZWNvbmRDaGlsZCAtIDEpKSwgKihfX2ZpcnN0ICsgX19zZWNvbmRDaGlsZCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX1N0bE1zZ19JTlZBTElEX1NUUklDVF9XRUFLX1BSRURJQ0FURSkKKyAgICAgIF9fc2Vjb25kQ2hpbGQtLTsKKyAgICB9CisgICAgKihfX2ZpcnN0ICsgX19ob2xlSW5kZXgpID0gKihfX2ZpcnN0ICsgX19zZWNvbmRDaGlsZCk7CisgICAgX19ob2xlSW5kZXggPSBfX3NlY29uZENoaWxkOworICAgIF9fc2Vjb25kQ2hpbGQgPSAyICogKF9fc2Vjb25kQ2hpbGQgKyAxKTsKKyAgfQorICBpZiAoX19zZWNvbmRDaGlsZCA9PSBfX2xlbikgeworICAgICooX19maXJzdCArIF9faG9sZUluZGV4KSA9ICooX19maXJzdCArIChfX3NlY29uZENoaWxkIC0gMSkpOworICAgIF9faG9sZUluZGV4ID0gX19zZWNvbmRDaGlsZCAtIDE7CisgIH0KKyAgX19wdXNoX2hlYXAoX19maXJzdCwgX19ob2xlSW5kZXgsIF9fdG9wSW5kZXgsIF9fdmFsLCBfX2NvbXApOworfQorCisKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmU+CitpbmxpbmUgdm9pZAorX19wb3BfaGVhcF9hdXgoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsCisgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0LCBfVHAqLCBfQ29tcGFyZSBfX2NvbXApCit7CisgIF9fcG9wX2hlYXAoX19maXJzdCwgX19sYXN0IC0gMSwgX19sYXN0IC0gMSwgX1RwKCooX19sYXN0IC0gMSkpLCBfX2NvbXAsCisgICAgICAgICAgICAgX1NUTFBfRElTVEFOQ0VfVFlQRShfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IpKTsKK30KKworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBjbGFzcyBfQ29tcGFyZT4KK3ZvaWQKK3BvcF9oZWFwKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LAorICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwgX0NvbXBhcmUgX19jb21wKQoreworICAgIF9fcG9wX2hlYXBfYXV4KF9fZmlyc3QsIF9fbGFzdCwgX1NUTFBfVkFMVUVfVFlQRShfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IpLCBfX2NvbXApOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBjbGFzcyBfVHAsIGNsYXNzIF9EaXN0YW5jZT4KK19TVExQX0lOTElORV9MT09QCit2b2lkCitfX21ha2VfaGVhcChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwKKyAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsIF9UcCosIF9EaXN0YW5jZSopCit7CisgIGlmIChfX2xhc3QgLSBfX2ZpcnN0IDwgMikgcmV0dXJuOworICBfRGlzdGFuY2UgX19sZW4gPSBfX2xhc3QgLSBfX2ZpcnN0OworICBfRGlzdGFuY2UgX19wYXJlbnQgPSAoX19sZW4gLSAyKS8yOworCisgIGZvciAoOzspIHsKKyAgICBfX2FkanVzdF9oZWFwKF9fZmlyc3QsIF9fcGFyZW50LCBfX2xlbiwgX1RwKCooX19maXJzdCArIF9fcGFyZW50KSkpOworICAgIGlmIChfX3BhcmVudCA9PSAwKSByZXR1cm47CisgICAgX19wYXJlbnQtLTsKKyAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPgordm9pZAorbWFrZV9oZWFwKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0KQoreworICBfX21ha2VfaGVhcChfX2ZpcnN0LCBfX2xhc3QsCisgICAgICAgICAgICAgIF9TVExQX1ZBTFVFX1RZUEUoX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yKSwgX1NUTFBfRElTVEFOQ0VfVFlQRShfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgY2xhc3MgX0NvbXBhcmUsCisgICAgICAgICAgY2xhc3MgX1RwLCBjbGFzcyBfRGlzdGFuY2U+CitfU1RMUF9JTkxJTkVfTE9PUAordm9pZAorX19tYWtlX2hlYXAoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICBfQ29tcGFyZSBfX2NvbXAsIF9UcCosIF9EaXN0YW5jZSopCit7CisgIGlmIChfX2xhc3QgLSBfX2ZpcnN0IDwgMikgcmV0dXJuOworICBfRGlzdGFuY2UgX19sZW4gPSBfX2xhc3QgLSBfX2ZpcnN0OworICBfRGlzdGFuY2UgX19wYXJlbnQgPSAoX19sZW4gLSAyKS8yOworCisgIGZvciAoOzspIHsKKyAgICBfX2FkanVzdF9oZWFwKF9fZmlyc3QsIF9fcGFyZW50LCBfX2xlbiwgX1RwKCooX19maXJzdCArIF9fcGFyZW50KSksCisgICAgICAgICAgICAgICAgICBfX2NvbXApOworICAgIGlmIChfX3BhcmVudCA9PSAwKSByZXR1cm47CisgICAgX19wYXJlbnQtLTsKKyAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBjbGFzcyBfQ29tcGFyZT4KK3ZvaWQKK21ha2VfaGVhcChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwKKyAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0LCBfQ29tcGFyZSBfX2NvbXApCit7CisgIF9fbWFrZV9oZWFwKF9fZmlyc3QsIF9fbGFzdCwgX19jb21wLAorICAgICAgICAgICAgICBfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyYXRvciksIF9TVExQX0RJU1RBTkNFX1RZUEUoX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yKSk7Cit9CisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2VuZGlmIC8qICBfU1RMUF9IRUFQX0MgKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9faGVhcC5oIGIvc3RsL19oZWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE2ZGM0OQotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9faGVhcC5oCkBAIC0wLDAgKzEsMTI1IEBACisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIEhld2xldHQtUGFja2FyZCBDb21wYW55IG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisvKiBOT1RFOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBTVEwgaGVhZGVycy4KKyAqICAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuCisgKi8KKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9IRUFQX0gKKyNkZWZpbmUgX1NUTFBfSU5URVJOQUxfSEVBUF9ICisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisvLyBIZWFwLW1hbmlwdWxhdGlvbiBmdW5jdGlvbnM6IHB1c2hfaGVhcCwgcG9wX2hlYXAsIG1ha2VfaGVhcCwgc29ydF9oZWFwLgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPgordm9pZAorcHVzaF9oZWFwKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0KTsKKworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBjbGFzcyBfQ29tcGFyZT4KK3ZvaWQKK3B1c2hfaGVhcChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICBfQ29tcGFyZSBfX2NvbXApOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBjbGFzcyBfRGlzdGFuY2UsIGNsYXNzIF9UcD4KK3ZvaWQKK19fYWRqdXN0X2hlYXAoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9EaXN0YW5jZSBfX2hvbGVJbmRleCwKKyAgICAgICAgICAgICAgX0Rpc3RhbmNlIF9fbGVuLCBfVHAgX192YWwpOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBjbGFzcyBfVHAsIGNsYXNzIF9EaXN0YW5jZT4KK2lubGluZSB2b2lkCitfX3BvcF9oZWFwKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19yZXN1bHQsIF9UcCBfX3ZhbCwgX0Rpc3RhbmNlKikKK3sKKyAgKl9fcmVzdWx0ID0gKl9fZmlyc3Q7CisgIF9fYWRqdXN0X2hlYXAoX19maXJzdCwgX0Rpc3RhbmNlKDApLCBfRGlzdGFuY2UoX19sYXN0IC0gX19maXJzdCksIF9fdmFsKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4KK3ZvaWQgcG9wX2hlYXAoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsCisgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QpOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBjbGFzcyBfRGlzdGFuY2UsCisgICAgICAgICAgY2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZT4KK3ZvaWQKK19fYWRqdXN0X2hlYXAoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9EaXN0YW5jZSBfX2hvbGVJbmRleCwKKyAgICAgICAgICAgICAgX0Rpc3RhbmNlIF9fbGVuLCBfVHAgX192YWwsIF9Db21wYXJlIF9fY29tcCk7CisKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmUsCisgICAgICAgICAgY2xhc3MgX0Rpc3RhbmNlPgoraW5saW5lIHZvaWQKK19fcG9wX2hlYXAoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX3Jlc3VsdCwgX1RwIF9fdmFsLCBfQ29tcGFyZSBfX2NvbXAsCisgICAgICAgICAgIF9EaXN0YW5jZSopCit7CisgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0OworICBfX2FkanVzdF9oZWFwKF9fZmlyc3QsIF9EaXN0YW5jZSgwKSwgX0Rpc3RhbmNlKF9fbGFzdCAtIF9fZmlyc3QpLAorICAgICAgICAgICAgICAgIF9fdmFsLCBfX2NvbXApOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBjbGFzcyBfQ29tcGFyZT4KK3ZvaWQKK3BvcF9oZWFwKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LAorICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwgX0NvbXBhcmUgX19jb21wKTsKKwordGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4KK3ZvaWQKK21ha2VfaGVhcChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCk7CisKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIGNsYXNzIF9Db21wYXJlPgordm9pZAorbWFrZV9oZWFwKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LAorICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsIF9Db21wYXJlIF9fY29tcCk7CisKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+CitfU1RMUF9JTkxJTkVfTE9PUAordm9pZCBzb3J0X2hlYXAoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QpCit7CisgIHdoaWxlIChfX2xhc3QgLSBfX2ZpcnN0ID4gMSkKKyAgICBwb3BfaGVhcChfX2ZpcnN0LCBfX2xhc3QtLSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIGNsYXNzIF9Db21wYXJlPgorX1NUTFBfSU5MSU5FX0xPT1AKK3ZvaWQKK3NvcnRfaGVhcChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwKKyAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0LCBfQ29tcGFyZSBfX2NvbXApCit7CisgIHdoaWxlIChfX2xhc3QgLSBfX2ZpcnN0ID4gMSkKKyAgICBwb3BfaGVhcChfX2ZpcnN0LCBfX2xhc3QtLSwgX19jb21wKTsKK30KKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjIGlmICFkZWZpbmVkIChfU1RMUF9MSU5LX1RJTUVfSU5TVEFOVElBVElPTikKKyMgIGluY2x1ZGUgPHN0bC9faGVhcC5jPgorIyBlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfSEVBUF9IICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvX2lvcy5jIGIvc3RsL19pb3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWU0NzdiCi0tLSAvZGV2L251bGwKKysrIGIvc3RsL19pb3MuYwpAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKyNpZm5kZWYgX1NUTFBfSU9TX0MKKyNkZWZpbmUgX1NUTFBfSU9TX0MKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9JT1NfSAorIyBpbmNsdWRlIDxzdGwvX2lvcy5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfU1RSRUFNQlVGCisjIGluY2x1ZGUgPHN0bC9fc3RyZWFtYnVmLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9OVU1QVU5DVF9ICisjIGluY2x1ZGUgPHN0bC9fbnVtcHVuY3QuaD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworLy8gYmFzaWNfaW9zPD4ncyBub24taW5saW5lIG1lbWJlciBmdW5jdGlvbnMKKworLy8gUHVibGljIGNvbnN0cnVjdG9yLCB0YWtpbmcgYSBzdHJlYW1idWYuCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz4KKyAgOjpiYXNpY19pb3MoYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fc3RyZWFtYnVmKQorICAgIDogaW9zX2Jhc2UoKSwKKyAgICAgIF9NX2ZpbGwoX1NUTFBfTlVMTF9DSEFSX0lOSVQoX0NoYXJUKSksIF9NX3N0cmVhbWJ1ZigwKSwgX01fdGllZF9vc3RyZWFtKDApIHsKKyAgYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz46OmluaXQoX19zdHJlYW1idWYpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qCitiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPjo6cmRidWYoYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fYnVmKSB7CisgIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX3RtcCA9IF9NX3N0cmVhbWJ1ZjsKKyAgX01fc3RyZWFtYnVmID0gX19idWY7CisgIHRoaXMtPmNsZWFyKCk7CisgIHJldHVybiBfX3RtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+JgorYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz46OmNvcHlmbXQoY29uc3QgYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz4mIF9feCkgeworICBfTV9pbnZva2VfY2FsbGJhY2tzKGVyYXNlX2V2ZW50KTsKKyAgX01fY29weV9zdGF0ZShfX3gpOyAgICAgICAgICAgLy8gSW5oZXJpdGVkIGZyb20gaW9zX2Jhc2UuCisgIF9NX2ZpbGwgPSBfX3guX01fZmlsbDsKKyAgX01fdGllZF9vc3RyZWFtID0gX194Ll9NX3RpZWRfb3N0cmVhbTsKKyAgX01faW52b2tlX2NhbGxiYWNrcyhjb3B5Zm10X2V2ZW50KTsKKyAgdGhpcy0+X01fc2V0X2V4Y2VwdGlvbl9tYXNrKF9feC5leGNlcHRpb25zKCkpOworICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Citsb2NhbGUgYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz46OmltYnVlKGNvbnN0IGxvY2FsZSYgX19sb2MpIHsKKyAgbG9jYWxlIF9fdG1wID0gaW9zX2Jhc2U6OmltYnVlKF9fbG9jKTsKKyAgX1NUTFBfVFJZIHsKKyAgICBpZiAoX01fc3RyZWFtYnVmKQorICAgICAgX01fc3RyZWFtYnVmLT5wdWJpbWJ1ZShfX2xvYyk7CisKKyAgICAvLyBubyB0aHJvd2luZyBoZXJlCisgICAgdGhpcy0+X01fY2FjaGVkX2N0eXBlID0gX19sb2MuX01fZ2V0X2ZhY2V0KGN0eXBlPGNoYXJfdHlwZT46OmlkKTsKKyAgICB0aGlzLT5fTV9jYWNoZWRfbnVtcHVuY3QgPSBfX2xvYy5fTV9nZXRfZmFjZXQobnVtcHVuY3Q8Y2hhcl90eXBlPjo6aWQpOworICAgIHRoaXMtPl9NX2NhY2hlZF9ncm91cGluZyA9ICgobnVtcHVuY3Q8Y2hhcl90eXBlPiopX01fY2FjaGVkX251bXB1bmN0KS0+Z3JvdXBpbmcoKTsKKyAgfQorICBfU1RMUF9DQVRDSF9BTEwgeworICAgIF9fdG1wID0gaW9zX2Jhc2U6OmltYnVlKF9fdG1wKTsKKyAgICBfTV9oYW5kbGVfZXhjZXB0aW9uKGlvc19iYXNlOjpmYWlsYml0KTsKKyAgfQorICByZXR1cm4gX190bXA7Cit9CisKKy8vIFByb3RlY3RlZCBjb25zdHJ1Y3RvciBhbmQgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zLiBUaGUgZGVmYXVsdAorLy8gY29uc3RydWN0b3IgY3JlYXRlcyBhbiB1bmluaXRpYWxpemVkIGJhc2ljX2lvcywgYW5kIGluaXQoKSBpbml0aWFsaXplcworLy8gYWxsIG9mIHRoZSBtZW1iZXJzIHRvIHRoZSB2YWx1ZXMgaW4gVGFibGUgODkgb2YgdGhlIEMrKyBzdGFuZGFyZC4KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+OjpiYXNpY19pb3MoKQorICA6IGlvc19iYXNlKCksCisgICAgX01fZmlsbChfU1RMUF9OVUxMX0NIQVJfSU5JVChfQ2hhclQpKSwgX01fc3RyZWFtYnVmKDApLCBfTV90aWVkX29zdHJlYW0oMCkKK3t9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Cit2b2lkCitiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPjo6aW5pdChiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19zYikKK3sKKyAgdGhpcy0+cmRidWYoX19zYik7CisgIHRoaXMtPmltYnVlKGxvY2FsZSgpKTsKKyAgdGhpcy0+dGllKDApOworICB0aGlzLT5fTV9zZXRfZXhjZXB0aW9uX21hc2soaW9zX2Jhc2U6Omdvb2RiaXQpOworICB0aGlzLT5fTV9jbGVhcl9ub3Rocm93KF9fc2IgIT0gMCA/IGlvc19iYXNlOjpnb29kYml0IDogaW9zX2Jhc2U6OmJhZGJpdCk7CisgIGlvc19iYXNlOjpmbGFncyhpb3NfYmFzZTo6c2tpcHdzIHwgaW9zX2Jhc2U6OmRlYyk7CisgIGlvc19iYXNlOjp3aWR0aCgwKTsKKyAgaW9zX2Jhc2U6OnByZWNpc2lvbig2KTsKKyAgdGhpcy0+ZmlsbCh3aWRlbignICcpKTsKKyAgLy8gV2UgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCBhbnkgb2YgdGhlIHRocmVlIGFycmF5czogdGhleSBhcmUKKyAgLy8gaW5pdGlhbGl6ZWQgY29ycmVjdGx5IGluIGlvc19iYXNlJ3MgY29uc3RydWN0b3IuCit9CisKKy8vIFRoaXMgaXMgbmV2ZXIgY2FsbGVkIGV4Y2VwdCBmcm9tIHdpdGhpbiBhIGNhdGNoIGNsYXVzZS4KK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Cit2b2lkIGJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+OjpfTV9oYW5kbGVfZXhjZXB0aW9uKGlvc19iYXNlOjppb3N0YXRlIF9fZmxhZykKK3sKKyAgdGhpcy0+X01fc2V0c3RhdGVfbm90aHJvdyhfX2ZsYWcpOworICBpZiAodGhpcy0+X01fZ2V0X2V4Y2VwdGlvbl9tYXNrKCkgJiBfX2ZsYWcpCisgICAgX1NUTFBfUkVUSFJPVzsKK30KKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYgLyogX1NUTFBfSU9TX0MgKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9faW9zLmggYi9zdGwvX2lvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlNmRhMmQKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvX2lvcy5oCkBAIC0wLDAgKzEsMTc4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9JT1NfSAorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9JT1NfSAorCisKKyNpZm5kZWYgX1NUTFBfSU9TX0JBU0VfSAorIyBpbmNsdWRlIDxzdGwvX2lvc19iYXNlLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DVFlQRV9ICisjIGluY2x1ZGUgPHN0bC9fY3R5cGUuaD4KKyNlbmRpZgorI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9OVU1QVU5DVF9ICisjIGluY2x1ZGUgPHN0bC9fbnVtcHVuY3QuaD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBDbGFzcyBiYXNpY19pb3MsIGEgc3ViY2xhc3Mgb2YgaW9zX2Jhc2UuICBUaGUgb25seSBpbXBvcnRhbnQgZGlmZmVyZW5jZQorLy8gYmV0d2VlbiB0aGUgdHdvIGlzIHRoYXQgYmFzaWNfaW9zIGlzIGEgY2xhc3MgdGVtcGxhdGUsIHBhcmFtZXRlcml6ZWQKKy8vIGJ5IHRoZSBjaGFyYWN0ZXIgdHlwZS4gIGlvc19iYXNlIGV4aXN0cyB0byBmYWN0b3Igb3V0IGFsbCBvZiB0aGUKKy8vIGNvbW1vbiBwcm9wZXJ0aWVzIHRoYXQgZG9uJ3QgZGVwZW5kIG9uIHRoZSBjaGFyYWN0ZXIgdHlwZS4KKworLy8gVGhlIHNlY29uZCB0ZW1wbGF0ZSBwYXJhbWV0ZXIsIF9UcmFpdHMsIGRlZmF1bHRzIHRvIGNoYXJfdHJhaXRzPF9DaGFyVD4uCisvLyBUaGUgZGVmYXVsdCBpcyBkZWNsYXJlZCBpbiBoZWFkZXIgPGlvc2Z3ZD4sIGFuZCBpdCBpc24ndCBkZWNsYXJlZCBoZXJlCisvLyBiZWNhdXNlIEMrKyBsYW5ndWFnZSBydWxlcyBkbyBub3QgYWxsb3cgaXQgdG8gYmUgZGVjbGFyZWQgdHdpY2UuCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitjbGFzcyBiYXNpY19pb3MgOiBwdWJsaWMgaW9zX2Jhc2UgeworICBmcmllbmQgY2xhc3MgaW9zX2Jhc2U7CitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN5bm9ueW1zIGZvciB0eXBlcy4KKyAgdHlwZWRlZiBfQ2hhclQgICAgICAgICAgICAgICAgICAgICBjaGFyX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6aW50X3R5cGUgaW50X3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6cG9zX3R5cGUgcG9zX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6b2ZmX3R5cGUgb2ZmX3R5cGU7CisgIHR5cGVkZWYgX1RyYWl0cyAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3R5cGU7CisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29uc3RydWN0b3IsIGRlc3RydWN0b3IuCisgIGV4cGxpY2l0IGJhc2ljX2lvcyhiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19zdHJlYW1idWYpOworICB2aXJ0dWFsIH5iYXNpY19pb3MoKSB7fQorCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1lbWJlcnMgZnJvbSBjbGF1c2UgMjcuNC40LjIKKyAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+KiB0aWUoKSBjb25zdCB7CisgICAgcmV0dXJuIF9NX3RpZWRfb3N0cmVhbTsKKyAgfQorICBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4qCisgIHRpZShiYXNpY19vc3RyZWFtPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+KiBfX25ld190aWVkX29zdHJlYW0pIHsKKyAgICBiYXNpY19vc3RyZWFtPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+KiBfX3RtcCA9IF9NX3RpZWRfb3N0cmVhbTsKKyAgICBfTV90aWVkX29zdHJlYW0gPSBfX25ld190aWVkX29zdHJlYW07CisgICAgcmV0dXJuIF9fdG1wOworICB9CisKKyAgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIHJkYnVmKCkgY29uc3QKKyAgICB7IHJldHVybiBfTV9zdHJlYW1idWY7IH0KKworICBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPioKKyAgcmRidWYoYmFzaWNfc3RyZWFtYnVmPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+Kik7CisKKyAgLy8gQ29waWVzIF9feCdzIHN0YXRlIHRvICp0aGlzLgorICBiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPiYgY29weWZtdChjb25zdCBiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPiYgX194KTsKKworICBjaGFyX3R5cGUgZmlsbCgpIGNvbnN0IHsgcmV0dXJuIF9NX2ZpbGw7IH0KKyAgY2hhcl90eXBlIGZpbGwoY2hhcl90eXBlIF9fZmlsbCkgeworICAgIGNoYXJfdHlwZSBfX3RtcChfTV9maWxsKTsKKyAgICBfTV9maWxsID0gX19maWxsOworICAgIHJldHVybiBfX3RtcDsKKyAgfQorCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1lbWJlcnMgZnJvbSAyNy40LjQuMy4gIFRoZXNlIGZvdXIgZnVuY3Rpb25zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbiBhbG1vc3QgYmUgZGVmaW5lZCBpbiBpb3NfYmFzZS4KKworICB2b2lkIGNsZWFyKGlvc3RhdGUgX19zdGF0ZSA9IGdvb2RiaXQpIHsKKyAgICBfTV9jbGVhcl9ub3Rocm93KHRoaXMtPnJkYnVmKCkgPyBfX3N0YXRlIDogaW9zdGF0ZShfX3N0YXRlfGlvc19iYXNlOjpiYWRiaXQpKTsKKyAgICBfTV9jaGVja19leGNlcHRpb25fbWFzaygpOworICB9CisgIHZvaWQgc2V0c3RhdGUoaW9zdGF0ZSBfX3N0YXRlKSB7IHRoaXMtPmNsZWFyKHJkc3RhdGUoKSB8IF9fc3RhdGUpOyB9CisKKyAgaW9zdGF0ZSBleGNlcHRpb25zKCkgY29uc3QgeyByZXR1cm4gdGhpcy0+X01fZ2V0X2V4Y2VwdGlvbl9tYXNrKCk7IH0KKyAgdm9pZCBleGNlcHRpb25zKGlvc3RhdGUgX19tYXNrKSB7CisgICAgdGhpcy0+X01fc2V0X2V4Y2VwdGlvbl9tYXNrKF9fbWFzayk7CisgICAgdGhpcy0+Y2xlYXIodGhpcy0+cmRzdGF0ZSgpKTsKKyAgfQorCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExvY2FsZS1yZWxhdGVkIG1lbWJlciBmdW5jdGlvbnMuCisgIGxvY2FsZSBpbWJ1ZShjb25zdCBsb2NhbGUmKTsKKworICBpbmxpbmUgY2hhciBuYXJyb3coX0NoYXJULCBjaGFyKSBjb25zdCA7CisgIGlubGluZSBfQ2hhclQgd2lkZW4oY2hhcikgY29uc3Q7CisKKyAgLy8gSGVscGVyIGZ1bmN0aW9uIHRoYXQgbWFrZXMgdGVzdGluZyBmb3IgRU9GIG1vcmUgY29udmVuaWVudC4KKyAgc3RhdGljIGJvb2wgX1NUTFBfQ0FMTCBfU19lb2YoaW50X3R5cGUgX19jKSB7CisgICAgY29uc3QgaW50X3R5cGUgX19lb2YgPSBfVHJhaXRzOjplb2YoKTsKKyAgICByZXR1cm4gX1RyYWl0czo6ZXFfaW50X3R5cGUoX19jLCBfX2VvZik7CisgIH0KKworcHJvdGVjdGVkOgorICBiYXNpY19pb3MoKTsKKworICB2b2lkIGluaXQoYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fc3RyZWFtYnVmKTsKKworcHVibGljOgorCisgIC8vIEhlbHBlciBmdW5jdGlvbiB1c2VkIGluIGlzdHJlYW0gYW5kIG9zdHJlYW0uICBJdCBpcyBjYWxsZWQgb25seSBmcm9tCisgIC8vIGEgY2F0Y2ggY2xhdXNlLgorICB2b2lkIF9NX2hhbmRsZV9leGNlcHRpb24oaW9zX2Jhc2U6Omlvc3RhdGUgX19mbGFnKTsKKworcHJpdmF0ZTogICAgICAgICAgICAgICAgICAgICAgICAvLyBEYXRhIG1lbWJlcnMKKyAgY2hhcl90eXBlIF9NX2ZpbGw7ICAgICAgICAgICAgLy8gVGhlIGZpbGwgY2hhcmFjdGVyLCB1c2VkIGZvciBwYWRkaW5nLgorCisgIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfTV9zdHJlYW1idWY7CisgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiogICBfTV90aWVkX29zdHJlYW07CisKK307CisKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2lubGluZSBjaGFyCitiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPjo6bmFycm93KF9DaGFyVCBfX2MsIGNoYXIgX19kZWZhdWx0KSBjb25zdAoreyByZXR1cm4gX19TVEFUSUNfQ0FTVChjb25zdCBjdHlwZTxfQ2hhclQ+KiwgdGhpcy0+X01fY3R5cGVfZmFjZXQoKSktPm5hcnJvdyhfX2MsIF9fZGVmYXVsdCk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2lubGluZSBfQ2hhclQKK2Jhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+Ojp3aWRlbihjaGFyIF9fYykgY29uc3QKK3sgcmV0dXJuIF9fU1RBVElDX0NBU1QoY29uc3QgY3R5cGU8X0NoYXJUPiosIHRoaXMtPl9NX2N0eXBlX2ZhY2V0KCkpLT53aWRlbihfX2MpOyB9CisKKyMgaWYgIWRlZmluZWQgKF9TVExQX05PX01FVEhPRF9TUEVDSUFMSVpBVElPTikKK19TVExQX1RFTVBMQVRFX05VTEwKK2lubGluZSBjaGFyCitiYXNpY19pb3M8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPjo6bmFycm93KGNoYXIgX19jLCBjaGFyKSBjb25zdAoreworICByZXR1cm4gX19jOworfQorCitfU1RMUF9URU1QTEFURV9OVUxMCitpbmxpbmUgY2hhcgorYmFzaWNfaW9zPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID46OndpZGVuKGNoYXIgX19jKSBjb25zdAoreworICByZXR1cm4gX19jOworfQorIyBlbmRpZiAvKiBfU1RMUF9OT19NRVRIT0RfU1BFQ0lBTElaQVRJT04gKi8KKworIyBpZiBkZWZpbmVkIChfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUKQorX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIGJhc2ljX2lvczxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+OworIyAgaWYgISBkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQorX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIGJhc2ljX2lvczx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+OworIyAgZW5kaWYKKyMgZW5kaWYgLyogX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCAqLworCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNpZiBkZWZpbmVkIChfU1RMUF9FWFBPU0VfU1RSRUFNX0lNUExFTUVOVEFUSU9OKSAmJiAhZGVmaW5lZCAoX1NUTFBfTElOS19USU1FX0lOU1RBTlRJQVRJT04pCisjICBpbmNsdWRlIDxzdGwvX2lvcy5jPgorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9JT1MgKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKKwpkaWZmIC0tZ2l0IGEvc3RsL19pb3NfYmFzZS5oIGIvc3RsL19pb3NfYmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MDYwNmEKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvX2lvc19iYXNlLmgKQEAgLTAsMCArMSwzNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisjaWZuZGVmIF9TVExQX0lPU19CQVNFX0gKKyNkZWZpbmUgX1NUTFBfSU9TX0JBU0VfSAorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX1NUREVYQ0VQVF9CQVNFCisjICBpbmNsdWRlIDxzdGwvX3N0ZGV4Y2VwdF9iYXNlLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9VVElMSVRZCisjICBpbmNsdWRlIDx1dGlsaXR5PgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfTE9DQUxFX0gKKyMgIGluY2x1ZGUgPHN0bC9fbG9jYWxlLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9TVFJJTkdfSAorIyAgaW5jbHVkZSA8c3RsL19zdHJpbmcuaD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBDbGFzcyBpb3NfYmFzZS4gIFRoaXMgaXMgdGhlIGJhc2UgY2xhc3Mgb2YgdGhlIGlvcyBoaWVyYXJjaHksIHdoaWNoCisvLyBpbmNsdWRlcyBiYXNpY19pc3RyZWFtIGFuZCBiYXNpY19vc3RyZWFtLiAgQ2xhc3NlcyBpbiB0aGUgaW9zCisvLyBoaWVyYXJjaHkgYXJlIGFjdHVhbGx5IHF1aXRlIHNpbXBsZTogdGhleSBhcmUganVzdCBnbG9yaWZpZWQKKy8vIHdyYXBwZXIgY2xhc3Nlcy4gIFRoZXkgZGVsZWdhdGUgYnVmZmVyaW5nIGFuZCBwaHlzaWNhbCBjaGFyYWN0ZXIKKy8vIG1hbmlwdWxhdGlvbiB0byB0aGUgc3RyZWFtYnVmIGNsYXNzZXMsIGFuZCB0aGV5IGRlbGVnYXRlIG1vc3QKKy8vIGZvcm1hdHRpbmcgdGFza3MgdG8gYSBsb2NhbGUuCisKK2NsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIGlvc19iYXNlIHsKK3B1YmxpYzoKKworICBjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBmYWlsdXJlIDogcHVibGljIF9fTmFtZWRfZXhjZXB0aW9uIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IGZhaWx1cmUoY29uc3Qgc3RyaW5nJik7CisgICAgdmlydHVhbCB+ZmFpbHVyZSgpIF9TVExQX05PVEhST1dfSU5IRVJFTlRMWTsKKyAgfTsKKworICB0eXBlZGVmIGludCBmbXRmbGFnczsKKyAgdHlwZWRlZiBpbnQgaW9zdGF0ZTsKKyAgdHlwZWRlZiBpbnQgb3Blbm1vZGU7CisgIHR5cGVkZWYgaW50IHNlZWtkaXI7CisKKyMgaWZuZGVmIF9TVExQX05PX0FOQUNIUk9OSVNNUworICB0eXBlZGVmIGZtdGZsYWdzIGZtdF9mbGFnczsKKyMgZW5kaWYKKworICAvLyBGb3JtYXR0aW5nIGZsYWdzLgorI2lmIGRlZmluZWQgKF9TVExQX1NUQVRJQ19DT05TVF9JTklUX0JVRykKKyAgZW51bSAgeworI2Vsc2UKKyAgLy8gYm9yaXMgOiB0eXBlIGZvciBhbGwgdGhvc2UgY29uc3RhbnRzIGlzIGludAorICBzdGF0aWMgY29uc3QgaW50CisjZW5kaWYKKyAgICBsZWZ0ICAgICAgID0gMHgwMDAxLAorICAgIHJpZ2h0ICAgICAgPSAweDAwMDIsCisgICAgaW50ZXJuYWwgICA9IDB4MDAwNCwKKyAgICBkZWMgICAgICAgID0gMHgwMDA4LAorICAgIGhleCAgICAgICAgPSAweDAwMTAsCisgICAgb2N0ICAgICAgICA9IDB4MDAyMCwKKyAgICBmaXhlZCAgICAgID0gMHgwMDQwLAorICAgIHNjaWVudGlmaWMgPSAweDAwODAsCisgICAgYm9vbGFscGhhICA9IDB4MDEwMCwKKyAgICBzaG93YmFzZSAgID0gMHgwMjAwLAorICAgIHNob3dwb2ludCAgPSAweDA0MDAsCisgICAgc2hvd3BvcyAgICA9IDB4MDgwMCwKKyAgICBza2lwd3MgICAgID0gMHgxMDAwLAorICAgIHVuaXRidWYgICAgPSAweDIwMDAsCisgICAgdXBwZXJjYXNlICA9IDB4NDAwMCwKKyAgICBhZGp1c3RmaWVsZCA9IGxlZnQgfCByaWdodCB8IGludGVybmFsLAorICAgIGJhc2VmaWVsZCAgID0gZGVjIHwgaGV4IHwgb2N0LAorICAgIGZsb2F0ZmllbGQgID0gc2NpZW50aWZpYyB8IGZpeGVkLAorCisgICAgLy8gU3RhdGUgZmxhZ3MuCisgICAgZ29vZGJpdCA9IDB4MDAsCisgICAgYmFkYml0ICA9IDB4MDEsCisgICAgZW9mYml0ICA9IDB4MDIsCisgICAgZmFpbGJpdCA9IDB4MDQsCisKKyAgICAvLyBPcGVubW9kZSBmbGFncy4KKyAgICBfX2RlZmF1bHRfbW9kZSA9IDB4MCwgLyogaW1wbGVtZW50YXRpb24gZGV0YWlsICovCisgICAgYXBwICAgID0gMHgwMSwKKyAgICBhdGUgICAgPSAweDAyLAorICAgIGJpbmFyeSA9IDB4MDQsCisgICAgaW4gICAgID0gMHgwOCwKKyAgICBvdXQgICAgPSAweDEwLAorICAgIHRydW5jICA9IDB4MjAsCisKKyAgICAvLyBTZWVrZGlyIGZsYWdzCisKKyAgICBiZWcgPSAweDAxLAorICAgIGN1ciA9IDB4MDIsCisgICAgZW5kID0gMHgwNAorIyBpZmRlZiBfU1RMUF9TVEFUSUNfQ09OU1RfSU5JVF9CVUcKKyAgfQorIyBlbmRpZgorICA7CisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmxhZy1tYW5pcHVsYXRpb24gZnVuY3Rpb25zLgorICBmbXRmbGFncyBmbGFncygpIGNvbnN0IHsgcmV0dXJuIF9NX2ZtdGZsYWdzOyB9CisgIGZtdGZsYWdzIGZsYWdzKGZtdGZsYWdzIF9fZmxhZ3MpIHsKKyAgICBmbXRmbGFncyBfX3RtcCA9IF9NX2ZtdGZsYWdzOworICAgIF9NX2ZtdGZsYWdzID0gX19mbGFnczsKKyAgICByZXR1cm4gX190bXA7CisgIH0KKworICBmbXRmbGFncyBzZXRmKGZtdGZsYWdzIF9fZmxhZykgeworICAgIGZtdGZsYWdzIF9fdG1wID0gX01fZm10ZmxhZ3M7CisgICAgX01fZm10ZmxhZ3MgfD0gX19mbGFnOworICAgIHJldHVybiBfX3RtcDsKKyAgfQorICBmbXRmbGFncyBzZXRmKGZtdGZsYWdzIF9fZmxhZywgZm10ZmxhZ3MgX19tYXNrKSB7CisgICAgZm10ZmxhZ3MgX190bXAgPSBfTV9mbXRmbGFnczsKKyAgICBfTV9mbXRmbGFncyAmPSB+X19tYXNrOworICAgIF9NX2ZtdGZsYWdzIHw9IF9fZmxhZyAmIF9fbWFzazsKKyAgICByZXR1cm4gX190bXA7CisgIH0KKyAgdm9pZCB1bnNldGYoZm10ZmxhZ3MgX19tYXNrKSB7IF9NX2ZtdGZsYWdzICY9IH5fX21hc2s7IH0KKworICBzdHJlYW1zaXplIHByZWNpc2lvbigpIGNvbnN0IHsgcmV0dXJuIF9NX3ByZWNpc2lvbjsgfQorICBzdHJlYW1zaXplIHByZWNpc2lvbihzdHJlYW1zaXplIF9fbmV3cHJlY2lzaW9uKSB7CisgICAgc3RyZWFtc2l6ZSBfX3RtcCA9IF9NX3ByZWNpc2lvbjsKKyAgICBfTV9wcmVjaXNpb24gPSBfX25ld3ByZWNpc2lvbjsKKyAgICByZXR1cm4gX190bXA7CisgIH0KKworICBzdHJlYW1zaXplIHdpZHRoKCkgY29uc3QgeyByZXR1cm4gX01fd2lkdGg7IH0KKyAgc3RyZWFtc2l6ZSB3aWR0aChzdHJlYW1zaXplIF9fbmV3d2lkdGgpIHsKKyAgICBzdHJlYW1zaXplIF9fdG1wID0gX01fd2lkdGg7CisgICAgX01fd2lkdGggPSBfX25ld3dpZHRoOworICAgIHJldHVybiBfX3RtcDsKKyAgfQorCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExvY2FsZXMKKyAgbG9jYWxlIGltYnVlKGNvbnN0IGxvY2FsZSYpOworICBsb2NhbGUgZ2V0bG9jKCkgY29uc3QgeyByZXR1cm4gX01fbG9jYWxlOyB9CisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXV4aWxpYXJ5IHN0b3JhZ2UuCisgIHN0YXRpYyBpbnQgX1NUTFBfQ0FMTCB4YWxsb2MoKTsKKyAgbG9uZyYgIGl3b3JkKGludCBfX2luZGV4KTsKKyAgdm9pZComIHB3b3JkKGludCBfX2luZGV4KTsKKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEZXN0cnVjdG9yLgorICB2aXJ0dWFsIH5pb3NfYmFzZSgpOworCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhbGxiYWNrcy4KKyAgZW51bSBldmVudCB7IGVyYXNlX2V2ZW50LCBpbWJ1ZV9ldmVudCwgY29weWZtdF9ldmVudCB9OworICB0eXBlZGVmIHZvaWQgKCpldmVudF9jYWxsYmFjaykoZXZlbnQsIGlvc19iYXNlJiwgaW50IF9faW5kZXgpOworICB2b2lkIHJlZ2lzdGVyX2NhbGxiYWNrKGV2ZW50X2NhbGxiYWNrIF9fZm4sIGludCBfX2luZGV4KTsKKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIG1lbWJlciBmdW5jdGlvbiBhZmZlY3RzIG9ubHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGVpZ2h0IHByZWRlZmluZWQgaW9zIG9iamVjdHM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNpbiwgY291dCwgZXRjLgorICBzdGF0aWMgYm9vbCBfU1RMUF9DQUxMIHN5bmNfd2l0aF9zdGRpbyhib29sIF9fc3luYyA9IHRydWUpOworCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBDKysgc3RhbmRhcmQgcmVxdWlyZXMgb25seSB0aGF0IHRoZXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lbWJlciBmdW5jdGlvbnMgYmUgZGVmaW5lZCBpbiBiYXNpY19pb3MuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGRlZmluZSB0aGVtIGluIHRoZSBub24tdGVtcGxhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFzZSBjbGFzcyB0byBhdm9pZCBjb2RlIGR1cGxpY2F0aW9uLgorICBvcGVyYXRvciB2b2lkKigpIGNvbnN0IHsgcmV0dXJuICFmYWlsKCkgPyAodm9pZCopIF9fQ09OU1RfQ0FTVChpb3NfYmFzZSosdGhpcykgOiAodm9pZCopIDA7IH0KKyAgYm9vbCBvcGVyYXRvciEoKSBjb25zdCB7IHJldHVybiBmYWlsKCk7IH0KKworICBpb3N0YXRlIHJkc3RhdGUoKSBjb25zdCB7IHJldHVybiBfTV9pb3N0YXRlOyB9CisKKyAgYm9vbCBnb29kKCkgY29uc3QgeyByZXR1cm4gX01faW9zdGF0ZSA9PSAwOyB9CisgIGJvb2wgZW9mKCkgY29uc3QgeyByZXR1cm4gKF9NX2lvc3RhdGUgJiBlb2ZiaXQpICE9IDA7IH0KKyAgYm9vbCBmYWlsKCkgY29uc3QgeyByZXR1cm4gKF9NX2lvc3RhdGUgJiAoZmFpbGJpdCB8IGJhZGJpdCkpICE9IDA7IH0KKyAgYm9vbCBiYWQoKSBjb25zdCB7IHJldHVybiAoX01faW9zdGF0ZSAmIGJhZGJpdCkgIT0gMDsgfQorCitwcm90ZWN0ZWQ6ICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBmdW5jdGlvbmFsIHByb3RlY3RlZCBpbnRlcmZhY2UuCisKKyAgLy8gQ29waWVzIHRoZSBzdGF0ZSBvZiBfX3ggdG8gKnRoaXMuICBUaGlzIG1lbWJlciBmdW5jdGlvbiBtYWtlcyBpdAorICAvLyBwb3NzaWJsZSB0byBpbXBsZW1lbnQgYmFzaWNfaW9zOjpjb3B5Zm10IHdpdGhvdXQgaGF2aW5nIHRvIGV4cG9zZQorICAvLyBpb3NfYmFzZSdzIHByaXZhdGUgZGF0YSBtZW1iZXJzLiAgRG9lcyBub3QgY29weSBfTV9leGNlcHRpb25fbWFzaworICAvLyBvciBfTV9pb3N0YXRlLgorICB2b2lkIF9NX2NvcHlfc3RhdGUoY29uc3QgaW9zX2Jhc2UmIF9feCk7CisKKyAgdm9pZCBfTV9zZXRzdGF0ZV9ub3Rocm93KGlvc3RhdGUgX19zdGF0ZSkgeyBfTV9pb3N0YXRlIHw9IF9fc3RhdGU7IH0KKyAgdm9pZCBfTV9jbGVhcl9ub3Rocm93KGlvc3RhdGUgX19zdGF0ZSkgeyBfTV9pb3N0YXRlID0gX19zdGF0ZTsgfQorICBpb3N0YXRlIF9NX2dldF9leGNlcHRpb25fbWFzaygpIGNvbnN0IHsgcmV0dXJuIF9NX2V4Y2VwdGlvbl9tYXNrOyB9CisgIHZvaWQgX01fc2V0X2V4Y2VwdGlvbl9tYXNrKGlvc3RhdGUgX19tYXNrKSB7IF9NX2V4Y2VwdGlvbl9tYXNrID0gX19tYXNrOyB9CisgIHZvaWQgX01fY2hlY2tfZXhjZXB0aW9uX21hc2soKSB7CisgICAgaWYgKF9NX2lvc3RhdGUgJiBfTV9leGNlcHRpb25fbWFzaykKKyAgICAgIF9NX3Rocm93X2ZhaWx1cmUoKTsKKyAgfQorCisgIHZvaWQgX01faW52b2tlX2NhbGxiYWNrcyhldmVudCk7CisgIHZvaWQgX1NUTFBfRlVOQ1RJT05fVEhST1dTIF9NX3Rocm93X2ZhaWx1cmUoKTsKKworICBpb3NfYmFzZSgpOyAgICAgICAgICAgICAgICAgICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yLgorCitwcm90ZWN0ZWQ6ICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5pdGlhbGl6YXRpb24gb2YgdGhlIEkvTyBzeXN0ZW0KKyAgc3RhdGljIHZvaWQgX1NUTFBfQ0FMTCBfU19pbml0aWFsaXplKCk7CisgIHN0YXRpYyB2b2lkIF9TVExQX0NBTEwgX1NfdW5pbml0aWFsaXplKCk7CisgIHN0YXRpYyBib29sIF9TX3dhc19zeW5jZWQ7CisKK3ByaXZhdGU6ICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW52YWxpZGF0ZSB0aGUgY29weSBjb25zdHJ1Y3RvciBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXNzaWdubWVudCBvcGVyYXRvci4KKyAgaW9zX2Jhc2UoY29uc3QgaW9zX2Jhc2UmKTsKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgaW9zX2Jhc2UmKTsKKworcHJpdmF0ZTogICAgICAgICAgICAgICAgICAgICAgICAvLyBEYXRhIG1lbWJlcnMuCisKKyAgZm10ZmxhZ3MgX01fZm10ZmxhZ3M7ICAgICAgICAgLy8gRmxhZ3MKKyAgaW9zdGF0ZSBfTV9pb3N0YXRlOworICBvcGVubW9kZSBfTV9vcGVubW9kZTsKKyAgc2Vla2RpciBfTV9zZWVrZGlyOworICBpb3N0YXRlIF9NX2V4Y2VwdGlvbl9tYXNrOworCisgIHN0cmVhbXNpemUgX01fcHJlY2lzaW9uOworICBzdHJlYW1zaXplIF9NX3dpZHRoOworCisgIGxvY2FsZSBfTV9sb2NhbGU7CisKKyAgcGFpcjxldmVudF9jYWxsYmFjaywgaW50PiogX01fY2FsbGJhY2tzOworICBzaXplX3QgX01fbnVtX2NhbGxiYWNrczsgICAgICAvLyBTaXplIG9mIHRoZSBjYWxsYmFjayBhcnJheS4KKyAgc2l6ZV90IF9NX2NhbGxiYWNrX2luZGV4OyAgICAgLy8gSW5kZXggb2YgdGhlIG5leHQgYXZhaWxhYmxlIGNhbGxiYWNrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbml0aWFsbHkgemVyby4KKworICBsb25nKiBfTV9pd29yZHM7ICAgICAgICAgICAgICAvLyBBdXhpbGlhcnkgc3RvcmFnZS4gIFRoZSBjb3VudCBpcyB6ZXJvCisgIHNpemVfdCBfTV9udW1faXdvcmRzOyAgICAgICAgIC8vIGlmIGFuZCBvbmx5IGlmIHRoZSBwb2ludGVyIGlzIG51bGwuCisKKyAgdm9pZCoqIF9NX3B3b3JkczsKKyAgc2l6ZV90IF9NX251bV9wd29yZHM7CisKK3Byb3RlY3RlZDoKKyAgLy8gQ2FjaGVkIGNvcGllcyBvZiB0aGUgY3VyZW50IGxvY2FsZSdzIGZhY2V0cy4gIFNldCBieSBpbml0KCkgYW5kIGltYnVlKCkuCisgIGxvY2FsZTo6ZmFjZXQqIF9NX2NhY2hlZF9jdHlwZTsKKyAgbG9jYWxlOjpmYWNldCogX01fY2FjaGVkX251bXB1bmN0OworICBzdHJpbmcgICAgICAgICBfTV9jYWNoZWRfZ3JvdXBpbmc7CitwdWJsaWM6CisgIC8vIEVxdWl2YWxlbnQgdG8gJnVzZV9mYWNldDwgRmFjZXQgPihnZXRsb2MoKSksIGJ1dCBmYXN0ZXIuCisgIGNvbnN0IGxvY2FsZTo6ZmFjZXQqIF9NX2N0eXBlX2ZhY2V0KCkgY29uc3QgeyByZXR1cm4gX01fY2FjaGVkX2N0eXBlOyB9CisgIGNvbnN0IGxvY2FsZTo6ZmFjZXQqIF9NX251bXB1bmN0X2ZhY2V0KCkgY29uc3QgeyByZXR1cm4gX01fY2FjaGVkX251bXB1bmN0OyB9CisgIGNvbnN0IHN0cmluZyYgIF9NX2dyb3VwaW5nKCkgY29uc3QgeyByZXR1cm4gX01fY2FjaGVkX2dyb3VwaW5nOyB9CitwdWJsaWM6CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBOZXN0ZWQgaW5pdGlhbGl6ZXIgY2xhc3MuICBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbCwgYnV0IGl0J3MKKyAgLy8gcHJlc2NyaWJlZCBieSB0aGUgc3RhbmRhcmQuICBUaGUgc3RhdGljIGluaXRpYWxpemVyIG9iamVjdCAob24KKyAgLy8gaW1wbGVtZW50YXRpb25zIHdoZXJlIHN1Y2ggYSB0aGluZyBpcyByZXF1aXJlZCkgaXMgZGVjbGFyZWQgaW4KKyAgLy8gPGlvc3RyZWFtPgorCisgIGNsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIEluaXQKKyAgeworICAgIHB1YmxpYzoKKyAgICAgIEluaXQoKTsKKyAgICAgIH5Jbml0KCk7CisgICAgcHJpdmF0ZToKKyAgICAgIHN0YXRpYyBsb25nIF9TX2NvdW50OworICAgICAgZnJpZW5kIGNsYXNzIGlvc19iYXNlOworICB9OworCisgIGZyaWVuZCBjbGFzcyBJbml0OworCitwdWJsaWM6CisjIGlmbmRlZiBfU1RMUF9OT19BTkFDSFJPTklTTVMKKyAgLy8gIDMxLjYgIE9sZCBpb3N0cmVhbXMgbWVtYmVycyAgICAgICAgICAgICAgICAgICAgICAgICBbZGVwci5pb3MubWVtYmVyc10KKyAgdHlwZWRlZiBpb3N0YXRlICBpb19zdGF0ZTsKKyAgdHlwZWRlZiBvcGVubW9kZSBvcGVuX21vZGU7CisgIHR5cGVkZWYgc2Vla2RpciAgc2Vla19kaXI7CisgIHR5cGVkZWYgX1NUTFBfU1REOjpzdHJlYW1vZmYgIHN0cmVhbW9mZjsKKyAgdHlwZWRlZiBfU1RMUF9TVEQ6OnN0cmVhbXBvcyAgc3RyZWFtcG9zOworIyBlbmRpZgorfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gaW9zX2Jhc2UgbWFuaXB1bGF0b3IgZnVuY3Rpb25zLCBmcm9tIHNlY3Rpb24gMjcuNC41IG9mIHRoZSBDKysgc3RhbmRhcmQuCisvLyBBbGwgb2YgdGhlbSBhcmUgdHJpdmlhbCBvbmUtbGluZSB3cmFwcGVyIGZ1bmN0aW9ucy4KKworLy8gZm10ZmxhZyBtYW5pcHVsYXRvcnMsIHNlY3Rpb24gMjcuNC41LjEKK2lubGluZSBpb3NfYmFzZSYgX1NUTFBfQ0FMTCBib29sYWxwaGEoaW9zX2Jhc2UmIF9fcykKKyAgeyBfX3Muc2V0Zihpb3NfYmFzZTo6Ym9vbGFscGhhKTsgcmV0dXJuIF9fczt9CisKK2lubGluZSBpb3NfYmFzZSYgX1NUTFBfQ0FMTCBub2Jvb2xhbHBoYShpb3NfYmFzZSYgX19zKQorICB7IF9fcy51bnNldGYoaW9zX2Jhc2U6OmJvb2xhbHBoYSk7IHJldHVybiBfX3M7fQorCitpbmxpbmUgaW9zX2Jhc2UmIF9TVExQX0NBTEwgc2hvd2Jhc2UoaW9zX2Jhc2UmIF9fcykKKyAgeyBfX3Muc2V0Zihpb3NfYmFzZTo6c2hvd2Jhc2UpOyByZXR1cm4gX19zO30KKworaW5saW5lIGlvc19iYXNlJiBfU1RMUF9DQUxMIG5vc2hvd2Jhc2UoaW9zX2Jhc2UmIF9fcykKKyAgeyBfX3MudW5zZXRmKGlvc19iYXNlOjpzaG93YmFzZSk7IHJldHVybiBfX3M7fQorCitpbmxpbmUgaW9zX2Jhc2UmIF9TVExQX0NBTEwgc2hvd3BvaW50KGlvc19iYXNlJiBfX3MpCisgIHsgX19zLnNldGYoaW9zX2Jhc2U6OnNob3dwb2ludCk7IHJldHVybiBfX3M7fQorCitpbmxpbmUgaW9zX2Jhc2UmIF9TVExQX0NBTEwgbm9zaG93cG9pbnQoaW9zX2Jhc2UmIF9fcykKKyAgeyBfX3MudW5zZXRmKGlvc19iYXNlOjpzaG93cG9pbnQpOyByZXR1cm4gX19zO30KKworaW5saW5lIGlvc19iYXNlJiBfU1RMUF9DQUxMIHNob3dwb3MoaW9zX2Jhc2UmIF9fcykKKyAgeyBfX3Muc2V0Zihpb3NfYmFzZTo6c2hvd3Bvcyk7IHJldHVybiBfX3M7fQorCitpbmxpbmUgaW9zX2Jhc2UmIF9TVExQX0NBTEwgbm9zaG93cG9zKGlvc19iYXNlJiBfX3MpCisgIHsgX19zLnVuc2V0Zihpb3NfYmFzZTo6c2hvd3Bvcyk7IHJldHVybiBfX3M7fQorCitpbmxpbmUgaW9zX2Jhc2UmIF9TVExQX0NBTEwgc2tpcHdzKGlvc19iYXNlJiBfX3MpCisgIHsgX19zLnNldGYoaW9zX2Jhc2U6OnNraXB3cyk7IHJldHVybiBfX3M7fQorCitpbmxpbmUgaW9zX2Jhc2UmIF9TVExQX0NBTEwgbm9za2lwd3MoaW9zX2Jhc2UmIF9fcykKKyAgeyBfX3MudW5zZXRmKGlvc19iYXNlOjpza2lwd3MpOyByZXR1cm4gX19zO30KKworaW5saW5lIGlvc19iYXNlJiBfU1RMUF9DQUxMIHVwcGVyY2FzZShpb3NfYmFzZSYgX19zKQorICB7IF9fcy5zZXRmKGlvc19iYXNlOjp1cHBlcmNhc2UpOyByZXR1cm4gX19zO30KKworaW5saW5lIGlvc19iYXNlJiBfU1RMUF9DQUxMIG5vdXBwZXJjYXNlKGlvc19iYXNlJiBfX3MpCisgIHsgX19zLnVuc2V0Zihpb3NfYmFzZTo6dXBwZXJjYXNlKTsgcmV0dXJuIF9fczt9CisKK2lubGluZSBpb3NfYmFzZSYgX1NUTFBfQ0FMTCB1bml0YnVmKGlvc19iYXNlJiBfX3MpCisgIHsgX19zLnNldGYoaW9zX2Jhc2U6OnVuaXRidWYpOyByZXR1cm4gX19zO30KKworaW5saW5lIGlvc19iYXNlJiBfU1RMUF9DQUxMIG5vdW5pdGJ1Zihpb3NfYmFzZSYgX19zKQorICB7IF9fcy51bnNldGYoaW9zX2Jhc2U6OnVuaXRidWYpOyByZXR1cm4gX19zO30KKworCisvLyBhZGp1c3RmaWVsZCBtYW5pcHVsYXRvcnMsIHNlY3Rpb24gMjcuNC41LjIKK2lubGluZSBpb3NfYmFzZSYgX1NUTFBfQ0FMTCBpbnRlcm5hbChpb3NfYmFzZSYgX19zKQorICB7IF9fcy5zZXRmKGlvc19iYXNlOjppbnRlcm5hbCwgaW9zX2Jhc2U6OmFkanVzdGZpZWxkKTsgcmV0dXJuIF9fczsgfQorCitpbmxpbmUgaW9zX2Jhc2UmIF9TVExQX0NBTEwgbGVmdChpb3NfYmFzZSYgX19zKQorICB7IF9fcy5zZXRmKGlvc19iYXNlOjpsZWZ0LCBpb3NfYmFzZTo6YWRqdXN0ZmllbGQpOyByZXR1cm4gX19zOyB9CisKK2lubGluZSBpb3NfYmFzZSYgX1NUTFBfQ0FMTCByaWdodChpb3NfYmFzZSYgX19zKQorICB7IF9fcy5zZXRmKGlvc19iYXNlOjpyaWdodCwgaW9zX2Jhc2U6OmFkanVzdGZpZWxkKTsgcmV0dXJuIF9fczsgfQorCisvLyBiYXNlZmllbGQgbWFuaXB1bGF0b3JzLCBzZWN0aW9uIDI3LjQuNS4zCitpbmxpbmUgaW9zX2Jhc2UmIF9TVExQX0NBTEwgZGVjKGlvc19iYXNlJiBfX3MpCisgIHsgX19zLnNldGYoaW9zX2Jhc2U6OmRlYywgaW9zX2Jhc2U6OmJhc2VmaWVsZCk7IHJldHVybiBfX3M7IH0KKworaW5saW5lIGlvc19iYXNlJiBfU1RMUF9DQUxMIGhleChpb3NfYmFzZSYgX19zKQorICB7IF9fcy5zZXRmKGlvc19iYXNlOjpoZXgsIGlvc19iYXNlOjpiYXNlZmllbGQpOyByZXR1cm4gX19zOyB9CisKK2lubGluZSBpb3NfYmFzZSYgX1NUTFBfQ0FMTCBvY3QoaW9zX2Jhc2UmIF9fcykKKyAgeyBfX3Muc2V0Zihpb3NfYmFzZTo6b2N0LCBpb3NfYmFzZTo6YmFzZWZpZWxkKTsgcmV0dXJuIF9fczsgfQorCisKKy8vIGZsb2F0ZmllbGQgbWFuaXB1bGF0b3JzLCBzZWN0aW9uIDI3LjQuNS4zCitpbmxpbmUgaW9zX2Jhc2UmIF9TVExQX0NBTEwgZml4ZWQoaW9zX2Jhc2UmIF9fcykKKyAgeyBfX3Muc2V0Zihpb3NfYmFzZTo6Zml4ZWQsIGlvc19iYXNlOjpmbG9hdGZpZWxkKTsgcmV0dXJuIF9fczsgfQorCitpbmxpbmUgaW9zX2Jhc2UmIF9TVExQX0NBTEwgc2NpZW50aWZpYyhpb3NfYmFzZSYgX19zKQorICB7IF9fcy5zZXRmKGlvc19iYXNlOjpzY2llbnRpZmljLCBpb3NfYmFzZTo6ZmxvYXRmaWVsZCk7IHJldHVybiBfX3M7IH0KKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYgLyogX1NUTFBfSU9TX0JBU0UgKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKKwpkaWZmIC0tZ2l0IGEvc3RsL19pb3NlcnIuaCBiL3N0bC9faW9zZXJyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNiYTg3NwotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9faW9zZXJyLmgKQEAgLTAsMCArMSwxMiBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBpbmNsdWRlZCBpbiBldmVyeSBoZWFkZXIgdGhhdCBuZWVkcyB0aGUgU1RMcG9ydCBsaWJyYXJ5IHRvIGJlCisgKiBidWlsdDsgdGhlIGhlYWRlciBmaWxlcyBtb3N0bHkgYXJlIHRoZSBpb3N0cmVhbXMtaGVhZGVycy4gVGhlIGZpbGUgY2hlY2tzIGZvcgorICogX1NUTFBfVVNFX05PX0lPU1RSRUFNUyBvciBfU1RMUF9OT19JT1NUUkVBTVMgYmVpbmcgbm90IGRlZmluZWQsIHNvIHRoYXQgdGhlCisgKiBpb3N0cmVhbXMgcGFydCBvZiBTVExwb3J0IGNhbm5vdCBiZSB1c2VkIHdoZW4gdGhlIHN5bWJvbHMgd2VyZSBkZWZpbmVkCisgKiBhY2NpZGVudGFsbHkuCisgKi8KKyNpZiBkZWZpbmVkIChfU1RMUF9OT19JT1NUUkVBTVMpCisjICBlcnJvciBTVExwb3J0IGlvc3RyZWFtcyBoZWFkZXIgY2Fubm90IGJlIHVzZWQ7IHlvdSBjaG9zZSBub3QgdG8gdXNlIGlvc3RyZWFtcyBpbiB0aGUgU1RMcG9ydCBjb25maWd1cmF0aW9uIGZpbGUgKHN0bHBvcnQvc3RsL2NvbmZpZy91c2VyX2NvbmZpZy5oKS4KKyNlbGlmIGRlZmluZWQgKF9TVExQX1VTRV9OT19JT1NUUkVBTVMgKQorIyAgZXJyb3IgU1RMcG9ydCBpb3N0cmVhbXMgaGVhZGVyIGNhbm5vdCBiZSB1c2VkOyB5b3VyIGNvbXBpbGVyIGRvIG5vdCBzdXBwb3J0IGl0LgorI2VuZGlmCmRpZmYgLS1naXQgYS9zdGwvX2lvc2Z3ZC5oIGIvc3RsL19pb3Nmd2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGM2NDMwCi0tLSAvZGV2L251bGwKKysrIGIvc3RsL19pb3Nmd2QuaApAQCAtMCwwICsxLDE1OSBAQAorI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9JT1NGV0QKKyNkZWZpbmUgX1NUTFBfSU5URVJOQUxfSU9TRldECisKKyNpZiBkZWZpbmVkIChfX3NnaSkgJiYgIWRlZmluZWQgKF9fR05VQ19fKSAmJiAhZGVmaW5lZCAoX1NUQU5EQVJEX0NfUExVU19QTFVTKQorIyAgZXJyb3IgVGhpcyBoZWFkZXIgZmlsZSByZXF1aXJlcyB0aGUgLUxBTkc6c3RkIG9wdGlvbgorI2VuZGlmCisKKy8vIFRoaXMgZmlsZSBwcm92aWRlcyBmb3J3YXJkIGRlY2xhcmF0aW9ucyBvZiB0aGUgbW9zdCBpbXBvcnRhbnQgSS9PCisvLyBjbGFzc2VzLiAgTm90ZSB0aGF0IGFsbW9zdCBhbGwgb2YgdGhvc2UgY2xhc3NlcyBhcmUgY2xhc3MgdGVtcGxhdGVzLAorLy8gd2l0aCBkZWZhdWx0IHRlbXBsYXRlIGFyZ3VtZW50cy4gIEFjY29yZGluZyB0byB0aGUgQysrIHN0YW5kYXJkLAorLy8gaWYgYSBjbGFzcyB0ZW1wbGF0ZSBpcyBkZWNsYXJlZCBtb3JlIHRoYW4gb25jZSBpbiB0aGUgc2FtZSBzY29wZQorLy8gdGhlbiBvbmx5IG9uZSBvZiB0aG9zZSBkZWNsYXJhdGlvbnMgbWF5IGhhdmUgZGVmYXVsdCBhcmd1bWVudHMuCisKKy8vIDxpb3Nmd2Q+IGNvbnRhaW5zIHRoZSBzYW1lIGRlY2xhcmF0aW9ucyBhcyBvdGhlciBoZWFkZXJzLCBhbmQgaW5jbHVkaW5nCisvLyBib3RoIDxpb3Nmd2Q+IGFuZCAoc2F5KSA8aW9zdHJlYW0+IGlzIHBlcm1pdHRlZC4gIFRoaXMgbWVhbnMgdGhhdCBvbmx5CisvLyBvbmUgaGVhZGVyIG1heSBjb250YWluIHRob3NlIGRlZmF1bHQgdGVtcGxhdGUgYXJndW1lbnRzLgorCisvLyBJbiB0aGlzIGltcGxlbWVudGF0aW9uLCB0aGUgZGVjbGFyYXRpb25zIGluIDxpb3Nmd2Q+IGNvbnRhaW4gZGVmYXVsdAorLy8gdGVtcGxhdGUgYXJndW1lbnRzLiAgQWxsIG9mIHRoZSBvdGhlciBJL08gaGVhZGVycyBpbmNsdWRlIDxpb3Nmd2Q+LgorCisjaWZuZGVmIF9TVExQX0NIQVJfVFJBSVRTX0gKKyMgIGluY2x1ZGUgPHN0bC9jaGFyX3RyYWl0cy5oPgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCitjbGFzcyBpb3NfYmFzZTsKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgX1NUTFBfREZMX1RNUExfUEFSQU0oX1RyYWl0cyAsIGNoYXJfdHJhaXRzPF9DaGFyVD4pID4KK2NsYXNzIGJhc2ljX2lvczsKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgX1NUTFBfREZMX1RNUExfUEFSQU0oX1RyYWl0cyAsIGNoYXJfdHJhaXRzPF9DaGFyVD4pID4KK2NsYXNzIGJhc2ljX3N0cmVhbWJ1ZjsKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgX1NUTFBfREZMX1RNUExfUEFSQU0oX1RyYWl0cyAsIGNoYXJfdHJhaXRzPF9DaGFyVD4pID4KK2NsYXNzIGJhc2ljX2lzdHJlYW07CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIF9TVExQX0RGTF9UTVBMX1BBUkFNKF9UcmFpdHMgLCBjaGFyX3RyYWl0czxfQ2hhclQ+KSA+CitjbGFzcyBiYXNpY19vc3RyZWFtOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBfU1RMUF9ERkxfVE1QTF9QQVJBTShfVHJhaXRzICwgY2hhcl90cmFpdHM8X0NoYXJUPikgPgorY2xhc3MgYmFzaWNfaW9zdHJlYW07CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIF9TVExQX0RGTF9UTVBMX1BBUkFNKCBfVHJhaXRzICwgY2hhcl90cmFpdHM8X0NoYXJUPiksCisgICAgICAgICAgX1NUTFBfREZMX1RNUExfUEFSQU0oX0FsbG9jYXRvciAsIGFsbG9jYXRvcjxfQ2hhclQ+KSA+CitjbGFzcyBiYXNpY19zdHJpbmdidWY7CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIF9TVExQX0RGTF9UTVBMX1BBUkFNKF9UcmFpdHMgLCBjaGFyX3RyYWl0czxfQ2hhclQ+KSwKKyAgICAgICAgICBfU1RMUF9ERkxfVE1QTF9QQVJBTShfQWxsb2NhdG9yICwgYWxsb2NhdG9yPF9DaGFyVD4pID4KK2NsYXNzIGJhc2ljX2lzdHJpbmdzdHJlYW07CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIF9TVExQX0RGTF9UTVBMX1BBUkFNKF9UcmFpdHMgLCBjaGFyX3RyYWl0czxfQ2hhclQ+KSwKKyAgICAgICAgICBfU1RMUF9ERkxfVE1QTF9QQVJBTShfQWxsb2NhdG9yICwgYWxsb2NhdG9yPF9DaGFyVD4pID4KK2NsYXNzIGJhc2ljX29zdHJpbmdzdHJlYW07CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIF9TVExQX0RGTF9UTVBMX1BBUkFNKF9UcmFpdHMgLCBjaGFyX3RyYWl0czxfQ2hhclQ+KSwKKyAgICAgICAgICBfU1RMUF9ERkxfVE1QTF9QQVJBTShfQWxsb2NhdG9yICwgYWxsb2NhdG9yPF9DaGFyVD4pID4KK2NsYXNzIGJhc2ljX3N0cmluZ3N0cmVhbTsKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgX1NUTFBfREZMX1RNUExfUEFSQU0oX1RyYWl0cyAsIGNoYXJfdHJhaXRzPF9DaGFyVD4pID4KK2NsYXNzIGJhc2ljX2ZpbGVidWY7CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIF9TVExQX0RGTF9UTVBMX1BBUkFNKF9UcmFpdHMgLCBjaGFyX3RyYWl0czxfQ2hhclQ+KSA+CitjbGFzcyBiYXNpY19pZnN0cmVhbTsKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgX1NUTFBfREZMX1RNUExfUEFSQU0oX1RyYWl0cyAsIGNoYXJfdHJhaXRzPF9DaGFyVD4pID4KK2NsYXNzIGJhc2ljX29mc3RyZWFtOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBfU1RMUF9ERkxfVE1QTF9QQVJBTShfVHJhaXRzICwgY2hhcl90cmFpdHM8X0NoYXJUPikgPgorY2xhc3MgYmFzaWNfZnN0cmVhbTsKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgX1NUTFBfREZMX1RNUExfUEFSQU0oX1RyYWl0cyAsIGNoYXJfdHJhaXRzPF9DaGFyVD4pID4KK2NsYXNzIGlzdHJlYW1idWZfaXRlcmF0b3I7CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIF9TVExQX0RGTF9UTVBMX1BBUkFNKF9UcmFpdHMgLCBjaGFyX3RyYWl0czxfQ2hhclQ+KSA+CitjbGFzcyBvc3RyZWFtYnVmX2l0ZXJhdG9yOworCit0eXBlZGVmIGJhc2ljX2lvczxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+ICAgIGlvczsKKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQordHlwZWRlZiBiYXNpY19pb3M8d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPiB3aW9zOworI2VuZGlmCisKKy8vIEZvcndhcmQgZGVjbGFyYXRpb24gb2YgY2xhc3MgbG9jYWxlLCBhbmQgb2YgdGhlIG1vc3QgaW1wb3J0YW50IGZhY2V0cy4KK2NsYXNzIGxvY2FsZTsKKyNpZiBkZWZpbmVkIChfU1RMUF9OT19FWFBMSUNJVF9GVU5DVElPTl9UTVBMX0FSR1MpCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZhY2V0Pgorc3RydWN0IF9Vc2VfZmFjZXQgeworICBjb25zdCBsb2NhbGUmIF9fbG9jOworICBfVXNlX2ZhY2V0KGNvbnN0IGxvY2FsZSYgX19wX2xvYykgOiBfX2xvYyhfX3BfbG9jKSB7fQorICBpbmxpbmUgY29uc3QgX0ZhY2V0JiBvcGVyYXRvciAqKCkgY29uc3Q7Cit9OworIyAgZGVmaW5lIHVzZV9mYWNldCAqX1VzZV9mYWNldAorI2Vsc2UKK3RlbXBsYXRlIDxjbGFzcyBfRmFjZXQ+IGlubGluZSBjb25zdCBfRmFjZXQmIHVzZV9mYWNldChjb25zdCBsb2NhbGUmKTsKKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPiBjbGFzcyBjdHlwZTsKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+IGNsYXNzIGN0eXBlX2J5bmFtZTsKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+IGNsYXNzIGNvbGxhdGU7Cit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPiBjbGFzcyBjb2xsYXRlX2J5bmFtZTsKKworX1NUTFBfVEVNUExBVEVfTlVMTCBjbGFzcyBjdHlwZTxjaGFyPjsKK19TVExQX1RFTVBMQVRFX05VTEwgY2xhc3MgY3R5cGVfYnluYW1lPGNoYXI+OworX1NUTFBfVEVNUExBVEVfTlVMTCBjbGFzcyBjb2xsYXRlPGNoYXI+OworX1NUTFBfVEVNUExBVEVfTlVMTCBjbGFzcyBjb2xsYXRlX2J5bmFtZTxjaGFyPjsKKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQorX1NUTFBfVEVNUExBVEVfTlVMTCBjbGFzcyBjdHlwZTx3Y2hhcl90PjsKK19TVExQX1RFTVBMQVRFX05VTEwgY2xhc3MgY3R5cGVfYnluYW1lPHdjaGFyX3Q+OworX1NUTFBfVEVNUExBVEVfTlVMTCBjbGFzcyBjb2xsYXRlPHdjaGFyX3Q+OworX1NUTFBfVEVNUExBVEVfTlVMTCBjbGFzcyBjb2xsYXRlX2J5bmFtZTx3Y2hhcl90PjsKKyNlbmRpZgorCisjaWYgIShkZWZpbmVkIChfX1NVTlBST19DQykgJiYgX19TVU5QUk9fQ0MgPCAweDUwMCApCisvLyBUeXBlZGVmcyBmb3Igb3JkaW5hcnkgKG5hcnJvdy1jaGFyYWN0ZXIpIHN0cmVhbXMuCisvL19TVExQX1RFTVBMQVRFX05VTEwgY2xhc3MgYmFzaWNfc3RyZWFtYnVmPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID47CisjZW5kaWYKKwordHlwZWRlZiBiYXNpY19pc3RyZWFtPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4gIGlzdHJlYW07Cit0eXBlZGVmIGJhc2ljX29zdHJlYW08Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiAgb3N0cmVhbTsKK3R5cGVkZWYgYmFzaWNfaW9zdHJlYW08Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiBpb3N0cmVhbTsKK3R5cGVkZWYgYmFzaWNfc3RyZWFtYnVmPGNoYXIsY2hhcl90cmFpdHM8Y2hhcj4gPiBzdHJlYW1idWY7CisKK3R5cGVkZWYgYmFzaWNfc3RyaW5nYnVmPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+LCBhbGxvY2F0b3I8Y2hhcj4gPiAgICAgc3RyaW5nYnVmOwordHlwZWRlZiBiYXNpY19pc3RyaW5nc3RyZWFtPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+LCBhbGxvY2F0b3I8Y2hhcj4gPiBpc3RyaW5nc3RyZWFtOwordHlwZWRlZiBiYXNpY19vc3RyaW5nc3RyZWFtPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+LCBhbGxvY2F0b3I8Y2hhcj4gPiBvc3RyaW5nc3RyZWFtOwordHlwZWRlZiBiYXNpY19zdHJpbmdzdHJlYW08Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4sIGFsbG9jYXRvcjxjaGFyPiA+ICBzdHJpbmdzdHJlYW07CisKK3R5cGVkZWYgYmFzaWNfZmlsZWJ1ZjxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+ICBmaWxlYnVmOwordHlwZWRlZiBiYXNpY19pZnN0cmVhbTxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+IGlmc3RyZWFtOwordHlwZWRlZiBiYXNpY19vZnN0cmVhbTxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+IG9mc3RyZWFtOwordHlwZWRlZiBiYXNpY19mc3RyZWFtPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4gIGZzdHJlYW07CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkKKy8vIFR5cGVkZWZzIGZvciB3aWRlLWNoYXJhY3RlciBzdHJlYW1zLgordHlwZWRlZiBiYXNpY19zdHJlYW1idWY8d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPiB3c3RyZWFtYnVmOwordHlwZWRlZiBiYXNpY19pc3RyZWFtPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4gICB3aXN0cmVhbTsKK3R5cGVkZWYgYmFzaWNfb3N0cmVhbTx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+ICAgd29zdHJlYW07Cit0eXBlZGVmIGJhc2ljX2lvc3RyZWFtPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4gIHdpb3N0cmVhbTsKKwordHlwZWRlZiBiYXNpY19zdHJpbmdidWY8d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4sIGFsbG9jYXRvcjx3Y2hhcl90PiA+ICAgICB3c3RyaW5nYnVmOwordHlwZWRlZiBiYXNpY19pc3RyaW5nc3RyZWFtPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+LCBhbGxvY2F0b3I8d2NoYXJfdD4gPiB3aXN0cmluZ3N0cmVhbTsKK3R5cGVkZWYgYmFzaWNfb3N0cmluZ3N0cmVhbTx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiwgYWxsb2NhdG9yPHdjaGFyX3Q+ID4gd29zdHJpbmdzdHJlYW07Cit0eXBlZGVmIGJhc2ljX3N0cmluZ3N0cmVhbTx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiwgYWxsb2NhdG9yPHdjaGFyX3Q+ID4gIHdzdHJpbmdzdHJlYW07CisKK3R5cGVkZWYgYmFzaWNfZmlsZWJ1Zjx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+ICB3ZmlsZWJ1ZjsKK3R5cGVkZWYgYmFzaWNfaWZzdHJlYW08d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPiB3aWZzdHJlYW07Cit0eXBlZGVmIGJhc2ljX29mc3RyZWFtPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4gd29mc3RyZWFtOwordHlwZWRlZiBiYXNpY19mc3RyZWFtPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4gIHdmc3RyZWFtOworI2VuZGlmCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2VuZGlmCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvX2lvc3RyZWFtX3N0cmluZy5oIGIvc3RsL19pb3N0cmVhbV9zdHJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzY1NmE0Ci0tLSAvZGV2L251bGwKKysrIGIvc3RsL19pb3N0cmVhbV9zdHJpbmcuaApAQCAtMCwwICsxLDE0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNAorICogRnJhbmNvaXMgRHVtb250CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyAvKgorICAqIFRoaXMgaXMgYW4gaW50ZXJuYWwgc3RyaW5nIGZvciB0aGUgU1RMcG9ydCBvd24gaW9zdHJlYW0gaW1wbGVtZW50YXRpb24uCisgICogVGhlIG9ubHkgZGlmZXJlbmNlIHJlbHkgb24gdGhlIGFsbG9jYXRvciB1c2VkIHRvIGluc3RhbmNpYXRlIHRoZSBiYXNpY19zdHJpbmcuCisgICogSXRzIGdvYWxzIGlzIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UgbGltaXRhdGluZyB0aGUgbnVtYmVyIG9mIGR5bmFtaWMgYWxsb2NhdGlvbgorICAqIHRoYXQgY291bGQgb2NjdXIgd2hlbiByZXF1ZXN0aW5nIGEgYmlnIGZsb2F0IG91cHV0IGZvciBpbnN0YW5jZS4gVGhpcyBhbGxvY2F0b3IKKyAgKiBpcyBub3Qgc3RhbmRhcmQgY29uZm9ybWFudCBhcyBpdCBoYXMgYW4gaW50ZXJuYWwgc3RhdGUgKHRoZSBzdGF0aWMgYnVmZmVyKQorICAqLworCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfSU9TVFJFQU1fU1RSSU5HX0gKKyNkZWZpbmUgX1NUTFBfSU5URVJOQUxfSU9TVFJFQU1fU1RSSU5HX0gKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9BTExPQ19ICisjICBpbmNsdWRlIDxzdGwvX2FsbG9jLmg+CisjZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfQUxMT0NfSCAqLworCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX1NUUklOR19ICisjICBpbmNsdWRlIDxzdGwvX3N0cmluZy5oPgorI2VuZGlmIC8qIF9TVExQX0lOVEVSTkFMX1NUUklOR19IICovCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+CitjbGFzcyBfX2lvc3RyaW5nX2FsbG9jYXRvciA6IHB1YmxpYyBhbGxvY2F0b3I8X0NoYXJUPiB7CitwdWJsaWM6CisgIGVudW0geyBfU1RSX1NJWkUgPSAyNTYgfTsKKworcHJpdmF0ZToKKyAgZW51bSB7IF9CVUZfU0laRSA9IF9TVFJfU0laRSArIDEgfTsKKyAgdHlwZWRlZiBhbGxvY2F0b3I8X0NoYXJUPiBfQmFzZTsKKyAgX0NoYXJUIF9NX3N0YXRpY19idWZbX0JVRl9TSVpFXTsKKworcHVibGljOgorICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpzaXplX3R5cGUgc2l6ZV90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpwb2ludGVyIHBvaW50ZXI7CisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFX0NMQVNTRVMpCisgIHRlbXBsYXRlIDxjbGFzcyBfVHAxPiBzdHJ1Y3QgcmViaW5kIHsKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9NU1ZDKSB8fCAoX1NUTFBfTVNWQyA+PSAxMzAwKQorICAgIHR5cGVkZWYgX19pb3N0cmluZ19hbGxvY2F0b3I8X1RwMT4gb3RoZXI7CisjICBlbHNlCisgICAgdHlwZWRlZiBfU1RMUF9QUklWIF9faW9zdHJpbmdfYWxsb2NhdG9yPF9UcDE+IG90aGVyOworIyAgZW5kaWYKKyAgfTsKKyNlbmRpZgorCisgIF9DaGFyVCogYWxsb2NhdGUoc2l6ZV90eXBlIF9fbiwgY29uc3Qgdm9pZCogX19wdHIgPSAwKSB7CisgICAgaWYgKF9fbiA+IF9CVUZfU0laRSkgeworICAgICAgcmV0dXJuIF9CYXNlOjphbGxvY2F0ZShfX24sIF9fcHRyKTsKKyAgICB9CisgICAgcmV0dXJuIF9NX3N0YXRpY19idWY7CisgIH0KKyAgdm9pZCBkZWFsbG9jYXRlKHBvaW50ZXIgX19wLCBzaXplX3R5cGUgX19uKSB7CisgICAgaWYgKF9fcCAhPSBfTV9zdGF0aWNfYnVmKSBfQmFzZTo6ZGVhbGxvY2F0ZShfX3AsIF9fbik7CisgIH0KK307CisKKyNpZiBkZWZpbmVkIChfU1RMUF9ET05UX1NVUFBPUlRfUkVCSU5EX01FTUJFUl9URU1QTEFURSkgfHwgIWRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisvKgorICogQXMgdGhlIF9faW9zdHJpbmdfYWxsb2NhdG9yIGFsbG9jYXRvciB3aWxsIG9ubHkgYmUgdXNlZCBpbiB0aGUgYmFzaWNfc3RyaW5nIGltcGxlbWVudGF0aW9uCisgKiB3ZSBrbm93biB0aGF0IGl0IGlzIG5ldmVyIGdvaW5nIHRvIGJlIGJvdW5kIHRvIGFub3RoZXIgdHlwZSB0aGF0IHRoZSBvbmUgdXNlZCB0byBpbnN0YW50aWF0ZQorICogdGhlIGJhc2ljX3N0cmluZy4gVGhpcyBpcyB3aHkgdGhlIGFzc29jaWF0ZWQgX19zdGxfYWxsb2NfcmViaW5kIGhhcyBvbmx5IG9uZSB0ZW1wbGF0ZQorICogcGFyYW1ldGVyLgorICovCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfU1RMUF9QUklWIF9faW9zdHJpbmdfYWxsb2NhdG9yPF9UcD4mIF9TVExQX0NBTEwKK19fc3RsX2FsbG9jX3JlYmluZChfU1RMUF9QUklWIF9faW9zdHJpbmdfYWxsb2NhdG9yPF9UcD4mIF9fYSwgY29uc3QgX1RwKikKK3sgcmV0dXJuIF9fYTsgfQordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfU1RMUF9QUklWIF9faW9zdHJpbmdfYWxsb2NhdG9yPF9UcD4gX1NUTFBfQ0FMTAorX19zdGxfYWxsb2NfY3JlYXRlKGNvbnN0IF9TVExQX1BSSVYgX19pb3N0cmluZ19hbGxvY2F0b3I8X1RwPiYsIGNvbnN0IF9UcCopCit7IHJldHVybiBfU1RMUF9QUklWIF9faW9zdHJpbmdfYWxsb2NhdG9yPF9UcD4oKTsgfQorCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisjZW5kaWYgLyogX1NUTFBfRE9OVF9TVVBQT1JUX1JFQklORF9NRU1CRVJfVEVNUExBVEUgKi8KKworI2lmICFkZWZpbmVkIChfU1RMUF9ERUJVRykKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+CitzdHJ1Y3QgX19iYXNpY19pb3N0cmluZyA6IHB1YmxpYyBiYXNpY19zdHJpbmc8X0NoYXJULCBjaGFyX3RyYWl0czxfQ2hhclQ+LCBfX2lvc3RyaW5nX2FsbG9jYXRvcjxfQ2hhclQ+ID4geworICAvKgorICAgKiBBIGNvbnNlcXVlbmNlIG9mIHRoZSBub24gc3RhbmRhcmQgY29uZm9ybWFudCBhbGxvY2F0b3IgaXMgdGhhdCBhIHN0cmluZyB1c2luZyBpdAorICAgKiBtdXN0IGFsd2F5cyBiZSBwcmVzaXplZCB0byB0aGUgYWxsb2NhdG9yIHN0YXRpYyBidWZmZXIgc2l6ZSBiZWNhdXNlIHRoZSBiYXNpY19zdHJpbmcgaW1wbGVtZW50YXRpb24KKyAgICogZG8gbm90IG1hbmFnZSBhbiBhbGxvY2F0b3IgcmV0dXJuaW5nIGFsd2F5cyB0aGUgc2FtZSBtZW1vcnkgYWRyZXNzIGFzIGxvbmcgYXMgdGhlCisgICAqIHJlcXVlc3RlZCBtZW1vcnkgYmxvY2sgc2l6ZSBpcyB1bmRlciBhIGNlcnRhaW4gdmFsdWUuCisgICAqLworICB0eXBlZGVmIF9fYmFzaWNfaW9zdHJpbmc8X0NoYXJUPiBfU2VsZjsKKyAgdHlwZWRlZiBiYXNpY19zdHJpbmc8X0NoYXJULCBjaGFyX3RyYWl0czxfQ2hhclQ+LCBfX2lvc3RyaW5nX2FsbG9jYXRvcjxfQ2hhclQ+ID4gX0Jhc2U7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Ol9SZXNlcnZlX3QgX1Jlc2VydmVfdDsKKworICBfX2Jhc2ljX2lvc3RyaW5nKCkgOiBfQmFzZShfUmVzZXJ2ZV90KCksIF9faW9zdHJpbmdfYWxsb2NhdG9yPF9DaGFyVD46Ol9TVFJfU0laRSkKKyAge30KKworICBfU2VsZiYgb3BlcmF0b3I9KGNvbnN0IF9DaGFyVCogX19zKSB7CisgICAgX0Jhc2U6Om9wZXJhdG9yPShfX3MpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorfTsKKwordHlwZWRlZiBfX2Jhc2ljX2lvc3RyaW5nPGNoYXI+IF9faW9zdHJpbmc7CisKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQordHlwZWRlZiBfX2Jhc2ljX2lvc3RyaW5nPHdjaGFyX3Q+IF9faW93c3RyaW5nOworIyAgZW5kaWYKKworIyAgZGVmaW5lIF9TVExQX0JBU0lDX0lPU1RSSU5HKF9DaGFyVCkgX1NUTFBfUFJJViBfX2Jhc2ljX2lvc3RyaW5nPF9DaGFyVD4KKworI2Vsc2UKKwordHlwZWRlZiBzdHJpbmcgX19pb3N0cmluZzsKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQordHlwZWRlZiB3c3RyaW5nIF9faW93c3RyaW5nOworIyAgZW5kaWYKKworIyAgZGVmaW5lIF9TVExQX0JBU0lDX0lPU1RSSU5HKF9DaGFyVCkgYmFzaWNfc3RyaW5nPF9DaGFyVCwgY2hhcl90cmFpdHM8X0NoYXJUPiwgYWxsb2NhdG9yPF9DaGFyVD4gPgorCisjZW5kaWYKKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2VuZGlmIC8qIF9TVExQX0lOVEVSTkFMX0lPU1RSRUFNX1NUUklOR19IICovCmRpZmYgLS1naXQgYS9zdGwvX2lzdHJlYW0uYyBiL3N0bC9faXN0cmVhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MmNhYjEKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvX2lzdHJlYW0uYwpAQCAtMCwwICsxLDE0MjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisjaWZuZGVmIF9TVExQX0lTVFJFQU1fQworI2RlZmluZSBfU1RMUF9JU1RSRUFNX0MKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9JU1RSRUFNCisjICBpbmNsdWRlIDxzdGwvX2lzdHJlYW0uaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0xJTUlUUworIyAgaW5jbHVkZSA8c3RsL19saW1pdHMuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX05VTV9HRVRfSAorIyAgaW5jbHVkZSA8c3RsL19udW1fZ2V0Lmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQgKCBfU1RMUF9ORVNURURfVFlQRV9QQVJBTV9CVUcgKQorLy8gbm8gd2NoYXJfdCBpcyBzdXBwb3J0ZWQgZm9yIHRoaXMgbW9kZQorIyAgZGVmaW5lIF9fQklTX2ludF90eXBlX18gaW50CisjICBkZWZpbmUgX19CSVNfcG9zX3R5cGVfXyBzdHJlYW1wb3MKKyMgIGRlZmluZSBfX0JJU19vZmZfdHlwZV9fIHN0cmVhbW9mZgorI2Vsc2UKKyMgIGRlZmluZSBfX0JJU19pbnRfdHlwZV9fIF9TVExQX1RZUEVOQU1FX09OX1JFVFVSTl9UWVBFIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6aW50X3R5cGUKKyMgIGRlZmluZSBfX0JJU19wb3NfdHlwZV9fIF9TVExQX1RZUEVOQU1FX09OX1JFVFVSTl9UWVBFIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6cG9zX3R5cGUKKyMgIGRlZmluZSBfX0JJU19vZmZfdHlwZV9fIF9TVExQX1RZUEVOQU1FX09OX1JFVFVSTl9UWVBFIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6b2ZmX3R5cGUKKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGdW5jdGlvbiBvYmplY3Qgc3RydWN0cyB1c2VkIGJ5IHNvbWUgbWVtYmVyIGZ1bmN0aW9ucy4KKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RyYWl0cz4KK3N0cnVjdCBfSXNfbm90X3dzcGFjZSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6Y2hhcl90eXBlIGFyZ3VtZW50X3R5cGU7CisgIHR5cGVkZWYgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdF90eXBlOworCisgIGNvbnN0IGN0eXBlPGFyZ3VtZW50X3R5cGU+KiBfTV9jdHlwZTsKKworICBfSXNfbm90X3dzcGFjZShjb25zdCBjdHlwZTxhcmd1bWVudF90eXBlPiogX19jX3R5cGUpIDogX01fY3R5cGUoX19jX3R5cGUpIHt9CisgIGJvb2wgb3BlcmF0b3IoKShhcmd1bWVudF90eXBlIF9fYykgY29uc3QKKyAgICB7IHJldHVybiAhX01fY3R5cGUtPmlzKGN0eXBlX2Jhc2U6OnNwYWNlLCBfX2MpOyB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RyYWl0cz4KK3N0cnVjdCBfSXNfd3NwYWNlX251bGwgeworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OmNoYXJfdHlwZSBhcmd1bWVudF90eXBlOworICB0eXBlZGVmIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfdHlwZTsKKworICBjb25zdCBjdHlwZTxhcmd1bWVudF90eXBlPiogX01fY3R5cGU7CisKKyAgX0lzX3dzcGFjZV9udWxsKGNvbnN0IGN0eXBlPGFyZ3VtZW50X3R5cGU+KiBfX2NfdHlwZSkgOiBfTV9jdHlwZShfX2NfdHlwZSkge30KKyAgYm9vbCBvcGVyYXRvcigpKGFyZ3VtZW50X3R5cGUgX19jKSBjb25zdCB7CisgICAgcmV0dXJuIF9UcmFpdHM6OmVxKF9fYywgYXJndW1lbnRfdHlwZSgpKSB8fAorICAgICAgICAgICBfTV9jdHlwZS0+aXMoY3R5cGVfYmFzZTo6c3BhY2UsIF9fYyk7CisgIH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHJhaXRzPgorc3RydWN0IF9TY2FuX2Zvcl93c3BhY2UgeworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OmNoYXJfdHlwZSAgY2hhcl90eXBlOworICB0eXBlZGVmIGNoYXJfdHlwZSogICAgICAgICAgICAgICAgICAgZmlyc3RfYXJndW1lbnRfdHlwZTsKKyAgdHlwZWRlZiBjaGFyX3R5cGUqICAgICAgICAgICAgICAgICAgIHNlY29uZF9hcmd1bWVudF90eXBlOworICB0eXBlZGVmIGNoYXJfdHlwZSogICAgICAgICAgICAgICAgICAgcmVzdWx0X3R5cGU7CisKKyAgY29uc3QgY3R5cGU8Y2hhcl90eXBlPiogX01fY3R5cGU7CisKKyAgX1NjYW5fZm9yX3dzcGFjZShjb25zdCBjdHlwZTxjaGFyX3R5cGU+KiBfX2N0eXBlKSA6IF9NX2N0eXBlKF9fY3R5cGUpIHt9CisgIGNvbnN0IGNoYXJfdHlwZSoKKyAgb3BlcmF0b3IoKShjb25zdCBjaGFyX3R5cGUqIF9fZmlyc3QsIGNvbnN0IGNoYXJfdHlwZSogX19sYXN0KSBjb25zdCB7CisgICAgcmV0dXJuIF9NX2N0eXBlLT5zY2FuX2lzKGN0eXBlX2Jhc2U6OnNwYWNlLCBfX2ZpcnN0LCBfX2xhc3QpOworICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RyYWl0cz4KK3N0cnVjdCBfU2Nhbl93c3BhY2VfbnVsbCB7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6Y2hhcl90eXBlICBjaGFyX3R5cGU7CisgIHR5cGVkZWYgY2hhcl90eXBlKiAgICAgICAgICAgICAgICAgICBmaXJzdF9hcmd1bWVudF90eXBlOworICB0eXBlZGVmIGNoYXJfdHlwZSogICAgICAgICAgICAgICAgICAgc2Vjb25kX2FyZ3VtZW50X3R5cGU7CisgIHR5cGVkZWYgY2hhcl90eXBlKiAgICAgICAgICAgICAgICAgICByZXN1bHRfdHlwZTsKKworICBjb25zdCBjdHlwZTxjaGFyX3R5cGU+KiBfTV9jdHlwZTsKKworICBfU2Nhbl93c3BhY2VfbnVsbChjb25zdCBjdHlwZTxjaGFyX3R5cGU+KiBfX2NfdHlwZSkgOiBfTV9jdHlwZShfX2NfdHlwZSkge30KKyAgY29uc3QgY2hhcl90eXBlKgorICBvcGVyYXRvcigpKGNvbnN0IGNoYXJfdHlwZSogX19maXJzdCwgY29uc3QgY2hhcl90eXBlKiBfX2xhc3QpIGNvbnN0IHsKKyAgICBfX2xhc3QgPSBmaW5kX2lmKF9fZmlyc3QsIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgIF9FcV9jaGFyX2JvdW5kPF9UcmFpdHM+KGNoYXJfdHlwZSgpKSk7CisgICAgcmV0dXJuIF9NX2N0eXBlLT5zY2FuX2lzKGN0eXBlX2Jhc2U6OnNwYWNlLCBfX2ZpcnN0LCBfX2xhc3QpOworICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RyYWl0cz4KK3N0cnVjdCBfU2Nhbl9mb3Jfbm90X3dzcGFjZSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6Y2hhcl90eXBlICBjaGFyX3R5cGU7CisgIHR5cGVkZWYgY2hhcl90eXBlKiAgICAgICAgICAgICAgICAgICBmaXJzdF9hcmd1bWVudF90eXBlOworICB0eXBlZGVmIGNoYXJfdHlwZSogICAgICAgICAgICAgICAgICAgc2Vjb25kX2FyZ3VtZW50X3R5cGU7CisgIHR5cGVkZWYgY2hhcl90eXBlKiAgICAgICAgICAgICAgICAgICByZXN1bHRfdHlwZTsKKworICBjb25zdCBjdHlwZTxjaGFyX3R5cGU+KiBfTV9jdHlwZTsKKworICBfU2Nhbl9mb3Jfbm90X3dzcGFjZShjb25zdCBjdHlwZTxjaGFyX3R5cGU+KiBfX2NfdHlwZSkgOiBfTV9jdHlwZShfX2NfdHlwZSkge30KKyAgY29uc3QgY2hhcl90eXBlKgorICBvcGVyYXRvcigpKGNvbnN0IGNoYXJfdHlwZSogX19maXJzdCwgY29uc3QgY2hhcl90eXBlKiBfX2xhc3QpIGNvbnN0IHsKKyAgICByZXR1cm4gX01fY3R5cGUtPnNjYW5fbm90KGN0eXBlX2Jhc2U6OnNwYWNlLCBfX2ZpcnN0LCBfX2xhc3QpOworICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RyYWl0cz4KK3N0cnVjdCBfU2Nhbl9mb3JfY2hhcl92YWwgeworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OmNoYXJfdHlwZSBjaGFyX3R5cGU7CisgIHR5cGVkZWYgY2hhcl90eXBlKiAgICAgICAgICAgICAgICAgIGZpcnN0X2FyZ3VtZW50X3R5cGU7CisgIHR5cGVkZWYgY2hhcl90eXBlKiAgICAgICAgICAgICAgICAgIHNlY29uZF9hcmd1bWVudF90eXBlOworICB0eXBlZGVmIGNoYXJfdHlwZSogICAgICAgICAgICAgICAgICByZXN1bHRfdHlwZTsKKworICBjaGFyX3R5cGUgX01fdmFsOworCisgIF9TY2FuX2Zvcl9jaGFyX3ZhbChjaGFyX3R5cGUgX192YWwpIDogX01fdmFsKF9fdmFsKSB7fQorCisgIGNvbnN0IGNoYXJfdHlwZSoKKyAgb3BlcmF0b3IoKShjb25zdCBjaGFyX3R5cGUqIF9fZmlyc3QsIGNvbnN0IGNoYXJfdHlwZSogX19sYXN0KSBjb25zdCB7CisgICAgcmV0dXJuIGZpbmRfaWYoX19maXJzdCwgX19sYXN0LCBfRXFfY2hhcl9ib3VuZDxfVHJhaXRzPihfTV92YWwpKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcmFpdHM+CitzdHJ1Y3QgX1NjYW5fZm9yX2ludF92YWwgeworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OmNoYXJfdHlwZSBjaGFyX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6aW50X3R5cGUgIGludF90eXBlOworICB0eXBlZGVmIGNoYXJfdHlwZSogICAgICAgICAgICAgICAgICBmaXJzdF9hcmd1bWVudF90eXBlOworICB0eXBlZGVmIGNoYXJfdHlwZSogICAgICAgICAgICAgICAgICBzZWNvbmRfYXJndW1lbnRfdHlwZTsKKyAgdHlwZWRlZiBjaGFyX3R5cGUqICAgICAgICAgICAgICAgICAgcmVzdWx0X3R5cGU7CisKKyAgaW50X3R5cGUgX01fdmFsOworCisgIF9TY2FuX2Zvcl9pbnRfdmFsKGludF90eXBlIF9fdmFsKSA6IF9NX3ZhbChfX3ZhbCkge30KKworICBjb25zdCBjaGFyX3R5cGUqCisgIG9wZXJhdG9yKCkoY29uc3QgY2hhcl90eXBlKiBfX2ZpcnN0LCBjb25zdCBjaGFyX3R5cGUqIF9fbGFzdCkgY29uc3QgeworICAgIHJldHVybiBmaW5kX2lmKF9fZmlyc3QsIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICBfRXFfaW50X2JvdW5kPF9UcmFpdHM+KF9NX3ZhbCkpOworICB9Cit9OworCisvLyBIZWxwZXIgZnVuY3Rpb246IHRyeSB0byBwdXNoIGJhY2sgYSBjaGFyYWN0ZXIgdG8gYSBzdHJlYW1idWYsCisvLyByZXR1cm4gdHJ1ZSBpZiB0aGUgcHVzaGJhY2sgc3VjY2VlZGVkLiAgRG9lcyBub3QgdGhyb3cuCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Citib29sIF9TVExQX0NBTEwKK19fcHVzaGJhY2soYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fYnVmLCBfQ2hhclQgX19jKSB7CisgIGJvb2wgcmV0OworICBfU1RMUF9UUlkgeworICAgIGNvbnN0IHR5cGVuYW1lIF9UcmFpdHM6OmludF90eXBlIF9fZW9mID0gX1RyYWl0czo6ZW9mKCk7CisgICAgcmV0ID0gIV9UcmFpdHM6OmVxX2ludF90eXBlKF9fYnVmLT5zcHV0YmFja2MoX19jKSwgX19lb2YpOworICB9CisgIF9TVExQX0NBVENIX0FMTCB7CisgICAgcmV0ID0gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEZWZpbml0aW9ucyBvZiBiYXNpY19pc3RyZWFtPD4ncyBub25pbmxpbmUgbWVtYmVyIGZ1bmN0aW9ucy4KKworLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBmb3JtYXR0ZWQgaW5wdXQgb2YgbnVtYmVycy4KK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9OdW1iZXI+Citpb3NfYmFzZTo6aW9zdGF0ZSBfU1RMUF9DQUxMCitfX2dldF9udW0oYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX3RoYXQsIF9OdW1iZXImIF9fdmFsKSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpzZW50cnkgX1NlbnRyeTsKKyAgaW9zX2Jhc2U6Omlvc3RhdGUgX19lcnIgPSAwOworICBfU2VudHJ5IF9fc2VudHJ5KCBfX3RoYXQgKTsgICAgIC8vIFNraXAgd2hpdGVzcGFjZS4KKyAgaWYgKF9fc2VudHJ5KSB7CisgICAgdHlwZWRlZiBudW1fZ2V0PF9DaGFyVCwgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQsIF9UcmFpdHM+ID4gX051bV9nZXQ7CisgICAgX1NUTFBfVFJZIHsKKyAgICAgICgoY29uc3QgX051bV9nZXQmKXVzZV9mYWNldDxfTnVtX2dldD4oX190aGF0LmdldGxvYygpKSkuZ2V0KGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJULCBfVHJhaXRzPihfX3RoYXQucmRidWYoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBfX3RoYXQsIF9fZXJyLCBfX3ZhbCk7CisgICAgfQorICAgIF9TVExQX0NBVENIX0FMTCB7CisgICAgICBfX3RoYXQuX01faGFuZGxlX2V4Y2VwdGlvbihpb3NfYmFzZTo6YmFkYml0KTsKKyAgICB9CisgICAgaWYgKF9fZXJyKSBfX3RoYXQuc2V0c3RhdGUoX19lcnIpOworICB9CisgIHJldHVybiBfX2VycjsKK30KKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6b3BlcmF0b3I+PiAoc2hvcnQmIF9fdmFsKSB7CisgIGxvbmcgX19sdmFsOworICBfU1RMUF9QUklWIF9fZ2V0X251bSgqdGhpcywgX19sdmFsKTsKKyAgaWYgKCB0aGlzLT5mYWlsKCkgKSB7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIHNob3J0IF9fdG1wID0gX19TVEFUSUNfQ0FTVChzaG9ydCwgX19sdmFsKTsKKyAgdW5zaWduZWQgc2hvcnQgX191dmFsID0gX19TVEFUSUNfQ0FTVCh1bnNpZ25lZCBzaG9ydCwgX19sdmFsKTsKKyAgLy8gY2hlY2sgaWYgd2UgbG9zZSBkaWdpdHMKKyAgLy8gICAgaWYgKChfX3ZhbCAhPSBfX2x2YWwpICYmICgodW5zaWduZWQgc2hvcnQpX192YWwgIT0gX19sdmFsKSkKKyAgaWYgKChfX3RtcCAhPSBfX2x2YWwpICYmICgobG9uZylfX3V2YWwgIT0gX19sdmFsKSkKKyAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7CisgIGVsc2UKKyAgICBfX3ZhbCA9IF9fdG1wOworICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6b3BlcmF0b3I+PiAoaW50JiBfX3ZhbCkgeworICBsb25nIF9fbHZhbDsKKyAgX1NUTFBfUFJJViBfX2dldF9udW0oKnRoaXMsIF9fbHZhbCk7CisgIGlmICggdGhpcy0+ZmFpbCgpICkgeworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBpbnQgX190bXAgPSBfX2x2YWw7CisgIHVuc2lnbmVkIGludCBfX3V2YWwgPSBfX2x2YWw7CisgIC8vIGNoZWNrIGlmIHdlIGxvc2UgZGlnaXRzCisgIC8vICAgIGlmICgoX192YWwgIT0gX19sdmFsKSAmJiAoKHVuc2lnbmVkIGludClfX3ZhbCAhPSBfX2x2YWwpKQorICBpZiAoKF9fdG1wICE9IF9fbHZhbCkgJiYgKChsb25nKV9fdXZhbCAhPSBfX2x2YWwpKQorICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKKyAgZWxzZQorICAgIF9fdmFsID0gX190bXA7CisgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpvcGVyYXRvcj4+ICh1bnNpZ25lZCBzaG9ydCYgX192YWwpIHsKKyAgX1NUTFBfUFJJViBfX2dldF9udW0oKnRoaXMsIF9fdmFsKTsKKyAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Om9wZXJhdG9yPj4gKHVuc2lnbmVkIGludCYgX192YWwpIHsKKyAgX1NUTFBfUFJJViBfX2dldF9udW0oKnRoaXMsIF9fdmFsKTsKKyAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Om9wZXJhdG9yPj4gKGxvbmcmIF9fdmFsKSB7CisgIF9TVExQX1BSSVYgX19nZXRfbnVtKCp0aGlzLCBfX3ZhbCk7CisgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpvcGVyYXRvcj4+ICh1bnNpZ25lZCBsb25nJiBfX3ZhbCkgeworICBfU1RMUF9QUklWIF9fZ2V0X251bSgqdGhpcywgX192YWwpOworICByZXR1cm4gKnRoaXM7Cit9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9MT05HX0xPTkcpCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Om9wZXJhdG9yPj4gKF9TVExQX0xPTkdfTE9ORyYgX192YWwpIHsKKyAgX1NUTFBfUFJJViBfX2dldF9udW0oKnRoaXMsIF9fdmFsKTsKKyAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Om9wZXJhdG9yPj4gKHVuc2lnbmVkIF9TVExQX0xPTkdfTE9ORyYgX192YWwpIHsKKyAgX1NUTFBfUFJJViBfX2dldF9udW0oKnRoaXMsIF9fdmFsKTsKKyAgcmV0dXJuICp0aGlzOworfQorI2VuZGlmCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Om9wZXJhdG9yPj4gKGZsb2F0JiBfX3ZhbCkgeworICBfU1RMUF9QUklWIF9fZ2V0X251bSgqdGhpcywgX192YWwpOworICByZXR1cm4gKnRoaXM7Cit9Cit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Om9wZXJhdG9yPj4gKGRvdWJsZSYgX192YWwpIHsKKyAgX1NUTFBfUFJJViBfX2dldF9udW0oKnRoaXMsIF9fdmFsKTsKKyAgcmV0dXJuICp0aGlzOworfQorI2lmICFkZWZpbmVkIChfU1RMUF9OT19MT05HX0RPVUJMRSkKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6b3BlcmF0b3I+PiAobG9uZyBkb3VibGUmIF9fdmFsKSB7CisgIF9TVExQX1BSSVYgX19nZXRfbnVtKCp0aGlzLCBfX3ZhbCk7CisgIHJldHVybiAqdGhpczsKK30KKyNlbmRpZgorI2lmICFkZWZpbmVkIChfU1RMUF9OT19CT09MKQordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpvcGVyYXRvcj4+IChib29sJiBfX3ZhbCkgeworICBfU1RMUF9QUklWIF9fZ2V0X251bSgqdGhpcywgX192YWwpOworICByZXR1cm4gKnRoaXM7Cit9CisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpvcGVyYXRvcj4+ICh2b2lkKiYgX192YWwpIHsKKyAgX1NUTFBfUFJJViBfX2dldF9udW0oKnRoaXMsIF9fdmFsKTsKKyAgcmV0dXJuICp0aGlzOworfQorCisvLyBVbmZvcm1hdHRlZCBpbnB1dAorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorX19CSVNfaW50X3R5cGVfXworYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpwZWVrKCkgeworICB0eXBlbmFtZSBfVHJhaXRzOjppbnRfdHlwZSBfX3RtcCA9IF9UcmFpdHM6OmVvZigpOworCisgIHRoaXMtPl9NX2djb3VudCA9IDA7CisgIHNlbnRyeSBfX3NlbnRyeSgqdGhpcywgX05vX1NraXBfV1MoKSk7CisKKyAgaWYgKF9fc2VudHJ5KSB7CisgICAgX1NUTFBfVFJZIHsKKyAgICAgIF9fdG1wID0gdGhpcy0+cmRidWYoKS0+c2dldGMoKTsKKyAgICB9CisgICAgX1NUTFBfQ0FUQ0hfQUxMIHsKKyAgICAgIHRoaXMtPl9NX2hhbmRsZV9leGNlcHRpb24oaW9zX2Jhc2U6OmJhZGJpdCk7CisgICAgfQorICAgIGlmICh0aGlzLT5fU19lb2YoX190bXApKQorICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmVvZmJpdCk7CisgIH0KKworICByZXR1cm4gX190bXA7Cit9CisKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK19fQklTX2ludF90eXBlX18KK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6Z2V0KCkgeworICB0eXBlbmFtZSBfVHJhaXRzOjppbnRfdHlwZSBfX3RtcCA9IF9UcmFpdHM6OmVvZigpOworICBzZW50cnkgX19zZW50cnkoKnRoaXMsIF9Ob19Ta2lwX1dTKCkpOworICB0aGlzLT5fTV9nY291bnQgPSAwOworCisgIGlmIChfX3NlbnRyeSkgeworICAgIF9TVExQX1RSWSB7CisgICAgICBfX3RtcCA9IHRoaXMtPnJkYnVmKCktPnNidW1wYygpOworICAgIH0KKyAgICBfU1RMUF9DQVRDSF9BTEwgeworICAgICAgdGhpcy0+X01faGFuZGxlX2V4Y2VwdGlvbihpb3NfYmFzZTo6YmFkYml0KTsKKyAgICB9CisKKyAgICBpZiAoIXRoaXMtPl9TX2VvZihfX3RtcCkpCisgICAgICB0aGlzLT5fTV9nY291bnQgPSAxOworICB9CisKKyAgaWYgKF9NX2djb3VudCA9PSAwKQorICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjplb2ZiaXQgfCBpb3NfYmFzZTo6ZmFpbGJpdCk7CisKKyAgcmV0dXJuIF9fdG1wOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpnZXQoX0NoYXJUJiBfX2MpIHsKKyAgc2VudHJ5IF9fc2VudHJ5KCp0aGlzLCBfTm9fU2tpcF9XUygpKTsKKyAgdGhpcy0+X01fZ2NvdW50ID0gMDsKKworICBpZiAoX19zZW50cnkpIHsKKyAgICB0eXBlbmFtZSBfVHJhaXRzOjppbnRfdHlwZSBfX3RtcCA9IF9UcmFpdHM6OmVvZigpOworICAgIF9TVExQX1RSWSB7CisgICAgICBfX3RtcCA9IHRoaXMtPnJkYnVmKCktPnNidW1wYygpOworICAgIH0KKyAgICBfU1RMUF9DQVRDSF9BTEwgeworICAgICAgdGhpcy0+X01faGFuZGxlX2V4Y2VwdGlvbihpb3NfYmFzZTo6YmFkYml0KTsKKyAgICB9CisKKyAgICBpZiAoIXRoaXMtPl9TX2VvZihfX3RtcCkpIHsKKyAgICAgIHRoaXMtPl9NX2djb3VudCA9IDE7CisgICAgICBfX2MgPSBfVHJhaXRzOjp0b19jaGFyX3R5cGUoX190bXApOworICAgIH0KKyAgfQorCisgIGlmICh0aGlzLT5fTV9nY291bnQgPT0gMCkKKyAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6ZW9mYml0IHwgaW9zX2Jhc2U6OmZhaWxiaXQpOworCisgIHJldHVybiAqdGhpczsKK30KKworCisvLyBSZWFkIGNoYXJhY3RlcnMgYW5kIGRpc2NhcmQgdGhlbS4gIFRoZSBzdGFuZGFyZCBzcGVjaWZpZXMgYSBzaW5nbGUKKy8vIGZ1bmN0aW9uIHdpdGggdHdvIGFyZ3VtZW50cywgZWFjaCB3aXRoIGEgZGVmYXVsdC4gIFdlIGluc3RlYWQgdXNlCisvLyB0aHJlZSBvdmVybG9kZWQgZnVuY3Rpb25zLCBiZWNhdXNlIGl0J3MgcG9zc2libGUgdG8gaW1wbGVtZW50IHRoZQorLy8gZmlyc3QgdHdvIG1vcmUgZWZmaWNpZW50bHkgdGhhbiB0aGUgZnVsbHkgZ2VuZXJhbCB0aGlyZCB2ZXJzaW9uLgordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjppZ25vcmUoKSB7CisgIHNlbnRyeSBfX3NlbnRyeSgqdGhpcywgX05vX1NraXBfV1MoKSk7CisgIHRoaXMtPl9NX2djb3VudCA9IDA7CisKKyAgaWYgKF9fc2VudHJ5KSB7CisgICAgaW50X3R5cGUgX19jOworICAgIF9TVExQX1RSWSB7CisgICAgICBfX2MgPSB0aGlzLT5yZGJ1ZigpLT5zYnVtcGMoKTsKKyAgICB9CisgICAgX1NUTFBfQ0FUQ0hfQUxMIHsKKyAgICAgIHRoaXMtPl9NX2hhbmRsZV9leGNlcHRpb24oaW9zX2Jhc2U6OmJhZGJpdCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgaWYgKCF0aGlzLT5fU19lb2YoX19jKSkKKyAgICAgIHRoaXMtPl9NX2djb3VudCA9IDE7CisgICAgZWxzZQorICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmVvZmJpdCk7CisgIH0KKworICByZXR1cm4gKnRoaXM7Cit9CisKKy8vIFB1dGJhY2sKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6cHV0YmFjayhfQ2hhclQgX19jKSB7CisgIHRoaXMtPl9NX2djb3VudCA9IDA7CisgIHNlbnRyeSBfX3NlbnRyeSgqdGhpcywgX05vX1NraXBfV1MoKSk7CisKKyAgaWYgKF9fc2VudHJ5KSB7CisgICAgdHlwZW5hbWUgX1RyYWl0czo6aW50X3R5cGUgX190bXAgPSBfVHJhaXRzOjplb2YoKTsKKyAgICBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19idWYgPSB0aGlzLT5yZGJ1ZigpOworLy8gICAgaWYgKCFfX2J1ZiB8fCB0aGlzLT5fU19lb2YoX19idWYtPnNwdXRiYWNrYyhfX2MpKSkKKyAgICBpZiAoX19idWYpIHsKKyAgICAgIF9TVExQX1RSWSB7CisgICAgICAgIF9fdG1wID0gX19idWYtPnNwdXRiYWNrYyhfX2MpOworICAgICAgfQorICAgICAgX1NUTFBfQ0FUQ0hfQUxMIHsKKyAgICAgICAgdGhpcy0+X01faGFuZGxlX2V4Y2VwdGlvbihpb3NfYmFzZTo6YmFkYml0KTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHRoaXMtPl9TX2VvZihfX3RtcCkpCisgICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKKyAgfQorICBlbHNlCisgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworCisgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Ojp1bmdldCgpIHsKKyAgdGhpcy0+X01fZ2NvdW50ID0gMDsKKworICBzZW50cnkgX19zZW50cnkoKnRoaXMsIF9Ob19Ta2lwX1dTKCkpOworCisgIGlmIChfX3NlbnRyeSkgeworICAgIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX2J1ZiA9IHRoaXMtPnJkYnVmKCk7CisgICAgLy8gICAgIGlmICghX19idWYgfHwgX1RyYWl0czo6ZXFfaW50X3R5cGUoX19idWYtPnN1bmdldGMoKSwgX1RyYWl0czo6ZW9mKCkpKQorICAgIGlmIChfX2J1ZikgeworICAgICAgX1NUTFBfVFJZIHsKKyAgICAgICAgaWYgKHRoaXMtPl9TX2VvZihfX2J1Zi0+c3VuZ2V0YygpKSkKKyAgICAgICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKKyAgICAgIH0KKyAgICAgIF9TVExQX0NBVENIX0FMTCB7CisgICAgICAgIHRoaXMtPl9NX2hhbmRsZV9leGNlcHRpb24oaW9zX2Jhc2U6OmJhZGJpdCk7CisgICAgICB9CisgICAgfSBlbHNlCisgICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKKyAgfQorICBlbHNlCisgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworCisgIHJldHVybiAqdGhpczsKK30KKworLy8gUG9zaXRpb25pbmcgYW5kIGJ1ZmZlciBjb250cm9sLgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgoraW50IGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6c3luYygpIHsKKyAgc2VudHJ5IF9fc2VudHJ5KCp0aGlzLCBfTm9fU2tpcF9XUygpKTsKKworICBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19idWYgPSB0aGlzLT5yZGJ1ZigpOworICBpZiAoX19idWYpIHsKKyAgICBpZiAoX19idWYtPnB1YnN5bmMoKSA9PSAtMSkgeworICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHJldHVybiAwOworICB9CisgIGVsc2UKKyAgICByZXR1cm4gLTE7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitfX0JJU19wb3NfdHlwZV9fCitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OnRlbGxnKCkgeworICBzZW50cnkgX19zZW50cnkoKnRoaXMsIF9Ob19Ta2lwX1dTKCkpOworCisgIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX2J1ZiA9IHRoaXMtPnJkYnVmKCk7CisgIHJldHVybiAoX19idWYgJiYgIXRoaXMtPmZhaWwoKSkgPyBfX2J1Zi0+cHVic2Vla29mZigwLCBpb3NfYmFzZTo6Y3VyLCBpb3NfYmFzZTo6aW4pCisgICAgOiBwb3NfdHlwZSgtMSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OnNlZWtnKHBvc190eXBlIF9fcG9zKSB7CisgIHNlbnRyeSBfX3NlbnRyeSgqdGhpcywgX05vX1NraXBfV1MoKSk7CisKKyAgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fYnVmID0gdGhpcy0+cmRidWYoKTsKKyAgaWYgKCF0aGlzLT5mYWlsKCkgJiYgX19idWYpIHsKKyAgICBpZiAoX19idWYtPnB1YnNlZWtwb3MoX19wb3MpID09IHBvc190eXBlKC0xKSkgeworICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworICAgIH0KKyAgfQorICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OnNlZWtnKG9mZl90eXBlIF9fb2ZmLCBpb3NfYmFzZTo6c2Vla2RpciBfX2RpcikgeworICBzZW50cnkgX19zZW50cnkoKnRoaXMsIF9Ob19Ta2lwX1dTKCkpOworCisgIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX2J1ZiA9IHRoaXMtPnJkYnVmKCk7CisgIGlmICghdGhpcy0+ZmFpbCgpICYmIF9fYnVmKQorICAgIF9fYnVmLT5wdWJzZWVrb2ZmKF9fb2ZmLCBfX2Rpcik7CisgIHJldHVybiAqdGhpczsKK30KKworLy8gRm9ybWF0dGVkIGlucHV0IG9mIGNoYXJhY3RlcnMgYW5kIGNoYXJhY3RlciBhcnJheXMuCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Cit2b2lkIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6X01fZm9ybWF0dGVkX2dldChfQ2hhclQmIF9fYykgeworLy8gIHR5cGVuYW1lIF9UcmFpdHM6OmludF90eXBlIF9fdG1wID0gX1RyYWl0czo6ZW9mKCk7CisKKyAgc2VudHJ5IF9fc2VudHJ5KCp0aGlzKTsgLy8gU2tpcCB3aGl0ZXNwYWNlLgorCisgIGlmIChfX3NlbnRyeSkgeworICAgIHR5cGVuYW1lIF9UcmFpdHM6OmludF90eXBlIF9fdG1wOy8vID0gX1RyYWl0czo6ZW9mKCk7CisKKyAgICBfU1RMUF9UUlkgeworICAgICAgX190bXAgPSB0aGlzLT5yZGJ1ZigpLT5zYnVtcGMoKTsKKyAgICB9CisgICAgX1NUTFBfQ0FUQ0hfQUxMIHsKKyAgICAgIHRoaXMtPl9NX2hhbmRsZV9leGNlcHRpb24oaW9zX2Jhc2U6OmJhZGJpdCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCF0aGlzLT5fU19lb2YoX190bXApKQorICAgICAgX19jID0gX1RyYWl0czo6dG9fY2hhcl90eXBlKF9fdG1wKTsKKyAgICBlbHNlCisgICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6ZW9mYml0IHwgaW9zX2Jhc2U6OmZhaWxiaXQpOworICB9Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGlzdHJlYW0ncyBoZWxwZXIgZnVuY3Rpb25zLgorCisvLyBBIGdlbmVyaWMgZnVuY3Rpb24gZm9yIHVuYnVmZmVyZWQgaW5wdXQuICBXZSBzdG9wIHdoZW4gd2UgcmVhY2ggRU9GLAorLy8gb3Igd2hlbiB3ZSBoYXZlIGV4dHJhY3RlZCBfTnVtIGNoYXJhY3RlcnMsIG9yIHdoZW4gdGhlIGZ1bmN0aW9uIG9iamVjdAorLy8gX19pc19kZWxpbSByZXR1cm4gdHJ1ZS4gIEluIHRoZSBsYXN0IGNhc2UsIGl0IGV4dHJhY3RzIHRoZSBjaGFyYWN0ZXIKKy8vIGZvciB3aGljaCBfX2lzX2RlbGltIGlzIHRydWUsIGlmIGFuZCBvbmx5IGlmIF9fZXh0cmFjdF9kZWxpbSBpcyB0cnVlLgorLy8gSXQgYXBwZW5kcyBhIG51bGwgY2hhcmFjdGVyIHRvIHRoZSBlbmQgb2YgdGhlIHN0cmluZzsgdGhpcyBtZWFucyB0aGF0CisvLyBpdCBtYXkgc3RvcmUgdXAgdG8gX051bSArIDEgY2hhcmFjdGVycy4KKy8vCisvLyBfX2lzX2dldGxpbmUgZ292ZXJucyB0d28gY29ybmVyIGNhc2VzOiByZWFkaW5nIF9OdW0gY2hhcmFjdGVycyB3aXRob3V0CisvLyBlbmNvdW50ZXJpbmcgZGVsaW0gb3IgZW9mIChpbiB3aGljaCBjYXNlIGZhaWxiaXQgaXMgc2V0IGlmIF9faXNfZ2V0bGluZQorLy8gaXMgdHJ1ZSk7IGFuZCByZWFkaW5nIF9OdW0gY2hhcmFjdGVycyB3aGVyZSB0aGUgX051bSsxJ3N0IGNoYXJhY3RlciBpcworLy8gZW9mIChpbiB3aGljaCBjYXNlIGVvZmJpdCBpcyBzZXQgaWYgX19pc19nZXRsaW5lIGlzIHRydWUpLgorLy8KKy8vIEl0IGlzIGFzc3VtZWQgdGhhdCBfX2lzX2RlbGltIG5ldmVyIHRocm93cy4KKy8vCisvLyBSZXR1cm4gdmFsdWUgaXMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGV4dHJhY3RlZCwgaW5jbHVkaW5nIHRoZQorLy8gZGVsaW1pdGVyIGlmIGl0IGlzIGV4dHJhY3RlZC4gIE5vdGUgdGhhdCB0aGUgbnVtYmVyIG9mIGNoYXJhY2F0ZXJzCisvLyBleHRyYWN0ZWQgaXNuJ3QgbmVjZXNzYXJpbHkgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBzdG9yZWQuCisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPCBjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9Jc19EZWxpbT4KK3N0cmVhbXNpemUgX1NUTFBfQ0FMTAorX19yZWFkX3VuYnVmZmVyZWQoYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+KiBfX3RoYXQsIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX2J1ZiwKKyAgICAgICAgICAgICAgICAgIHN0cmVhbXNpemUgX051bSwgX0NoYXJUKiBfX3MsCisgICAgICAgICAgICAgICAgICBfSXNfRGVsaW0gX19pc19kZWxpbSwKKyAgICAgICAgICAgICAgICAgIGJvb2wgX19leHRyYWN0X2RlbGltLCBib29sIF9fYXBwZW5kX251bGwsCisgICAgICAgICAgICAgICAgICBib29sIF9faXNfZ2V0bGluZSkgeworICBzdHJlYW1zaXplIF9fbiA9IDA7CisgIGlvc19iYXNlOjppb3N0YXRlIF9fc3RhdHVzID0gMDsKKworICB0eXBlZGVmIHR5cGVuYW1lIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6aW50X3R5cGUgaW50X3R5cGU7CisgIC8vIFRoZSBvcGVyYXRpb25zIHRoYXQgY2FuIHBvdGVudGlhbGx5IHRocm93IGFyZSBzYnVtcGMsIHNuZXh0YywgYW5kIHNnZXRjLgorICBfU1RMUF9UUlkgeworICAgIGZvciAoOzspIHsKKyAgICAgIGludF90eXBlIF9fYyA9IF9fYnVmLT5zYnVtcGMoKTsgLy8gc3NjaHdhcnoKKworICAgICAgaWYgKF9fdGhhdC0+X1NfZW9mKF9fYykpIHsKKyAgICAgICAgaWYgKF9fbiA8IF9OdW0gfHwgX19pc19nZXRsaW5lKQorICAgICAgICAgIF9fc3RhdHVzIHw9IGlvc19iYXNlOjplb2ZiaXQ7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZWxzZSBpZiAoX19pc19kZWxpbShfVHJhaXRzOjp0b19jaGFyX3R5cGUoX19jKSkpIHsKKyAgICAgICAgaWYgKF9fZXh0cmFjdF9kZWxpbSkgeyAvLyBFeHRyYWN0IGFuZCBkaXNjYXJkIGN1cnJlbnQgY2hhcmFjdGVyLgorICAgICAgICAgICsrX19uOworICAgICAgICB9IGVsc2UgaWYgKCAhX19wdXNoYmFjayhfX2J1ZiwgX1RyYWl0czo6dG9fY2hhcl90eXBlKF9fYykpICkgeyAvLyBsZWF2ZSBkZWxpbWl0ZXIKKyAgICAgICAgICBfX3N0YXR1cyB8PSBpb3NfYmFzZTo6ZmFpbGJpdDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGVsc2UgeyAvLyByZWd1bGFyIGNoYXJhY3RlcgorICAgICAgICAqX19zKysgPSBfVHJhaXRzOjp0b19jaGFyX3R5cGUoX19jKTsKKyAgICAgICAgKytfX247CisgICAgICB9CisKKyAgICAgIGlmIChfX24gPT0gX051bSkgeworICAgICAgICBpZiAoX19pc19nZXRsaW5lKSAvLyBkaWRuJ3QgZmluZCBkZWxpbWl0ZXIgYXMgb25lIG9mIHRoZSBfTnVtIGNoYXJzCisgICAgICAgICAgX19zdGF0dXMgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorICBfU1RMUF9DQVRDSF9BTEwgeworICAgIF9fdGhhdC0+X01faGFuZGxlX2V4Y2VwdGlvbihpb3NfYmFzZTo6YmFkYml0KTsKKyAgICAqX19zID0gX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRChfQ2hhclQpOworICAgIHJldHVybiBfX247CisgIH0KKworICBpZiAoX19hcHBlbmRfbnVsbCkKKyAgICAqX19zID0gIF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQoX0NoYXJUKTsKKyAgaWYgKF9fc3RhdHVzKQorICAgIF9fdGhhdC0+c2V0c3RhdGUoX19zdGF0dXMpOyAgICAvLyBUaGlzIG1pZ2h0IHRocm93LgorICByZXR1cm4gX19uOworfQorCisvLyBNdWNoIGxpa2UgX19yZWFkX3VuYnVmZmVyZWQsIGJ1dCB3aXRoIG9uZSBhZGRpdGlvbmFsIGZ1bmN0aW9uIG9iamVjdDoKKy8vIF9fc2Nhbl9kZWxpbShmaXJzdCwgbGFzdCkgcmV0dXJucyB0aGUgZmlyc3QgcG9pbnRlciBwIGluIFtmaXJzdCwgbGFzdCkKKy8vIHN1Y2ggdGhhdCBfX2lzX2RlbGltKHApIGlzIHRydWUuCisKK3RlbXBsYXRlIDwgY2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfSXNfRGVsaW0sIGNsYXNzIF9TY2FuX0RlbGltPgorc3RyZWFtc2l6ZSBfU1RMUF9DQUxMCitfX3JlYWRfYnVmZmVyZWQoYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+KiBfX3RoYXQsIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX2J1ZiwKKyAgICAgICAgICAgICAgICAgc3RyZWFtc2l6ZSBfTnVtLCBfQ2hhclQqIF9fcywKKyAgICAgICAgICAgICAgICAgX0lzX0RlbGltIF9faXNfZGVsaW0sIF9TY2FuX0RlbGltIF9fc2Nhbl9kZWxpbSwKKyAgICAgICAgICAgICAgICAgYm9vbCBfX2V4dHJhY3RfZGVsaW0sIGJvb2wgX19hcHBlbmRfbnVsbCwKKyAgICAgICAgICAgICAgICAgYm9vbCBfX2lzX2dldGxpbmUpIHsKKyAgc3RyZWFtc2l6ZSBfX24gPSAwOworICBpb3NfYmFzZTo6aW9zdGF0ZSBfX3N0YXR1cyA9IDA7CisgIGJvb2wgX19kb25lICAgID0gZmFsc2U7CisKKyAgX1NUTFBfVFJZIHsKKyAgICB3aGlsZSAoX19idWYtPl9NX2VncHRyKCkgIT0gX19idWYtPl9NX2dwdHIoKSAmJiAhX19kb25lKSB7CisgICAgICBjb25zdCBfQ2hhclQqIF9fZmlyc3QgPSBfX2J1Zi0+X01fZ3B0cigpOworICAgICAgY29uc3QgX0NoYXJUKiBfX2xhc3QgID0gX19idWYtPl9NX2VncHRyKCk7CisgICAgICAvL2Nhc3RpbmcgbnVtZXJpY19saW1pdHM8cHRyZGlmZl90Pjo6bWF4IHRvIHN0cmVhbXNpemUgb25seSB3b3JrcyBpcyBwdHJkaWZmX3QgaXMgc2lnbmVkIG9yIHN0cmVhbXNpemUgcmVwcmVzZW50YXRpb24KKyAgICAgIC8vaXMgbGFyZ2VyIHRoYW4gcHRyZGlmZl90IG9uZS4KKyAgICAgIF9TVExQX1NUQVRJQ19BU1NFUlQoKChzaXplb2Yoc3RyZWFtc2l6ZSkgPiBzaXplb2YocHRyZGlmZl90KSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplb2Yoc3RyZWFtc2l6ZSkgPT0gc2l6ZW9mKHB0cmRpZmZfdCkpKSAmJiBudW1lcmljX2xpbWl0czxwdHJkaWZmX3Q+Ojppc19zaWduZWQpCisgICAgICBwdHJkaWZmX3QgX19yZXF1ZXN0ID0gX19TVEFUSUNfQ0FTVChwdHJkaWZmX3QsIChtaW4pIChfX1NUQVRJQ19DQVNUKHN0cmVhbXNpemUsIChudW1lcmljX2xpbWl0czxwdHJkaWZmX3Q+OjptYXgpKCkpLCBfTnVtIC0gX19uKSk7CisKKyAgICAgIGNvbnN0IF9DaGFyVCogX19wICA9IF9fc2Nhbl9kZWxpbShfX2ZpcnN0LCBfX2xhc3QpOworICAgICAgcHRyZGlmZl90IF9fY2h1bmsgPSAobWluKSAocHRyZGlmZl90KF9fcCAtIF9fZmlyc3QpLCBfX3JlcXVlc3QpOworICAgICAgX1RyYWl0czo6Y29weShfX3MsIF9fZmlyc3QsIF9fY2h1bmspOworICAgICAgX19zICs9IF9fY2h1bms7CisgICAgICBfX24gKz0gX19jaHVuazsKKyAgICAgIF9fYnVmLT5fTV9nYnVtcCgoaW50KV9fY2h1bmspOworCisgICAgICAvLyBXZSB0ZXJtaW5hdGVkIGJ5IGZpbmRpbmcgZGVsaW0uCisgICAgICBpZiAoX19wICE9IF9fbGFzdCAmJiBfX3AgLSBfX2ZpcnN0IDw9IF9fcmVxdWVzdCkgeworICAgICAgICBpZiAoX19leHRyYWN0X2RlbGltKSB7CisgICAgICAgICAgX19uICs9IDE7CisgICAgICAgICAgX19idWYtPl9NX2didW1wKDEpOworICAgICAgICB9CisgICAgICAgIF9fZG9uZSA9IHRydWU7CisgICAgICB9CisKKyAgICAgIC8vIFdlIHRlcm1pbmF0ZWQgYnkgcmVhZGluZyBhbGwgdGhlIGNoYXJhY3RlcnMgd2Ugd2VyZSBhc2tlZCBmb3IuCisgICAgICBlbHNlIGlmIChfX24gPT0gX051bSkgeworCisgICAgICAgIC8vIEZpbmQgb3V0IGlmIHdlIGhhdmUgcmVhY2hlZCBlb2YuICBUaGlzIG1hdHRlcnMgZm9yIGdldGxpbmUuCisgICAgICAgIGlmIChfX2lzX2dldGxpbmUpIHsKKyAgICAgICAgICBpZiAoX19jaHVuayA9PSBfX2xhc3QgLSBfX2ZpcnN0KSB7CisgICAgICAgICAgICBpZiAoX190aGF0LT5fU19lb2YoX19idWYtPnNnZXRjKCkpKQorICAgICAgICAgICAgICBfX3N0YXR1cyB8PSBpb3NfYmFzZTo6ZW9mYml0OworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBfX3N0YXR1cyB8PSBpb3NfYmFzZTo6ZmFpbGJpdDsKKyAgICAgICAgfQorICAgICAgICBfX2RvbmUgICA9IHRydWU7CisgICAgICB9CisKKyAgICAgIC8vIFRoZSBidWZmZXIgY29udGFpbmVkIGZld2VyIHRoYW4gX051bSAtIF9fbiBjaGFyYWN0ZXJzLiAgRWl0aGVyIHdlJ3JlCisgICAgICAvLyBhdCBlb2YsIG9yIHdlIHNob3VsZCByZWZpbGwgdGhlIGJ1ZmZlciBhbmQgdHJ5IGFnYWluLgorICAgICAgZWxzZSB7CisgICAgICAgIGlmIChfX3RoYXQtPl9TX2VvZihfX2J1Zi0+c2dldGMoKSkpIHsKKyAgICAgICAgICBfX3N0YXR1cyB8PSBpb3NfYmFzZTo6ZW9mYml0OworICAgICAgICAgIF9fZG9uZSA9IHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IC8vIENsb3NlIHRoZSB3aGlsZSBsb29wLgorICB9CisgIF9TVExQX0NBVENIX0FMTCB7CisgICAgX190aGF0LT5fTV9oYW5kbGVfZXhjZXB0aW9uKGlvc19iYXNlOjpiYWRiaXQpOworICAgIF9fZG9uZSA9IHRydWU7CisgIH0KKworICBpZiAoX19kb25lKSB7CisgICAgaWYgKF9fYXBwZW5kX251bGwpCisgICAgICAgICpfX3MgPSAgX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRChfQ2hhclQpOworICAgIGlmIChfX3N0YXR1cyAhPSAwKQorICAgICAgX190aGF0LT5zZXRzdGF0ZShfX3N0YXR1cyk7ICAgLy8gVGhpcyBtaWdodCB0aHJvdy4KKyAgICByZXR1cm4gX19uOworICB9CisKKyAgLy8gSWYgZXhlY3V0aW9uIGhhcyByZWFjaGVkIHRoaXMgcG9pbnQsIHRoZW4gd2UgaGF2ZSBhbiBlbXB0eSBidWZmZXIgYnV0CisgIC8vIHdlIGhhdmUgbm90IHJlYWNoZWQgZW9mLiAgV2hhdCB0aGF0IG1lYW5zIGlzIHRoYXQgdGhlIHN0cmVhbWJ1ZiBoYXMKKyAgLy8gZGVjaWRlZCB0byBzd2l0Y2ggZnJvbSBidWZmZXJlZCB0byB1bmJ1ZmZlcmVkIGlucHV0LiAgV2Ugc3dpdGNoIHRvCisgIC8vIHRvIF9fcmVhZF91bmJ1ZmZlcmVkLgorCisgIHJldHVybiBfX24gKyBfX3JlYWRfdW5idWZmZXJlZChfX3RoYXQsICBfX2J1ZiwgX051bSAtIF9fbiwgX19zLCBfX2lzX2RlbGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19leHRyYWN0X2RlbGltLF9fYXBwZW5kX251bGwsX19pc19nZXRsaW5lKTsKK30KKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OmdldChfQ2hhclQqIF9fcywgc3RyZWFtc2l6ZSBfX24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ2hhclQgX19kZWxpbSkgeworICBzZW50cnkgX19zZW50cnkoKnRoaXMsIF9Ob19Ta2lwX1dTKCkpOworICB0aGlzLT5fTV9nY291bnQgPSAwOworCisgIGlmIChfX3NlbnRyeSkgeworICAgIGlmIChfX24gPiAwKSB7CisgICAgICBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19idWYgPSB0aGlzLT5yZGJ1ZigpOworCisgICAgICBpZiAoX19idWYtPmVncHRyKCkgIT0gX19idWYtPmdwdHIoKSkKKyAgICAgICAgdGhpcy0+X01fZ2NvdW50ID0KKyAgICAgICAgICBfU1RMUF9QUklWIF9fcmVhZF9idWZmZXJlZCh0aGlzLCAgX19idWYsIF9fbiAtIDEsIF9fcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9FcV9jaGFyX2JvdW5kPF9UcmFpdHM+KF9fZGVsaW0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX1NjYW5fZm9yX2NoYXJfdmFsPF9UcmFpdHM+KF9fZGVsaW0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCB0cnVlLCBmYWxzZSk7CisgICAgICBlbHNlCisgICAgICAgIHRoaXMtPl9NX2djb3VudCA9CisgICAgICAgICAgX1NUTFBfUFJJViBfX3JlYWRfdW5idWZmZXJlZCh0aGlzLCAgX19idWYsIF9fbiAtIDEsIF9fcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX0VxX2NoYXJfYm91bmQ8X1RyYWl0cz4oX19kZWxpbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgdHJ1ZSwgZmFsc2UpOworICAgIH0KKyAgfQorCisgIGlmICh0aGlzLT5fTV9nY291bnQgPT0gMCkKKyAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7CisKKyAgcmV0dXJuICp0aGlzOworfQorCisvLyBHZXRsaW5lIGlzIGVzc2VudGlhbGx5IGlkZW50aWNhbCB0byBnZXQsIGV4Y2VwdCB0aGF0IGl0IGV4dHJhY3RzCisvLyB0aGUgZGVsaW1pdGVyLgordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6Z2V0bGluZShfQ2hhclQqIF9fcywgc3RyZWFtc2l6ZSBfX24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NoYXJUIF9fZGVsaW0pIHsKKyAgc2VudHJ5IF9fc2VudHJ5KCp0aGlzLCBfTm9fU2tpcF9XUygpKTsKKyAgdGhpcy0+X01fZ2NvdW50ID0gMDsKKworICBpZiAoX19zZW50cnkpIHsKKyAgICBpZiAoX19uID4gMCkgeworICAgICAgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fYnVmID0gdGhpcy0+cmRidWYoKTsKKyAgICAgIHRoaXMtPl9NX2djb3VudCA9IF9fYnVmLT5lZ3B0cigpICE9IF9fYnVmLT5ncHRyKCkKKyAgICAgICAgPyBfU1RMUF9QUklWIF9fcmVhZF9idWZmZXJlZCh0aGlzLCAgX19idWYsIF9fbiAtIDEsIF9fcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9FcV9jaGFyX2JvdW5kPF9UcmFpdHM+KF9fZGVsaW0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX1NjYW5fZm9yX2NoYXJfdmFsPF9UcmFpdHM+KF9fZGVsaW0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIHRydWUsIHRydWUpCisgICAgICAgIDogX1NUTFBfUFJJViBfX3JlYWRfdW5idWZmZXJlZCh0aGlzLCAgX19idWYsIF9fbiAtIDEsIF9fcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX0VxX2NoYXJfYm91bmQ8X1RyYWl0cz4oX19kZWxpbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCB0cnVlLCB0cnVlKTsKKyAgICB9CisgIH0KKworICBpZiAodGhpcy0+X01fZ2NvdW50ID09IDApCisgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworCisgIHJldHVybiAqdGhpczsKK30KKworLy8gUmVhZCBuIGNoYXJhY3RlcnMuICBXZSBkb24ndCBsb29rIGZvciBhbnkgZGVsaW1pdGVyLCBhbmQgd2UgZG9uJ3QKKy8vIHB1dCBpbiBhIHRlcm1pbmF0aW5nIG51bGwgY2hhcmFjdGVyLgordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6cmVhZChjaGFyX3R5cGUqIF9fcywgc3RyZWFtc2l6ZSBfX24pIHsKKyAgc2VudHJ5IF9fc2VudHJ5KCp0aGlzLCBfTm9fU2tpcF9XUygpKTsKKyAgdGhpcy0+X01fZ2NvdW50ID0gMDsKKworICBpZiAoX19zZW50cnkgJiYgIXRoaXMtPmVvZigpKSB7CisgICAgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qX19idWYgPSB0aGlzLT5yZGJ1ZigpOworICAgIGlmIChfX2J1Zi0+Z3B0cigpICE9IF9fYnVmLT5lZ3B0cigpKQorICAgICAgX01fZ2NvdW50CisgICAgICAgID0gX1NUTFBfUFJJViBfX3JlYWRfYnVmZmVyZWQodGhpcywgIF9fYnVmLCBfX24sIF9fcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9Db25zdGFudF91bmFyeV9mdW48Ym9vbCwgaW50X3R5cGU+KGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9Qcm9qZWN0Mm5kPGNvbnN0IF9DaGFyVCosIGNvbnN0IF9DaGFyVCo+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgZWxzZQorICAgICAgX01fZ2NvdW50CisgICAgICAgID0gX1NUTFBfUFJJViBfX3JlYWRfdW5idWZmZXJlZCh0aGlzLCAgX19idWYsIF9fbiwgX19zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfQ29uc3RhbnRfdW5hcnlfZnVuPGJvb2wsIGludF90eXBlPihmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgfQorICBlbHNlCisgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworCisgIGlmICh0aGlzLT5lb2YoKSkKKyAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6ZW9mYml0IHwgaW9zX2Jhc2U6OmZhaWxiaXQpOworCisgIHJldHVybiAqdGhpczsKK30KKworCisvLyBSZWFkIG4gb3IgZmV3ZXIgY2hhcmFjdGVycy4gIFdlIGRvbid0IGxvb2sgZm9yIGFueSBkZWxpbWl0ZXIsIGFuZAorLy8gd2UgZG9uJ3QgcHV0IGluIGEgdGVybWluYXRpbmcgbnVsbCBjaGFyYWN0ZXIuCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorc3RyZWFtc2l6ZQorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpyZWFkc29tZShjaGFyX3R5cGUqIF9fcywgc3RyZWFtc2l6ZSBfX25tYXgpIHsKKyAgc2VudHJ5IF9fc2VudHJ5KCp0aGlzLCBfTm9fU2tpcF9XUygpKTsKKyAgdGhpcy0+X01fZ2NvdW50ID0gMDsKKworICBpZiAoX19zZW50cnkgJiYgIXRoaXMtPmVvZigpICYmIF9fbm1heCA+PSAwKSB7CisKKyAgICBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19idWYgPSB0aGlzLT5yZGJ1ZigpOworICAgIHN0cmVhbXNpemUgX19hdmFpbCA9IF9fYnVmLT5pbl9hdmFpbCgpOworCisgICAgLy8gZmJwIDogaXNuJ3QgZnVsbC1ibG93biBzZXRzdGF0ZSByZXF1aXJlZCBoZXJlID8KKyAgICBpZiAoX19hdmFpbCA9PSAtMSkKKyAgICAgIHRoaXMtPl9NX3NldHN0YXRlX25vdGhyb3coaW9zX2Jhc2U6OmVvZmJpdCk7CisKKyAgICBlbHNlIGlmIChfX2F2YWlsICE9IDApIHsKKworICAgICAgaWYgKF9fYnVmLT5ncHRyKCkgIT0gX19idWYtPmVncHRyKCkpCisgICAgICAgIF9NX2djb3VudAorICAgICAgICAgID0gX1NUTFBfUFJJViBfX3JlYWRfYnVmZmVyZWQodGhpcywgIF9fYnVmLCAobWluKSAoX19hdmFpbCwgX19ubWF4KSwgX19zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfQ29uc3RhbnRfdW5hcnlfZnVuPGJvb2wsIGludF90eXBlPihmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9Qcm9qZWN0Mm5kPGNvbnN0IF9DaGFyVCosIGNvbnN0IF9DaGFyVCo+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgIGVsc2UKKyAgICAgICAgX01fZ2NvdW50CisgICAgICAgICAgPSBfU1RMUF9QUklWIF9fcmVhZF91bmJ1ZmZlcmVkKHRoaXMsICBfX2J1ZiwgKG1pbikgKF9fYXZhaWwsIF9fbm1heCksIF9fcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfQ29uc3RhbnRfdW5hcnlfZnVuPGJvb2wsIGludF90eXBlPihmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgIH0KKyAgfQorICBlbHNlIHsKKyAgICAvLyBmYnAgOiBjaGFuZ2VkIHNvIHRoYXQgZmFpbGJpdCBpcyBzZXQgb25seSB0aGVyZSwgdG8gcGFzcyBEaWV0bWFyJ3MgdGVzdAorICAgIGlmICh0aGlzLT5lb2YoKSkKKyAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjplb2ZiaXQgfCBpb3NfYmFzZTo6ZmFpbGJpdCk7CisgICAgZWxzZQorICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworICB9CisKKyAgLy8gIGlmICh0aGlzLT5lb2YoKSkKKyAgLy8gICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmVvZmJpdCB8IGlvc19iYXNlOjpmYWlsYml0KTsKKworICByZXR1cm4gX01fZ2NvdW50OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgordm9pZCBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Ol9NX2Zvcm1hdHRlZF9nZXQoX0NoYXJUKiBfX3MpIHsKKyAgc2VudHJ5IF9fc2VudHJ5KCp0aGlzKTsgLy8gU2tpcCB3aGl0ZXNwYWNlLgorCisgIGlmIChfX3NlbnRyeSkgeworICAgIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX2J1ZiA9IHRoaXMtPnJkYnVmKCk7CisgICAgc3RyZWFtc2l6ZSBfX25tYXggPSB0aGlzLT53aWR0aCgpID4gMAorICAgICAgPyB0aGlzLT53aWR0aCgpIC0gMQorICAgICAgOiAoKG51bWVyaWNfbGltaXRzPHN0cmVhbXNpemU+OjptYXgpKCkgLyBzaXplb2YoX0NoYXJUKSkgLSAxOworCisgICAgc3RyZWFtc2l6ZSBfX24gPSBfX2J1Zi0+Z3B0cigpICE9IF9fYnVmLT5lZ3B0cigpCisgICAgICA/IF9TVExQX1BSSVYgX19yZWFkX2J1ZmZlcmVkKHRoaXMsICBfX2J1ZiwgX19ubWF4LCBfX3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX0lzX3dzcGFjZV9udWxsPF9UcmFpdHM+KF9fU1RBVElDX0NBU1QoY29uc3QgY3R5cGU8X0NoYXJUPiosIHRoaXMtPl9NX2N0eXBlX2ZhY2V0KCkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfU2Nhbl93c3BhY2VfbnVsbDxfVHJhaXRzPihfX1NUQVRJQ19DQVNUKGNvbnN0IGN0eXBlPF9DaGFyVD4qLCB0aGlzLT5fTV9jdHlwZV9mYWNldCgpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCB0cnVlLCBmYWxzZSkKKyAgICAgIDogX1NUTFBfUFJJViBfX3JlYWRfdW5idWZmZXJlZCh0aGlzLCAgX19idWYsIF9fbm1heCwgX19zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX0lzX3dzcGFjZV9udWxsPF9UcmFpdHM+KF9fU1RBVElDX0NBU1QoY29uc3QgY3R5cGU8X0NoYXJUPiosIHRoaXMtPl9NX2N0eXBlX2ZhY2V0KCkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgdHJ1ZSwgZmFsc2UpOworICAgIGlmIChfX24gPT0gMCkKKyAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKKyAgfQorICB0aGlzLT53aWR0aCgwKTsKK30KKworLy8gQSBnZW5lcmljIHVuYnVmZmVyZWQgZnVuY3Rpb24gZm9yIGlnbm9yaW5nIGNoYXJhY3RlcnMuICBXZSBzdG9wCisvLyB3aGVuIHdlIHJlYWNoIEVPRiwgb3Igd2hlbiB0aGUgZnVuY3Rpb24gb2JqZWN0IF9faXNfZGVsaW0gcmV0dXJucworLy8gdHJ1ZS4gIEluIHRoZSBsYXN0IGNhc2UsIGl0IGV4dHJhY3RzIHRoZSBjaGFyYWN0ZXIgZm9yIHdoaWNoCisvLyBfX2lzX2RlbGltIGlzIHRydWUsIGlmIGFuZCBvbmx5IGlmIF9fZXh0cmFjdF9kZWxpbSBpcyB0cnVlLgorCit0ZW1wbGF0ZSA8IGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0lzX0RlbGltPgordm9pZCBfU1RMUF9DQUxMCitfTV9pZ25vcmVfdW5idWZmZXJlZChiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4qIF9fdGhhdCwKKyAgICAgICAgICAgICAgICAgICAgIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgIF9Jc19EZWxpbSBfX2lzX2RlbGltLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBfX2V4dHJhY3RfZGVsaW0sIGJvb2wgX19zZXRfZmFpbGJpdCkgeworICBib29sIF9fZG9uZSA9IGZhbHNlOworICBpb3NfYmFzZTo6aW9zdGF0ZSBfX3N0YXR1cyA9IDA7CisgIHR5cGVkZWYgdHlwZW5hbWUgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjppbnRfdHlwZSBpbnRfdHlwZTsKKworICBfU1RMUF9UUlkgeworICAgIHdoaWxlICghX19kb25lKSB7CisgICAgICBpbnRfdHlwZSBfX2MgPSBfX2J1Zi0+c2J1bXBjKCk7CisKKyAgICAgIGlmIChfX3RoYXQtPl9TX2VvZihfX2MpKSB7CisgICAgICAgIF9fZG9uZSA9IHRydWU7CisgICAgICAgIF9fc3RhdHVzIHw9IF9fc2V0X2ZhaWxiaXQgPyBpb3NfYmFzZTo6ZW9mYml0IHwgaW9zX2Jhc2U6OmZhaWxiaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGlvc19iYXNlOjplb2ZiaXQ7CisgICAgICB9CisKKyAgICAgIGVsc2UgaWYgKF9faXNfZGVsaW0oX1RyYWl0czo6dG9fY2hhcl90eXBlKF9fYykpKSB7CisgICAgICAgIF9fZG9uZSA9IHRydWU7CisgICAgICAgIGlmICghX19leHRyYWN0X2RlbGltKQorICAgICAgICAgIGlmIChfX3RoYXQtPl9TX2VvZihfX2J1Zi0+c3B1dGJhY2tjKF9UcmFpdHM6OnRvX2NoYXJfdHlwZShfX2MpKSkpCisgICAgICAgICAgICBfX3N0YXR1cyB8PSBpb3NfYmFzZTo6ZmFpbGJpdDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgX1NUTFBfQ0FUQ0hfQUxMIHsKKyAgICBfX3RoYXQtPl9NX2hhbmRsZV9leGNlcHRpb24oaW9zX2Jhc2U6OmJhZGJpdCk7CisgIH0KKworICBfX3RoYXQtPnNldHN0YXRlKF9fc3RhdHVzKTsKK30KKworLy8gQSBnZW5lcmljIGJ1ZmZlcmVkIGZ1bmN0aW9uIGZvciBpZ25vcmluZyBjaGFyYWN0ZXJzLiAgTXVjaCBsaWtlCisvLyBfTV9pZ25vcmVfdW5idWZmZXJlZCwgYnV0IHdpdGggb25lIGFkZGl0aW9uYWwgZnVuY3Rpb24gb2JqZWN0OgorLy8gX19zY2FuX2RlbGltKGZpcnN0LCBsYXN0KSByZXR1cm5zIHRoZSBmaXJzdCBwb2ludGVyIHAgaW4gW2ZpcnN0LAorLy8gbGFzdCkgc3VjaCB0aGF0IF9faXNfZGVsaW0ocCkgaXMgdHJ1ZS4KKwordGVtcGxhdGUgPCBjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9Jc19EZWxpbSwgY2xhc3MgX1NjYW5fRGVsaW0+Cit2b2lkIF9TVExQX0NBTEwKK19NX2lnbm9yZV9idWZmZXJlZChiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4qIF9fdGhhdCwKKyAgICAgICAgICAgICAgICAgICBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19idWYsCisgICAgICAgICAgICAgICAgICAgX0lzX0RlbGltIF9faXNfZGVsaW0sIF9TY2FuX0RlbGltIF9fc2Nhbl9kZWxpbSwKKyAgICAgICAgICAgICAgICAgICBib29sIF9fZXh0cmFjdF9kZWxpbSwgYm9vbCBfX3NldF9mYWlsYml0KSB7CisgIGJvb2wgX19hdF9lb2YgICAgICA9IGZhbHNlOworICBib29sIF9fZm91bmRfZGVsaW0gPSBmYWxzZTsKKworICBfU1RMUF9UUlkgeworICAgIHdoaWxlIChfX2J1Zi0+X01fZWdwdHIoKSAhPSBfX2J1Zi0+X01fZ3B0cigpICYmICFfX2F0X2VvZiAmJiAhX19mb3VuZF9kZWxpbSkgeworICAgICAgY29uc3QgX0NoYXJUKiBfX3AgPSBfX3NjYW5fZGVsaW0oX19idWYtPl9NX2dwdHIoKSwgX19idWYtPl9NX2VncHRyKCkpOworICAgICAgX19idWYtPl9NX2didW1wKChpbnQpKF9fcCAtIF9fYnVmLT5fTV9ncHRyKCkpKTsKKworICAgICAgaWYgKF9fcCAhPSBfX2J1Zi0+X01fZWdwdHIoKSkgeyAvLyBXZSBmb3VuZCBkZWxpbSwgc28gd2UncmUgZG9uZS4KKyAgICAgICAgaWYgKF9fZXh0cmFjdF9kZWxpbSkKKyAgICAgICAgICBfX2J1Zi0+X01fZ2J1bXAoMSk7CisgICAgICAgIF9fZm91bmRfZGVsaW0gPSB0cnVlOworICAgICAgfQorCisgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIGRlbGltLiAgVHJ5IHRvIHJlZmlsIHRoZSBidWZmZXIuCisgICAgICAgIF9fYXRfZW9mID0gX190aGF0LT5fU19lb2YoX19idWYtPnNnZXRjKCkpOworICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDbG9zZSB0aGUgd2hpbGUgbG9vcC4KKyAgfQorICBfU1RMUF9DQVRDSF9BTEwgeworICAgIF9fdGhhdC0+X01faGFuZGxlX2V4Y2VwdGlvbihpb3NfYmFzZTo6YmFkYml0KTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoX19hdF9lb2YpIHsKKyAgICBfX3RoYXQtPnNldHN0YXRlKF9fc2V0X2ZhaWxiaXQgPyBpb3NfYmFzZTo6ZW9mYml0IHwgaW9zX2Jhc2U6OmZhaWxiaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBpb3NfYmFzZTo6ZW9mYml0KTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKF9fZm91bmRfZGVsaW0pCisgICAgcmV0dXJuOworCisgIC8vIElmIGV4ZWN1dGlvbiBoYXMgcmVhY2hlZCB0aGlzIHBvaW50LCB0aGVuIHdlIGhhdmUgYW4gZW1wdHkgYnVmZmVyIGJ1dAorICAvLyB3ZSBoYXZlIG5vdCByZWFjaGVkIGVvZi4gIFdoYXQgdGhhdCBtZWFucyBpcyB0aGF0IHRoZSBzdHJlYW1idWYgaGFzCisgIC8vIGRlY2lkZWQgdG8gc3dpdGNoIGZyb20gYSBidWZmZXJlZCB0byBhbiB1bmJ1ZmZlcmVkIG1vZGUuICBXZSBzd2l0Y2gKKyAgLy8gdG8gX01faWdub3JlX3VuYnVmZmVyZWQuCisgIF9NX2lnbm9yZV91bmJ1ZmZlcmVkKF9fdGhhdCwgIF9fYnVmLCBfX2lzX2RlbGltLCBfX2V4dHJhY3RfZGVsaW0sIF9fc2V0X2ZhaWxiaXQpOworfQorCisvLyBPdmVybG9hZGVkIHZlcnNpb25zIG9mIF9NX2lnbm9yZV91bmJ1ZmZlcmVkIGFuZCBfTV9pZ25vcmVfdW5idWZmZXJlZAorLy8gd2l0aCBhbiBleHBsaWNpdCBjb3VudCBfTnVtLiAgUmV0dXJuIHZhbHVlIGlzIHRoZSBudW1iZXIgb2YKKy8vIGNoYXJhY3RlcnMgZXh0cmFjdGVkLgorLy8KKy8vIFRoZSBmdW5jdGlvbiBvYmplY3QgX19tYXhfY2hhcnMgdGFrZXMgdHdvIGFyZ3VtZW50cywgX051bSBhbmQgX19uCisvLyAodGhlIGxhdHRlciBiZWluZyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd2UgaGF2ZSBhbHJlYWR5IHJlYWQpLAorLy8gYW5kIHJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcmVhZCBmcm9tIHRoZSBidWZmZXIuCisvLyBXZSBwYXJhbWV0ZXJpemUgX01faWdub3JlX2J1ZmZlcmVkIHNvIHRoYXQgd2UgY2FuIHVzZSBpdCBmb3IgYm90aAorLy8gYm91bmRlZCBhbmQgdW5ib3VuZGVkIGlucHV0OyBmb3IgdGhlIGZvcm1lciB0aGUgZnVuY3Rpb24gb2JqZWN0IHNob3VsZAorLy8gYmUgbWludXM8PiwgYW5kIGZvciB0aGUgbGF0dGVyIGl0IHNob3VsZCByZXR1cm4gYSBjb25zdGFudCBtYXhpbXVtIHZhbHVlLgorCit0ZW1wbGF0ZSA8IGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX01heF9DaGFycywgY2xhc3MgX0lzX0RlbGltPgorc3RyZWFtc2l6ZSBfU1RMUF9DQUxMCitfTV9pZ25vcmVfdW5idWZmZXJlZChiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4qIF9fdGhhdCwKKyAgICAgICAgICAgICAgICAgICAgIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgIHN0cmVhbXNpemUgX051bSwgX01heF9DaGFycyBfX21heF9jaGFycywKKyAgICAgICAgICAgICAgICAgICAgIF9Jc19EZWxpbSBfX2lzX2RlbGltLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBfX2V4dHJhY3RfZGVsaW0sIGJvb2wgX19zZXRfZmFpbGJpdCkgeworICBzdHJlYW1zaXplIF9fbiA9IDA7CisgIGlvc19iYXNlOjppb3N0YXRlIF9fc3RhdHVzID0gMDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OmludF90eXBlIGludF90eXBlOworCisgIF9TVExQX1RSWSB7CisgICAgd2hpbGUgKF9fbWF4X2NoYXJzKF9OdW0sIF9fbikgPiAwKSB7CisgICAgICBpbnRfdHlwZSBfX2MgPSBfX2J1Zi0+c2J1bXBjKCk7CisKKyAgICAgIGlmIChfX3RoYXQtPl9TX2VvZihfX2MpKSB7CisgICAgICAgIF9fc3RhdHVzIHw9IF9fc2V0X2ZhaWxiaXQgPyBpb3NfYmFzZTo6ZW9mYml0IHwgaW9zX2Jhc2U6OmZhaWxiaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGlvc19iYXNlOjplb2ZiaXQ7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBlbHNlIGlmIChfX2lzX2RlbGltKF9UcmFpdHM6OnRvX2NoYXJfdHlwZShfX2MpKSkgeworICAgICAgICBpZiAoX19leHRyYWN0X2RlbGltKQorICAgICAgICAgICsrX19uOworICAgICAgICBlbHNlIGlmIChfX3RoYXQtPl9TX2VvZihfX2J1Zi0+c3B1dGJhY2tjKF9UcmFpdHM6OnRvX2NoYXJfdHlwZShfX2MpKSkpCisgICAgICAgICAgX19zdGF0dXMgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAvLyBmYnAgOiBhZGRlZCBjb3VudGVyIGluY3JlbWVudCB0byBwYXNzIERpZXRtYXIncyB0ZXN0CisgICAgICArK19fbjsKKyAgICB9CisgIH0KKyAgX1NUTFBfQ0FUQ0hfQUxMIHsKKyAgICBfX3RoYXQtPl9NX2hhbmRsZV9leGNlcHRpb24oaW9zX2Jhc2U6OmJhZGJpdCk7CisgIH0KKworICBpZiAoX19zdGF0dXMpCisgICAgX190aGF0LT5zZXRzdGF0ZShfX3N0YXR1cyk7ICAgLy8gVGhpcyBtaWdodCB0aHJvdy4KKyAgcmV0dXJuIF9fbjsKK30KKwordGVtcGxhdGUgPCBjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9NYXhfQ2hhcnMsIGNsYXNzIF9Jc19EZWxpbSwgY2xhc3MgX1NjYW5fRGVsaW0+CitzdHJlYW1zaXplIF9TVExQX0NBTEwKK19NX2lnbm9yZV9idWZmZXJlZChiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4qIF9fdGhhdCwKKyAgICAgICAgICAgICAgICAgICBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19idWYsCisgICAgICAgICAgICAgICAgICAgc3RyZWFtc2l6ZSBfTnVtLAorICAgICAgICAgICAgICAgICAgIF9NYXhfQ2hhcnMgX19tYXhfY2hhcnMsCisgICAgICAgICAgICAgICAgICAgX0lzX0RlbGltIF9faXNfZGVsaW0sIF9TY2FuX0RlbGltIF9fc2Nhbl9kZWxpbSwKKyAgICAgICAgICAgICAgICAgICBib29sIF9fZXh0cmFjdF9kZWxpbSwgYm9vbCBfX3NldF9mYWlsYml0KSB7CisgIHN0cmVhbXNpemUgX19uID0gMDsKKyAgYm9vbCBfX2F0X2VvZiA9IGZhbHNlOworICBib29sIF9fZG9uZSAgID0gZmFsc2U7CisKKyAgX1NUTFBfVFJZIHsKKyAgICB3aGlsZSAoX19idWYtPl9NX2VncHRyKCkgIT0gX19idWYtPl9NX2dwdHIoKSAmJiAhX19kb25lKSB7CisgICAgICBwdHJkaWZmX3QgX19hdmFpbCA9IF9fYnVmLT5fTV9lZ3B0cigpIC0gX19idWYtPl9NX2dwdHIoKTsKKyAgICAgIHN0cmVhbXNpemUgX19tID0gX19tYXhfY2hhcnMoX051bSwgX19uKTsKKworICAgICAgaWYgKF9fYXZhaWwgPj0gX19tKSB7ICAgICAgIC8vIFdlIGhhdmUgbW9yZSBjaGFyYWN0ZXJzIHRoYW4gd2UgbmVlZC4KKyAgICAgICAgY29uc3QgX0NoYXJUKiBfX2xhc3QgPSBfX2J1Zi0+X01fZ3B0cigpICsgX19TVEFUSUNfQ0FTVChwdHJkaWZmX3QsIF9fbSk7CisgICAgICAgIGNvbnN0IF9DaGFyVCogX19wID0gX19zY2FuX2RlbGltKF9fYnVmLT5fTV9ncHRyKCksIF9fbGFzdCk7CisgICAgICAgIHB0cmRpZmZfdCBfX2NodW5rID0gX19wIC0gX19idWYtPl9NX2dwdHIoKTsKKyAgICAgICAgX19uICs9IF9fY2h1bms7CisgICAgICAgIF9fYnVmLT5fTV9nYnVtcCgoaW50KV9fY2h1bmspOworCisgICAgICAgIGlmIChfX2V4dHJhY3RfZGVsaW0gJiYgX19wICE9IF9fbGFzdCkgeworICAgICAgICAgIF9fbiArPSAxOworICAgICAgICAgIF9fYnVmLT5fTV9nYnVtcCgxKTsKKyAgICAgICAgfQorCisgICAgICAgIF9fZG9uZSA9IHRydWU7CisgICAgICB9CisKKyAgICAgIGVsc2UgeworICAgICAgICBjb25zdCBfQ2hhclQqIF9fcCA9IF9fc2Nhbl9kZWxpbShfX2J1Zi0+X01fZ3B0cigpLCBfX2J1Zi0+X01fZWdwdHIoKSk7CisgICAgICAgIHB0cmRpZmZfdCBfX2NodW5rID0gX19wIC0gX19idWYtPl9NX2dwdHIoKTsKKyAgICAgICAgX19uICs9IF9fY2h1bms7CisgICAgICAgIF9fYnVmLT5fTV9nYnVtcCgoaW50KV9fY2h1bmspOworCisgICAgICAgIGlmIChfX3AgIT0gX19idWYtPl9NX2VncHRyKCkpIHsgLy8gV2UgZm91bmQgZGVsaW0uCisgICAgICAgICAgaWYgKF9fZXh0cmFjdF9kZWxpbSkgeworICAgICAgICAgICAgX19uICs9IDE7CisgICAgICAgICAgICBfX2J1Zi0+X01fZ2J1bXAoMSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgX19kb25lID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFdlIGRpZG4ndCBmaW5kIGRlbGltLiAgVHJ5IHRvIHJlZmlsbCB0aGUgYnVmZmVyLgorICAgICAgICBlbHNlIGlmIChfX3RoYXQtPl9TX2VvZihfX2J1Zi0+c2dldGMoKSkpIHsKKyAgICAgICAgICBfX2RvbmUgICA9IHRydWU7CisgICAgICAgICAgX19hdF9lb2YgPSB0cnVlOworICAgICAgICB9CisgICAgICB9CisgICAgfSAvLyBDbG9zZSB0aGUgd2hpbGUgbG9vcC4KKyAgfQorICBfU1RMUF9DQVRDSF9BTEwgeworICAgIF9fdGhhdC0+X01faGFuZGxlX2V4Y2VwdGlvbihpb3NfYmFzZTo6YmFkYml0KTsKKyAgICByZXR1cm4gX19uOworICB9CisKKyAgaWYgKF9fYXRfZW9mKQorICAgIF9fdGhhdC0+c2V0c3RhdGUoX19zZXRfZmFpbGJpdCA/IGlvc19iYXNlOjplb2ZiaXQgfCBpb3NfYmFzZTo6ZmFpbGJpdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGlvc19iYXNlOjplb2ZiaXQpOworCisgIGlmIChfX2RvbmUpCisgICAgcmV0dXJuIF9fbjsKKworICAvLyBJZiBleGVjdXRpb24gaGFzIHJlYWNoZWQgdGhpcyBwb2ludCwgdGhlbiB3ZSBoYXZlIGFuIGVtcHR5IGJ1ZmZlciBidXQKKyAgLy8gd2UgaGF2ZSBub3QgcmVhY2hlZCBlb2YuICBXaGF0IHRoYXQgbWVhbnMgaXMgdGhhdCB0aGUgc3RyZWFtYnVmIGhhcworICAvLyBkZWNpZGVkIHRvIHN3aXRjaCBmcm9tIGJ1ZmZlcmVkIHRvIHVuYnVmZmVyZWQgaW5wdXQuICBXZSBzd2l0Y2ggdG8KKyAgLy8gdG8gX01faWdub3JlX3VuYnVmZmVyZWQuCisKKyAgcmV0dXJuIF9fbiArIF9NX2lnbm9yZV91bmJ1ZmZlcmVkKF9fdGhhdCwgIF9fYnVmLCBfTnVtLCBfX21heF9jaGFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faXNfZGVsaW0sIF9fZXh0cmFjdF9kZWxpbSwgX19zZXRfZmFpbGJpdCk7Cit9CisKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6aWdub3JlKHN0cmVhbXNpemUgX19uKSB7CisgIHNlbnRyeSBfX3NlbnRyeSgqdGhpcywgX05vX1NraXBfV1MoKSk7CisgIHRoaXMtPl9NX2djb3VudCA9IDA7CisKKyAgaWYgKF9fc2VudHJ5KSB7CisgICAgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fYnVmID0gdGhpcy0+cmRidWYoKTsKKyAgICB0eXBlZGVmIF9TVExQX1BSSVYgX0NvbnN0YW50X3VuYXJ5X2Z1bjxib29sLCBpbnRfdHlwZT4gX0NvbnN0X2Jvb2w7CisgICAgdHlwZWRlZiBfU1RMUF9QUklWIF9Db25zdGFudF9iaW5hcnlfZnVuPHN0cmVhbXNpemUsIHN0cmVhbXNpemUsIHN0cmVhbXNpemU+IF9Db25zdF9zdHJlYW1zaXplOworICAgIGNvbnN0IHN0cmVhbXNpemUgX19tYXhzcyA9IChudW1lcmljX2xpbWl0czxzdHJlYW1zaXplPjo6bWF4KSgpOworCisgICAgaWYgKF9fbiA9PSAobnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KSgpKSB7CisgICAgICBpZiAoX19idWYtPmdwdHIoKSAhPSBfX2J1Zi0+ZWdwdHIoKSkKKyAgICAgICAgX01fZ2NvdW50ID0gX01faWdub3JlX2J1ZmZlcmVkKHRoaXMsICBfX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbWF4c3MsIF9Db25zdF9zdHJlYW1zaXplKF9fbWF4c3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NvbnN0X2Jvb2woZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfUHJvamVjdDJuZDxjb25zdCBfQ2hhclQqLCBjb25zdCBfQ2hhclQqPigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlKTsKKyAgICAgIGVsc2UKKyAgICAgICAgX01fZ2NvdW50ID0gX01faWdub3JlX3VuYnVmZmVyZWQodGhpcywgIF9fYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX21heHNzLCBfQ29uc3Rfc3RyZWFtc2l6ZShfX21heHNzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NvbnN0X2Jvb2woZmFsc2UpLCBmYWxzZSwgZmFsc2UpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGlmIChfX2J1Zi0+Z3B0cigpICE9IF9fYnVmLT5lZ3B0cigpKQorICAgICAgICBfTV9nY291bnQgPSBfTV9pZ25vcmVfYnVmZmVyZWQodGhpcywgIF9fYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19uLCBtaW51czxzdHJlYW1zaXplPigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NvbnN0X2Jvb2woZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfUHJvamVjdDJuZDxjb25zdCBfQ2hhclQqLCBjb25zdCBfQ2hhclQqPigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlKTsKKyAgICAgIGVsc2UKKyAgICAgICAgX01fZ2NvdW50ID0gX01faWdub3JlX3VuYnVmZmVyZWQodGhpcywgIF9fYnVmLCBfX24sIG1pbnVzPHN0cmVhbXNpemU+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Db25zdF9ib29sKGZhbHNlKSwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Omlnbm9yZShzdHJlYW1zaXplIF9fbiwgaW50X3R5cGUgX19kZWxpbSkgeworICBzZW50cnkgX19zZW50cnkoKnRoaXMsIF9Ob19Ta2lwX1dTKCkpOworICB0aGlzLT5fTV9nY291bnQgPSAwOworCisgIGlmIChfX3NlbnRyeSkgeworICAgIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX2J1ZiA9IHRoaXMtPnJkYnVmKCk7CisgICAgdHlwZWRlZiBfU1RMUF9QUklWIF9Db25zdGFudF91bmFyeV9mdW48Ym9vbCwgaW50X3R5cGU+IF9Db25zdF9ib29sOworICAgIHR5cGVkZWYgX1NUTFBfUFJJViBfQ29uc3RhbnRfYmluYXJ5X2Z1bjxzdHJlYW1zaXplLCBzdHJlYW1zaXplLCBzdHJlYW1zaXplPgorICAgICAgX0NvbnN0X3N0cmVhbXNpemU7CisgICAgY29uc3Qgc3RyZWFtc2l6ZSBfX21heHNzID0gKG51bWVyaWNfbGltaXRzPHN0cmVhbXNpemU+OjptYXgpKCk7CisKKyAgICBpZiAoX19uID09IChudW1lcmljX2xpbWl0czxpbnQ+OjptYXgpKCkpIHsKKyAgICAgIGlmIChfX2J1Zi0+Z3B0cigpICE9IF9fYnVmLT5lZ3B0cigpKQorICAgICAgICBfTV9nY291bnQgPSBfTV9pZ25vcmVfYnVmZmVyZWQodGhpcywgIF9fYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tYXhzcywgX0NvbnN0X3N0cmVhbXNpemUoX19tYXhzcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9FcV9pbnRfYm91bmQ8X1RyYWl0cz4oX19kZWxpbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9TY2FuX2Zvcl9pbnRfdmFsPF9UcmFpdHM+KF9fZGVsaW0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgZmFsc2UpOworICAgICAgZWxzZQorICAgICAgICBfTV9nY291bnQgPSBfTV9pZ25vcmVfdW5idWZmZXJlZCh0aGlzLCAgX19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbWF4c3MsIF9Db25zdF9zdHJlYW1zaXplKF9fbWF4c3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9FcV9pbnRfYm91bmQ8X1RyYWl0cz4oX19kZWxpbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIGZhbHNlKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBpZiAoX19idWYtPmdwdHIoKSAhPSBfX2J1Zi0+ZWdwdHIoKSkKKyAgICAgICAgX01fZ2NvdW50ID0gX01faWdub3JlX2J1ZmZlcmVkKHRoaXMsICBfX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbiwgbWludXM8c3RyZWFtc2l6ZT4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX0VxX2ludF9ib3VuZDxfVHJhaXRzPihfX2RlbGltKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX1NjYW5fZm9yX2ludF92YWw8X1RyYWl0cz4oX19kZWxpbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCBmYWxzZSk7CisgICAgICBlbHNlCisgICAgICAgIF9NX2djb3VudCA9IF9NX2lnbm9yZV91bmJ1ZmZlcmVkKHRoaXMsICBfX2J1ZiwgX19uLCBtaW51czxzdHJlYW1zaXplPigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9FcV9pbnRfYm91bmQ8X1RyYWl0cz4oX19kZWxpbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIGZhbHNlKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gKnRoaXM7Cit9CisKKy8vIFRoaXMgbWVtYmVyIGZ1bmN0aW9uIGRvZXMgbm90IGNvbnN0cnVjdCBhIHNlbnRyeSBvYmplY3QsIGJlY2F1c2UKKy8vIGl0IGlzIGNhbGxlZCBmcm9tIHNlbnRyeSdzIGNvbnN0cnVjdG9yLgordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK3ZvaWQgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpfTV9za2lwX3doaXRlc3BhY2UoYm9vbCBfX3NldF9mYWlsYml0KSB7CisgIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX2J1ZiA9IHRoaXMtPnJkYnVmKCk7CisgIGlmICghX19idWYpCisgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CisgIGVsc2UgaWYgKF9fYnVmLT5ncHRyKCkgIT0gX19idWYtPmVncHRyKCkpCisgICAgX01faWdub3JlX2J1ZmZlcmVkKHRoaXMsICBfX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfSXNfbm90X3dzcGFjZTxfVHJhaXRzPihfX1NUQVRJQ19DQVNUKGNvbnN0IGN0eXBlPF9DaGFyVD4qLCB0aGlzLT5fTV9jdHlwZV9mYWNldCgpKSksCisgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX1NjYW5fZm9yX25vdF93c3BhY2U8X1RyYWl0cz4oX19TVEFUSUNfQ0FTVChjb25zdCBjdHlwZTxfQ2hhclQ+KiwgdGhpcy0+X01fY3R5cGVfZmFjZXQoKSkpLAorICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgX19zZXRfZmFpbGJpdCk7CisgIGVsc2UKKyAgICBfTV9pZ25vcmVfdW5idWZmZXJlZCh0aGlzLCAgX19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfSXNfbm90X3dzcGFjZTxfVHJhaXRzPihfX1NUQVRJQ19DQVNUKGNvbnN0IGN0eXBlPF9DaGFyVD4qLCB0aGlzLT5fTV9jdHlwZV9mYWNldCgpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIF9fc2V0X2ZhaWxiaXQpOworfQorCisKKy8vIFRoaXMgaXMgYSB2ZXJ5IHNpbXBsZSBsb29wIHRoYXQgcmVhZHMgY2hhcmFjdGVycyBmcm9tIF9fc3JjIGFuZCBwdXRzCisvLyB0aGVtIGludG8gX19kZXN0LiAgSXQgbG9va3MgY29tcGxpY2F0ZWQgYmVjYXVzZSBvZiB0aGUgKHN0YW5kYXJkLQorLy8gbWFuZGF0ZWQpIGV4Y2VwdGlvbiBoYW5kbGluZyBwb2xpY3kuCisvLworLy8gV2Ugc3RvcCB3aGVuIHdlIGdldCBhbiBleGNlcHRpb24sIHdoZW4gd2UgZmFpbCB0byBpbnNlcnQgaW50byB0aGUKKy8vIG91dHB1dCBzdHJlYW1idWYsIG9yIHdoZW4gX19pc19kZWxpbSBpcyB0cnVlLgorCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDwgY2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfSXNfRGVsaW0+CitzdHJlYW1zaXplIF9TVExQX0NBTEwKK19fY29weV91bmJ1ZmZlcmVkKGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiogX190aGF0LCBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19zcmMsCisgICAgICAgICAgICAgICAgICBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19kZXN0LAorICAgICAgICAgICAgICAgICAgX0lzX0RlbGltIF9faXNfZGVsaW0sCisgICAgICAgICAgICAgICAgICBib29sIF9fZXh0cmFjdF9kZWxpbSwgYm9vbCBfX3JldGhyb3cpIHsKKyAgc3RyZWFtc2l6ZSBfX2V4dHJhY3RlZCA9IDA7CisgIGlvc19iYXNlOjppb3N0YXRlIF9fc3RhdHVzID0gMDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OmludF90eXBlIGludF90eXBlOworICBpbnRfdHlwZSBfX2M7CisKKyAgX1NUTFBfVFJZIHsKKyAgICBmb3IgKDs7KSB7CisgICAgICAvLyBHZXQgYSBjaGFyYWN0ZXIuIElmIHRoZXJlJ3MgYW4gZXhjZXB0aW9uLCBjYXRjaCBhbmQgKG1heWJlKSByZXRocm93IGl0LgorICAgICAgX19jID0gX19zcmMtPnNidW1wYygpOworCisgICAgICAvLyBJZiB3ZSBmYWlsZWQgdG8gZ2V0IGEgY2hhcmFjdGVyLCB0aGVuIHF1aXQuCisgICAgICBpZiAoX190aGF0LT5fU19lb2YoX19jKSkgeworICAgICAgICBfX3N0YXR1cyB8PSBpb3NfYmFzZTo6ZW9mYml0OworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIC8vIElmIGl0J3MgdGhlIGRlbGltaXRlciwgdGhlbiBxdWl0LgorICAgICAgZWxzZSBpZiAoX19pc19kZWxpbShfVHJhaXRzOjp0b19jaGFyX3R5cGUoX19jKSkpIHsKKyAgICAgICAgaWYgKCFfX2V4dHJhY3RfZGVsaW0gJiYgIV9fcHVzaGJhY2soX19zcmMsIF9UcmFpdHM6OnRvX2NoYXJfdHlwZShfX2MpKSkKKyAgICAgICAgICBfX3N0YXR1cyB8PSBpb3NfYmFzZTo6ZmFpbGJpdDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgLy8gVHJ5IHRvIHB1dCB0aGUgY2hhcmFjdGVyIGluIHRoZSBvdXRwdXQgc3RyZWFtYnVmLgorICAgICAgICBib29sIF9fZmFpbGVkID0gZmFsc2U7CisgICAgICAgIF9TVExQX1RSWSB7CisgICAgICAgICAgaWYgKCFfX3RoYXQtPl9TX2VvZihfX2Rlc3QtPnNwdXRjKF9UcmFpdHM6OnRvX2NoYXJfdHlwZShfX2MpKSkpCisgICAgICAgICAgICArK19fZXh0cmFjdGVkOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9fZmFpbGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBfU1RMUF9DQVRDSF9BTEwgeworICAgICAgICAgIF9fZmFpbGVkID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIHdlIGZhaWxlZCB0byBwdXQgdGhlIGNoYXJhY3RlciBpbiB0aGUgb3V0cHV0IHN0cmVhbWJ1ZiwgdGhlbgorICAgICAgICAvLyB0cnkgdG8gcHVzaCBpdCBiYWNrIHRvIHRoZSBpbnB1dCBzdHJlYW1idWYuCisgICAgICAgIGlmIChfX2ZhaWxlZCAmJiAhX19wdXNoYmFjayhfX3NyYywgX1RyYWl0czo6dG9fY2hhcl90eXBlKF9fYykpKQorICAgICAgICAgIF9fc3RhdHVzIHw9IGlvc19iYXNlOjpmYWlsYml0OworCisgICAgICAgIC8vIGZicCA6IGF2b2lkaW5nIGluZmluaXRlIGxvb3AgaW4gaW8tMjctNi0xLTItMy5leHAKKyAgICAgICAgaWYgKF9fZmFpbGVkKQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgfSAvKiBmb3IgKDs7KSAqLworCisgIH0KKyAgLy8gZmJwIDogdGhpcyB0cnkvY2F0Y2ggbW92ZWQgaGVyZSBpbiByZWFzb25hYmxlIGFzc3VtcHRpb24KKyAgLy8gX19pc19kZWxpbSBuZXZlciB0aHJvdyAoX19wdXNoYmFjayBpcyBndWFyYW50ZWVkIG5vdCB0bykKKyAgX1NUTFBfQ0FUQ0hfQUxMIHsKKyAgICAvLyBTZWUgMjcuNi4xLjIuMywgcGFyYWdyYXBoIDEzLgorICAgIGlmIChfX3JldGhyb3cgJiYgX19leHRyYWN0ZWQgPT0gMCkKKyAgICAgIF9fdGhhdC0+X01faGFuZGxlX2V4Y2VwdGlvbihpb3NfYmFzZTo6ZmFpbGJpdCk7CisgIH0KKyAgX190aGF0LT5zZXRzdGF0ZShfX3N0YXR1cyk7CisgIHJldHVybiBfX2V4dHJhY3RlZDsKK30KKworLy8gQnVmZmVyZWQgY29weWluZyBmcm9tIG9uZSBzdHJlYW1idWYgdG8gYW5vdGhlci4gIFdlIGNvcHkgdGhlIGNoYXJhY3RlcnMKKy8vIGluIGNodW5rcywgcmF0aGVyIHRoYW4gb25lIGF0IGEgdGltZS4gIFdlIHN0aWxsIGhhdmUgdG8gd29ycnkgYWJvdXQgYWxsCisvLyBvZiB0aGUgZXJyb3IgY29uZGl0aW9ucyB3ZSBjaGVja2VkIGluIF9fY29weV91bmJ1ZmZlcmVkLCBwbHVzIG9uZSBtb3JlOgorLy8gdGhlIHN0cmVhbWJ1ZiBtaWdodCBkZWNpZGUgdG8gc3dpdGNoIGZyb20gYSBidWZmZXJlZCB0byBhbiB1bmJ1ZmZlcmVkIG1vZGUuCisKK3RlbXBsYXRlIDwgY2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfSXNfRGVsaW0sIGNsYXNzIF9TY2FuX0RlbGltPgorc3RyZWFtc2l6ZSBfU1RMUF9DQUxMCitfX2NvcHlfYnVmZmVyZWQoYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+KiBfX3RoYXQsIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX3NyYywKKyAgICAgICAgICAgICAgICBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19kZXN0LAorICAgICAgICAgICAgICAgIF9TY2FuX0RlbGltIF9fc2Nhbl9kZWxpbSwgX0lzX0RlbGltIF9faXNfZGVsaW0sCisgICAgICAgICAgICAgICAgYm9vbCBfX2V4dHJhY3RfZGVsaW0sIGJvb2wgX19yZXRocm93KSB7CisgIHN0cmVhbXNpemUgX19leHRyYWN0ZWQgPSAwOworICBpb3NfYmFzZTo6aW9zdGF0ZSBfX3N0YXR1cyA9IDA7CisgIHR5cGVkZWYgdHlwZW5hbWUgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjppbnRfdHlwZSBpbnRfdHlwZTsKKyAgLy9Cb3JsYW5kIGNvbXBpbGVyIGdlbmVyYXRlcyBhIHdhcm5pbmcgaWYgYXNzaWdubWVudCBiZWNhdXNlIHZhbHVlIGlzIG5ldmVyIHVzZWQ6CisgIGludF90eXBlIF9fYyAvKj0gX1RyYWl0czo6ZW9mKCkqLzsKKyAgX0NoYXJUKiBfX2ZpcnN0ID0gX19zcmMtPl9NX2dwdHIoKTsKKyAgcHRyZGlmZl90IF9fYXZhaWwgPSBfX3NyYy0+X01fZWdwdHIoKSAtIF9fZmlyc3Q7CisgIC8vIGZicCA6IGludHJvZHVjZWQgdG8gbW92ZSBjYXRjaC90cnkgYmxvY2tzIG91dCBvZiB0aGUgbG9vcAorICBib29sIF9fZG9faGFuZGxlX2V4Y2VwdGlvbnMgPSBmYWxzZTsKKworICBfU1RMUF9UUlkgeworICAgIGZvciAoOzspIHsKKyAgICAgIGNvbnN0IF9DaGFyVCogX19sYXN0ID0gX19zY2FuX2RlbGltKF9fZmlyc3QsIF9fc3JjLT5fTV9lZ3B0cigpKTsKKworICAgICAgLy8gVHJ5IHRvIGNvcHkgdGhlIGVudGlyZSBpbnB1dCBidWZmZXIgdG8gdGhlIG91dHB1dCBidWZmZXIuCisgICAgICBzdHJlYW1zaXplIF9fbiA9IF9fZGVzdC0+c3B1dG4oX19maXJzdCwgX19leHRyYWN0X2RlbGltICYmIF9fbGFzdCAhPSBfX3NyYy0+X01fZWdwdHIoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKF9fbGFzdCAtIF9fZmlyc3QpICsgMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKF9fbGFzdCAtIF9fZmlyc3QpKTsKKyAgICAgIF9fc3JjLT5fTV9nYnVtcCgoaW50KV9fbik7CisgICAgICBfX2V4dHJhY3RlZCArPSBfX247CisKKyAgICAgIC8vIGZyb20gdGhpcyBvbiwgY2F0Y2goKSB3aWxsIGNhbGwgX01faGFuZGxlX2V4Y2VwdGlvbnMoKQorICAgICAgX19kb19oYW5kbGVfZXhjZXB0aW9ucyA9IHRydWU7CisKKyAgICAgIGlmIChfX24gPCBfX2F2YWlsKSAgICAgICAgICAvLyBXZSBmb3VuZCB0aGUgZGVsaW1pdGVyLCBvciBlbHNlIGZhaWxlZCB0bworICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgc29tZSBjaGFyYWN0ZXJzLgorCisgICAgICBfX2MgPSBfX3NyYy0+c2dldGMoKTsKKworICAgICAgLy8gVGhyZWUgcG9zc2liaWxpdGllczogd2Ugc3VjY2VlZGVkIGluIHJlZmlsbGluZyB0aGUgYnVmZmVyLCBvcgorICAgICAgLy8gd2UgZ290IEVPRiwgb3IgdGhlIHN0cmVhbWJ1ZiBoYXMgc3dpdGNoZWQgdG8gdW5idWZmZXJlZCBtb2RlLgorICAgICAgX19maXJzdCA9IF9fc3JjLT5fTV9ncHRyKCk7CisgICAgICBfX2F2YWlsID0gX19zcmMtPl9NX2VncHRyKCkgLSBfX2ZpcnN0OworCisgICAgICBpZiAoX19hdmFpbCA+IDApCisgICAgICAgIHt9ICAvLyBkd2EgMS8xNi8wMCAtLSBzdXBwcmVzcyBhIE1ldHJvd2Vya3Mgd2FybmluZworICAgICAgZWxzZSBpZiAoX190aGF0LT5fU19lb2YoX19jKSkgeworICAgICAgICBfX3N0YXR1cyB8PSBpb3NfYmFzZTo6ZW9mYml0OworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICByZXR1cm4gX19leHRyYWN0ZWQgKyBfX2NvcHlfdW5idWZmZXJlZChfX3RoYXQsICBfX3NyYywgX19kZXN0LCBfX2lzX2RlbGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19leHRyYWN0X2RlbGltLCBfX3JldGhyb3cpOworICAgICAgfQorCisgICAgICBfX2RvX2hhbmRsZV9leGNlcHRpb25zID0gZmFsc2U7CisgICAgfQorICB9CisKKyAgX1NUTFBfQ0FUQ0hfQUxMIHsKKyAgICAvLyBTZWUgMjcuNi4xLjIuMywgcGFyYWdyYXBoIDEzLgorICAgIGlmIChfX3JldGhyb3cgJiYgX19kb19oYW5kbGVfZXhjZXB0aW9ucyAmJiAgX19leHRyYWN0ZWQgPT0gMCkKKyAgICAgIF9fdGhhdC0+X01faGFuZGxlX2V4Y2VwdGlvbihpb3NfYmFzZTo6ZmFpbGJpdCk7CisgIH0KKworICBpZiAoX19zdGF0dXMpCisgICAgX190aGF0LT5zZXRzdGF0ZShfX3N0YXR1cyk7ICAgLy8gVGhpcyBtaWdodCB0aHJvdy4KKyAgcmV0dXJuIF9fZXh0cmFjdGVkOworfQorCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPgorICA6OmdldChiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiYgX19kZXN0LCBfQ2hhclQgX19kZWxpbSkgeworICBzZW50cnkgX19zZW50cnkoKnRoaXMsIF9Ob19Ta2lwX1dTKCkpOworICB0aGlzLT5fTV9nY291bnQgPSAwOworCisgIGlmIChfX3NlbnRyeSkgeworICAgIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX3NyYyA9IHRoaXMtPnJkYnVmKCk7CisKKyAgICBpZiAoX19zcmMpCisgICAgICB0aGlzLT5fTV9nY291bnQgPSBfX3NyYy0+ZWdwdHIoKSAhPSBfX3NyYy0+Z3B0cigpCisgICAgICAgID8gX1NUTFBfUFJJViBfX2NvcHlfYnVmZmVyZWQodGhpcywgIF9fc3JjLCAmX19kZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX1NjYW5fZm9yX2NoYXJfdmFsPF9UcmFpdHM+KF9fZGVsaW0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX0VxX2NoYXJfYm91bmQ8X1RyYWl0cz4oX19kZWxpbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlKQorICAgICAgICA6IF9TVExQX1BSSVYgX19jb3B5X3VuYnVmZmVyZWQodGhpcywgIF9fc3JjLCAmX19kZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfRXFfY2hhcl9ib3VuZDxfVHJhaXRzPihfX2RlbGltKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSk7CisgIH0KKworICBpZiAodGhpcy0+X01fZ2NvdW50ID09IDApCisgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworCisgIHJldHVybiAqdGhpczsKK30KKworLy8gQ29weWluZyBjaGFyYWN0ZXJzIGludG8gYSBzdHJlYW1idWYuCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+CisgIDo6b3BlcmF0b3I+PihiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19kZXN0KSB7CisgIHN0cmVhbXNpemUgX19uID0gMDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OnNlbnRyeSBfU2VudHJ5OworICBfU2VudHJ5IF9fc2VudHJ5KCp0aGlzKTsKKyAgaWYgKF9fc2VudHJ5KSB7CisgICAgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fc3JjID0gdGhpcy0+cmRidWYoKTsKKyAgICBpZiAoX19zcmMgJiYgX19kZXN0KQorICAgICAgX19uID0gX19zcmMtPmVncHRyKCkgIT0gX19zcmMtPmdwdHIoKQorICAgICAgICA/IF9TVExQX1BSSVYgX19jb3B5X2J1ZmZlcmVkKHRoaXMsICBfX3NyYywgX19kZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX1Byb2plY3QybmQ8Y29uc3QgX0NoYXJUKiwgY29uc3QgX0NoYXJUKj4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9Db25zdGFudF91bmFyeV9mdW48Ym9vbCwgaW50X3R5cGU+KGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgdHJ1ZSkKKyAgICAgICAgOiBfU1RMUF9QUklWIF9fY29weV91bmJ1ZmZlcmVkKHRoaXMsICBfX3NyYywgX19kZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfQ29uc3RhbnRfdW5hcnlfZnVuPGJvb2wsIGludF90eXBlPihmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgdHJ1ZSk7CisgIH0KKworICBpZiAoX19uID09IDApCisgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworCisgIHJldHVybiAqdGhpczsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gYmFzaWNfaW9zdHJlYW08PiBjbGFzcworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfaW9zdHJlYW08X0NoYXJULCBfVHJhaXRzPgorICA6OmJhc2ljX2lvc3RyZWFtKGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX2J1ZikKKyAgICA6IGJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+KCksCisgICAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4oX19idWYpLAorICAgICAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+KF9fYnVmKSB7CisgIHRoaXMtPmluaXQoX19idWYpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfaW9zdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6fmJhc2ljX2lvc3RyZWFtKCkKK3t9CisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI3VuZGVmIF9fQklTX2ludF90eXBlX18KKyN1bmRlZiBfX0JJU19wb3NfdHlwZV9fCisjdW5kZWYgX19CSVNfb2ZmX3R5cGVfXworCisjZW5kaWYgLyogX1NUTFBfSVNUUkVBTV9DICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvX2lzdHJlYW0uaCBiL3N0bC9faXN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyOTJjY2UKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvX2lzdHJlYW0uaApAQCAtMCwwICsxLDM2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfSVNUUkVBTQorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9JU1RSRUFNCisKKy8vIHRoaXMgYmxvY2sgaXMgaW5jbHVkZWQgYnkgX29zdHJlYW0uaCwgd2UgaW5jbHVkZSBpdCBoZXJlIHRvIGxvd2VyICNpbmNsdWRlIGxldmVsCisjaWYgZGVmaW5lZCAoX1NUTFBfSEFTX1dDSEFSX1QpICYmICFkZWZpbmVkIChfU1RMUF9JTlRFUk5BTF9DV0NIQVIpCisjICBpbmNsdWRlIDxzdGwvX2N3Y2hhci5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfSU9TX0gKKyMgIGluY2x1ZGUgPHN0bC9faW9zLmg+ICAgICAgICAgICAgICAgICAgLy8gRm9yIGJhc2ljX2lvczw+LiAgSW5jbHVkZXMgPGlvc2Z3ZD4uCisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9PU1RSRUFNX0gKKyMgIGluY2x1ZGUgPHN0bC9fb3N0cmVhbS5oPiAgICAgICAgICAgICAgLy8gTmVlZGVkIGFzIGEgYmFzZSBjbGFzcyBvZiBiYXNpY19pb3N0cmVhbS4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0lTVFJFQU1CVUZfSVRFUkFUT1JfSAorIyAgaW5jbHVkZSA8c3RsL19pc3RyZWFtYnVmX2l0ZXJhdG9yLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0bC9fY3RyYWl0c19mbnMuaD4gICAgLy8gSGVscGVyIGZ1bmN0aW9ucyB0aGF0IGFsbG93IGNoYXIgdHJhaXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGJlIHVzZWQgYXMgZnVuY3Rpb24gb2JqZWN0cy4KK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCkKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitjbGFzcyBfSXNlbnRyeTsKKyNlbmRpZgorCitzdHJ1Y3QgX05vX1NraXBfV1Mge307ICAgICAgICAvLyBEdW1teSBjbGFzcyB1c2VkIGJ5IHNlbnRyeS4KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jvb2wgX01faW5pdF9za2lwKGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pc3RyKTsKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Citib29sIF9NX2luaXRfbm9za2lwKGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pc3RyKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDbGFzcyBiYXNpY19pc3RyZWFtLCBhIGNsYXNzIHRoYXQgcGVyZm9ybXMgZm9ybWF0dGVkIGlucHV0IHRocm91Z2gKKy8vIGEgc3RyZWFtIGJ1ZmZlci4KKworLy8gVGhlIHNlY29uZCB0ZW1wbGF0ZSBwYXJhbWV0ZXIsIF9UcmFpdHMsIGRlZmF1bHRzIHRvIGNoYXJfdHJhaXRzPF9DaGFyVD4uCisvLyBUaGUgZGVmYXVsdCBpcyBkZWNsYXJlZCBpbiBoZWFkZXIgPGlvc2Z3ZD4sIGFuZCBpdCBpc24ndCBkZWNsYXJlZCBoZXJlCisvLyBiZWNhdXNlIEMrKyBsYW5ndWFnZSBydWxlcyBkbyBub3QgYWxsb3cgaXQgdG8gYmUgZGVjbGFyZWQgdHdpY2UuCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitjbGFzcyBiYXNpY19pc3RyZWFtIDogdmlydHVhbCBwdWJsaWMgYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz4geworICB0eXBlZGVmIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiBfU2VsZjsKKworI2lmIGRlZmluZWQgKF9TVExQX01TVkMpICYmIChfU1RMUF9NU1ZDID49IDEzMDAgJiYgX1NUTFBfTVNWQyA8PSAxMzEwKQorICAvL2V4cGxpY2l0ZWx5IGRlZmluZWQgYXMgcHJpdmF0ZSB0byBhdm9pZCB3YXJuaW5nczoKKyAgYmFzaWNfaXN0cmVhbShfU2VsZiBjb25zdCYpOworICBfU2VsZiYgb3BlcmF0b3IgPSAoX1NlbGYgY29uc3QmKTsKKyNlbmRpZgorCitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHlwZXMKKyAgdHlwZWRlZiBfQ2hhclQgICAgICAgICAgICAgICAgICAgICBjaGFyX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6aW50X3R5cGUgaW50X3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6cG9zX3R5cGUgcG9zX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6b2ZmX3R5cGUgb2ZmX3R5cGU7CisgIHR5cGVkZWYgX1RyYWl0cyAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3R5cGU7CisgIHR5cGVkZWYgYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz4gICAgIF9CYXNpY19pb3M7CisKKyAgdHlwZWRlZiBiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPiYgKF9TVExQX0NBTEwgKl9faW9zX2ZuKShiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPiYpOworICB0eXBlZGVmIGlvc19iYXNlJiAoX1NUTFBfQ0FMTCAqX19pb3NfYmFzZV9mbikoaW9zX2Jhc2UmKTsKKyAgdHlwZWRlZiBfU2VsZiYgKF9TVExQX0NBTEwgKl9faXN0cmVhbV9mbikoX1NlbGYmKTsKKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3Rvci4KKyAgZXhwbGljaXQgYmFzaWNfaXN0cmVhbShiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19idWYpIDoKKyAgICBiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPigpLCBfTV9nY291bnQoMCkgeworICAgIHRoaXMtPmluaXQoX19idWYpOworICB9CisgIH5iYXNpY19pc3RyZWFtKCkge307CisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmVzdGVkIHNlbnRyeSBjbGFzcy4KKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIb29rcyBmb3IgbWFuaXB1bGF0b3JzLiAgVGhlIGFyZ3VtZW50cyBhcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnVuY3Rpb24gcG9pbnRlcnMuCisgIF9TZWxmJiBvcGVyYXRvcj4+IChfX2lzdHJlYW1fZm4gX19mKSB7IHJldHVybiBfX2YoKnRoaXMpOyB9CisgIF9TZWxmJiBvcGVyYXRvcj4+IChfX2lvc19mbiBfX2YpIHsgIF9fZigqdGhpcyk7IHJldHVybiAqdGhpczsgfQorICBfU2VsZiYgb3BlcmF0b3I+PiAoX19pb3NfYmFzZV9mbiBfX2YpIHsgX19mKCp0aGlzKTsgcmV0dXJuICp0aGlzOyB9CisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9ybWF0dGVkIGlucHV0IG9mIG51bWJlcnMuCisgIF9TZWxmJiBvcGVyYXRvcj4+IChzaG9ydCYgX192YWwpOworICBfU2VsZiYgb3BlcmF0b3I+PiAoaW50JiBfX3ZhbCk7CisgIF9TZWxmJiBvcGVyYXRvcj4+ICh1bnNpZ25lZCBzaG9ydCYgX192YWwpOworICBfU2VsZiYgb3BlcmF0b3I+PiAodW5zaWduZWQgaW50JiBfX3ZhbCk7CisgIF9TZWxmJiBvcGVyYXRvcj4+IChsb25nJiBfX3ZhbCk7CisgIF9TZWxmJiBvcGVyYXRvcj4+ICh1bnNpZ25lZCBsb25nJiBfX3ZhbCk7CisjaWZkZWYgX1NUTFBfTE9OR19MT05HCisgIF9TZWxmJiBvcGVyYXRvcj4+IChfU1RMUF9MT05HX0xPTkcmIF9fdmFsKTsKKyAgX1NlbGYmIG9wZXJhdG9yPj4gKHVuc2lnbmVkIF9TVExQX0xPTkdfTE9ORyYgX192YWwpOworI2VuZGlmCisgIF9TZWxmJiBvcGVyYXRvcj4+IChmbG9hdCYgX192YWwpOworICBfU2VsZiYgb3BlcmF0b3I+PiAoZG91YmxlJiBfX3ZhbCk7CisjIGlmbmRlZiBfU1RMUF9OT19MT05HX0RPVUJMRQorICBfU2VsZiYgb3BlcmF0b3I+PiAobG9uZyBkb3VibGUmIF9fdmFsKTsKKyMgZW5kaWYKKyMgaWZuZGVmIF9TVExQX05PX0JPT0wKKyAgX1NlbGYmIG9wZXJhdG9yPj4gKGJvb2wmIF9fdmFsKTsKKyMgZW5kaWYKKyAgX1NlbGYmIG9wZXJhdG9yPj4gKHZvaWQqJiBfX3ZhbCk7CisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29weWluZyBjaGFyYWN0ZXJzIGludG8gYSBzdHJlYW1idWYuCisgIF9TZWxmJiBvcGVyYXRvcj4+KGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+Kik7CisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gVW5mb3JtYXR0ZWQgaW5wdXQuCisgIHN0cmVhbXNpemUgZ2NvdW50KCkgY29uc3QgeyByZXR1cm4gX01fZ2NvdW50OyB9CisgIGludF90eXBlIHBlZWsoKTsKKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQoKSBmb3Igc2luZ2xlIGNoYXJhY3RlcnMKKyAgaW50X3R5cGUgZ2V0KCk7CisgIF9TZWxmJiBnZXQoY2hhcl90eXBlJiBfX2MpOworCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCgpIGZvciBjaGFyYWN0ZXIgYXJyYXlzLgorICBfU2VsZiYgZ2V0KGNoYXJfdHlwZSogX19zLCBzdHJlYW1zaXplIF9fbiwgY2hhcl90eXBlIF9fZGVsaW0pOworICBfU2VsZiYgZ2V0KGNoYXJfdHlwZSogX19zLCBzdHJlYW1zaXplIF9fbikKKyAgICB7IHJldHVybiBnZXQoX19zLCBfX24sIHRoaXMtPndpZGVuKCdcbicpKTsgfQorCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCgpIGZvciBzdHJlYW1idWZzCisgIF9TZWxmJiBnZXQoYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4mIF9fYnVmLAorICAgICAgICAgICAgICAgICAgICAgY2hhcl90eXBlIF9fZGVsaW0pOworICBfU2VsZiYgZ2V0KGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+JiBfX2J1ZikKKyAgICB7IHJldHVybiBnZXQoX19idWYsIHRoaXMtPndpZGVuKCdcbicpKTsgfQorCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldGxpbmUoKQorICBfU2VsZiYgZ2V0bGluZShjaGFyX3R5cGUqIF9fcywgc3RyZWFtc2l6ZSBfX24sIGNoYXJfdHlwZSBkZWxpbSk7CisgIF9TZWxmJiBnZXRsaW5lKGNoYXJfdHlwZSogX19zLCBzdHJlYW1zaXplIF9fbikKKyAgICB7IHJldHVybiBnZXRsaW5lKF9fcywgX19uLCB0aGlzLT53aWRlbignXG4nKSk7IH0KKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWFkKCksIHJlYWRzb21lKCksIGlnbm9yZSgpCisgIF9TZWxmJiBpZ25vcmUoKTsKKyAgX1NlbGYmIGlnbm9yZShzdHJlYW1zaXplIF9fbik7CisjaWYgKGRlZmluZWQgKF9TVExQX01TVkMpICYmIF9TVExQX01TVkMgPCAxMjAwKQorICBpbmxpbmUKKyNlbmRpZgorICBfU2VsZiYgaWdub3JlKHN0cmVhbXNpemUgX19uLCBpbnRfdHlwZSBfX2RlbGltKTsKKworICBfU2VsZiYgcmVhZChjaGFyX3R5cGUqIF9fcywgc3RyZWFtc2l6ZSBfX24pOworICBzdHJlYW1zaXplIHJlYWRzb21lKGNoYXJfdHlwZSogX19zLCBzdHJlYW1zaXplIF9fbik7CisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHV0YmFjaworICBfU2VsZiYgcHV0YmFjayhjaGFyX3R5cGUgX19jKTsKKyAgX1NlbGYmIHVuZ2V0KCk7CisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gUG9zaXRpb25pbmcgYW5kIGJ1ZmZlciBjb250cm9sLgorICBpbnQgc3luYygpOworCisgIHBvc190eXBlIHRlbGxnKCk7CisgIF9TZWxmJiBzZWVrZyhwb3NfdHlwZSBfX3Bvcyk7CisgIF9TZWxmJiBzZWVrZyhvZmZfdHlwZSwgaW9zX2Jhc2U6OnNlZWtkaXIpOworCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIG5vbi1tZW1iZXIgZXh0cmFjdG9ycy4KKyAgdm9pZCBfTV9mb3JtYXR0ZWRfZ2V0KF9DaGFyVCYgX19jKTsKKyAgdm9pZCBfTV9mb3JtYXR0ZWRfZ2V0KF9DaGFyVCogX19zKTsKKyAgdm9pZCBfTV9za2lwX3doaXRlc3BhY2UoYm9vbCBfX3NldF9mYWlsYml0KTsKKworcHJpdmF0ZTogICAgICAgICAgICAgICAgICAgICAgICAvLyBOdW1iZXIgb2YgY2hhcmFjdGVycyBleHRyYWN0ZWQgYnkgdGhlCisgIHN0cmVhbXNpemUgX01fZ2NvdW50OyAgICAgICAgIC8vIG1vc3QgcmVjZW50IHVuZm9ybWF0dGVkIGlucHV0IGZ1bmN0aW9uLgorCitwdWJsaWM6CisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUKQorICAvLyBJZiB3ZSBhcmUgdXNpbmcgRExMIHNwZWNzLCB3ZSBoYXZlIG5vdCB0byB1c2UgaW5uZXIgY2xhc3NlcworICAvLyBlbmQgY2xhc3MgZGVjbGFyYXRpb24gaGVyZQorICB0eXBlZGVmIF9Jc2VudHJ5PF9DaGFyVCwgX1RyYWl0cz4gICAgICBzZW50cnk7Cit9OworIyAgZGVmaW5lIHNlbnRyeSBfSXNlbnRyeQordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2NsYXNzIF9Jc2VudHJ5IHsKKyAgdHlwZWRlZiBfSXNlbnRyeTxfQ2hhclQsIF9UcmFpdHM+IF9TZWxmOworIyBlbHNlCisgIGNsYXNzIHNlbnRyeSB7CisgICAgdHlwZWRlZiBzZW50cnkgX1NlbGY7CisjZW5kaWYKKworICBwcml2YXRlOgorICAgIGNvbnN0IGJvb2wgX01fb2s7CisgICAgLy8gICAgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9NX2J1ZjsKKworICBwdWJsaWM6CisgICAgdHlwZWRlZiBfVHJhaXRzIHRyYWl0c190eXBlOworCisgICAgZXhwbGljaXQgc2VudHJ5KGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pc3RyLAorICAgICAgICAgICAgICAgICAgICBib29sIF9fbm9za2lwd3MgPSBmYWxzZSkgOgorICAgICAgX01fb2soKF9fbm9za2lwd3MgfHwgIShfX2lzdHIuZmxhZ3MoKSAmIGlvc19iYXNlOjpza2lwd3MpKSA/IF9NX2luaXRfbm9za2lwKF9faXN0cikgOiBfTV9pbml0X3NraXAoX19pc3RyKSApCisgICAgICAvKiAsIF9NX2J1ZihfX2lzdHIucmRidWYoKSkgKi8KKyAgICAgIHt9CisKKyAgICAvLyBDYWxsaW5nIHRoaXMgY29uc3RydWN0b3IgaXMgdGhlIHNhbWUgYXMgY2FsbGluZyB0aGUgcHJldmlvdXMgb25lIHdpdGgKKyAgICAvLyBfX25vc2tpcHdzID0gdHJ1ZSwgZXhjZXB0IHRoYXQgaXQgZG9lc24ndCByZXF1aXJlIGEgcnVudGltZSB0ZXN0LgorICAgIHNlbnRyeShiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXN0ciwgX05vX1NraXBfV1MpIDogLyogX01fYnVmKF9faXN0ci5yZGJ1ZigpKSwgKi8KKyAgICAgIF9NX29rKF9NX2luaXRfbm9za2lwKF9faXN0cikpIHt9CisKKyAgICB+c2VudHJ5KCkge30KKworICAgIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBfTV9vazsgfQorCisgIHByaXZhdGU6ICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGlzYWJsZSBhc3NpZ25tZW50IGFuZCBjb3B5IGNvbnN0cnVjdG9yLgorICAgIC8vSW1wbGVtZW50YXRpb24gaXMgaGVyZSBvbmx5IHRvIGF2b2lkIHdhcm5pbmcgd2l0aCBzb21lIGNvbXBpbGVycy4KKyAgICBzZW50cnkoY29uc3QgX1NlbGYmKSA6IF9NX29rKGZhbHNlKSB7fQorICAgIF9TZWxmJiBvcGVyYXRvcj0oY29uc3QgX1NlbGYmKSB7IHJldHVybiAqdGhpczsgfQorICB9OworCisjIGlmIGRlZmluZWQgKF9TVExQX1VTRV9URU1QTEFURV9FWFBPUlQpCisjICB1bmRlZiBzZW50cnkKKyMgZWxzZQorICAvLyBjbG9zZSBiYXNpY19pc3RyZWFtIGNsYXNzIGRlZmluaXRpb24gaGVyZQorfTsKKyMgZW5kaWYKKworIyBpZiBkZWZpbmVkIChfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUKQorX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIF9Jc2VudHJ5PGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID47CitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgYmFzaWNfaXN0cmVhbTxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+OworIyAgaWYgISBkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQorX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIF9Jc2VudHJ5PHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID47CitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgYmFzaWNfaXN0cmVhbTx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+OworIyAgZW5kaWYKKyMgZW5kaWYgLyogX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCAqLworCisvLyBOb24tbWVtYmVyIGNoYXJhY3RlciBhbmQgc3RyaW5nIGV4dHJhY3RvciBmdW5jdGlvbnMuCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgoraW5saW5lIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX1NUTFBfQ0FMTAorb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faW5fc3RyLCBfQ2hhclQmIF9fYykgeworICBfX2luX3N0ci5fTV9mb3JtYXR0ZWRfZ2V0KF9fYyk7CisgIHJldHVybiBfX2luX3N0cjsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcmFpdHM+CitpbmxpbmUgYmFzaWNfaXN0cmVhbTxjaGFyLCBfVHJhaXRzPiYgX1NUTFBfQ0FMTAorb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPGNoYXIsIF9UcmFpdHM+JiBfX2luX3N0ciwgdW5zaWduZWQgY2hhciYgX19jKSB7CisgIF9faW5fc3RyLl9NX2Zvcm1hdHRlZF9nZXQoX19SRUlOVEVSUFJFVF9DQVNUKGNoYXImLF9fYykpOworICByZXR1cm4gX19pbl9zdHI7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHJhaXRzPgoraW5saW5lIGJhc2ljX2lzdHJlYW08Y2hhciwgX1RyYWl0cz4mIF9TVExQX0NBTEwKK29wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxjaGFyLCBfVHJhaXRzPiYgX19pbl9zdHIsIHNpZ25lZCBjaGFyJiBfX2MpIHsKKyAgX19pbl9zdHIuX01fZm9ybWF0dGVkX2dldChfX1JFSU5URVJQUkVUX0NBU1QoY2hhciYsX19jKSk7CisgIHJldHVybiBfX2luX3N0cjsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2lubGluZSBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9TVExQX0NBTEwKK29wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2luX3N0ciwgX0NoYXJUKiBfX3MpIHsKKyAgX19pbl9zdHIuX01fZm9ybWF0dGVkX2dldChfX3MpOworICByZXR1cm4gX19pbl9zdHI7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHJhaXRzPgoraW5saW5lIGJhc2ljX2lzdHJlYW08Y2hhciwgX1RyYWl0cz4mIF9TVExQX0NBTEwKK29wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxjaGFyLCBfVHJhaXRzPiYgX19pbl9zdHIsIHVuc2lnbmVkIGNoYXIqIF9fcykgeworICBfX2luX3N0ci5fTV9mb3JtYXR0ZWRfZ2V0KF9fUkVJTlRFUlBSRVRfQ0FTVChjaGFyKixfX3MpKTsKKyAgcmV0dXJuIF9faW5fc3RyOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RyYWl0cz4KK2lubGluZSBiYXNpY19pc3RyZWFtPGNoYXIsIF9UcmFpdHM+JiBfU1RMUF9DQUxMCitvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08Y2hhciwgX1RyYWl0cz4mIF9faW5fc3RyLCBzaWduZWQgY2hhciogX19zKSB7CisgIF9faW5fc3RyLl9NX2Zvcm1hdHRlZF9nZXQoX19SRUlOVEVSUFJFVF9DQVNUKGNoYXIqLF9fcykpOworICByZXR1cm4gX19pbl9zdHI7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gaXN0cmVhbSBtYW5pcHVsYXRvci4KK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9TVExQX0NBTEwKK3dzKGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pc3RyKSB7CisgIGlmICghX19pc3RyLmVvZigpKSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OnNlbnRyeSAgICAgIF9TZW50cnk7CisgICAgX1NlbnRyeSBfX3NlbnRyeShfX2lzdHIsIF9Ob19Ta2lwX1dTKCkpOyAvLyBEb24ndCBza2lwIHdoaXRlc3BhY2UuCisgICAgaWYgKF9fc2VudHJ5KQorICAgICAgX19pc3RyLl9NX3NraXBfd2hpdGVzcGFjZShmYWxzZSk7CisgIH0KKyAgcmV0dXJuIF9faXN0cjsKK30KKworLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgaXN0cmVhbTw+OjpzZW50cnkgY29uc3RydWN0b3IuCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgoraW5saW5lIGJvb2wgX01faW5pdF9za2lwKGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pc3RyKSB7CisgIGlmIChfX2lzdHIuZ29vZCgpKSB7CisgICAgaWYgKF9faXN0ci50aWUoKSkKKyAgICAgIF9faXN0ci50aWUoKS0+Zmx1c2goKTsKKworICAgIF9faXN0ci5fTV9za2lwX3doaXRlc3BhY2UodHJ1ZSk7CisgIH0KKworICBpZiAoIV9faXN0ci5nb29kKCkpIHsKKyAgICBfX2lzdHIuc2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworICAgIHJldHVybiBmYWxzZTsKKyAgfSBlbHNlCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitpbmxpbmUgYm9vbCBfTV9pbml0X25vc2tpcChiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXN0cikgeworICBpZiAoX19pc3RyLmdvb2QoKSkgeworICAgIGlmIChfX2lzdHIudGllKCkpCisgICAgICBfX2lzdHIudGllKCktPmZsdXNoKCk7CisKKyAgICBpZiAoIV9faXN0ci5yZGJ1ZigpKQorICAgICAgX19pc3RyLnNldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOworICB9CisgIGVsc2UKKyAgICBfX2lzdHIuc2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworICByZXR1cm4gX19pc3RyLmdvb2QoKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDbGFzcyBpb3N0cmVhbS4KK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitjbGFzcyBiYXNpY19pb3N0cmVhbQorICA6IHB1YmxpYyBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4sCisgICAgcHVibGljIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPgoreworcHVibGljOgorICB0eXBlZGVmIGJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+IF9CYXNpY19pb3M7CisKKyAgZXhwbGljaXQgYmFzaWNfaW9zdHJlYW0oYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fYnVmKTsKKyAgdmlydHVhbCB+YmFzaWNfaW9zdHJlYW0oKTsKK307CisKKyMgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCkKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBiYXNpY19pb3N0cmVhbTxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+OworCisjICBpZiAhIGRlZmluZWQgKF9TVExQX05PX1dDSEFSX1QpCitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgYmFzaWNfaW9zdHJlYW08d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPjsKKyMgIGVuZGlmCisjIGVuZGlmIC8qIF9TVExQX1VTRV9URU1QTEFURV9FWFBPUlQgKi8KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfU1RMUF9DQUxMIF9NX2dldF9pc3RyZWFtYnVmKGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pc3RyKQoreyByZXR1cm4gX19pc3RyLnJkYnVmKCk7IH0KKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjaWYgZGVmaW5lZCAoX1NUTFBfRVhQT1NFX1NUUkVBTV9JTVBMRU1FTlRBVElPTikgJiYgIWRlZmluZWQgKF9TVExQX0xJTktfVElNRV9JTlNUQU5USUFUSU9OKQorIyAgaW5jbHVkZSA8c3RsL19pc3RyZWFtLmM+CisjZW5kaWYKKworI2VuZGlmIC8qIF9TVExQX0lOVEVSTkFMX0lTVFJFQU0gKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9faXN0cmVhbWJ1Zl9pdGVyYXRvci5oIGIvc3RsL19pc3RyZWFtYnVmX2l0ZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE1NzhlYgotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9faXN0cmVhbWJ1Zl9pdGVyYXRvci5oCkBAIC0wLDAgKzEsMTcwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworLy8gV0FSTklORzogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgQysrCisvLyBzdGFuZGFyZCBsaWJyYXJ5IGhlYWRlcnMuICBZb3Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHVzZSB0aGlzIGhlYWRlcgorLy8gZmlsZSBkaXJlY3RseS4KKworCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0lTVFJFQU1CVUZfSVRFUkFUT1JfSAorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9JU1RSRUFNQlVGX0lURVJBVE9SX0gKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9JVEVSQVRPUl9CQVNFX0gKKyMgaW5jbHVkZSA8c3RsL19pdGVyYXRvcl9iYXNlLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9TVFJFQU1CVUYKKyMgaW5jbHVkZSA8c3RsL19zdHJlYW1idWYuaD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworLy8gZGVmaW5lZCBpbiBfaXN0cmVhbS5oCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorZXh0ZXJuIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfU1RMUF9DQUxMIF9NX2dldF9pc3RyZWFtYnVmKGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgKSA7CisKKy8vIFdlIGRvIG5vdCByZWFkIGFueSBjaGFyYWN0ZXJzIHVudGlsIG9wZXJhdG9yKiBpcyBjYWxsZWQuIG9wZXJhdG9yKiBjYWxscyBzZ2V0YworLy8gdW5sZXNzIHRoZSBpdGVyYXRvciBpcyB1bmNoYW5nZWQgZnJvbSB0aGUgbGFzdCBjYWxsIGluIHdoaWNoIGNhc2UgYSBjYWNoZWQgdmFsdWUgaXMKKy8vIHVzZWQuIENhbGxzIHRvIG9wZXJhdG9yKysgdXNlIHNidW1wYy4KKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorY2xhc3MgaXN0cmVhbWJ1Zl9pdGVyYXRvciA6CisgIHB1YmxpYyBpdGVyYXRvcjxpbnB1dF9pdGVyYXRvcl90YWcsIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0czo6b2ZmX3R5cGUsIF9DaGFyVCosIF9DaGFyVCY+Cit7CitwdWJsaWM6CisgIHR5cGVkZWYgX0NoYXJUICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl90eXBlOworICB0eXBlZGVmIF9UcmFpdHMgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OmludF90eXBlICAgICAgIGludF90eXBlOworICB0eXBlZGVmIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+IHN0cmVhbWJ1Zl90eXBlOworICB0eXBlZGVmIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgIGlzdHJlYW1fdHlwZTsKKworICB0eXBlZGVmIGlucHV0X2l0ZXJhdG9yX3RhZyAgICAgICAgICAgICAgIGl0ZXJhdG9yX2NhdGVnb3J5OworICB0eXBlZGVmIF9DaGFyVCAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6b2ZmX3R5cGUgICAgICAgZGlmZmVyZW5jZV90eXBlOworICB0eXBlZGVmIGNvbnN0IF9DaGFyVCogICAgICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgIHR5cGVkZWYgY29uc3QgX0NoYXJUJiAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworCitwdWJsaWM6CisgIGlzdHJlYW1idWZfaXRlcmF0b3Ioc3RyZWFtYnVmX3R5cGUqIF9fcCA9IDApIHsgdGhpcy0+X01faW5pdChfX3ApOyB9CisgIC8vICBpc3RyZWFtYnVmX2l0ZXJhdG9yKGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcykgeyB0aGlzLT5fTV9pbml0KF9NX2dldF9pc3RyZWFtYnVmKF9faXMpKTsgfQorICBpbmxpbmUgaXN0cmVhbWJ1Zl9pdGVyYXRvcihiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMpOworCisgIGNoYXJfdHlwZSBvcGVyYXRvciooKSBjb25zdCB7IHRoaXMtPl9NX2dldGMoKTsgcmV0dXJuIF9NX2M7IH0KKyAgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQsIF9UcmFpdHM+JiBvcGVyYXRvcisrKCkKKyAgICAgIHsKKyAgICAgICAgX01fYnVmLT5zYnVtcGMoKTsKKyAgICAgICAgX01faGF2ZV9jID0gZmFsc2U7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIH0KKyAgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQsIF9UcmFpdHM+ICBvcGVyYXRvcisrKGludCk7CisKKyAgYm9vbCBlcXVhbChjb25zdCBpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVCwgX1RyYWl0cz4mIF9faSkgY29uc3QgeworICAgIGlmICh0aGlzLT5fTV9idWYpCisgICAgICB0aGlzLT5fTV9nZXRjKCk7CisgICAgaWYgKF9faS5fTV9idWYpCisgICAgICBfX2kuX01fZ2V0YygpOworICAgIHJldHVybiB0aGlzLT5fTV9lb2YgPT0gX19pLl9NX2VvZjsKKyAgfQorCitwcml2YXRlOgorICB2b2lkIF9NX2luaXQoc3RyZWFtYnVmX3R5cGUqIF9fcCkgeworICAgIF9NX2J1ZiA9IF9fcDsKKyAgICBfTV9lb2YgPSAoX19wID09IDApOworICAgIF9NX2hhdmVfYyA9IGZhbHNlOworICB9CisKKyAgdm9pZCBfTV9nZXRjKCkgY29uc3QgeworICAgIGlmIChfTV9oYXZlX2MpCisgICAgICByZXR1cm47CisgICAgaW50X3R5cGUgX19jID0gX01fYnVmLT5zZ2V0YygpOworIyBpZiAhZGVmaW5lZCAoX1NUTFBfTkVFRF9NVVRBQkxFKSAvKiAmJiAhIGRlZmluZWQgKF9fU1VOUFJPX0NDKSAqLworICAgIF9NX2MgPSB0cmFpdHNfdHlwZTo6dG9fY2hhcl90eXBlKF9fYyk7CisgICAgX01fZW9mID0gdHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9fYywgdHJhaXRzX3R5cGU6OmVvZigpKTsKKyAgICBfTV9oYXZlX2MgPSB0cnVlOworIyBlbHNlCisgICAgdHlwZWRlZiBpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVCxfVHJhaXRzPiBfU2VsZjsKKyAgICBfU2VsZiogX190aGF0ID0gX19DT05TVF9DQVNUKF9TZWxmKiwgdGhpcyk7CisgICAgX190aGF0LT5fTV9jID0gX19TVEFUSUNfQ0FTVChfQ2hhclQsIHRyYWl0c190eXBlOjp0b19jaGFyX3R5cGUoX19jKSk7CisgICAgX190aGF0LT5fTV9lb2YgPSB0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19jLCB0cmFpdHNfdHlwZTo6ZW9mKCkpOworICAgIF9fdGhhdC0+X01faGF2ZV9jID0gdHJ1ZTsKKyMgZW5kaWYKKyAgfQorCitwcml2YXRlOgorICBzdHJlYW1idWZfdHlwZSogX01fYnVmOworICBtdXRhYmxlIF9DaGFyVCBfTV9jOworICBtdXRhYmxlIGJvb2wgX01fZW9mOworICBtdXRhYmxlIGJvb2wgX01faGF2ZV9jOworfTsKKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgoraW5saW5lIGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJULCBfVHJhaXRzPjo6aXN0cmVhbWJ1Zl9pdGVyYXRvcihiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMpCit7IHRoaXMtPl9NX2luaXQoX01fZ2V0X2lzdHJlYW1idWYoX19pcykpOyB9CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2lubGluZSBib29sIF9TVExQX0NBTEwgb3BlcmF0b3I9PShjb25zdCBpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVCwgX1RyYWl0cz4mIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVCwgX1RyYWl0cz4mIF9feSkgeworICByZXR1cm4gX194LmVxdWFsKF9feSk7Cit9CisKKyNpZmRlZiBfU1RMUF9VU0VfU0VQQVJBVEVfUkVMT1BTX05BTUVTUEFDRQorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yIT0oY29uc3QgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQsIF9UcmFpdHM+JiBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQsIF9UcmFpdHM+JiBfX3kpIHsKKyAgcmV0dXJuICFfX3guZXF1YWwoX195KTsKK30KKworI2VuZGlmIC8qIF9TVExQX1VTRV9TRVBBUkFURV9SRUxPUFNfTkFNRVNQQUNFICovCisKKyMgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCkKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBpc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID47CisjICBpZiBkZWZpbmVkIChJTlNUQU5USUFURV9XSURFX1NUUkVBTVMpCitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgaXN0cmVhbWJ1Zl9pdGVyYXRvcjx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+OworIyAgZW5kaWYKKyMgZW5kaWYgLyogX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCAqLworCisjIGlmZGVmIF9TVExQX1VTRV9PTERfSFBfSVRFUkFUT1JfUVVFUklFUwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2lubGluZSBpbnB1dF9pdGVyYXRvcl90YWcgX1NUTFBfQ0FMTCBpdGVyYXRvcl9jYXRlZ29yeShjb25zdCBpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVCwgX1RyYWl0cz4mKSB7IHJldHVybiBpbnB1dF9pdGVyYXRvcl90YWcoKTsgfQordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2lubGluZSBzdHJlYW1vZmYqIF9TVExQX0NBTEwKK2Rpc3RhbmNlX3R5cGUoY29uc3QgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQsIF9UcmFpdHM+JikgeyByZXR1cm4gKHN0cmVhbW9mZiopMDsgfQordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2lubGluZSBfQ2hhclQqIF9TVExQX0NBTEwgdmFsdWVfdHlwZShjb25zdCBpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVCwgX1RyYWl0cz4mKSB7IHJldHVybiAoX0NoYXJUKikwOyB9CisjIGVuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Citpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVCwgX1RyYWl0cz4KK2lzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJULCBfVHJhaXRzPjo6b3BlcmF0b3IrKyhpbnQpIHsKKyAgX01fZ2V0YygpOyAvLyBfX3RtcCBzaG91bGQgYXZvaWQgYW55IGZ1dHVyZSBhY3Rpb25zIHVuZGVyCisgIC8vIHVuZGVybGluZWQgYnVmZmVyLS0tZHVyaW5nIGNhbGwgb2Ygb3BlcmF0b3IgKigpCisgIC8vIChkdWUgdG8gYnVmZmVyIGZvciAqdGhpcyBhbmQgX190bXAgYXJlIHRoZSBzYW1lKS4KKyAgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQsIF9UcmFpdHM+IF9fdG1wID0gKnRoaXM7CisgIF9NX2J1Zi0+c2J1bXBjKCk7CisgIF9NX2hhdmVfYyA9IGZhbHNlOworICByZXR1cm4gX190bXA7Cit9CisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2VuZGlmIC8qIF9TVExQX0lOVEVSTkFMX0lTVFJFQU1CVUZfSVRFUkFUT1JfSCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgorCmRpZmYgLS1naXQgYS9zdGwvX2l0ZXJhdG9yLmggYi9zdGwvX2l0ZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQyM2ZhYQotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9faXRlcmF0b3IuaApAQCAtMCwwICsxLDI2NiBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LTE5OTgKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKy8qIE5PVEU6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIFNUTCBoZWFkZXJzLgorICogICBZb3Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4KKyAqLworCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0lURVJBVE9SX0gKKyNkZWZpbmUgX1NUTFBfSU5URVJOQUxfSVRFUkFUT1JfSAorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0lURVJBVE9SX0JBU0VfSAorIyAgaW5jbHVkZSA8c3RsL19pdGVyYXRvcl9iYXNlLmg+CisjZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKKyNpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQorLy8gVGhpcyBpcyB0aGUgbmV3IHZlcnNpb24gb2YgcmV2ZXJzZV9pdGVyYXRvciwgYXMgZGVmaW5lZCBpbiB0aGUKKy8vICBkcmFmdCBDKysgc3RhbmRhcmQuICBJdCByZWxpZXMgb24gdGhlIGl0ZXJhdG9yX3RyYWl0cyB0ZW1wbGF0ZSwKKy8vICB3aGljaCBpbiB0dXJuIHJlbGllcyBvbiBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uLiAgVGhlIGNsYXNzCisvLyAgcmV2ZXJzZV9iaWRpcmVjdGlvbmFsX2l0ZXJhdG9yIGlzIG5vIGxvbmdlciBwYXJ0IG9mIHRoZSBkcmFmdAorLy8gIHN0YW5kYXJkLCBidXQgaXQgaXMgcmV0YWluZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+CitjbGFzcyByZXZlcnNlX2l0ZXJhdG9yIDoKKyAgcHVibGljIGl0ZXJhdG9yPHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSXRlcmF0b3I+OjppdGVyYXRvcl9jYXRlZ29yeSwKKyAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSXRlcmF0b3I+Ojp2YWx1ZV90eXBlLAorICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSXRlcmF0b3I+Ojpwb2ludGVyLAorICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcj46OnJlZmVyZW5jZT4geworcHJvdGVjdGVkOgorICBfSXRlcmF0b3IgY3VycmVudDsKKyAgdHlwZWRlZiByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj4gX1NlbGY7CitwdWJsaWM6CisgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcj46Oml0ZXJhdG9yX2NhdGVnb3J5ICBpdGVyYXRvcl9jYXRlZ29yeTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0l0ZXJhdG9yPjo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSXRlcmF0b3I+Ojpwb2ludGVyIHBvaW50ZXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcj46OnJlZmVyZW5jZSByZWZlcmVuY2U7CisgIHR5cGVkZWYgX0l0ZXJhdG9yIGl0ZXJhdG9yX3R5cGU7CitwdWJsaWM6CisgIHJldmVyc2VfaXRlcmF0b3IoKSB7fQorICBleHBsaWNpdCByZXZlcnNlX2l0ZXJhdG9yKGl0ZXJhdG9yX3R5cGUgX194KSA6IGN1cnJlbnQoX194KSB7fQorICByZXZlcnNlX2l0ZXJhdG9yKGNvbnN0IF9TZWxmJiBfX3gpIDogY3VycmVudChfX3guY3VycmVudCkge30KKyAgX1NlbGYmIG9wZXJhdG9yID0gKGNvbnN0IF9TZWxmJiBfX3gpIHsgY3VycmVudCA9IF9feC5iYXNlKCk7IHJldHVybiAqdGhpczsgfQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyAgdGVtcGxhdGUgPGNsYXNzIF9JdGVyPgorICByZXZlcnNlX2l0ZXJhdG9yKGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X0l0ZXI+JiBfX3gpIDogY3VycmVudChfX3guYmFzZSgpKSB7fQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXI+CisgIF9TZWxmJiBvcGVyYXRvciA9IChjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyPiYgX194KSB7IGN1cnJlbnQgPSBfX3guYmFzZSgpOyByZXR1cm4gKnRoaXM7IH0KKyMgIGVuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKworICBpdGVyYXRvcl90eXBlIGJhc2UoKSBjb25zdCB7IHJldHVybiBjdXJyZW50OyB9CisgIHJlZmVyZW5jZSBvcGVyYXRvciooKSBjb25zdCB7CisgICAgX0l0ZXJhdG9yIF9fdG1wID0gY3VycmVudDsKKyAgICByZXR1cm4gKi0tX190bXA7CisgIH0KKyAgX1NUTFBfREVGSU5FX0FSUk9XX09QRVJBVE9SCisgIF9TZWxmJiBvcGVyYXRvcisrKCkgeworICAgIC0tY3VycmVudDsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgX1NlbGYgb3BlcmF0b3IrKyhpbnQpIHsKKyAgICBfU2VsZiBfX3RtcCA9ICp0aGlzOworICAgIC0tY3VycmVudDsKKyAgICByZXR1cm4gX190bXA7CisgIH0KKyAgX1NlbGYmIG9wZXJhdG9yLS0oKSB7CisgICAgKytjdXJyZW50OworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBfU2VsZiBvcGVyYXRvci0tKGludCkgeworICAgIF9TZWxmIF9fdG1wID0gKnRoaXM7CisgICAgKytjdXJyZW50OworICAgIHJldHVybiBfX3RtcDsKKyAgfQorCisgIF9TZWxmIG9wZXJhdG9yKyhkaWZmZXJlbmNlX3R5cGUgX19uKSBjb25zdCB7IHJldHVybiBfU2VsZihjdXJyZW50IC0gX19uKTsgfQorICBfU2VsZiYgb3BlcmF0b3IrPShkaWZmZXJlbmNlX3R5cGUgX19uKSB7CisgICAgY3VycmVudCAtPSBfX247CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIF9TZWxmIG9wZXJhdG9yLShkaWZmZXJlbmNlX3R5cGUgX19uKSBjb25zdCB7IHJldHVybiBfU2VsZihjdXJyZW50ICsgX19uKTsgfQorICBfU2VsZiYgb3BlcmF0b3ItPShkaWZmZXJlbmNlX3R5cGUgX19uKSB7CisgICAgY3VycmVudCArPSBfX247CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIHJlZmVyZW5jZSBvcGVyYXRvcltdKGRpZmZlcmVuY2VfdHlwZSBfX24pIGNvbnN0IHsgcmV0dXJuICooKnRoaXMgKyBfX24pOyB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgoraW5saW5lIGJvb2wgIF9TVExQX0NBTEwgb3BlcmF0b3I9PShjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj4mIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3kpCit7IHJldHVybiBfX3guYmFzZSgpID09IF9feS5iYXNlKCk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcj4KK2lubGluZSBib29sIF9TVExQX0NBTEwgb3BlcmF0b3I8KGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X0l0ZXJhdG9yPiYgX194LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3kpCit7IHJldHVybiBfX3kuYmFzZSgpIDwgX194LmJhc2UoKTsgfQorCisjICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfU0VQQVJBVEVfUkVMT1BTX05BTUVTUEFDRSkKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+CitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yIT0oY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3kpCit7IHJldHVybiAhKF9feCA9PSBfX3kpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+CitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yPihjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj4mIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X0l0ZXJhdG9yPiYgX195KQoreyByZXR1cm4gX195IDwgX194OyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+CitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yPD0oY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3kpCit7IHJldHVybiAhKF9feSA8IF9feCk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcj4KK2lubGluZSBib29sIF9TVExQX0NBTEwgb3BlcmF0b3I+PShjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj4mIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj4mIF9feSkKK3sgcmV0dXJuICEoX194IDwgX195KTsgfQorIyAgZW5kaWYgLyogX1NUTFBfVVNFX1NFUEFSQVRFX1JFTE9QU19OQU1FU1BBQ0UgKi8KKwordGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcj4KKyMgIGlmIGRlZmluZWQgKF9fU1VOUFJPX0NDKQoraW5saW5lIHB0cmRpZmZfdCBfU1RMUF9DQUxMCisjICBlbHNlCitpbmxpbmUgdHlwZW5hbWUgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUgX1NUTFBfQ0FMTAorIyAgZW5kaWYKK29wZXJhdG9yLShjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj4mIF9feCwKKyAgICAgICAgICBjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj4mIF9feSkKK3sgcmV0dXJuIF9feS5iYXNlKCkgLSBfX3guYmFzZSgpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3IsIGNsYXNzIF9EaWZmZXJlbmNlVHlwZT4KK2lubGluZSByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj4gIF9TVExQX0NBTEwKK29wZXJhdG9yKyhfRGlmZmVyZW5jZVR5cGUgbixjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj4mIHgpCit7IHJldHVybiB4Lm9wZXJhdG9yKyhuKTsgfQorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfQ29udGFpbmVyPgorY2xhc3MgYmFja19pbnNlcnRfaXRlcmF0b3IKKyAgOiBwdWJsaWMgaXRlcmF0b3I8b3V0cHV0X2l0ZXJhdG9yX3RhZywgdm9pZCwgdm9pZCwgdm9pZCwgdm9pZD4geworICB0eXBlZGVmIGJhY2tfaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+IF9TZWxmOworcHJvdGVjdGVkOgorICAvL2MgaXMgYSBTdGFuZGFyZCBuYW1lICgyNC40LjIuMSksIGRvIG5vIG1ha2UgaXQgU1RMcG9ydCBuYW1pbmcgY29udmVudGlvbiBjb21wbGlhbnQuCisgIF9Db250YWluZXIgKmNvbnRhaW5lcjsKK3B1YmxpYzoKKyAgdHlwZWRlZiBfQ29udGFpbmVyICAgICAgICAgIGNvbnRhaW5lcl90eXBlOworICB0eXBlZGVmIG91dHB1dF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CisKKyAgZXhwbGljaXQgYmFja19pbnNlcnRfaXRlcmF0b3IoX0NvbnRhaW5lciYgX194KSA6IGNvbnRhaW5lcigmX194KSB7fQorCisgIF9TZWxmJiBvcGVyYXRvcj0oY29uc3QgX1NlbGYmIF9fb3RoZXIpIHsKKyAgICBjb250YWluZXIgPSBfX290aGVyLmNvbnRhaW5lcjsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgX1NlbGYmIG9wZXJhdG9yPShjb25zdCB0eXBlbmFtZSBfQ29udGFpbmVyOjp2YWx1ZV90eXBlJiBfX3ZhbCkgeworICAgIGNvbnRhaW5lci0+cHVzaF9iYWNrKF9fdmFsKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgX1NlbGYmIG9wZXJhdG9yKigpIHsgcmV0dXJuICp0aGlzOyB9CisgIF9TZWxmJiBvcGVyYXRvcisrKCkgeyByZXR1cm4gKnRoaXM7IH0KKyAgX1NlbGYgIG9wZXJhdG9yKysoaW50KSB7IHJldHVybiAqdGhpczsgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9Db250YWluZXI+CitpbmxpbmUgYmFja19pbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4gIF9TVExQX0NBTEwgYmFja19pbnNlcnRlcihfQ29udGFpbmVyJiBfX3gpCit7IHJldHVybiBiYWNrX2luc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPihfX3gpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ29udGFpbmVyPgorY2xhc3MgZnJvbnRfaW5zZXJ0X2l0ZXJhdG9yCisgIDogcHVibGljIGl0ZXJhdG9yPG91dHB1dF9pdGVyYXRvcl90YWcsIHZvaWQsIHZvaWQsIHZvaWQsIHZvaWQ+IHsKKyAgdHlwZWRlZiBmcm9udF9pbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4gX1NlbGY7Citwcm90ZWN0ZWQ6CisgIC8vYyBpcyBhIFN0YW5kYXJkIG5hbWUgKDI0LjQuMi4zKSwgZG8gbm8gbWFrZSBpdCBTVExwb3J0IG5hbWluZyBjb252ZW50aW9uIGNvbXBsaWFudC4KKyAgX0NvbnRhaW5lciAqY29udGFpbmVyOworcHVibGljOgorICB0eXBlZGVmIF9Db250YWluZXIgICAgICAgICAgY29udGFpbmVyX3R5cGU7CisgIHR5cGVkZWYgb3V0cHV0X2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKKyAgZXhwbGljaXQgZnJvbnRfaW5zZXJ0X2l0ZXJhdG9yKF9Db250YWluZXImIF9feCkgOiBjb250YWluZXIoJl9feCkge30KKworICBfU2VsZiYgb3BlcmF0b3I9KGNvbnN0IF9TZWxmJiBfX290aGVyKSB7CisgICAgY29udGFpbmVyID0gX19vdGhlci5jb250YWluZXI7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIF9TZWxmJiBvcGVyYXRvcj0oY29uc3QgdHlwZW5hbWUgX0NvbnRhaW5lcjo6dmFsdWVfdHlwZSYgX192YWwpIHsKKyAgICBjb250YWluZXItPnB1c2hfZnJvbnQoX192YWwpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBfU2VsZiYgb3BlcmF0b3IqKCkgeyByZXR1cm4gKnRoaXM7IH0KKyAgX1NlbGYmIG9wZXJhdG9yKysoKSB7IHJldHVybiAqdGhpczsgfQorICBfU2VsZiAgb3BlcmF0b3IrKyhpbnQpIHsgcmV0dXJuICp0aGlzOyB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NvbnRhaW5lcj4KK2lubGluZSBmcm9udF9pbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4gIF9TVExQX0NBTEwgZnJvbnRfaW5zZXJ0ZXIoX0NvbnRhaW5lciYgX194KQoreyByZXR1cm4gZnJvbnRfaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+KF9feCk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9Db250YWluZXI+CitjbGFzcyBpbnNlcnRfaXRlcmF0b3IKKyAgOiBwdWJsaWMgaXRlcmF0b3I8b3V0cHV0X2l0ZXJhdG9yX3RhZywgdm9pZCwgdm9pZCwgdm9pZCwgdm9pZD4geworICB0eXBlZGVmIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiBfU2VsZjsKK3Byb3RlY3RlZDoKKyAgLy9jb250YWluZXIgaXMgYSBTdGFuZGFyZCBuYW1lICgyNC40LjIuNSksIGRvIG5vIG1ha2UgaXQgU1RMcG9ydCBuYW1pbmcgY29udmVudGlvbiBjb21wbGlhbnQuCisgIF9Db250YWluZXIgKmNvbnRhaW5lcjsKKyAgdHlwZW5hbWUgX0NvbnRhaW5lcjo6aXRlcmF0b3IgX01faXRlcjsKK3B1YmxpYzoKKyAgdHlwZWRlZiBfQ29udGFpbmVyICAgICAgICAgIGNvbnRhaW5lcl90eXBlOworICB0eXBlZGVmIG91dHB1dF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CisgIGluc2VydF9pdGVyYXRvcihfQ29udGFpbmVyJiBfX3gsIHR5cGVuYW1lIF9Db250YWluZXI6Oml0ZXJhdG9yIF9faSkKKyAgICA6IGNvbnRhaW5lcigmX194KSwgX01faXRlcihfX2kpIHt9CisKKyAgX1NlbGYmIG9wZXJhdG9yPShfU2VsZiBjb25zdCYgX19vdGhlcikgeworICAgIGNvbnRhaW5lciA9IF9fb3RoZXIuY29udGFpbmVyOworICAgIF9NX2l0ZXIgPSBfX290aGVyLl9NX2l0ZXI7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIF9TZWxmJiBvcGVyYXRvcj0oY29uc3QgdHlwZW5hbWUgX0NvbnRhaW5lcjo6dmFsdWVfdHlwZSYgX192YWwpIHsKKyAgICBfTV9pdGVyID0gY29udGFpbmVyLT5pbnNlcnQoX01faXRlciwgX192YWwpOworICAgICsrX01faXRlcjsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgX1NlbGYmIG9wZXJhdG9yKigpIHsgcmV0dXJuICp0aGlzOyB9CisgIF9TZWxmJiBvcGVyYXRvcisrKCkgeyByZXR1cm4gKnRoaXM7IH0KKyAgX1NlbGYmIG9wZXJhdG9yKysoaW50KSB7IHJldHVybiAqdGhpczsgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9Db250YWluZXIsIGNsYXNzIF9JdGVyYXRvcj4KK2lubGluZSBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4gIF9TVExQX0NBTEwKK2luc2VydGVyKF9Db250YWluZXImIF9feCwgX0l0ZXJhdG9yIF9faSkgeworICB0eXBlZGVmIHR5cGVuYW1lIF9Db250YWluZXI6Oml0ZXJhdG9yIF9faXRlcjsKKyAgcmV0dXJuIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPihfX3gsIF9faXRlcihfX2kpKTsKK30KKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjaWYgISBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKSB8fCBkZWZpbmVkIChfU1RMUF9VU0VfT0xEX0hQX0lURVJBVE9SX1FVRVJJRVMpCisjICBpbmNsdWRlIDxzdGwvX2l0ZXJhdG9yX29sZC5oPgorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9JVEVSQVRPUl9IICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvX2l0ZXJhdG9yX2Jhc2UuaCBiL3N0bC9faXRlcmF0b3JfYmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ZmU0OTIKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvX2l0ZXJhdG9yX2Jhc2UuaApAQCAtMCwwICsxLDU0MSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LTE5OTgKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKy8qIE5PVEU6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIFNUTCBoZWFkZXJzLgorICogICBZb3Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4KKyAqLworCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0lURVJBVE9SX0JBU0VfSAorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9JVEVSQVRPUl9CQVNFX0gKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DU1REREVGCisjICBpbmNsdWRlIDxzdGwvX2NzdGRkZWYuaD4KKyNlbmRpZgorCisvLyMgaWYgZGVmaW5lZCAgKF9TVExQX0lNUE9SVF9WRU5ET1JfQ1NURCkgJiYgISBkZWZpbmVkIChfU1RMUF9WRU5ET1JfR0xPQkFMX0NTVEQpCisvL19TVExQX0JFR0lOX05BTUVTUEFDRQorLy91c2luZyBuYW1lc3BhY2UgX1NUTFBfVkVORE9SX0NTVEQ7CisvL19TVExQX0VORF9OQU1FU1BBQ0UKKy8vI2VuZGlmIC8qIF9TVExQX0lNUE9SVF9WRU5ET1JfQ1NURCAqLworCisjaWYgIWRlZmluZWQoX1NUTFBfVVNFX09MRF9IUF9JVEVSQVRPUl9RVUVSSUVTKSAmJiAhZGVmaW5lZChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQorIyAgaWZuZGVmIF9TVExQX1RZUEVfVFJBSVRTX0gKKyMgICAgaW5jbHVkZSA8c3RsL3R5cGVfdHJhaXRzLmg+CisjICBlbmRpZgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCitzdHJ1Y3QgaW5wdXRfaXRlcmF0b3JfdGFnIHt9Oworc3RydWN0IG91dHB1dF9pdGVyYXRvcl90YWcge307CitzdHJ1Y3QgZm9yd2FyZF9pdGVyYXRvcl90YWcgOiBwdWJsaWMgaW5wdXRfaXRlcmF0b3JfdGFnIHt9Oworc3RydWN0IGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnIDogcHVibGljIGZvcndhcmRfaXRlcmF0b3JfdGFnIHt9Oworc3RydWN0IHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnIDogcHVibGljIGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnIHt9OworCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2F0ZWdvcnksIGNsYXNzIF9UcCwgX1NUTFBfREZMX1RNUExfUEFSQU0oX0Rpc3RhbmNlLHB0cmRpZmZfdCksCisgICAgICAgICAgX1NUTFBfREZMX1RNUExfUEFSQU0oX1BvaW50ZXIsX1RwKiksIF9TVExQX0RGTF9UTVBMX1BBUkFNKF9SZWZlcmVuY2UsX1RwJikgPgorc3RydWN0IGl0ZXJhdG9yIHsKKyAgdHlwZWRlZiBfQ2F0ZWdvcnkgIGl0ZXJhdG9yX2NhdGVnb3J5OworICB0eXBlZGVmIF9UcCAgICAgICAgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiBfRGlzdGFuY2UgIGRpZmZlcmVuY2VfdHlwZTsKKyAgdHlwZWRlZiBfUG9pbnRlciAgIHBvaW50ZXI7CisgIHR5cGVkZWYgX1JlZmVyZW5jZSByZWZlcmVuY2U7Cit9OworX1NUTFBfVEVNUExBVEVfTlVMTAorc3RydWN0IGl0ZXJhdG9yPG91dHB1dF9pdGVyYXRvcl90YWcsIHZvaWQsIHZvaWQsIHZvaWQsIHZvaWQ+IHsKKyAgdHlwZWRlZiBvdXRwdXRfaXRlcmF0b3JfdGFnICBpdGVyYXRvcl9jYXRlZ29yeTsKKyNpZmRlZiBfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OCisgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyNlbmRpZgorfTsKKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9PTERfSFBfSVRFUkFUT1JfUVVFUklFUykKKyMgIGRlZmluZSBfU1RMUF9JVEVSQVRPUl9DQVRFR09SWShfSXQsIF9UcCkgaXRlcmF0b3JfY2F0ZWdvcnkoX0l0KQorIyAgZGVmaW5lIF9TVExQX0RJU1RBTkNFX1RZUEUoX0l0LCBfVHApICAgICBkaXN0YW5jZV90eXBlKF9JdCkKKyMgIGRlZmluZSBfU1RMUF9WQUxVRV9UWVBFKF9JdCwgX1RwKSAgICAgICAgdmFsdWVfdHlwZShfSXQpCisvL09sZCBIUCBpdGVyYXRvciBxdWVyaWVzIGRvIG5vdCBnaXZlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBpdGVyYXRvcgorLy9hc3NvY2lhdGVkIHJlZmVyZW5jZSB0eXBlIHNvIHdlIGNvbnNpZGVyIHRoYXQgaXQgaXMgbm90IGEgcmVhbCByZWZlcmVuY2UuCisjICBkZWZpbmUgX1NUTFBfSVNfUkVGX1RZUEVfUkVBTF9SRUYoX0l0LCBfVHApIF9fZmFsc2VfdHlwZSgpCisjZWxzZQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikKKyMgICAgZGVmaW5lIF9TVExQX1ZBTFVFX1RZUEUoX0l0LCBfVHApICAgICAgICAodHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPCBfVHAgPjo6dmFsdWVfdHlwZSopMAorIyAgICBkZWZpbmUgX1NUTFBfRElTVEFOQ0VfVFlQRShfSXQsIF9UcCkgICAgICh0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8IF9UcCA+OjpkaWZmZXJlbmNlX3R5cGUqKTAKKyMgICAgaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKSB8fCBkZWZpbmVkIChfX1NVTlBST19DQykgfHwgKCBkZWZpbmVkIChfX01XRVJLU19fKSAmJiAoX19NV0VSS1NfXyA8PSAweDIzMDMpKSB8fCAoIGRlZmluZWQgKF9fc2dpKSAmJiBkZWZpbmVkIChfQ09NUElMRVJfVkVSU0lPTikpIHx8IGRlZmluZWQgKF9fRE1DX18pCisjICAgICAgZGVmaW5lIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9JdCwgX1RwKSBpdGVyYXRvcl90cmFpdHM8IF9UcCA+OjppdGVyYXRvcl9jYXRlZ29yeSgpCisjICAgIGVsc2UKKyMgICAgICBkZWZpbmUgX1NUTFBfSVRFUkFUT1JfQ0FURUdPUlkoX0l0LCBfVHApIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czwgX1RwID46Oml0ZXJhdG9yX2NhdGVnb3J5KCkKKyMgICAgZW5kaWYKKyMgICAgZGVmaW5lIF9TVExQX0lTX1JFRl9UWVBFX1JFQUxfUkVGKF9JdCwgX1RwKSBfSXNSZWZUeXBlPCB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8IF9UcCA+OjpyZWZlcmVuY2UgPjo6X1JldCgpCisjICBlbHNlCisjICAgIGRlZmluZSBfU1RMUF9JVEVSQVRPUl9DQVRFR09SWShfSXQsIF9UcCkgICBfX2l0ZXJhdG9yX2NhdGVnb3J5KF9JdCwgX0lzUHRyVHlwZTxfVHA+OjpfUmV0KCkpCisjICAgIGRlZmluZSBfU1RMUF9ESVNUQU5DRV9UWVBFKF9JdCwgX1RwKSAgICAgICAocHRyZGlmZl90KikwCisjICAgIGRlZmluZSBfU1RMUF9WQUxVRV9UWVBFKF9JdCwgX1RwKSAgICAgICAgICBfX3ZhbHVlX3R5cGUoX0l0LCBfSXNQdHJUeXBlPF9UcD46Ol9SZXQoKSApCisjICAgIGRlZmluZSBfU1RMUF9JU19SRUZfVFlQRV9SRUFMX1JFRihfSXQsIF9UcCkgX19mYWxzZV90eXBlKCkKKyMgIGVuZGlmCisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcj4KK3N0cnVjdCBpdGVyYXRvcl90cmFpdHMgeworICB0eXBlZGVmIHR5cGVuYW1lIF9JdGVyYXRvcjo6aXRlcmF0b3JfY2F0ZWdvcnkgaXRlcmF0b3JfY2F0ZWdvcnk7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0l0ZXJhdG9yOjp2YWx1ZV90eXBlICAgICAgICB2YWx1ZV90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9JdGVyYXRvcjo6ZGlmZmVyZW5jZV90eXBlICAgZGlmZmVyZW5jZV90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9JdGVyYXRvcjo6cG9pbnRlciAgICAgICAgICAgcG9pbnRlcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSXRlcmF0b3I6OnJlZmVyZW5jZSAgICAgICAgIHJlZmVyZW5jZTsKK307CisKKworI2lmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pICYmICEgZGVmaW5lZCAoX19TVU5QUk9fQ0MpCisjICBkZWZpbmUgX1NUTFBfRElGRkVSRU5DRV9UWVBFKF9JdGVyYXRvcikgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZQorI2Vsc2UKKyMgIGRlZmluZSBfU1RMUF9ESUZGRVJFTkNFX1RZUEUoX0l0ZXJhdG9yKSBwdHJkaWZmX3QKKyNlbmRpZgorCisjaWZkZWYgX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTgorCisvLyBmYnAgOiB0aGlzIG9yZGVyIGtlZXBzIGdjYyBoYXBweQordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBpdGVyYXRvcl90cmFpdHM8Y29uc3QgX1RwKj4geworICB0eXBlZGVmIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnICBpdGVyYXRvcl9jYXRlZ29yeTsKKyAgdHlwZWRlZiBfVHAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiBwdHJkaWZmX3QgICAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICB0eXBlZGVmIGNvbnN0IF9UcCogICAgICAgICAgICAgICAgICBwb2ludGVyOworICB0eXBlZGVmIGNvbnN0IF9UcCYgICAgICAgICAgICAgICAgICByZWZlcmVuY2U7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IGl0ZXJhdG9yX3RyYWl0czxfVHAqPiB7CisgIHR5cGVkZWYgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgIGl0ZXJhdG9yX2NhdGVnb3J5OworICB0eXBlZGVmIF9UcCAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICB0eXBlZGVmIHB0cmRpZmZfdCAgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgIHR5cGVkZWYgX1RwKiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgIHR5cGVkZWYgX1RwJiAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKK307CisKKyMgIGlmIGRlZmluZWQgKF9fQk9STEFORENfXykKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgaXRlcmF0b3JfdHJhaXRzPF9UcCogY29uc3Q+IHsKKyAgdHlwZWRlZiByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyAgaXRlcmF0b3JfY2F0ZWdvcnk7CisgIHR5cGVkZWYgX1RwICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgcHRyZGlmZl90ICAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgdHlwZWRlZiBjb25zdCBfVHAqICAgICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgdHlwZWRlZiBjb25zdCBfVHAmICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworfTsKKyMgIGVuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OICovCisKKworI2lmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pIHx8IFwKKyAgIChkZWZpbmVkIChfU1RMUF9TSU1VTEFURV9QQVJUSUFMX1NQRUNfRk9SX1RZUEVfVFJBSVRTKSAmJiAhIGRlZmluZWQgKF9TVExQX05PX0FSUk9XX09QRVJBVE9SKSkKKyMgIGRlZmluZSBfU1RMUF9QT0lOVEVSU19TUEVDSUFMSVpFKCBfVHBQICkKKyMgIGRlZmluZSBfU1RMUF9ERUZJTkVfQVJST1dfT1BFUkFUT1IgIHBvaW50ZXIgb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuICYob3BlcmF0b3IqKCkpOyB9CisjZWxzZQorIyAgaW5jbHVkZSA8c3RsL19wdHJzX3NwZWNpYWxpemUuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX1VTRV9PTERfSFBfSVRFUkFUT1JfUVVFUklFUworLy8gVGhlIG92ZXJsb2FkZWQgZnVuY3Rpb25zIGl0ZXJhdG9yX2NhdGVnb3J5LCBkaXN0YW5jZV90eXBlLCBhbmQKKy8vIHZhbHVlX3R5cGUgYXJlIG5vdCBwYXJ0IG9mIHRoZSBDKysgc3RhbmRhcmQuICAoVGhleSBoYXZlIGJlZW4KKy8vIHJlcGxhY2VkIGJ5IHN0cnVjdCBpdGVyYXRvcl90cmFpdHMuKSAgVGhleSBhcmUgaW5jbHVkZWQgZm9yCisvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggdGhlIEhQIFNUTC4KKy8vIFdlIGludHJvZHVjZSBpbnRlcm5hbCBuYW1lcyBmb3IgdGhlc2UgZnVuY3Rpb25zLgorCisjICBpZmRlZiBfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OCisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcj4KK2lubGluZSB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0l0ZXI+OjppdGVyYXRvcl9jYXRlZ29yeSBfX2l0ZXJhdG9yX2NhdGVnb3J5KGNvbnN0IF9JdGVyJikgeworICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSXRlcj46Oml0ZXJhdG9yX2NhdGVnb3J5IF9DYXRlZ29yeTsKKyAgcmV0dXJuIF9DYXRlZ29yeSgpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXI+CitpbmxpbmUgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JdGVyPjo6ZGlmZmVyZW5jZV90eXBlKiBfX2Rpc3RhbmNlX3R5cGUoY29uc3QgX0l0ZXImKSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JdGVyPjo6ZGlmZmVyZW5jZV90eXBlIF9kaWZmX3R5cGU7CisgIHJldHVybiBfX1NUQVRJQ19DQVNUKF9kaWZmX3R5cGUqLDApOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXI+CitpbmxpbmUgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JdGVyPjo6dmFsdWVfdHlwZSogX192YWx1ZV90eXBlKGNvbnN0IF9JdGVyJikgeworICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSXRlcj46OnZhbHVlX3R5cGUgX3ZhbHVlX3R5cGU7CisgIHJldHVybiBfX1NUQVRJQ19DQVNUKF92YWx1ZV90eXBlKiwwKTsKK30KKworIyAgZWxzZSAvKiBfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OICovCisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcj4KK2lubGluZSByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZworX19pdGVyYXRvcl9jYXRlZ29yeShjb25zdCBfSXRlciYsIGNvbnN0IF9fdHJ1ZV90eXBlJikgeworICByZXR1cm4gcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9JdGVyPgoraW5saW5lIF9TVExQX1RZUEVOQU1FX09OX1JFVFVSTl9UWVBFIGl0ZXJhdG9yX3RyYWl0czxfSXRlcj46Oml0ZXJhdG9yX2NhdGVnb3J5CitfX2l0ZXJhdG9yX2NhdGVnb3J5KGNvbnN0IF9JdGVyJiwgY29uc3QgX19mYWxzZV90eXBlJikgeworICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSXRlcj46Oml0ZXJhdG9yX2NhdGVnb3J5IF9DYXRlZ29yeTsKKyAgcmV0dXJuIF9DYXRlZ29yeSgpOworfQorCisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcj4KK2lubGluZSBwdHJkaWZmX3QqIF9TVExQX0NBTEwgX19kaXN0YW5jZV90eXBlKGNvbnN0IF9JdGVyJikgeyByZXR1cm4gX19TVEFUSUNfQ0FTVChwdHJkaWZmX3QqLCAwKTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXI+CitpbmxpbmUgX1NUTFBfVFlQRU5BTUVfT05fUkVUVVJOX1RZUEUgaXRlcmF0b3JfdHJhaXRzPF9JdGVyPjo6dmFsdWVfdHlwZSoKK19fdmFsdWVfdHlwZShjb25zdCBfSXRlciYsIGNvbnN0IF9fZmFsc2VfdHlwZSYpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0l0ZXI+Ojp2YWx1ZV90eXBlIF92YWx1ZV90eXBlOworICByZXR1cm4gX19TVEFUSUNfQ0FTVChfdmFsdWVfdHlwZSosMCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX1RwKgorX192YWx1ZV90eXBlKGNvbnN0IF9UcCosIGNvbnN0IF9fdHJ1ZV90eXBlJikgeworICByZXR1cm4gX19TVEFUSUNfQ0FTVChfVHAqLCAwKTsKK30KKworIyAgZW5kaWYgLyogX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTiAqLworCisjZWxzZSAvKiBfU1RMUF9VU0VfT0xEX0hQX0lURVJBVE9SX1FVRVJJRVMgKi8KK3RlbXBsYXRlIDxjbGFzcyBfQ2F0ZWdvcnksIGNsYXNzIF9UcCwgY2xhc3MgX0Rpc3RhbmNlLCBjbGFzcyBfUG9pbnRlciwgY2xhc3MgX1JlZmVyZW5jZT4KK2lubGluZSBfQ2F0ZWdvcnkgX1NUTFBfQ0FMTCBpdGVyYXRvcl9jYXRlZ29yeShjb25zdCBpdGVyYXRvcjxfQ2F0ZWdvcnksX1RwLF9EaXN0YW5jZSxfUG9pbnRlcixfUmVmZXJlbmNlPiYpIHsgcmV0dXJuIF9DYXRlZ29yeSgpOyB9Cit0ZW1wbGF0ZSA8Y2xhc3MgX0NhdGVnb3J5LCBjbGFzcyBfVHAsIGNsYXNzIF9EaXN0YW5jZSwgY2xhc3MgX1BvaW50ZXIsIGNsYXNzIF9SZWZlcmVuY2U+CitpbmxpbmUgX1RwKiBfU1RMUF9DQUxMIHZhbHVlX3R5cGUoY29uc3QgaXRlcmF0b3I8X0NhdGVnb3J5LF9UcCxfRGlzdGFuY2UsX1BvaW50ZXIsX1JlZmVyZW5jZT4mKSB7IHJldHVybiBfX1NUQVRJQ19DQVNUKF9UcCosIDApOyB9Cit0ZW1wbGF0ZSA8Y2xhc3MgX0NhdGVnb3J5LCBjbGFzcyBfVHAsIGNsYXNzIF9EaXN0YW5jZSwgY2xhc3MgX1BvaW50ZXIsIGNsYXNzIF9SZWZlcmVuY2U+CitpbmxpbmUgX0Rpc3RhbmNlKiBfU1RMUF9DQUxMIGRpc3RhbmNlX3R5cGUoY29uc3QgaXRlcmF0b3I8X0NhdGVnb3J5LF9UcCxfRGlzdGFuY2UsX1BvaW50ZXIsX1JlZmVyZW5jZT4mKSB7IHJldHVybiBfX1NUQVRJQ19DQVNUKF9EaXN0YW5jZSosIDApOyB9Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnIF9TVExQX0NBTEwgaXRlcmF0b3JfY2F0ZWdvcnkoY29uc3QgX1RwKikgeyByZXR1cm4gcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcoKTsgfQordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfVHAqIF9TVExQX0NBTEwgdmFsdWVfdHlwZShjb25zdCBfVHAqKSB7IHJldHVybiBfX1NUQVRJQ19DQVNUKF9UcCosIDApOyB9Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIHB0cmRpZmZfdCogX1NUTFBfQ0FMTCBkaXN0YW5jZV90eXBlKGNvbnN0IF9UcCopIHsgcmV0dXJuIF9fU1RBVElDX0NBU1QocHRyZGlmZl90KiwgMCk7IH0KKyNlbmRpZiAvKiBfU1RMUF9VU0VfT0xEX0hQX0lURVJBVE9SX1FVRVJJRVMgKi8KKworIyBpZiAhIGRlZmluZWQgKF9TVExQX05PX0FOQUNIUk9OSVNNUykKKy8vIFRoZSBiYXNlIGNsYXNzZXMgaW5wdXRfaXRlcmF0b3IsIG91dHB1dF9pdGVyYXRvciwgZm9yd2FyZF9pdGVyYXRvciwKKy8vIGJpZGlyZWN0aW9uYWxfaXRlcmF0b3IsIGFuZCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yIGFyZSBub3QgcGFydCBvZgorLy8gdGhlIEMrKyBzdGFuZGFyZC4gIChUaGV5IGhhdmUgYmVlbiByZXBsYWNlZCBieSBzdHJ1Y3QgaXRlcmF0b3IuKQorLy8gVGhleSBhcmUgaW5jbHVkZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgSFAgU1RMLgordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0Rpc3RhbmNlPiBzdHJ1Y3QgaW5wdXRfaXRlcmF0b3IgOgorICBwdWJsaWMgaXRlcmF0b3IgPGlucHV0X2l0ZXJhdG9yX3RhZywgX1RwLCBfRGlzdGFuY2UsIF9UcCosIF9UcCY+IHt9Oworc3RydWN0IG91dHB1dF9pdGVyYXRvciA6IHB1YmxpYyBpdGVyYXRvciA8b3V0cHV0X2l0ZXJhdG9yX3RhZywgdm9pZCwgdm9pZCwgdm9pZCwgdm9pZD4ge307Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfRGlzdGFuY2U+IHN0cnVjdCBmb3J3YXJkX2l0ZXJhdG9yIDoKKyAgcHVibGljIGl0ZXJhdG9yPGZvcndhcmRfaXRlcmF0b3JfdGFnLCBfVHAsIF9EaXN0YW5jZSwgX1RwKiwgX1RwJj4ge307Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfRGlzdGFuY2U+IHN0cnVjdCBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yIDoKKyAgcHVibGljIGl0ZXJhdG9yPGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnLCBfVHAsIF9EaXN0YW5jZSwgX1RwKiwgX1RwJj4ge307Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfRGlzdGFuY2U+IHN0cnVjdCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yIDoKKyAgcHVibGljIGl0ZXJhdG9yPHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLCBfVHAsIF9EaXN0YW5jZSwgX1RwKiwgX1RwJj4ge307CisKKyMgaWYgZGVmaW5lZCAoX1NUTFBfQkFTRV9NQVRDSF9CVUcpICYmIGRlZmluZWQgKF9TVExQX1VTRV9PTERfSFBfSVRFUkFUT1JfUVVFUklFUykKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9EaXN0YW5jZT4KK2lubGluZSBpbnB1dF9pdGVyYXRvcl90YWcgX1NUTFBfQ0FMTAoraXRlcmF0b3JfY2F0ZWdvcnkoY29uc3QgaW5wdXRfaXRlcmF0b3I8X1RwLCBfRGlzdGFuY2U+JikgeyByZXR1cm4gaW5wdXRfaXRlcmF0b3JfdGFnKCk7IH0KK2lubGluZSBvdXRwdXRfaXRlcmF0b3JfdGFnIF9TVExQX0NBTEwKK2l0ZXJhdG9yX2NhdGVnb3J5KGNvbnN0IG91dHB1dF9pdGVyYXRvciYpIHsgcmV0dXJuIG91dHB1dF9pdGVyYXRvcl90YWcoKTsgfQordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0Rpc3RhbmNlPgoraW5saW5lIGZvcndhcmRfaXRlcmF0b3JfdGFnIF9TVExQX0NBTEwKK2l0ZXJhdG9yX2NhdGVnb3J5KGNvbnN0IGZvcndhcmRfaXRlcmF0b3I8X1RwLCBfRGlzdGFuY2U+JikgeyByZXR1cm4gZm9yd2FyZF9pdGVyYXRvcl90YWcoKTsgfQordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0Rpc3RhbmNlPgoraW5saW5lIGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnIF9TVExQX0NBTEwKK2l0ZXJhdG9yX2NhdGVnb3J5KGNvbnN0IGJpZGlyZWN0aW9uYWxfaXRlcmF0b3I8X1RwLCBfRGlzdGFuY2U+JikgeyByZXR1cm4gYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcoKTsgfQordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0Rpc3RhbmNlPgoraW5saW5lIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnIF9TVExQX0NBTEwKK2l0ZXJhdG9yX2NhdGVnb3J5KGNvbnN0IHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3I8X1RwLCBfRGlzdGFuY2U+JikgeyByZXR1cm4gcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcoKTsgfQordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0Rpc3RhbmNlPgoraW5saW5lIF9UcCogIF9TVExQX0NBTEwgdmFsdWVfdHlwZShjb25zdCBpbnB1dF9pdGVyYXRvcjxfVHAsIF9EaXN0YW5jZT4mKSB7IHJldHVybiBfX1NUQVRJQ19DQVNUKF9UcCosIDApOyB9Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfRGlzdGFuY2U+CitpbmxpbmUgX1RwKiBfU1RMUF9DQUxMIHZhbHVlX3R5cGUoY29uc3QgZm9yd2FyZF9pdGVyYXRvcjxfVHAsIF9EaXN0YW5jZT4mKSB7IHJldHVybiBfX1NUQVRJQ19DQVNUKF9UcCosIDApOyB9Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfRGlzdGFuY2U+CitpbmxpbmUgX1RwKiBfU1RMUF9DQUxMIHZhbHVlX3R5cGUoY29uc3QgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcjxfVHAsIF9EaXN0YW5jZT4mKSB7IHJldHVybiBfX1NUQVRJQ19DQVNUKF9UcCosIDApOyB9Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfRGlzdGFuY2U+CitpbmxpbmUgX1RwKiBfU1RMUF9DQUxMIHZhbHVlX3R5cGUoY29uc3QgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcjxfVHAsIF9EaXN0YW5jZT4mKSB7IHJldHVybiBfX1NUQVRJQ19DQVNUKF9UcCosIDApOyB9Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfRGlzdGFuY2U+CitpbmxpbmUgX0Rpc3RhbmNlKiBfU1RMUF9DQUxMIGRpc3RhbmNlX3R5cGUoY29uc3QgaW5wdXRfaXRlcmF0b3I8X1RwLCBfRGlzdGFuY2U+JikgeyByZXR1cm4gX19TVEFUSUNfQ0FTVChfRGlzdGFuY2UqLCAwKTsgfQordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0Rpc3RhbmNlPgoraW5saW5lIF9EaXN0YW5jZSogX1NUTFBfQ0FMTCBkaXN0YW5jZV90eXBlKGNvbnN0IGZvcndhcmRfaXRlcmF0b3I8X1RwLCBfRGlzdGFuY2U+JikgeyByZXR1cm4gX19TVEFUSUNfQ0FTVChfRGlzdGFuY2UqLCAwKTsgfQordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0Rpc3RhbmNlPgoraW5saW5lIF9EaXN0YW5jZSogX1NUTFBfQ0FMTCBkaXN0YW5jZV90eXBlKGNvbnN0IGJpZGlyZWN0aW9uYWxfaXRlcmF0b3I8X1RwLCBfRGlzdGFuY2U+JikgeyByZXR1cm4gX19TVEFUSUNfQ0FTVChfRGlzdGFuY2UqLCAwKTt9Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfRGlzdGFuY2U+CitpbmxpbmUgX0Rpc3RhbmNlKiBfU1RMUF9DQUxMIGRpc3RhbmNlX3R5cGUoY29uc3QgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcjxfVHAsIF9EaXN0YW5jZT4mKSB7IHJldHVybiBfX1NUQVRJQ19DQVNUKF9EaXN0YW5jZSosIDApOyB9CisjIGVuZGlmIC8qIEJBU0VfTUFUQ0ggKi8KKworI2VuZGlmIC8qIF9TVExQX05PX0FOQUNIUk9OSVNNUyAqLworCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3IsIGNsYXNzIF9EaXN0YW5jZT4KK2lubGluZSB2b2lkIF9TVExQX0NBTEwgX19kaXN0YW5jZShjb25zdCBfSW5wdXRJdGVyYXRvciYgX19maXJzdCwgY29uc3QgX0lucHV0SXRlcmF0b3ImIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRGlzdGFuY2UmIF9fbiwgY29uc3QgaW5wdXRfaXRlcmF0b3JfdGFnICYpIHsKKyAgX0lucHV0SXRlcmF0b3IgX19pdChfX2ZpcnN0KTsKKyAgd2hpbGUgKF9faXQgIT0gX19sYXN0KSB7ICsrX19pdDsgKytfX247IH0KK30KKworCisjIGlmIGRlZmluZWQgKF9TVExQX05PTlRFTVBMX0JBU0VfTUFUQ0hfQlVHKQordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3IsIGNsYXNzIF9EaXN0YW5jZT4KK2lubGluZSB2b2lkIF9TVExQX0NBTEwgX19kaXN0YW5jZShjb25zdCBfRm9yd2FyZEl0ZXJhdG9yJiBfX2ZpcnN0LCBjb25zdCBfRm9yd2FyZEl0ZXJhdG9yJiBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0Rpc3RhbmNlJiBfX24sIGNvbnN0IGZvcndhcmRfaXRlcmF0b3JfdGFnICYpIHsKKyAgX0ZvcndhcmRJdGVyYXRvciBfX2l0KF9fZmlyc3QpOworICB3aGlsZSAoX19pdCAhPSBfX2xhc3QpIHsgKytfX2ZpcnN0OyArK19fbjsgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciwgY2xhc3MgX0Rpc3RhbmNlPgorX1NUTFBfSU5MSU5FX0xPT1Agdm9pZCBfU1RMUF9DQUxMIF9fZGlzdGFuY2UoY29uc3QgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciYgX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9CaWRpcmVjdGlvbmFsSXRlcmF0b3ImIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EaXN0YW5jZSYgX19uLCBjb25zdCBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZyAmKSB7CisgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19pdChfX2ZpcnN0KTsKKyAgd2hpbGUgKF9faXQgIT0gX19sYXN0KSB7ICsrX19pdDsgKytfX247IH0KK30KKyMgZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgY2xhc3MgX0Rpc3RhbmNlPgoraW5saW5lIHZvaWQgX1NUTFBfQ0FMTCBfX2Rpc3RhbmNlKGNvbnN0IF9SYW5kb21BY2Nlc3NJdGVyYXRvciYgX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfUmFuZG9tQWNjZXNzSXRlcmF0b3ImIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRGlzdGFuY2UmIF9fbiwgY29uc3QgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgJikgeworICBfX24gKz0gX19sYXN0IC0gX19maXJzdDsKK30KKworI2lmbmRlZiBfU1RMUF9OT19BTkFDSFJPTklTTVMKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvciwgY2xhc3MgX0Rpc3RhbmNlPgoraW5saW5lIHZvaWQgX1NUTFBfQ0FMTCBkaXN0YW5jZShjb25zdCBfSW5wdXRJdGVyYXRvciYgX19maXJzdCwKKyAgICAgICAgY29uc3QgX0lucHV0SXRlcmF0b3ImIF9fbGFzdCwgX0Rpc3RhbmNlJiBfX24pIHsKKyAgX19kaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QsIF9fbiwgX1NUTFBfSVRFUkFUT1JfQ0FURUdPUlkoX19maXJzdCwgX0lucHV0SXRlcmF0b3IpKTsKK30KKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CitpbmxpbmUgX1NUTFBfRElGRkVSRU5DRV9UWVBFKF9JbnB1dEl0ZXJhdG9yKSBfU1RMUF9DQUxMCitfX2Rpc3RhbmNlKGNvbnN0IF9JbnB1dEl0ZXJhdG9yJiBfX2ZpcnN0LCBjb25zdCBfSW5wdXRJdGVyYXRvciYgX19sYXN0LCBjb25zdCBpbnB1dF9pdGVyYXRvcl90YWcgJikgeworICBfU1RMUF9ESUZGRVJFTkNFX1RZUEUoX0lucHV0SXRlcmF0b3IpIF9fbiA9IDA7CisgIF9JbnB1dEl0ZXJhdG9yIF9faXQoX19maXJzdCk7CisgIHdoaWxlIChfX2l0ICE9IF9fbGFzdCkgeworICAgICsrX19pdDsgKytfX247CisgIH0KKyAgcmV0dXJuIF9fbjsKK30KKworIyBpZiBkZWZpbmVkIChfU1RMUF9OT05URU1QTF9CQVNFX01BVENIX0JVRykKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgoraW5saW5lIF9TVExQX0RJRkZFUkVOQ0VfVFlQRShfRm9yd2FyZEl0ZXJhdG9yKSBfU1RMUF9DQUxMCitfX2Rpc3RhbmNlKGNvbnN0IF9Gb3J3YXJkSXRlcmF0b3ImIF9fZmlyc3QsIGNvbnN0IF9Gb3J3YXJkSXRlcmF0b3ImIF9fbGFzdCwKKyAgICAgICAgICAgY29uc3QgZm9yd2FyZF9pdGVyYXRvcl90YWcgJikKK3sKKyAgX1NUTFBfRElGRkVSRU5DRV9UWVBFKF9Gb3J3YXJkSXRlcmF0b3IpIF9fbiA9IDA7CisgIF9Gb3J3YXJkSXRlcmF0b3IgX19pdChfX2ZpcnN0KTsKKyAgd2hpbGUgKF9faXQgIT0gX19sYXN0KSB7CisgICAgKytfX2l0OyArK19fbjsKKyAgfQorICByZXR1cm4gX19uOworCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yPgorX1NUTFBfSU5MSU5FX0xPT1AgX1NUTFBfRElGRkVSRU5DRV9UWVBFKF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IpIF9TVExQX0NBTEwKK19fZGlzdGFuY2UoY29uc3QgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciYgX19maXJzdCwKKyAgICAgICAgICAgY29uc3QgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciYgX19sYXN0LAorICAgICAgICAgICBjb25zdCBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZyAmKSB7CisgIF9TVExQX0RJRkZFUkVOQ0VfVFlQRShfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yKSBfX24gPSAwOworICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9faXQoX19maXJzdCk7CisgIHdoaWxlIChfX2l0ICE9IF9fbGFzdCkgeworICAgICsrX19pdDsgKytfX247CisgIH0KKyAgcmV0dXJuIF9fbjsKK30KKyMgZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4KK2lubGluZSBfU1RMUF9ESUZGRVJFTkNFX1RZUEUoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yKSBfU1RMUF9DQUxMCitfX2Rpc3RhbmNlKGNvbnN0IF9SYW5kb21BY2Nlc3NJdGVyYXRvciYgX19maXJzdCwgY29uc3QgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yJiBfX2xhc3QsCisgICAgICAgICAgIGNvbnN0IHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnICYpIHsKKyAgcmV0dXJuIF9fbGFzdCAtIF9fZmlyc3Q7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KK2lubGluZSBfU1RMUF9ESUZGRVJFTkNFX1RZUEUoX0lucHV0SXRlcmF0b3IpIF9TVExQX0NBTEwKK2Rpc3RhbmNlKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkgeworICByZXR1cm4gX19kaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QsIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yKSk7Cit9CisKKy8vIGZicDogdGhvc2UgYXJlIGJlaW5nIHVzZWQgZm9yIGl0ZXJhdG9yL2NvbnN0X2l0ZXJhdG9yIGRlZmluaXRpb25zIGV2ZXJ5d2hlcmUKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX05vbmNvbnN0X3RyYWl0czsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfQ29uc3RfdHJhaXRzIHsKKyAgdHlwZWRlZiBfVHAgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiBjb25zdCBfVHAmICByZWZlcmVuY2U7CisgIHR5cGVkZWYgY29uc3QgX1RwKiAgcG9pbnRlcjsKKyAgdHlwZWRlZiBfQ29uc3RfdHJhaXRzPF9UcD4gX0NvbnN0VHJhaXRzOworICB0eXBlZGVmIF9Ob25jb25zdF90cmFpdHM8X1RwPiBfTm9uQ29uc3RUcmFpdHM7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9Ob25jb25zdF90cmFpdHMgeworICB0eXBlZGVmIF9UcCB2YWx1ZV90eXBlOworICB0eXBlZGVmIF9UcCYgcmVmZXJlbmNlOworICB0eXBlZGVmIF9UcCogcG9pbnRlcjsKKyAgdHlwZWRlZiBfQ29uc3RfdHJhaXRzPF9UcD4gX0NvbnN0VHJhaXRzOworICB0eXBlZGVmIF9Ob25jb25zdF90cmFpdHM8X1RwPiBfTm9uQ29uc3RUcmFpdHM7Cit9OworCisvKgorICogZHVtczogQSBzcGVjaWFsIGl0ZXJhdG9yL2NvbnN0X2l0ZXJhdG9yIHRyYWl0cyBmb3Igc2V0IGFuZCBtdWx0aXNldCBmb3Igd2hpY2ggZXZlbgorICogdGhlIGl0ZXJhdG9yIGlzIG5vdCBtdXRhYmxlCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX05vbmNvbnN0X0NvbnN0X3RyYWl0czsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfQ29uc3RfQ29uc3RfdHJhaXRzIHsKKyAgdHlwZWRlZiBfVHAgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiBjb25zdCBfVHAmICByZWZlcmVuY2U7CisgIHR5cGVkZWYgY29uc3QgX1RwKiAgcG9pbnRlcjsKKyAgdHlwZWRlZiBfQ29uc3RfQ29uc3RfdHJhaXRzPF9UcD4gX0NvbnN0VHJhaXRzOworICB0eXBlZGVmIF9Ob25jb25zdF9Db25zdF90cmFpdHM8X1RwPiBfTm9uQ29uc3RUcmFpdHM7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9Ob25jb25zdF9Db25zdF90cmFpdHMgeworICB0eXBlZGVmIF9UcCB2YWx1ZV90eXBlOworICB0eXBlZGVmIGNvbnN0IF9UcCYgcmVmZXJlbmNlOworICB0eXBlZGVmIGNvbnN0IF9UcCogcG9pbnRlcjsKKyAgdHlwZWRlZiBfQ29uc3RfQ29uc3RfdHJhaXRzPF9UcD4gX0NvbnN0VHJhaXRzOworICB0eXBlZGVmIF9Ob25jb25zdF9Db25zdF90cmFpdHM8X1RwPiBfTm9uQ29uc3RUcmFpdHM7Cit9OworCisvKgorICogQSBtYWNybyB0byBnZW5lcmF0ZSBhIG5ldyBpdGVyYXRvciB0cmFpdHMgZnJvbSBvbmUgb2YgdGhlCisgKiBwcmV2aW91cyBvbmUuIENoYW5naW5nIHRoZSBpdGVyYXRvciB0cmFpdHMgdHlwZSBtYWtlIGl0ZXJhdG9ycworICogZnJvbSBkaWZmZXJlbnQgY29udGFpbmVycyBub3QgY29tcGFyYWJsZS4KKyAqLworI2RlZmluZSBfU1RMUF9DUkVBVEVfSVRFUkFUT1JfVFJBSVRTX0JBU0UoTW90aWYsIFRyYWl0cykgICAgICAgIFwKK3RlbXBsYXRlIDxjbGFzcyBfVHA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdHJ1Y3QgXyMjTW90aWY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordGVtcGxhdGUgPGNsYXNzIF9UcD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0cnVjdCBfQ29uc3QjI01vdGlmIDogcHVibGljIF9TVExQX1NURDo6X0NvbnN0XyMjVHJhaXRzPF9UcD4geyAgXAorICB0eXBlZGVmIF9Db25zdCMjTW90aWY8X1RwPiBfQ29uc3RUcmFpdHM7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdHlwZWRlZiBfIyNNb3RpZjxfVHA+IF9Ob25Db25zdFRyYWl0czsgICAgICAgICAgICAgICAgICAgICAgICBcCit9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordGVtcGxhdGUgPGNsYXNzIF9UcD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0cnVjdCBfIyNNb3RpZiA6IHB1YmxpYyBfU1RMUF9TVEQ6Ol9Ob25jb25zdF8jI1RyYWl0czxfVHA+IHsgICAgXAorICB0eXBlZGVmIF9Db25zdCMjTW90aWY8X1RwPiBfQ29uc3RUcmFpdHM7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdHlwZWRlZiBfIyNNb3RpZjxfVHA+IF9Ob25Db25zdFRyYWl0czsgICAgICAgICAgICAgICAgICAgICAgICBcCit9OworCisjZGVmaW5lIF9TVExQX0NSRUFURV9JVEVSQVRPUl9UUkFJVFMoTW90aWYsIFRyYWl0cykgICAgICAgICAgICAgXAorX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK19TVExQX0NSRUFURV9JVEVSQVRPUl9UUkFJVFNfQkFTRShNb3RpZiwgVHJhaXRzKSAgICAgICAgICAgICAgICBcCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKworI2RlZmluZSBfU1RMUF9DUkVBVEVfSEFTSF9JVEVSQVRPUl9UUkFJVFMoTW90aWYsIFRyYWl0cykgICAgICAgIFwKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitfU1RMUF9DUkVBVEVfSVRFUkFUT1JfVFJBSVRTX0JBU0UoTm9uTG9jYWwjI01vdGlmLCBUcmFpdHMpICAgICAgXAorX1NUTFBfQ1JFQVRFX0lURVJBVE9SX1RSQUlUU19CQVNFKExvY2FsIyNNb3RpZiwgVHJhaXRzKSAgICAgICAgIFwKK3RlbXBsYXRlIDxjbGFzcyBfVHA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdHJ1Y3QgXyMjTW90aWYgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0eXBlZGVmIF9Db25zdE5vbkxvY2FsIyNNb3RpZjxfVHA+IF9Db25zdFRyYWl0czsgICAgICAgICAgICAgIFwKKyAgdHlwZWRlZiBfTm9uTG9jYWwjI01vdGlmPF9UcD4gX05vbkNvbnN0VHJhaXRzOyAgICAgICAgICAgICAgICBcCisgIHR5cGVkZWYgX0NvbnN0TG9jYWwjI01vdGlmPF9UcD4gX0NvbnN0TG9jYWxUcmFpdHM7ICAgICAgICAgICAgXAorICB0eXBlZGVmIF9Mb2NhbCMjTW90aWY8X1RwPiBfTm9uQ29uc3RMb2NhbFRyYWl0czsgICAgICAgICAgICAgIFwKK307ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKworLyoKKyMgIGlmIGRlZmluZWQgKF9TVExQX0JBU0VfVFlQRURFRl9CVUcpCisvLyB0aGlzIHdvcmthcm91bmQgaXMgbmVlZGVkIGZvciBTdW5Qcm8gNC4wLjEKK3RlbXBsYXRlIDxjbGFzcyBfVHJhaXRzPgorc3RydWN0IF9fY25zdF90cmFpdHNfYXV4IDogcHJpdmF0ZSBfVHJhaXRzIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7Cit9OworIyAgZGVmaW5lIF9fVFJBSVRTX1ZBTFVFX1RZUEUoX1RyYWl0cykgX19jbnN0X3RyYWl0c19hdXg8X1RyYWl0cz46OnZhbHVlX3R5cGUKKyMgIGVsc2UKKyMgIGRlZmluZSBfX1RSQUlUU19WQUxVRV9UWVBFKF9UcmFpdHMpIF9UcmFpdHM6OnZhbHVlX3R5cGUKKyMgIGVuZGlmCisqLworCisjaWYgZGVmaW5lZCAoX1NUTFBfTVNWQykKKy8vIE1TVkMgc3BlY2lmaWMKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvciwgY2xhc3MgX0Rpc3Q+CitpbmxpbmUgdm9pZCAgX1NUTFBfQ0FMTCBfRGlzdGFuY2UoX0lucHV0SXRlcmF0b3IgX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyYXRvciBfX2xhc3QsIF9EaXN0JiBfX24pIHsKKyAgX19kaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QsIF9fbiwgX1NUTFBfSVRFUkFUT1JfQ0FURUdPUlkoX19maXJzdCwgX0lucHV0SXRlcmF0b3IpKTsKK30KKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX0Rpc3RhbmNlPgorX1NUTFBfSU5MSU5FX0xPT1Agdm9pZCAgX1NUTFBfQ0FMTAorX19hZHZhbmNlKF9JbnB1dEl0ZXImIF9faSwgX0Rpc3RhbmNlIF9fbiwgY29uc3QgaW5wdXRfaXRlcmF0b3JfdGFnICYpIHsKKyAgd2hpbGUgKF9fbi0tKSArK19faTsKK30KKworLy8gZmJwIDogYWRkZWQgb3V0cHV0IGl0ZXJhdG9yIHRhZyB2YXJpYW50Cit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX0Rpc3RhbmNlPgorX1NUTFBfSU5MSU5FX0xPT1Agdm9pZCAgX1NUTFBfQ0FMTAorX19hZHZhbmNlKF9JbnB1dEl0ZXImIF9faSwgX0Rpc3RhbmNlIF9fbiwgY29uc3Qgb3V0cHV0X2l0ZXJhdG9yX3RhZyAmKSB7CisgIHdoaWxlIChfX24tLSkgKytfX2k7Cit9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9OT05URU1QTF9CQVNFX01BVENIX0JVRykKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yLCBjbGFzcyBfRGlzdGFuY2U+CitfU1RMUF9JTkxJTkVfTE9PUCB2b2lkIF9TVExQX0NBTEwKK19fYWR2YW5jZShfRm9yd2FyZEl0ZXJhdG9yJiBpLCBfRGlzdGFuY2UgbiwgY29uc3QgZm9yd2FyZF9pdGVyYXRvcl90YWcgJikgeworICB3aGlsZSAobi0tKSArK2k7Cit9CisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IsIGNsYXNzIF9EaXN0YW5jZT4KK19TVExQX0lOTElORV9MT09QIHZvaWQgX1NUTFBfQ0FMTAorX19hZHZhbmNlKF9CaWRpcmVjdGlvbmFsSXRlcmF0b3ImIF9faSwgX0Rpc3RhbmNlIF9fbiwKKyAgICAgICAgICBjb25zdCBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZyAmKSB7CisgIGlmIChfX24gPiAwKQorICAgIHdoaWxlIChfX24tLSkgKytfX2k7CisgIGVsc2UKKyAgICB3aGlsZSAoX19uKyspIC0tX19pOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBjbGFzcyBfRGlzdGFuY2U+CitpbmxpbmUgdm9pZCBfU1RMUF9DQUxMCitfX2FkdmFuY2UoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yJiBfX2ksIF9EaXN0YW5jZSBfX24sCisgICAgICAgICAgY29uc3QgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgJikgeworICBfX2kgKz0gX19uOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3IsIGNsYXNzIF9EaXN0YW5jZT4KK2lubGluZSB2b2lkIF9TVExQX0NBTEwgYWR2YW5jZShfSW5wdXRJdGVyYXRvciYgX19pLCBfRGlzdGFuY2UgX19uKSB7CisgIF9fYWR2YW5jZShfX2ksIF9fbiwgX1NUTFBfSVRFUkFUT1JfQ0FURUdPUlkoX19pLCBfSW5wdXRJdGVyYXRvcikpOworfQorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNpZiBkZWZpbmVkIChfU1RMUF9ERUJVRykgJiYgIWRlZmluZWQgKF9TVExQX0RFQlVHX0gpCisjICBpbmNsdWRlIDxzdGwvZGVidWcvX2RlYnVnLmg+CisjZW5kaWYKKworI2VuZGlmIC8qIF9TVExQX0lOVEVSTkFMX0lURVJBVE9SX0JBU0VfSCAqLworCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvX2l0ZXJhdG9yX29sZC5oIGIvc3RsL19pdGVyYXRvcl9vbGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjBhMTFmCi0tLSAvZGV2L251bGwKKysrIGIvc3RsL19pdGVyYXRvcl9vbGQuaApAQCAtMCwwICsxLDM1MSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LTE5OTgKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKy8qIE5PVEU6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIFNUTCBoZWFkZXJzLgorICogICBZb3Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4KKyAqLworCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0lURVJBVE9SX09MRF9ICisjZGVmaW5lIF9TVExQX0lOVEVSTkFMX0lURVJBVE9SX09MRF9ICisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfSVRFUkFUT1JfQkFTRV9ICisjIGluY2x1ZGUgPHN0bC9faXRlcmF0b3JfYmFzZS5oPgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisjIGlmZGVmIF9TVExQX1VTRV9PTERfSFBfSVRFUkFUT1JfUVVFUklFUworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NvbnRhaW5lcj4KK2lubGluZSBvdXRwdXRfaXRlcmF0b3JfdGFnIF9TVExQX0NBTEwKK2l0ZXJhdG9yX2NhdGVnb3J5KGNvbnN0IGJhY2tfaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JikgeyByZXR1cm4gb3V0cHV0X2l0ZXJhdG9yX3RhZygpOyB9Cit0ZW1wbGF0ZSA8Y2xhc3MgX0NvbnRhaW5lcj4KK2lubGluZSBvdXRwdXRfaXRlcmF0b3JfdGFnIF9TVExQX0NBTEwKK2l0ZXJhdG9yX2NhdGVnb3J5KGNvbnN0IGZyb250X2luc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYpIHsgcmV0dXJuIG91dHB1dF9pdGVyYXRvcl90YWcoKTsgfQordGVtcGxhdGUgPGNsYXNzIF9Db250YWluZXI+CitpbmxpbmUgb3V0cHV0X2l0ZXJhdG9yX3RhZyBfU1RMUF9DQUxMCitpdGVyYXRvcl9jYXRlZ29yeShjb25zdCBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mKSB7IHJldHVybiBvdXRwdXRfaXRlcmF0b3JfdGFnKCk7IH0KKworIyBlbmRpZgorCisjIGlmIGRlZmluZWQgKF9TVExQX01TVkM1MF9DT01QQVRJQklMSVRZKQorIyBkZWZpbmUgX19SZWZlcmVuY2UgX1JlZmVyZW5jZSwgY2xhc3MgX1BvaW50ZXIKKyMgZGVmaW5lIFJlZmVyZW5jZV9fIF9SZWZlcmVuY2UsIF9Qb2ludGVyCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciwgY2xhc3MgX1RwLAorICAgIF9TVExQX0RGTF9UTVBMX1BBUkFNKF9SZWZlcmVuY2UsIF9UcCYgKSwKKyAgICBfU1RMUF9ERkxfVE1QTF9QQVJBTShfUG9pbnRlciwgX1RwKiksCisgICAgX1NUTFBfREZMX1RZUEVfUEFSQU0oX0Rpc3RhbmNlLCBwdHJkaWZmX3QpPgorIyBlbHNlCisjIGRlZmluZSBfX1JlZmVyZW5jZSBfUmVmZXJlbmNlCisjIGRlZmluZSBSZWZlcmVuY2VfXyBfUmVmZXJlbmNlCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciwgY2xhc3MgX1RwLCBfU1RMUF9ERkxfVE1QTF9QQVJBTShfUmVmZXJlbmNlLCBfVHAmICksCisgICAgX1NUTFBfREZMX1RZUEVfUEFSQU0oX0Rpc3RhbmNlLCBwdHJkaWZmX3QpPgorIyBlbmRpZgorY2xhc3MgcmV2ZXJzZV9iaWRpcmVjdGlvbmFsX2l0ZXJhdG9yIHsKKyAgdHlwZWRlZiByZXZlcnNlX2JpZGlyZWN0aW9uYWxfaXRlcmF0b3I8X0JpZGlyZWN0aW9uYWxJdGVyYXRvciwgX1RwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZlcmVuY2VfXywgX0Rpc3RhbmNlPiBfU2VsZjsKKyAgLy8gIGZyaWVuZCBpbmxpbmUgYm9vbCBvcGVyYXRvcj09IF9TVExQX05VTExfVE1QTF9BUkdTIChjb25zdCBfU2VsZiYgeCwgY29uc3QgX1NlbGYmIHkpOworcHJvdGVjdGVkOgorICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIGN1cnJlbnQ7CitwdWJsaWM6CisgIHR5cGVkZWYgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CisgIHR5cGVkZWYgX1RwICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiBfRGlzdGFuY2UgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisjIGlmIGRlZmluZWQgKF9TVExQX01TVkM1MF9DT01QQVRJQklMSVRZKQorICB0eXBlZGVmIF9Qb2ludGVyICAgICAgICAgICAgICAgICAgIHBvaW50ZXI7CisjIGVsc2UKKyAgdHlwZWRlZiBfVHAqICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyOworIyBlbmRpZgorICB0eXBlZGVmIF9SZWZlcmVuY2UgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKworICByZXZlcnNlX2JpZGlyZWN0aW9uYWxfaXRlcmF0b3IoKSB7fQorICBleHBsaWNpdCByZXZlcnNlX2JpZGlyZWN0aW9uYWxfaXRlcmF0b3IoX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX3gpCisgICAgOiBjdXJyZW50KF9feCkge30KKyAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBiYXNlKCkgY29uc3QgeyByZXR1cm4gY3VycmVudDsgfQorICBfUmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fdG1wID0gY3VycmVudDsKKyAgICByZXR1cm4gKigtLV9fdG1wKTsKKyAgfQorIyBpZiAhKGRlZmluZWQgX1NUTFBfTk9fQVJST1dfT1BFUkFUT1IpCisgIF9TVExQX0RFRklORV9BUlJPV19PUEVSQVRPUgorIyBlbmRpZgorICBfU2VsZiYgb3BlcmF0b3IrKygpIHsKKyAgICAtLWN1cnJlbnQ7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIF9TZWxmIG9wZXJhdG9yKysoaW50KSB7CisgICAgX1NlbGYgX190bXAgPSAqdGhpczsKKyAgICAtLWN1cnJlbnQ7CisgICAgcmV0dXJuIF9fdG1wOworICB9CisgIF9TZWxmJiBvcGVyYXRvci0tKCkgeworICAgICsrY3VycmVudDsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgX1NlbGYgb3BlcmF0b3ItLShpbnQpIHsKKyAgICBfU2VsZiBfX3RtcCA9ICp0aGlzOworICAgICsrY3VycmVudDsKKyAgICByZXR1cm4gX190bXA7CisgIH0KK307CisKKyMgaWZkZWYgX1NUTFBfVVNFX09MRF9IUF9JVEVSQVRPUl9RVUVSSUVTCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciwgY2xhc3MgX1RwLCBjbGFzcyBfX1JlZmVyZW5jZSwKKyAgICAgICAgICBjbGFzcyBfRGlzdGFuY2U+CitpbmxpbmUgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcgX1NUTFBfQ0FMTAoraXRlcmF0b3JfY2F0ZWdvcnkoY29uc3QgcmV2ZXJzZV9iaWRpcmVjdGlvbmFsX2l0ZXJhdG9yPF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IsIF9UcCwgUmVmZXJlbmNlX18sIF9EaXN0YW5jZT4mKQoreyByZXR1cm4gYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcoKTsgfQordGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IsIGNsYXNzIF9UcCwgY2xhc3MgX19SZWZlcmVuY2UsCisgIGNsYXNzIF9EaXN0YW5jZT4KK2lubGluZSBfVHAqIF9TVExQX0NBTEwKK3ZhbHVlX3R5cGUoY29uc3QgcmV2ZXJzZV9iaWRpcmVjdGlvbmFsX2l0ZXJhdG9yPF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IsIF9UcCwgUmVmZXJlbmNlX18sIF9EaXN0YW5jZT4mKQoreyByZXR1cm4gKF9UcCopIDA7IH0KK3RlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCBjbGFzcyBfVHAsIGNsYXNzIF9fUmVmZXJlbmNlLAorICAgICAgICAgIGNsYXNzIF9EaXN0YW5jZT4KK2lubGluZSBfRGlzdGFuY2UqIF9TVExQX0NBTEwKK2Rpc3RhbmNlX3R5cGUoY29uc3QgcmV2ZXJzZV9iaWRpcmVjdGlvbmFsX2l0ZXJhdG9yPF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IsIF9UcCwgUmVmZXJlbmNlX18sIF9EaXN0YW5jZT4mKQoreyByZXR1cm4gKF9EaXN0YW5jZSopIDA7IH0KKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciwgY2xhc3MgX1RwLCBjbGFzcyBfX1JlZmVyZW5jZSwKKyAgICAgICAgICBjbGFzcyBfRGlzdGFuY2U+CitpbmxpbmUgYm9vbCAgX1NUTFBfQ0FMTCBvcGVyYXRvcj09KAorICAgIGNvbnN0IHJldmVyc2VfYmlkaXJlY3Rpb25hbF9pdGVyYXRvcjxfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCBfVHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZmVyZW5jZV9fLCBfRGlzdGFuY2U+JiBfX3gsCisgICAgY29uc3QgcmV2ZXJzZV9iaWRpcmVjdGlvbmFsX2l0ZXJhdG9yPF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IsIF9UcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmZXJlbmNlX18sIF9EaXN0YW5jZT4mIF9feSkKK3sKKyAgcmV0dXJuIF9feC5iYXNlKCkgPT0gX195LmJhc2UoKTsKK30KKworI2lmZGVmIF9TVExQX1VTRV9TRVBBUkFURV9SRUxPUFNfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfQmlJdGVyLCBjbGFzcyBfVHAsIGNsYXNzIF9fUmVmZXJlbmNlLCBjbGFzcyBfRGlzdGFuY2U+CitpbmxpbmUgYm9vbCAgX1NUTFBfQ0FMTCBvcGVyYXRvciE9KAorICAgIGNvbnN0IHJldmVyc2VfYmlkaXJlY3Rpb25hbF9pdGVyYXRvcjxfQmlJdGVyLCBfVHAsIFJlZmVyZW5jZV9fLCBfRGlzdGFuY2U+JiBfX3gsCisgICAgY29uc3QgcmV2ZXJzZV9iaWRpcmVjdGlvbmFsX2l0ZXJhdG9yPF9CaUl0ZXIsIF9UcCwgUmVmZXJlbmNlX18sIF9EaXN0YW5jZT4mIF9feSkKK3sKKyAgcmV0dXJuICEoX194ID09IF9feSk7Cit9CisKKyNlbmRpZiAvKiBfU1RMUF9VU0VfU0VQQVJBVEVfUkVMT1BTX05BTUVTUEFDRSAqLworCisjaWYgISBkZWZpbmVkICggX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTiApCisKKy8vIFRoaXMgaXMgdGhlIG9sZCB2ZXJzaW9uIG9mIHJldmVyc2VfaXRlcmF0b3IsIGFzIGZvdW5kIGluIHRoZSBvcmlnaW5hbAorLy8gIEhQIFNUTC4gIEl0IGRvZXMgbm90IHVzZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uLgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLAorIyBpZiBkZWZpbmVkIChfX01TTF9fKSAmJiAoX19NU0xfXyA+PSAweDI0MDUpIFwKKyAgfHwgZGVmaW5lZChfX01SQ19fKSB8fCAoZGVmaW5lZChfX1NDX18pICYmICFkZWZpbmVkKF9fRE1DX18pKSAgICAvLyp0eSAwMy8yMi8yMDAxIC0gZ2l2ZSB0aGUgZGVmYXVsdCB0byB0aGUgc2Vjb250IHBhcmFtIHVuZGVyIE1QVy4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEkgYmVsaWV2ZSBnaXZpbmcgdGhlIGRlZmF1bHQgd2lsbCBjYXVzZSBhbnkgaGFybSBldmVuIHRob3VnaCB0aGUgMm5kIHR5cGUgcGFyYW1ldGVyCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGlsbCBoYXZlIHRvIGJlIHByb3ZpZGVkIGZvciBUKiB0eXBlIGl0ZXJhdG9ycy4KKyAgX1NUTFBfREZMX1RNUExfUEFSQU0oX1RwLGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+Ojp2YWx1ZV90eXBlKSwKKyMgZWxzZQorICBjbGFzcyBfVHAsCisjZW5kaWYKKyBfU1RMUF9ERkxfVE1QTF9QQVJBTShfUmVmZXJlbmNlLF9UcCYpLAorIyBpZiBkZWZpbmVkIChfU1RMUF9NU1ZDNTBfQ09NUEFUSUJJTElUWSkKKyAgICAgICAgX1NUTFBfREZMX1RNUExfUEFSQU0oX1BvaW50ZXIsIF9UcCopLAorIyBlbmRpZgorICAgICAgICBfU1RMUF9ERkxfVFlQRV9QQVJBTShfRGlzdGFuY2UscHRyZGlmZl90KT4KK2NsYXNzIHJldmVyc2VfaXRlcmF0b3IgeworICB0eXBlZGVmIHJldmVyc2VfaXRlcmF0b3I8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBfVHAsIFJlZmVyZW5jZV9fLCBfRGlzdGFuY2U+CisgICAgICAgICAgX1NlbGY7Citwcm90ZWN0ZWQ6CisgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2N1cnJlbnQ7CitwdWJsaWM6CisgIHR5cGVkZWYgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CisgIHR5cGVkZWYgX1RwICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiBfRGlzdGFuY2UgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisjIGlmIGRlZmluZWQgKF9TVExQX01TVkM1MF9DT01QQVRJQklMSVRZKQorICB0eXBlZGVmIF9Qb2ludGVyICAgICAgICAgICAgICAgICAgIHBvaW50ZXI7CisjIGVsc2UKKyAgdHlwZWRlZiBfVHAqICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyOworIyBlbmRpZgorICB0eXBlZGVmIF9SZWZlcmVuY2UgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKworICByZXZlcnNlX2l0ZXJhdG9yKCkge30KKyAgcmV2ZXJzZV9pdGVyYXRvcihjb25zdCBfU2VsZiYgX194KSA6IF9fY3VycmVudChfX3guYmFzZSgpKSB7fQorICBleHBsaWNpdCByZXZlcnNlX2l0ZXJhdG9yKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX3gpIDogX19jdXJyZW50KF9feCkge30KKyAgX1NlbGYmIG9wZXJhdG9yPShjb25zdCBfU2VsZiYgX194KSB7X19jdXJyZW50ID0gX194LmJhc2UoKTsgcmV0dXJuICp0aGlzOyB9CisKKyAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIGJhc2UoKSBjb25zdCB7IHJldHVybiBfX2N1cnJlbnQ7IH0KKyAgX1JlZmVyZW5jZSBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiAqKF9fY3VycmVudCAtIChkaWZmZXJlbmNlX3R5cGUpMSk7IH0KKworIyBpZiAhKGRlZmluZWQgX1NUTFBfTk9fQVJST1dfT1BFUkFUT1IpCisgIF9TVExQX0RFRklORV9BUlJPV19PUEVSQVRPUgorIyBlbmRpZgorCisgIF9TZWxmJiBvcGVyYXRvcisrKCkgeworICAgIC0tX19jdXJyZW50OworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBfU2VsZiBvcGVyYXRvcisrKGludCkgeworICAgIF9TZWxmIF9fdG1wID0gKnRoaXM7CisgICAgLS1fX2N1cnJlbnQ7CisgICAgcmV0dXJuIF9fdG1wOworICB9CisgIF9TZWxmJiBvcGVyYXRvci0tKCkgeworICAgICsrX19jdXJyZW50OworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBfU2VsZiBvcGVyYXRvci0tKGludCkgeworICAgIF9TZWxmIF9fdG1wID0gKnRoaXM7CisgICAgKytfX2N1cnJlbnQ7CisgICAgcmV0dXJuIF9fdG1wOworICB9CisgIF9TZWxmIG9wZXJhdG9yKyhfRGlzdGFuY2UgX19uKSBjb25zdCB7CisgICAgcmV0dXJuIF9TZWxmKF9fY3VycmVudCAtIF9fbik7CisgIH0KKyAgX1NlbGYmIG9wZXJhdG9yKz0oX0Rpc3RhbmNlIF9fbikgeworICAgIF9fY3VycmVudCAtPSBfX247CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIF9TZWxmIG9wZXJhdG9yLShfRGlzdGFuY2UgX19uKSBjb25zdCB7CisgICAgcmV0dXJuIF9TZWxmKF9fY3VycmVudCArIF9fbik7CisgIH0KKyAgX1NlbGYmIG9wZXJhdG9yLT0oX0Rpc3RhbmNlIF9fbikgeworICAgIF9fY3VycmVudCArPSBfX247CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIF9SZWZlcmVuY2Ugb3BlcmF0b3JbXShfRGlzdGFuY2UgX19uKSBjb25zdCB7IHJldHVybiAqKCp0aGlzICsgX19uKTsgfQorfTsKKworIyBpZmRlZiBfU1RMUF9VU0VfT0xEX0hQX0lURVJBVE9SX1FVRVJJRVMKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIGNsYXNzIF9UcCwKKyAgICAgICAgICBjbGFzcyBfX1JlZmVyZW5jZSwgY2xhc3MgX0Rpc3RhbmNlPgoraW5saW5lIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnIF9TVExQX0NBTEwKK2l0ZXJhdG9yX2NhdGVnb3J5KGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBfVHAsIFJlZmVyZW5jZV9fLCBfRGlzdGFuY2U+JikKK3sgcmV0dXJuIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKCk7IH0KK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIGNsYXNzIF9UcCwKKyAgY2xhc3MgX19SZWZlcmVuY2UsIGNsYXNzIF9EaXN0YW5jZT4KK2lubGluZSBfVHAqICBfU1RMUF9DQUxMIHZhbHVlX3R5cGUoY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIF9UcCwgUmVmZXJlbmNlX18sIF9EaXN0YW5jZT4mKQoreyByZXR1cm4gKF9UcCopIDA7IH0KK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIGNsYXNzIF9UcCwKKyAgICAgICAgICBjbGFzcyBfX1JlZmVyZW5jZSwgY2xhc3MgX0Rpc3RhbmNlPgoraW5saW5lIF9EaXN0YW5jZSogIF9TVExQX0NBTEwKK2Rpc3RhbmNlX3R5cGUoY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIF9UcCwgUmVmZXJlbmNlX18sIF9EaXN0YW5jZT4mKQoreyByZXR1cm4gKF9EaXN0YW5jZSopIDA7IH0KKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBjbGFzcyBfVHAsCisgICAgICAgICAgY2xhc3MgX19SZWZlcmVuY2UsIGNsYXNzIF9EaXN0YW5jZT4KK2lubGluZSBib29sICBfU1RMUF9DQUxMCitvcGVyYXRvcj09KGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBfVHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmZXJlbmNlX18sIF9EaXN0YW5jZT4mIF9feCwKKyAgICAgICAgICAgY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIF9UcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZlcmVuY2VfXywgX0Rpc3RhbmNlPiYgX195KQoreworICByZXR1cm4gX194LmJhc2UoKSA9PSBfX3kuYmFzZSgpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBjbGFzcyBfVHAsCisgICAgICAgICAgY2xhc3MgX19SZWZlcmVuY2UsIGNsYXNzIF9EaXN0YW5jZT4KK2lubGluZSBib29sIF9TVExQX0NBTEwKK29wZXJhdG9yPChjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgX1RwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmZXJlbmNlX18sIF9EaXN0YW5jZT4mIF9feCwKKyAgICAgICAgICBjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgX1RwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmZXJlbmNlX18sIF9EaXN0YW5jZT4mIF9feSkKK3sKKyAgcmV0dXJuIF9feS5iYXNlKCkgPCBfX3guYmFzZSgpOworfQorCisjaWZkZWYgX1NUTFBfVVNFX1NFUEFSQVRFX1JFTE9QU19OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgY2xhc3MgX1RwLAorICAgICAgICAgIGNsYXNzIF9fUmVmZXJlbmNlLCBjbGFzcyBfRGlzdGFuY2U+CitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMCitvcGVyYXRvciE9KGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBfVHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmZXJlbmNlX18sIF9EaXN0YW5jZT4mIF9feCwKKyAgICAgICAgICAgY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIF9UcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZlcmVuY2VfXywgX0Rpc3RhbmNlPiYgX195KSB7CisgIHJldHVybiAhKF9feCA9PSBfX3kpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBjbGFzcyBfVHAsCisgICAgICAgICAgY2xhc3MgX19SZWZlcmVuY2UsIGNsYXNzIF9EaXN0YW5jZT4KK2lubGluZSBib29sIF9TVExQX0NBTEwKK29wZXJhdG9yPihjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgX1RwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmZXJlbmNlX18sIF9EaXN0YW5jZT4mIF9feCwKKyAgICAgICAgICBjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgX1RwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmZXJlbmNlX18sIF9EaXN0YW5jZT4mIF9feSkgeworICByZXR1cm4gX195IDwgX194OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBjbGFzcyBfVHAsCisgICAgICAgICAgY2xhc3MgX19SZWZlcmVuY2UsIGNsYXNzIF9EaXN0YW5jZT4KK2lubGluZSBib29sIF9TVExQX0NBTEwKK29wZXJhdG9yPD0oY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIF9UcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZlcmVuY2VfXywgX0Rpc3RhbmNlPiYgX194LAorICAgICAgICAgICBjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgX1RwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZmVyZW5jZV9fLCBfRGlzdGFuY2U+JiBfX3kpIHsKKyAgcmV0dXJuICEoX195IDwgX194KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgY2xhc3MgX1RwLAorICAgICAgICAgIGNsYXNzIF9fUmVmZXJlbmNlLCBjbGFzcyBfRGlzdGFuY2U+CitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMCitvcGVyYXRvcj49KGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBfVHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmZXJlbmNlX18sIF9EaXN0YW5jZT4mIF9feCwKKyAgICAgICAgICAgY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIF9UcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZlcmVuY2VfXywgX0Rpc3RhbmNlPiYgX195KSB7CisgIHJldHVybiAhKF9feCA8IF9feSk7Cit9CisKKyNlbmRpZiAvKiBfU1RMUF9VU0VfU0VQQVJBVEVfUkVMT1BTX05BTUVTUEFDRSAqLworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBjbGFzcyBfVHAsCisgICAgICAgICAgY2xhc3MgX19SZWZlcmVuY2UsIGNsYXNzIF9EaXN0YW5jZT4KK2lubGluZSBfRGlzdGFuY2UgIF9TVExQX0NBTEwKK29wZXJhdG9yLShjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgX1RwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmZXJlbmNlX18sIF9EaXN0YW5jZT4mIF9feCwKKyAgICAgICAgICBjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgX1RwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmZXJlbmNlX18sIF9EaXN0YW5jZT4mIF9feSkKK3sKKyAgcmV0dXJuIF9feS5iYXNlKCkgLSBfX3guYmFzZSgpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBjbGFzcyBfVHAsCisgICAgICAgICAgY2xhc3MgX19SZWZlcmVuY2UsIGNsYXNzIF9EaXN0YW5jZT4KK2lubGluZSByZXZlcnNlX2l0ZXJhdG9yPF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgX1RwLAorICAgICAgICAgICAgICAgICAgICAgICAgUmVmZXJlbmNlX18sIF9EaXN0YW5jZT4gIF9TVExQX0NBTEwKK29wZXJhdG9yKyhfRGlzdGFuY2UgX19uLAorICAgICAgICAgIGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBfVHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZlcmVuY2VfXywgX0Rpc3RhbmNlPiYgX194KQoreworICByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcjxfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIF9UcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmZXJlbmNlX18sIF9EaXN0YW5jZT4oX194LmJhc2UoKSAtIF9fbik7Cit9CisKKyNlbmRpZiAvKiAhIGRlZmluZWQgKCBfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OICkgKi8KKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfSVRFUkFUT1JfSCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RsL19saW1pdHMuYyBiL3N0bC9fbGltaXRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU2NDg5YgotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9fbGltaXRzLmMKQEAgLTAsMCArMSwzMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgsMTk5OQorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmbmRlZiBfU1RMUF9MSU1JVFNfQworI2RlZmluZSBfU1RMUF9MSU1JVFNfQworCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0xJTUlUUworIyAgaW5jbHVkZSA8c3RsL19saW1pdHMuaD4KKyNlbmRpZgorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBudW1lcmljX2xpbWl0cyBzdGF0aWMgbWVtYmVycworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfU1RBVElDX0NPTlNUX0lOSVRfQlVHKQorCisjICBkZWZpbmUgX19kZWNsYXJlX251bWVyaWNfYmFzZV9tZW1iZXIoX190eXBlLCBfX21lbSwgX0luaXQpIFwKK3RlbXBsYXRlIDxjbGFzcyBfX251bWJlcj4gXAorICBjb25zdCBfX3R5cGUgX051bWVyaWNfbGltaXRzX2Jhc2U8X19udW1iZXI+OjogX19tZW0KKworX19kZWNsYXJlX251bWVyaWNfYmFzZV9tZW1iZXIoYm9vbCwgaXNfc3BlY2lhbGl6ZWQsIGZhbHNlKTsKK19fZGVjbGFyZV9udW1lcmljX2Jhc2VfbWVtYmVyKGludCwgZGlnaXRzLCAwKTsKK19fZGVjbGFyZV9udW1lcmljX2Jhc2VfbWVtYmVyKGludCwgZGlnaXRzMTAsIDApOworX19kZWNsYXJlX251bWVyaWNfYmFzZV9tZW1iZXIoYm9vbCwgaXNfc2lnbmVkLCBmYWxzZSk7CitfX2RlY2xhcmVfbnVtZXJpY19iYXNlX21lbWJlcihib29sLCBpc19pbnRlZ2VyLCBmYWxzZSk7CitfX2RlY2xhcmVfbnVtZXJpY19iYXNlX21lbWJlcihib29sLCBpc19leGFjdCwgZmFsc2UpOworX19kZWNsYXJlX251bWVyaWNfYmFzZV9tZW1iZXIoaW50LCByYWRpeCwgMCk7CitfX2RlY2xhcmVfbnVtZXJpY19iYXNlX21lbWJlcihpbnQsIG1pbl9leHBvbmVudCwgMCk7CitfX2RlY2xhcmVfbnVtZXJpY19iYXNlX21lbWJlcihpbnQsIG1heF9leHBvbmVudCwgMCk7CitfX2RlY2xhcmVfbnVtZXJpY19iYXNlX21lbWJlcihpbnQsIG1pbl9leHBvbmVudDEwLCAwKTsKK19fZGVjbGFyZV9udW1lcmljX2Jhc2VfbWVtYmVyKGludCwgbWF4X2V4cG9uZW50MTAsIDApOworX19kZWNsYXJlX251bWVyaWNfYmFzZV9tZW1iZXIoYm9vbCwgaGFzX2luZmluaXR5LCBmYWxzZSk7CitfX2RlY2xhcmVfbnVtZXJpY19iYXNlX21lbWJlcihib29sLCBoYXNfcXVpZXRfTmFOLCBmYWxzZSk7CitfX2RlY2xhcmVfbnVtZXJpY19iYXNlX21lbWJlcihib29sLCBoYXNfc2lnbmFsaW5nX05hTiwgZmFsc2UpOworX19kZWNsYXJlX251bWVyaWNfYmFzZV9tZW1iZXIoZmxvYXRfZGVub3JtX3N0eWxlLCBoYXNfZGVub3JtLCBkZW5vcm1fYWJzZW50KTsKK19fZGVjbGFyZV9udW1lcmljX2Jhc2VfbWVtYmVyKGJvb2wsIGhhc19kZW5vcm1fbG9zcywgZmFsc2UpOworX19kZWNsYXJlX251bWVyaWNfYmFzZV9tZW1iZXIoYm9vbCwgaXNfaWVjNTU5LCBmYWxzZSk7CitfX2RlY2xhcmVfbnVtZXJpY19iYXNlX21lbWJlcihib29sLCBpc19ib3VuZGVkLCBmYWxzZSk7CitfX2RlY2xhcmVfbnVtZXJpY19iYXNlX21lbWJlcihib29sLCBpc19tb2R1bG8sIGZhbHNlKTsKK19fZGVjbGFyZV9udW1lcmljX2Jhc2VfbWVtYmVyKGJvb2wsIHRyYXBzLCBmYWxzZSk7CitfX2RlY2xhcmVfbnVtZXJpY19iYXNlX21lbWJlcihib29sLCB0aW55bmVzc19iZWZvcmUsIGZhbHNlKTsKK19fZGVjbGFyZV9udW1lcmljX2Jhc2VfbWVtYmVyKGZsb2F0X3JvdW5kX3N0eWxlLCByb3VuZF9zdHlsZSwgcm91bmRfdG93YXJkX3plcm8pOworCisjICB1bmRlZiBfX2RlY2xhcmVfbnVtZXJpY19iYXNlX21lbWJlcgorCisjICBkZWZpbmUgX19kZWNsYXJlX2ludGVnZXJfbGltaXRzX21lbWJlcihfX3R5cGUsIF9fbWVtLCBfSW5pdCkgXAordGVtcGxhdGUgPGNsYXNzIF9JbnQsIF9TVExQX0xJTUlUU19NSU5fVFlQRSBfX2ltaW4sIF9TVExQX0xJTUlUU19NQVhfVFlQRSBfX2ltYXgsIGludCBfX2lkaWdpdHMsIGJvb2wgX19pc21vZD4gXAorICBjb25zdCBfX3R5cGUgX0ludGVnZXJfbGltaXRzPF9JbnQsIF9faW1pbiwgX19pbWF4LCBfX2lkaWdpdHMsIF9faXNtb2Q+OjogX19tZW0KKworX19kZWNsYXJlX2ludGVnZXJfbGltaXRzX21lbWJlcihib29sLCBpc19zcGVjaWFsaXplZCwgdHJ1ZSk7CitfX2RlY2xhcmVfaW50ZWdlcl9saW1pdHNfbWVtYmVyKGludCwgZGlnaXRzLCAoX19pZGlnaXRzIDwgMCkgPyBcCisgICAgICAgICAgKChpbnQpKChzaXplb2YoX0ludCkgKiAoQ0hBUl9CSVQpKSkgLSAoKF9faW1pbiA9PSAwKSA/IDAgOiAxKSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKF9faWRpZ2l0cykgKTsKK19fZGVjbGFyZV9pbnRlZ2VyX2xpbWl0c19tZW1iZXIoaW50LCBkaWdpdHMxMCwgKGludCkoMzAxVUwgKiBkaWdpdHMpIC8xMDAwKTsKK19fZGVjbGFyZV9pbnRlZ2VyX2xpbWl0c19tZW1iZXIoYm9vbCwgaXNfc2lnbmVkLCBfX2ltaW4gIT0gMCk7CitfX2RlY2xhcmVfaW50ZWdlcl9saW1pdHNfbWVtYmVyKGJvb2wsIGlzX2ludGVnZXIsIHRydWUpOworX19kZWNsYXJlX2ludGVnZXJfbGltaXRzX21lbWJlcihib29sLCBpc19leGFjdCwgdHJ1ZSk7CitfX2RlY2xhcmVfaW50ZWdlcl9saW1pdHNfbWVtYmVyKGludCwgcmFkaXgsIDIpOworX19kZWNsYXJlX2ludGVnZXJfbGltaXRzX21lbWJlcihib29sLCBpc19ib3VuZGVkLCB0cnVlKTsKK19fZGVjbGFyZV9pbnRlZ2VyX2xpbWl0c19tZW1iZXIoYm9vbCwgaXNfbW9kdWxvLCB0cnVlKTsKKyMgIHVuZGVmIF9fZGVjbGFyZV9pbnRlZ2VyX2xpbWl0c19tZW1iZXIKKworIyAgZGVmaW5lIF9fZGVjbGFyZV9mbG9hdF9saW1pdHNfbWVtYmVyKF9fdHlwZSwgX19tZW0sIF9Jbml0KSBcCit0ZW1wbGF0ZSA8Y2xhc3MgX19udW1iZXIsICBcCisgICAgICAgICBpbnQgX19EaWdpdHMsIGludCBfX0RpZ2l0czEwLCAgICBcCisgICAgICAgICBpbnQgX19NaW5FeHAsIGludCBfX01heEV4cCwgICAgICBcCisgICAgICAgICBpbnQgX19NaW5FeHAxMCwgaW50IF9fTWF4RXhwMTAsICBcCisgICAgICAgICBib29sIF9fSXNJRUM1NTksIFwKKyAgICAgICAgIGZsb2F0X3JvdW5kX3N0eWxlIF9fUm91bmRTdHlsZT4gXAorY29uc3QgX190eXBlIF9GbG9hdGluZ19saW1pdHM8IF9fbnVtYmVyLCBfX0RpZ2l0cywgX19EaWdpdHMxMCwgICAgXAorICAgICAgICAgX19NaW5FeHAsIF9fTWF4RXhwLCBfX01pbkV4cDEwLCBfX01heEV4cDEwLCAgXAorICAgICAgICAgX19Jc0lFQzU1OSwgX19Sb3VuZFN0eWxlPjo6XAorICAgICAgICAgX19tZW0KKworX19kZWNsYXJlX2Zsb2F0X2xpbWl0c19tZW1iZXIoYm9vbCwgaXNfc3BlY2lhbGl6ZWQsIHRydWUpOworX19kZWNsYXJlX2Zsb2F0X2xpbWl0c19tZW1iZXIoaW50LCBkaWdpdHMsIF9fRGlnaXRzKTsKK19fZGVjbGFyZV9mbG9hdF9saW1pdHNfbWVtYmVyKGludCwgZGlnaXRzMTAsIF9fRGlnaXRzMTApOworX19kZWNsYXJlX2Zsb2F0X2xpbWl0c19tZW1iZXIoYm9vbCwgaXNfc2lnbmVkLCB0cnVlKTsKK19fZGVjbGFyZV9mbG9hdF9saW1pdHNfbWVtYmVyKGludCwgcmFkaXgsIEZMVF9SQURJWCk7CitfX2RlY2xhcmVfZmxvYXRfbGltaXRzX21lbWJlcihpbnQsIG1pbl9leHBvbmVudCwgX19NaW5FeHApOworX19kZWNsYXJlX2Zsb2F0X2xpbWl0c19tZW1iZXIoaW50LCBtYXhfZXhwb25lbnQsIF9fTWF4RXhwKTsKK19fZGVjbGFyZV9mbG9hdF9saW1pdHNfbWVtYmVyKGludCwgbWluX2V4cG9uZW50MTAsIF9fTWluRXhwMTApOworX19kZWNsYXJlX2Zsb2F0X2xpbWl0c19tZW1iZXIoaW50LCBtYXhfZXhwb25lbnQxMCwgX19NYXhFeHAxMCk7CitfX2RlY2xhcmVfZmxvYXRfbGltaXRzX21lbWJlcihib29sLCBoYXNfaW5maW5pdHksIHRydWUpOworX19kZWNsYXJlX2Zsb2F0X2xpbWl0c19tZW1iZXIoYm9vbCwgaGFzX3F1aWV0X05hTiwgdHJ1ZSk7CitfX2RlY2xhcmVfZmxvYXRfbGltaXRzX21lbWJlcihib29sLCBoYXNfc2lnbmFsaW5nX05hTiwgdHJ1ZSk7CitfX2RlY2xhcmVfZmxvYXRfbGltaXRzX21lbWJlcihmbG9hdF9kZW5vcm1fc3R5bGUsIGhhc19kZW5vcm0sIGRlbm9ybV9pbmRldGVybWluYXRlKTsKK19fZGVjbGFyZV9mbG9hdF9saW1pdHNfbWVtYmVyKGJvb2wsIGhhc19kZW5vcm1fbG9zcywgZmFsc2UpOworX19kZWNsYXJlX2Zsb2F0X2xpbWl0c19tZW1iZXIoYm9vbCwgaXNfaWVjNTU5LCBfX0lzSUVDNTU5KTsKK19fZGVjbGFyZV9mbG9hdF9saW1pdHNfbWVtYmVyKGJvb2wsIGlzX2JvdW5kZWQsIHRydWUpOworX19kZWNsYXJlX2Zsb2F0X2xpbWl0c19tZW1iZXIoYm9vbCwgdHJhcHMsIHRydWUpOworX19kZWNsYXJlX2Zsb2F0X2xpbWl0c19tZW1iZXIoYm9vbCwgdGlueW5lc3NfYmVmb3JlLCBmYWxzZSk7CitfX2RlY2xhcmVfZmxvYXRfbGltaXRzX21lbWJlcihmbG9hdF9yb3VuZF9zdHlsZSwgcm91bmRfc3R5bGUsIF9fUm91bmRTdHlsZSk7CisjICB1bmRlZiBfX2RlY2xhcmVfZmxvYXRfbGltaXRzX21lbWJlcgorCisjZW5kaWYgLyogX1NUTFBfU1RBVElDX0NPTlNUX0lOSVRfQlVHICovCisKKworI2lmIGRlZmluZWQgKF9TVExQX0VYUE9TRV9HTE9CQUxTX0lNUExFTUVOVEFUSU9OKQorCisjICBpZiBkZWZpbmVkIChfU1RMUF9CSUdfRU5ESUFOKQorIyAgICBpZiBkZWZpbmVkIChfX09TNDAwX18pCisjICAgICAgZGVmaW5lIF9TVExQX0ZMT0FUX0lORl9SRVAgeyAweDdmODAsIDAgfQorIyAgICAgIGRlZmluZSBfU1RMUF9GTE9BVF9RTkFOX1JFUCB7IDB4ZmZjMCwgMCB9CisjICAgICAgZGVmaW5lIF9TVExQX0ZMT0FUX1NOQU5fUkVQIHsgMHhmZjgwLCAwIH0KKyMgICAgICBkZWZpbmUgX1NUTFBfRE9VQkxFX0lORl9SRVAgeyAweDdmZjAsIDAsIDAsIDAgfQorIyAgICAgIGRlZmluZSBfU1RMUF9ET1VCTEVfUU5BTl9SRVAgeyAweGZmZjgsIDAsIDAsIDAgfQorIyAgICAgIGRlZmluZSBfU1RMUF9ET1VCTEVfU05BTl9SRVAgeyAweGZmZjAsIDAsIDAsIDAgfQorIyAgICAgIGRlZmluZSBfU1RMUF9MRE9VQkxFX0lORl9SRVAgeyAweDdmZjAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfQorIyAgICAgIGRlZmluZSBfU1RMUF9MRE9VQkxFX1FOQU5fUkVQIHsgMHhmZmY4LCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0KKyMgICAgICBkZWZpbmUgX1NUTFBfTERPVUJMRV9TTkFOX1JFUCB7IDB4ZmZmMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9CisjICAgIGVsc2UgLyogX19PUzQwMF9fICovCisjICAgICAgZGVmaW5lIF9TVExQX0ZMT0FUX0lORl9SRVAgICB7IDB4N2Y4MCwgMCB9CisjICAgICAgZGVmaW5lIF9TVExQX0ZMT0FUX1FOQU5fUkVQICB7IDB4N2ZjMSwgMCB9CisjICAgICAgZGVmaW5lIF9TVExQX0ZMT0FUX1NOQU5fUkVQICB7IDB4N2Y4MSwgMCB9CisjICAgICAgZGVmaW5lIF9TVExQX0RPVUJMRV9JTkZfUkVQICB7IDB4N2ZmMCwgMCwgMCwgMCB9CisjICAgICAgZGVmaW5lIF9TVExQX0RPVUJMRV9RTkFOX1JFUCB7IDB4N2ZmOSwgMCwgMCwgMCB9CisjICAgICAgZGVmaW5lIF9TVExQX0RPVUJMRV9TTkFOX1JFUCB7IDB4N2ZmMSwgMCwgMCwgMCB9CisjICAgICAgZGVmaW5lIF9TVExQX0xET1VCTEVfSU5GX1JFUCB7IDB4N2ZmMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9CisjICAgICAgZGVmaW5lIF9TVExQX0xET1VCTEVfUU5BTl9SRVAgeyAweDdmZjEsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfQorIyAgICAgIGRlZmluZSBfU1RMUF9MRE9VQkxFX1NOQU5fUkVQIHsgMHg3ZmY5LCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0KKyMgICAgZW5kaWYgLyogX19PUzQwMF9fICovCisKKyMgIGVsaWYgZGVmaW5lZCAoX1NUTFBfTElUVExFX0VORElBTikKKworIyAgICBpZiAwIC8qIGRlZmluZWQoX1NUTFBfTVNWQykgfHwgZGVmaW5lZChfX2xpbnV4X18pICovCisvLyBzb21lIElBLTMyIHBsYXRmb3JtID8/CisvKgorIyAgICAgIGRlZmluZSBfU1RMUF9GTE9BVF9JTkZfUkVQIHsgMCwgMHg3ZjgwIH0KKyMgICAgICBkZWZpbmUgX1NUTFBfRkxPQVRfUU5BTl9SRVAgeyAwLCAweGZmYzAgfQorIyAgICAgIGRlZmluZSBfU1RMUF9GTE9BVF9TTkFOX1JFUCB7IDAsIDB4ZmY4MCB9CisKKyMgICAgICBkZWZpbmUgX1NUTFBfRE9VQkxFX0lORl9SRVAgeyAwLCAwLCAwLCAweDdmZjAgfQorIyAgICAgIGRlZmluZSBfU1RMUF9ET1VCTEVfUU5BTl9SRVAgeyAwLCAwLCAwLCAweGZmZjggfQorIyAgICAgIGRlZmluZSBfU1RMUF9ET1VCTEVfU05BTl9SRVAgeyAwLCAwLCAwLCAweGZmZjAgfQorIyAgICAgIGRlZmluZSBfU1RMUF9MRE9VQkxFX0lORl9SRVAgeyAwLCAwLCAwLCAweDdGRjAsIDAgfSAvLyA/Pz8/CisjICAgICAgZGVmaW5lIF9TVExQX0xET1VCTEVfUU5BTl9SRVAgeyAwLCAwLCAwLCAweEZGRjgsIDAgfSAvLyA/Pz8/CisjICAgICAgZGVmaW5lIF9TVExQX0xET1VCTEVfU05BTl9SRVAgeyAwLCAwLCAwLCAweEZGRjAsIDAgfSAvLyA/Pz8/CisqLworIyAgICBlbGlmIGRlZmluZWQoX19ERUNDWFgpCisKKyMgICAgICBkZWZpbmUgX1NUTFBfRkxPQVRfSU5GX1JFUCB7IDAsIDB4N2Y4MCB9CisjICAgICAgZGVmaW5lIF9TVExQX0ZMT0FUX1FOQU5fUkVQIHsgMCwgMHhmZmMwIH0KKyMgICAgICBkZWZpbmUgX1NUTFBfRkxPQVRfU05BTl9SRVAgeyAweDU1NTUsIDB4N2Y4NSB9CisKKyMgICAgICBkZWZpbmUgX1NUTFBfRE9VQkxFX0lORl9SRVAgeyAwLCAwLCAwLCAweDdmZjAgfQorIyAgICAgIGRlZmluZSBfU1RMUF9ET1VCTEVfUU5BTl9SRVAgeyAwLCAwLCAwLCAweGZmZjggfQorIyAgICAgIGRlZmluZSBfU1RMUF9ET1VCTEVfU05BTl9SRVAgeyAweDU1NTUsIDB4NTU1NSwgMHg1NTU1LCAweDdmZjUgfQorCisjICAgICAgZGVmaW5lIF9TVExQX0xET1VCTEVfSU5GX1JFUCB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB4N2ZmZiB9CisjICAgICAgZGVmaW5lIF9TVExQX0xET1VCTEVfUU5BTl9SRVAgeyAwLCAwLCAwLCAwLCAwLCAwLCAweDgwMDAsIDB4ZmZmZiB9CisjICAgICAgZGVmaW5lIF9TVExQX0xET1VCTEVfU05BTl9SRVAgeyAweDU1NTUsIDB4NTU1NSwgMHg1NTU1LCAweDU1NTUsIDB4NTU1NSwgMHg1NTU1LCAweDU1NTUsIDB4N2ZmZn0KKyMgICAgZWxzZQorIyAgICAgIGRlZmluZSBfU1RMUF9GTE9BVF9JTkZfUkVQIHsgMCwgMHg3ZjgwIH0KKyMgICAgICBkZWZpbmUgX1NUTFBfRkxPQVRfUU5BTl9SRVAgeyAwLCAweDdmYzAgfQorIyAgICAgIGRlZmluZSBfU1RMUF9GTE9BVF9TTkFOX1JFUCB7IDAsIDB4N2ZhMCB9CisjICAgICAgZGVmaW5lIF9TVExQX0RPVUJMRV9JTkZfUkVQIHsgMCwgMCwgMCwgMHg3ZmYwIH0KKyMgICAgICBkZWZpbmUgX1NUTFBfRE9VQkxFX1FOQU5fUkVQIHsgMCwgMCwgMCwgMHg3ZmY4IH0KKyMgICAgICBkZWZpbmUgX1NUTFBfRE9VQkxFX1NOQU5fUkVQIHsgMCwgMCwgMCwgMHg3ZmY0IH0KKyMgICAgICBpZiBkZWZpbmVkIChfU1RMUF9NU1ZDKSB8fCBkZWZpbmVkIChfX0lDTCkKKyMgICAgICAgIGRlZmluZSBfU1RMUF9MRE9VQkxFX0lORl9SRVAgeyAwLCAwLCAwLCAweDdGRjAsIDAgfQorIyAgICAgICAgZGVmaW5lIF9TVExQX0xET1VCTEVfUU5BTl9SRVAgeyAwLCAwLCAwLCAweEZGRjgsIDAgfQorIyAgICAgICAgZGVmaW5lIF9TVExQX0xET1VCTEVfU05BTl9SRVAgeyAwLCAwLCAwLCAweEZGRjgsIDAgfQorIyAgICAgIGVsaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKQorIyAgICAgICAgZGVmaW5lIF9TVExQX0xET1VCTEVfSU5GX1JFUCB7IDAsIDAsIDAsIDB4ODAwMCwgMHg3ZmZmIH0KKyMgICAgICAgIGRlZmluZSBfU1RMUF9MRE9VQkxFX1FOQU5fUkVQIHsgMCwgMCwgMCwgMHhjMDAwLCAweDdmZmYgfQorIyAgICAgICAgZGVmaW5lIF9TVExQX0xET1VCTEVfU05BTl9SRVAgeyAwLCAwLCAwLCAweGEwMDAsIDB4N2ZmZiB9CisjICAgICAgZWxzZQorIyAgICAgICAgZGVmaW5lIF9TVExQX0xET1VCTEVfSU5GX1JFUCB7IDAsIDAsIDAsIDB4ODAwMCwgMHg3ZmZmLCAwIH0KKyMgICAgICAgIGRlZmluZSBfU1RMUF9MRE9VQkxFX1FOQU5fUkVQIHsgMCwgMCwgMCwgMHhhMDAwLCAweDdmZmYsIDAgfQorIyAgICAgICAgZGVmaW5lIF9TVExQX0xET1VCTEVfU05BTl9SRVAgeyAwLCAwLCAwLCAweGMwMDAsIDB4N2ZmZiwgMCB9CisjICAgICAgZW5kaWYKKyMgICAgZW5kaWYKKyMgIGVsc2UKKy8qIFRoaXMgaXMgYW4gYXJjaGl0ZWN0dXJlIHdlIGRvbid0IGtub3cgaG93IHRvIGhhbmRsZS4gUmV0dXJuIHNvbWUKK29idmlvdXNseSB3cm9uZyB2YWx1ZXMuICovCisjICAgIGRlZmluZSBfU1RMUF9GTE9BVF9JTkZfUkVQIHsgMCwgMCB9CisjICAgIGRlZmluZSBfU1RMUF9GTE9BVF9RTkFOX1JFUCB7IDAsIDAgfQorIyAgICBkZWZpbmUgX1NUTFBfRkxPQVRfU05BTl9SRVAgeyAwLCAwIH0KKyMgICAgZGVmaW5lIF9TVExQX0RPVUJMRV9JTkZfUkVQIHsgMCwgMCB9CisjICAgIGRlZmluZSBfU1RMUF9ET1VCTEVfUU5BTl9SRVAgeyAwLCAwIH0KKyMgICAgZGVmaW5lIF9TVExQX0RPVUJMRV9TTkFOX1JFUCB7IDAsIDAgfQorIyAgICBkZWZpbmUgX1NUTFBfTERPVUJMRV9JTkZfUkVQIHsgMCB9CisjICAgIGRlZmluZSBfU1RMUF9MRE9VQkxFX1FOQU5fUkVQIHsgMCB9CisjICAgIGRlZmluZSBfU1RMUF9MRE9VQkxFX1NOQU5fUkVQIHsgMCB9CisKKyMgIGVuZGlmCisKKyMgIGlmIDAKKy8qCisjICAgIGlmIGRlZmluZWQoX1NUTFBfQklHX0VORElBTikKKworIyAgICBlbGlmIGRlZmluZWQgKF9TVExQX0xJVFRMRV9FTkRJQU4pCisjICAgIGVsc2UKKworLy9UaGlzIGlzIGFuIGFyY2hpdGVjdHVyZSB3ZSBkb24ndCBrbm93IGhvdyB0byBoYW5kbGUuICBSZXR1cm4gc29tZQorLy9vYnZpb3VzbHkgd3JvbmcgdmFsdWVzLgorIyAgICAgIGRlZmluZSBfU1RMUF9GTE9BVF9JTkZfUkVQICB7IDAsIDAgfQorIyAgICAgIGRlZmluZSBfU1RMUF9GTE9BVF9RTkFOX1JFUCB7IDAsIDAgfQorIyAgICAgIGRlZmluZSBfU1RMUF9GTE9BVF9TTkFOX1JFUCB7IDAsIDAgfQorIyAgICAgIGRlZmluZSBfU1RMUF9ET1VCTEVfSU5GX1JFUCAgeyAwLCAwIH0KKyMgICAgICBkZWZpbmUgX1NUTFBfRE9VQkxFX1FOQU5fUkVQIHsgMCwgMCB9CisjICAgICAgZGVmaW5lIF9TVExQX0RPVUJMRV9TTkFOX1JFUCB7IDAsIDAgfQorIyAgICAgIGRlZmluZSBfU1RMUF9MRE9VQkxFX0lORl9SRVAgIHsgMCB9CisjICAgICAgZGVmaW5lIF9TVExQX0xET1VCTEVfUU5BTl9SRVAgeyAwIH0KKyMgICAgICBkZWZpbmUgX1NUTFBfTERPVUJMRV9TTkFOX1JFUCB7IDAgfQorIyAgICBlbmRpZgorKi8KKyMgIGVuZGlmCisKK3VuaW9uIF9GX3JlcCB7CisgIHVuc2lnbmVkIHNob3J0IHJlcFsyXTsKKyAgZmxvYXQgdmFsOworfTsKK3VuaW9uIF9EX3JlcCB7CisgIHVuc2lnbmVkIHNob3J0IHJlcFs0XTsKKyAgZG91YmxlIHZhbDsKK307CisKKyMgIGlmbmRlZiBfU1RMUF9OT19MT05HX0RPVUJMRQordW5pb24gX0xEX3JlcCB7CisgIHVuc2lnbmVkIHNob3J0IHJlcFs4XTsKKyAgbG9uZyBkb3VibGUgdmFsOworfTsKKyMgIGVuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfX2R1bW15PgorZmxvYXQgX1NUTFBfQ0FMTCBfTGltRzxfX2R1bW15Pjo6Z2V0X0ZfaW5mKCkgeworICBfRl9yZXAgX0ZfaW5mID0ge19TVExQX0ZMT0FUX0lORl9SRVB9OworICByZXR1cm4gX0ZfaW5mLnZhbDsKK30KK3RlbXBsYXRlIDxjbGFzcyBfX2R1bW15PgorZmxvYXQgX1NUTFBfQ0FMTCBfTGltRzxfX2R1bW15Pjo6Z2V0X0ZfcU5hTigpIHsKKyAgX0ZfcmVwIF9GX3FOYU4gPSB7X1NUTFBfRkxPQVRfUU5BTl9SRVB9OworICByZXR1cm4gX0ZfcU5hTi52YWw7Cit9Cit0ZW1wbGF0ZSA8Y2xhc3MgX19kdW1teT4KK2Zsb2F0IF9TVExQX0NBTEwgX0xpbUc8X19kdW1teT46OmdldF9GX3NOYU4oKSB7CisgIF9GX3JlcCBfRl9zTmFOID0ge19TVExQX0ZMT0FUX1NOQU5fUkVQfTsKKyAgcmV0dXJuIF9GX3NOYU4udmFsOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX19kdW1teT4KK2RvdWJsZSBfU1RMUF9DQUxMIF9MaW1HPF9fZHVtbXk+OjpnZXRfRF9pbmYoKSB7CisgIF9EX3JlcCBfRF9pbmYgPSB7X1NUTFBfRE9VQkxFX0lORl9SRVB9OworICByZXR1cm4gX0RfaW5mLnZhbDsKK30KK3RlbXBsYXRlIDxjbGFzcyBfX2R1bW15PgorZG91YmxlIF9TVExQX0NBTEwgX0xpbUc8X19kdW1teT46OmdldF9EX3FOYU4oKSB7CisgIF9EX3JlcCBfRF9xTmFOID0ge19TVExQX0RPVUJMRV9RTkFOX1JFUH07CisgIHJldHVybiBfRF9xTmFOLnZhbDsKK30KK3RlbXBsYXRlIDxjbGFzcyBfX2R1bW15PgorZG91YmxlIF9TVExQX0NBTEwgX0xpbUc8X19kdW1teT46OmdldF9EX3NOYU4oKSB7CisgIF9EX3JlcCBfRF9zTmFOID0ge19TVExQX0RPVUJMRV9TTkFOX1JFUH07CisgIHJldHVybiBfRF9zTmFOLnZhbDsKK30KKworIyAgaWYgIWRlZmluZWQgKF9TVExQX05PX0xPTkdfRE9VQkxFKQordGVtcGxhdGUgPGNsYXNzIF9fZHVtbXk+Citsb25nIGRvdWJsZSBfU1RMUF9DQUxMIF9MaW1HPF9fZHVtbXk+OjpnZXRfTERfaW5mKCkgeworICBfTERfcmVwIF9MRF9pbmYgPSB7X1NUTFBfTERPVUJMRV9JTkZfUkVQfTsKKyAgcmV0dXJuIF9MRF9pbmYudmFsOworfQordGVtcGxhdGUgPGNsYXNzIF9fZHVtbXk+Citsb25nIGRvdWJsZSBfU1RMUF9DQUxMIF9MaW1HPF9fZHVtbXk+OjpnZXRfTERfcU5hTigpIHsKKyAgX0xEX3JlcCBfTERfcU5hTiA9IHtfU1RMUF9MRE9VQkxFX1FOQU5fUkVQfTsKKyAgcmV0dXJuIF9MRF9xTmFOLnZhbDsKK30KK3RlbXBsYXRlIDxjbGFzcyBfX2R1bW15PgorbG9uZyBkb3VibGUgX1NUTFBfQ0FMTCBfTGltRzxfX2R1bW15Pjo6Z2V0X0xEX3NOYU4oKSB7CisgIF9MRF9yZXAgX0xEX3NOYU4gPSB7X1NUTFBfTERPVUJMRV9TTkFOX1JFUH07CisgIHJldHVybiBfTERfc05hTi52YWw7Cit9CisjICBlbmRpZiAvKiBfU1RMUF9OT19MT05HX0RPVUJMRSAqLworCisjZW5kaWYgLyogX1NUTFBfRVhQT1NFX0dMT0JBTFNfSU1QTEVNRU5UQVRJT04gKi8KKworI3VuZGVmIF9TVExQX0xJTUlUU19NSU5fVFlQRQorI3VuZGVmIF9TVExQX0xJTUlUU19NQVhfVFlQRQorCisjdW5kZWYgX1NUTFBfRkxPQVRfSU5GX1JFUAorI3VuZGVmIF9TVExQX0ZMT0FUX1FOQU5fUkVQCisjdW5kZWYgX1NUTFBfRkxPQVRfU05BTl9SRVAKKyN1bmRlZiBfU1RMUF9ET1VCTEVfSU5GX1JFUAorI3VuZGVmIF9TVExQX0RPVUJMRV9RTkFOX1JFUAorI3VuZGVmIF9TVExQX0RPVUJMRV9TTkFOX1JFUAorI3VuZGVmIF9TVExQX0xET1VCTEVfSU5GX1JFUAorI3VuZGVmIF9TVExQX0xET1VCTEVfUU5BTl9SRVAKKyN1bmRlZiBfU1RMUF9MRE9VQkxFX1NOQU5fUkVQCisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNlbmRpZiAvKiBfU1RMUF9MSU1JVFNfQ19JTkNMVURFRCAqLwpkaWZmIC0tZ2l0IGEvc3RsL19saW1pdHMuaCBiL3N0bC9fbGltaXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ0MjAyZAotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9fbGltaXRzLmgKQEAgLTAsMCArMSw1MzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKy8qIE5PVEU6IFRoaXMgbWF5IGJlIG5vdCBwb3J0YWJsZSBjb2RlLiBQYXJ0cyBvZiBudW1lcmljX2xpbWl0czw+IGFyZQorICogaW5oZXJlbnRseSBtYWNoaW5lLWRlcGVuZGVudC4gIEF0IHByZXNlbnQgdGhpcyBmaWxlIGlzIHN1aXRhYmxlCisgKiBmb3IgdGhlIE1JUFMsIFNQQVJDLCBBbHBoYSBhbmQgaWEzMiBhcmNoaXRlY3R1cmVzLgorICovCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfTElNSVRTCisjZGVmaW5lIF9TVExQX0lOVEVSTkFMX0xJTUlUUworCisjaWZuZGVmIF9TVExQX0NMSU1JVFMKKyMgIGluY2x1ZGUgPGNsaW1pdHM+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9DRkxPQVQKKyMgIGluY2x1ZGUgPGNmbG9hdD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfSEFTX1dDSEFSX1QpICYmICFkZWZpbmVkIChfU1RMUF9JTlRFUk5BTF9DV0NIQVIpCisjICBpbmNsdWRlIDxzdGwvX2N3Y2hhci5oPgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCitlbnVtIGZsb2F0X3JvdW5kX3N0eWxlIHsKKyAgcm91bmRfaW5kZXRlcm1pbmF0ZSAgICAgICA9IC0xLAorICByb3VuZF90b3dhcmRfemVybyAgICAgICAgID0gIDAsCisgIHJvdW5kX3RvX25lYXJlc3QgICAgICAgICAgPSAgMSwKKyAgcm91bmRfdG93YXJkX2luZmluaXR5ICAgICA9ICAyLAorICByb3VuZF90b3dhcmRfbmVnX2luZmluaXR5ID0gIDMKK307CisKK2VudW0gZmxvYXRfZGVub3JtX3N0eWxlIHsKKyAgZGVub3JtX2luZGV0ZXJtaW5hdGUgPSAtMSwKKyAgZGVub3JtX2Fic2VudCAgICAgICAgPSAgMCwKKyAgZGVub3JtX3ByZXNlbnQgICAgICAgPSAgMQorfTsKKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCisvLyBCYXNlIGNsYXNzIGZvciBhbGwgc3BlY2lhbGl6YXRpb25zIG9mIG51bWVyaWNfbGltaXRzLgordGVtcGxhdGUgPGNsYXNzIF9fbnVtYmVyPgorY2xhc3MgX051bWVyaWNfbGltaXRzX2Jhc2UgeworcHVibGljOgorCisgIHN0YXRpYyBfX251bWJlciAoX1NUTFBfQ0FMTCBtaW4pKCkgX1NUTFBfTk9USFJPVyB7IHJldHVybiBfX251bWJlcigpOyB9CisgIHN0YXRpYyBfX251bWJlciAoX1NUTFBfQ0FMTCBtYXgpKCkgX1NUTFBfTk9USFJPVyB7IHJldHVybiBfX251bWJlcigpOyB9CisKKyNpZiBkZWZpbmVkICggX1NUTFBfU1RBVElDX0NPTlNUX0lOSVRfQlVHKQorICBlbnVtIHsKKyNlbHNlCisgIHN0YXRpYyBjb25zdCBpbnQKKyNlbmRpZgorCisgIGRpZ2l0cyA9IDAsCisgIGRpZ2l0czEwID0gMCwKKyAgcmFkaXggPSAwLAorICBtaW5fZXhwb25lbnQgPSAwLAorICBtaW5fZXhwb25lbnQxMCA9IDAsCisgIG1heF9leHBvbmVudCA9IDAsCisgIG1heF9leHBvbmVudDEwID0gMAorCisjaWYgZGVmaW5lZCAoIF9TVExQX1NUQVRJQ19DT05TVF9JTklUX0JVRykKKyAgLAorICBoYXNfZGVub3JtID0gZGVub3JtX2Fic2VudCwKKyAgcm91bmRfc3R5bGUgPSByb3VuZF90b3dhcmRfemVybywKKyNlbHNlCisgIDsKKyAgc3RhdGljIGNvbnN0IGZsb2F0X2Rlbm9ybV9zdHlsZSBoYXNfZGVub3JtID0gIGRlbm9ybV9hYnNlbnQ7CisgIHN0YXRpYyBjb25zdCBmbG9hdF9yb3VuZF9zdHlsZSByb3VuZF9zdHlsZSA9IHJvdW5kX3Rvd2FyZF96ZXJvOworICBzdGF0aWMgY29uc3QgYm9vbAorI2VuZGlmCisKKyAgICBpc19zcGVjaWFsaXplZCA9IGZhbHNlLAorICAgIGlzX3NpZ25lZCAgPSBmYWxzZSwKKyAgICBpc19pbnRlZ2VyID0gZmFsc2UsCisgICAgaXNfZXhhY3QgPSBmYWxzZSwKKyAgICBoYXNfaW5maW5pdHkgPSBmYWxzZSwKKyAgICBoYXNfcXVpZXRfTmFOID0gZmFsc2UsCisgICAgaGFzX3NpZ25hbGluZ19OYU4gPSBmYWxzZSwKKyAgICBoYXNfZGVub3JtX2xvc3MgPSBmYWxzZSwKKyAgICBpc19pZWM1NTkgPSBmYWxzZSwKKyAgICBpc19ib3VuZGVkID0gZmFsc2UsCisgICAgaXNfbW9kdWxvID0gZmFsc2UsCisgICAgdHJhcHMgPSBmYWxzZSwKKyAgICB0aW55bmVzc19iZWZvcmUgPSBmYWxzZQorI2lmIGRlZmluZWQgKCBfU1RMUF9TVEFUSUNfQ09OU1RfSU5JVF9CVUcpCisgIH0KKyNlbmRpZgorICA7CisKKyAgc3RhdGljIF9fbnVtYmVyIF9TVExQX0NBTEwgZXBzaWxvbigpIF9TVExQX05PVEhST1cgICAgIHsgcmV0dXJuIF9fbnVtYmVyKCk7IH0KKyAgc3RhdGljIF9fbnVtYmVyIF9TVExQX0NBTEwgcm91bmRfZXJyb3IoKSBfU1RMUF9OT1RIUk9XIHsgcmV0dXJuIF9fbnVtYmVyKCk7IH0KKworICBzdGF0aWMgX19udW1iZXIgX1NUTFBfQ0FMTCBpbmZpbml0eSgpIF9TVExQX05PVEhST1cgICAgICB7IHJldHVybiBfX251bWJlcigpOyB9CisgIHN0YXRpYyBfX251bWJlciBfU1RMUF9DQUxMIHF1aWV0X05hTigpIF9TVExQX05PVEhST1cgICAgIHsgcmV0dXJuIF9fbnVtYmVyKCk7IH0KKyAgc3RhdGljIF9fbnVtYmVyIF9TVExQX0NBTEwgc2lnbmFsaW5nX05hTigpIF9TVExQX05PVEhST1cgeyByZXR1cm4gX19udW1iZXIoKTsgfQorICBzdGF0aWMgX19udW1iZXIgX1NUTFBfQ0FMTCBkZW5vcm1fbWluKCkgX1NUTFBfTk9USFJPVyAgICB7IHJldHVybiBfX251bWJlcigpOyB9Cit9OworCisvLyBCYXNlIGNsYXNzIGZvciBpbnRlZ2Vycy4KKworI2lmZGVmIF9TVExQX0xJTUlURURfREVGQVVMVF9URU1QTEFURVMKKyMgIGlmZGVmIF9TVExQX0xPTkdfTE9ORworIyAgICBkZWZpbmUgX1NUTFBfTElNSVRTX01JTl9UWVBFIF9TVExQX0xPTkdfTE9ORworIyAgICBkZWZpbmUgX1NUTFBfTElNSVRTX01BWF9UWVBFIHVuc2lnbmVkIF9TVExQX0xPTkdfTE9ORworIyAgZWxzZQorIyAgICBkZWZpbmUgX1NUTFBfTElNSVRTX01JTl9UWVBFIGxvbmcKKyMgICAgZGVmaW5lIF9TVExQX0xJTUlUU19NQVhfVFlQRSB1bnNpZ25lZCBsb25nCisjICBlbmRpZgorI2Vsc2UKKyMgIGRlZmluZSBfU1RMUF9MSU1JVFNfTUlOX1RZUEUgX0ludAorIyAgZGVmaW5lIF9TVExQX0xJTUlUU19NQVhfVFlQRSBfSW50CisjZW5kaWYgLyogX1NUTFBfTElNSVRFRF9ERUZBVUxUX1RFTVBMQVRFUyAqLworCit0ZW1wbGF0ZSA8Y2xhc3MgX0ludCwKKyAgICAgICAgICBfU1RMUF9MSU1JVFNfTUlOX1RZUEUgX19pbWluLAorICAgICAgICAgIF9TVExQX0xJTUlUU19NQVhfVFlQRSBfX2ltYXgsCisgICAgICAgICAgaW50IF9faWRpZ2l0cywgYm9vbCBfX2lzbW9kPgorY2xhc3MgX0ludGVnZXJfbGltaXRzIDogcHVibGljIF9OdW1lcmljX2xpbWl0c19iYXNlPF9JbnQ+IHsKK3B1YmxpYzoKKworICBzdGF0aWMgX0ludCAoX1NUTFBfQ0FMTCBtaW4pICgpIF9TVExQX05PVEhST1cgeyByZXR1cm4gKF9JbnQpX19pbWluOyB9CisgIHN0YXRpYyBfSW50IChfU1RMUF9DQUxMIG1heCkgKCkgX1NUTFBfTk9USFJPVyB7IHJldHVybiAoX0ludClfX2ltYXg7IH0KKworI2lmIGRlZmluZWQgKF9TVExQX1NUQVRJQ19DT05TVF9JTklUX0JVRykKKyAgZW51bSB7CisjZWxzZQorICBzdGF0aWMgY29uc3QgaW50CisjZW5kaWYKKyAgZGlnaXRzID0gKF9faWRpZ2l0cyA8IDApID8KKyAgKChpbnQpKChzaXplb2YoX0ludCkgKiAoQ0hBUl9CSVQpKSkgLSAoKF9faW1pbiA9PSAwKSA/IDAgOiAxKSkKKyAgOiAoX19pZGlnaXRzKSwKKyAgZGlnaXRzMTAgPSAoZGlnaXRzICogMzAxVUwpIC8gMTAwMCwKKyAgcmFkaXggPSAyCisjaWYgIWRlZmluZWQgKF9TVExQX1NUQVRJQ19DT05TVF9JTklUX0JVRykKKyAgOworICBzdGF0aWMgY29uc3QgYm9vbAorI2Vsc2UKKyAgLAorI2VuZGlmCisgIGlzX3NwZWNpYWxpemVkID0gdHJ1ZSwKKyAgaXNfc2lnbmVkID0gKF9faW1pbiAhPSAwKSwKKyAgaXNfaW50ZWdlciA9IHRydWUsCisgIGlzX2V4YWN0ID0gdHJ1ZSwKKyAgaXNfYm91bmRlZCA9IHRydWUsCisgIGlzX21vZHVsbyA9IF9faXNtb2QKKyNpZiBkZWZpbmVkICggX1NUTFBfU1RBVElDX0NPTlNUX0lOSVRfQlVHKQorICB9CisjZW5kaWYKKyAgOworfTsKKworLy8gQmFzZSBjbGFzcyBmb3IgZmxvYXRpbmctcG9pbnQgbnVtYmVycy4KK3RlbXBsYXRlIDxjbGFzcyBfX251bWJlciwKKyAgICAgICAgIGludCBfX0RpZ2l0cywgaW50IF9fRGlnaXRzMTAsCisgICAgICAgICBpbnQgX19NaW5FeHAsIGludCBfX01heEV4cCwKKyAgICAgICAgIGludCBfX01pbkV4cDEwLCBpbnQgX19NYXhFeHAxMCwKKyAgICAgICAgIGJvb2wgX19Jc0lFQzU1OSwKKyAgICAgICAgIGZsb2F0X3JvdW5kX3N0eWxlIF9fUm91bmRTdHlsZT4KK2NsYXNzIF9GbG9hdGluZ19saW1pdHMgOiBwdWJsaWMgX051bWVyaWNfbGltaXRzX2Jhc2U8X19udW1iZXI+IHsKK3B1YmxpYzoKKworI2lmIGRlZmluZWQgKF9TVExQX1NUQVRJQ19DT05TVF9JTklUX0JVRykKKyAgZW51bSB7CisjZWxzZQorICBzdGF0aWMgY29uc3QgaW50CisjZW5kaWYKKworICBkaWdpdHMgPSBfX0RpZ2l0cywKKyAgZGlnaXRzMTAgPSBfX0RpZ2l0czEwLAorCisgIHJhZGl4ID0gKCAgRkxUX1JBRElYIC8qIDIgKi8gKSwKKyAgbWluX2V4cG9uZW50ID0gX19NaW5FeHAsCisgIG1heF9leHBvbmVudCA9IF9fTWF4RXhwLAorICBtaW5fZXhwb25lbnQxMCA9IF9fTWluRXhwMTAsCisgIG1heF9leHBvbmVudDEwID0gX19NYXhFeHAxMAorCisjaWYgZGVmaW5lZCAoX1NUTFBfU1RBVElDX0NPTlNUX0lOSVRfQlVHKQorICAsCisgIGhhc19kZW5vcm0gPSBkZW5vcm1faW5kZXRlcm1pbmF0ZSwKKyAgcm91bmRfc3R5bGUgPSBfX1JvdW5kU3R5bGUsCisjZWxzZQorICA7CisgIHN0YXRpYyBjb25zdCBmbG9hdF9kZW5vcm1fc3R5bGUgaGFzX2Rlbm9ybSA9IGRlbm9ybV9pbmRldGVybWluYXRlOworICBzdGF0aWMgY29uc3QgZmxvYXRfcm91bmRfc3R5bGUgcm91bmRfc3R5bGUgPSBfX1JvdW5kU3R5bGU7CisgIHN0YXRpYyBjb25zdCBib29sCisjZW5kaWYKKworICBpc19zcGVjaWFsaXplZCA9IHRydWUsCisgIGlzX3NpZ25lZCA9IHRydWUsCisKKyAgLy9JRUMgNTU5IHNwZWNpZnkgdGhlIGZsb2F0aW5nIHBvaW50IHJlcHJlc2VudGF0aW9uIG9mCisgIC8vaW5maW5pdHksIHF1aWV0IGFuZCBzaWduYWxpbmcgTm90IGEgTnVtYmVyLiBOb3Qgc3VwcG9ydGluZworICAvL2l0IGlzIGNvbnNpZGVyIGFzIG5vdCBiZWluZyBhYmxlIHRvIGdyYW50IHRob3NlIHZhbHVlcy4KKyNpZiAoZGVmaW5lZCAoX1NUTFBfTVNWQykgJiYgKF9TVExQX01TVkMgPCAxMzAwKSkKKyAgLy9NU1ZDIDYgZG8gbm90IGZ1bGx5IHN1cHBvcnQgSUVDIDU5OSBidXQgZ3JhbnQgYSBnb29kIGluZmluaXR5IHZhbHVlLgorICBoYXNfaW5maW5pdHkgICAgICA9IHRydWUsCisjZWxzZQorICBoYXNfaW5maW5pdHkgICAgICA9IF9fSXNJRUM1NTksCisjZW5kaWYKKyAgaGFzX3F1aWV0X05hTiAgICAgPSBfX0lzSUVDNTU5LAorICBoYXNfc2lnbmFsaW5nX05hTiA9IF9fSXNJRUM1NTksCisKKyAgaGFzX2Rlbm9ybV9sb3NzICAgPSAgZmFsc2UsCisgIGlzX2llYzU1OSAgICAgID0gIF9fSXNJRUM1NTksCisgIGlzX2JvdW5kZWQgICAgID0gIHRydWUsCisgIHRyYXBzICAgICAgICAgID0gIHRydWUsCisgIHRpbnluZXNzX2JlZm9yZT0gIGZhbHNlCisKKyNpZiBkZWZpbmVkIChfU1RMUF9TVEFUSUNfQ09OU1RfSU5JVF9CVUcpCisgIH0KKyNlbmRpZgorICA7Cit9OworCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKworLy8gQ2xhc3MgbnVtZXJpY19saW1pdHMKKworLy8gVGhlIHVuc3BlY2lhbGl6ZWQgY2xhc3MuCisKK3RlbXBsYXRlPGNsYXNzIF9UcD4KK2NsYXNzIG51bWVyaWNfbGltaXRzIDogcHVibGljIF9TVExQX1BSSVYgX051bWVyaWNfbGltaXRzX2Jhc2U8X1RwPiB7fTsKKworLy8gU3BlY2lhbGl6YXRpb25zIGZvciBhbGwgYnVpbHQtaW4gaW50ZWdyYWwgdHlwZXMuCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fQk9PTCkKK19TVExQX1RFTVBMQVRFX05VTEwKK2NsYXNzIG51bWVyaWNfbGltaXRzPGJvb2w+CisgIDogcHVibGljIF9TVExQX1BSSVYgX0ludGVnZXJfbGltaXRzPGJvb2wsIGZhbHNlLCB0cnVlLCAxLCBmYWxzZT4KK3t9OworI2VuZGlmIC8qIF9TVExQX05PX0JPT0wgKi8KKworX1NUTFBfVEVNUExBVEVfTlVMTAorY2xhc3MgbnVtZXJpY19saW1pdHM8Y2hhcj4KKyAgOiBwdWJsaWMgX1NUTFBfUFJJViBfSW50ZWdlcl9saW1pdHM8Y2hhciwgQ0hBUl9NSU4sIENIQVJfTUFYLCAtMSwgdHJ1ZT4KK3t9OworCisjaWYgIWRlZmluZWQgKF9TVExQX05PX1NJR05FRF9CVUlMVElOUykKK19TVExQX1RFTVBMQVRFX05VTEwKK2NsYXNzIG51bWVyaWNfbGltaXRzPHNpZ25lZCBjaGFyPgorICA6IHB1YmxpYyBfU1RMUF9QUklWIF9JbnRlZ2VyX2xpbWl0czxzaWduZWQgY2hhciwgU0NIQVJfTUlOLCBTQ0hBUl9NQVgsIC0xLCB0cnVlPgore307CisjZW5kaWYKKworX1NUTFBfVEVNUExBVEVfTlVMTAorY2xhc3MgbnVtZXJpY19saW1pdHM8dW5zaWduZWQgY2hhcj4KKyAgOiBwdWJsaWMgX1NUTFBfUFJJViBfSW50ZWdlcl9saW1pdHM8dW5zaWduZWQgY2hhciwgMCwgVUNIQVJfTUFYLCAtMSwgdHJ1ZT4KK3t9OworCisjaWYgIShkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKSB8fCBkZWZpbmVkIChfU1RMUF9XQ0hBUl9UX0lTX1VTSE9SVCkpCisKK19TVExQX1RFTVBMQVRFX05VTEwKK2NsYXNzIG51bWVyaWNfbGltaXRzPHdjaGFyX3Q+CisgIDogcHVibGljIF9TVExQX1BSSVYgX0ludGVnZXJfbGltaXRzPHdjaGFyX3QsIFdDSEFSX01JTiwgV0NIQVJfTUFYLCAtMSwgdHJ1ZT4KK3t9OworCisjZW5kaWYKKworX1NUTFBfVEVNUExBVEVfTlVMTAorY2xhc3MgbnVtZXJpY19saW1pdHM8c2hvcnQ+CisgIDogcHVibGljIF9TVExQX1BSSVYgX0ludGVnZXJfbGltaXRzPHNob3J0LCBTSFJUX01JTiwgU0hSVF9NQVgsIC0xLCB0cnVlPgore307CisKK19TVExQX1RFTVBMQVRFX05VTEwKK2NsYXNzIG51bWVyaWNfbGltaXRzPHVuc2lnbmVkIHNob3J0PgorICA6IHB1YmxpYyBfU1RMUF9QUklWIF9JbnRlZ2VyX2xpbWl0czx1bnNpZ25lZCBzaG9ydCwgMCwgVVNIUlRfTUFYLCAtMSwgdHJ1ZT4KK3t9OworCisjaWYgZGVmaW5lZCAoX194bENfXykgJiYgKF9feGxDX18gPT0gMHg1MDApCisjICB1bmRlZiBJTlRfTUlOCisjICBkZWZpbmUgSU5UX01JTiAtMjE0NzQ4MzY0OAorI2VuZGlmCisKK19TVExQX1RFTVBMQVRFX05VTEwKK2NsYXNzIG51bWVyaWNfbGltaXRzPGludD4KKyAgOiBwdWJsaWMgX1NUTFBfUFJJViBfSW50ZWdlcl9saW1pdHM8aW50LCBJTlRfTUlOLCBJTlRfTUFYLCAtMSwgdHJ1ZT4KK3t9OworCitfU1RMUF9URU1QTEFURV9OVUxMCitjbGFzcyBudW1lcmljX2xpbWl0czx1bnNpZ25lZCBpbnQ+CisgIDogcHVibGljIF9TVExQX1BSSVYgX0ludGVnZXJfbGltaXRzPHVuc2lnbmVkIGludCwgMCwgVUlOVF9NQVgsIC0xLCB0cnVlPgore307CisKK19TVExQX1RFTVBMQVRFX05VTEwKK2NsYXNzIG51bWVyaWNfbGltaXRzPGxvbmc+CisgIDogcHVibGljIF9TVExQX1BSSVYgX0ludGVnZXJfbGltaXRzPGxvbmcsIExPTkdfTUlOLCBMT05HX01BWCwgLTEsIHRydWU+Cit7fTsKKworX1NUTFBfVEVNUExBVEVfTlVMTAorY2xhc3MgbnVtZXJpY19saW1pdHM8dW5zaWduZWQgbG9uZz4KKyAgOiBwdWJsaWMgX1NUTFBfUFJJViBfSW50ZWdlcl9saW1pdHM8dW5zaWduZWQgbG9uZywgMCwgVUxPTkdfTUFYLCAtMSwgdHJ1ZT4KK3t9OworCisjaWYgZGVmaW5lZCAoX1NUTFBfTE9OR19MT05HKQorCisjICBpZiBkZWZpbmVkIChfU1RMUF9NU1ZDKSB8fCBkZWZpbmVkIChfX0JPUkxBTkRDX18pCisjICAgIGRlZmluZSBMT05HTE9OR19NQVggICAgIDB4N2ZmZmZmZmZmZmZmZmZmZmk2NAorIyAgICBkZWZpbmUgTE9OR0xPTkdfTUlOICAgICAoLUxPTkdMT05HX01BWC0xaTY0KQorIyAgICBkZWZpbmUgVUxPTkdMT05HX01BWCAgICAweGZmZmZmZmZmZmZmZmZmZmZVaTY0CisjICBlbHNlCisjICAgIGlmbmRlZiBMT05HTE9OR19NQVgKKyMgICAgICBkZWZpbmUgTE9OR0xPTkdfTUFYICAgMHg3ZmZmZmZmZmZmZmZmZmZmTEwKKyMgICAgZW5kaWYKKyMgICAgaWZuZGVmIExPTkdMT05HX01JTgorIyAgICAgIGRlZmluZSBMT05HTE9OR19NSU4gICAoLUxPTkdMT05HX01BWC0xTEwpCisjICAgIGVuZGlmCisjICAgIGlmbmRlZiBVTE9OR0xPTkdfTUFYCisjICAgICAgZGVmaW5lIFVMT05HTE9OR19NQVggIDB4ZmZmZmZmZmZmZmZmZmZmZlVMTAorIyAgICBlbmRpZgorIyAgZW5kaWYKKworIyAgaWYgIWRlZmluZWQoX19HTlVDX18pIHx8IChfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fIDw9IDk2KQorCitfU1RMUF9URU1QTEFURV9OVUxMCitjbGFzcyBudW1lcmljX2xpbWl0czxfU1RMUF9MT05HX0xPTkc+CisgIDogcHVibGljIF9TVExQX1BSSVYgX0ludGVnZXJfbGltaXRzPF9TVExQX0xPTkdfTE9ORywgTE9OR0xPTkdfTUlOLCBMT05HTE9OR19NQVgsIC0xLCB0cnVlPgore307CisKK19TVExQX1RFTVBMQVRFX05VTEwKK2NsYXNzIG51bWVyaWNfbGltaXRzPHVuc2lnbmVkIF9TVExQX0xPTkdfTE9ORz4KKyAgOiBwdWJsaWMgX1NUTFBfUFJJViBfSW50ZWdlcl9saW1pdHM8dW5zaWduZWQgX1NUTFBfTE9OR19MT05HLCAwLCBVTE9OR0xPTkdfTUFYLCAtMSwgdHJ1ZT4KK3t9OworIyAgZWxzZSAvKiBnY2MgMi45NyAoYWZ0ZXIgMjAwMC0xMS0wMSksIDIuOTgsIDMuMCAqLworLyoKKyBuZXdlc3QgZ2NjIGhhcyBuZXcgbWFuZ2xpbmcgc2NoZW1lLCB0aGF0IGhhcyBwcm9ibGVtCisgd2l0aCBnZW5lcmF0aW5nIG5hbWUgW2luc3RhbnRpYXRlZF0gb2YgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gbGlrZQorIF9JbnRlZ2VyX2xpbWl0czxfU1RMUF9MT05HX0xPTkcsIExPTkdMT05HX01JTiwgTE9OR0xPTkdfTUFYLCAtMSwgdHJ1ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+fn5+fn5+fn5+fn4gIH5+fn5+fn5+fn5+fgorIEJlbG93IGlzIGNvZGUgdGhhdCBzb2x2ZSB0aGlzIHByb2JsZW0uCisgICAtIHB0cgorICovCitfU1RMUF9URU1QTEFURV9OVUxMCitjbGFzcyBudW1lcmljX2xpbWl0czxfU1RMUF9MT05HX0xPTkc+CisgIDogcHVibGljIF9TVExQX1BSSVYgX051bWVyaWNfbGltaXRzX2Jhc2U8X1NUTFBfTE9OR19MT05HPiB7CitwdWJsaWM6CisKKyAgc3RhdGljIF9TVExQX0xPTkdfTE9ORyAoX1NUTFBfQ0FMTCBtaW4pICgpIF9TVExQX05PVEhST1cgeyByZXR1cm4gTE9OR0xPTkdfTUlOOyB9CisgIHN0YXRpYyBfU1RMUF9MT05HX0xPTkcgKF9TVExQX0NBTEwgbWF4KSAoKSBfU1RMUF9OT1RIUk9XIHsgcmV0dXJuIExPTkdMT05HX01BWDsgfQorCisjICAgIGlmIGRlZmluZWQgKCBfU1RMUF9TVEFUSUNfQ09OU1RfSU5JVF9CVUcpCisgIGVudW0geworIyAgICBlbHNlCisgIHN0YXRpYyBjb25zdCBpbnQKKyMgICAgZW5kaWYKKyAgZGlnaXRzID0gKChpbnQpKChzaXplb2YoX1NUTFBfTE9OR19MT05HKSAqIChDSEFSX0JJVCkpKSAtIDEpLAorICBkaWdpdHMxMCA9IChkaWdpdHMgKiAzMDFVTCkgLyAxMDAwLAorICByYWRpeCA9IDIKKyMgICAgaWYgISBkZWZpbmVkIChfU1RMUF9TVEFUSUNfQ09OU1RfSU5JVF9CVUcpCisgIDsKKyAgc3RhdGljIGNvbnN0IGJvb2wKKyMgICAgZWxzZQorICAsCisjICAgIGVuZGlmCisgIGlzX3NwZWNpYWxpemVkID0gdHJ1ZSwKKyAgaXNfc2lnbmVkID0gdHJ1ZSwKKyAgaXNfaW50ZWdlciA9IHRydWUsCisgIGlzX2V4YWN0ID0gdHJ1ZSwKKyAgaXNfYm91bmRlZCA9IHRydWUsCisgIGlzX21vZHVsbyA9IHRydWUKKyMgICAgaWYgZGVmaW5lZCAoX1NUTFBfU1RBVElDX0NPTlNUX0lOSVRfQlVHKQorICB9CisjICAgIGVuZGlmCisgIDsKK307CisKK19TVExQX1RFTVBMQVRFX05VTEwKK2NsYXNzIG51bWVyaWNfbGltaXRzPHVuc2lnbmVkIF9TVExQX0xPTkdfTE9ORz4KKyAgOiBwdWJsaWMgX1NUTFBfUFJJViBfTnVtZXJpY19saW1pdHNfYmFzZTx1bnNpZ25lZCBfU1RMUF9MT05HX0xPTkc+IHsKK3B1YmxpYzoKKworICBzdGF0aWMgdW5zaWduZWQgX1NUTFBfTE9OR19MT05HIChfU1RMUF9DQUxMIG1pbikgKCkgX1NUTFBfTk9USFJPVyB7IHJldHVybiAwVUxMOyB9CisgIHN0YXRpYyB1bnNpZ25lZCBfU1RMUF9MT05HX0xPTkcgKF9TVExQX0NBTEwgbWF4KSAoKSBfU1RMUF9OT1RIUk9XIHsgcmV0dXJuIFVMT05HTE9OR19NQVg7IH0KKworIyAgICBpZiBkZWZpbmVkIChfU1RMUF9TVEFUSUNfQ09OU1RfSU5JVF9CVUcpCisgIGVudW0geworIyAgICBlbHNlCisgIHN0YXRpYyBjb25zdCBpbnQKKyMgICAgZW5kaWYKKyAgZGlnaXRzID0gKChpbnQpKChzaXplb2YodW5zaWduZWQgX1NUTFBfTE9OR19MT05HKSAqIChDSEFSX0JJVCkpKSksCisgIGRpZ2l0czEwID0gKGRpZ2l0cyAqIDMwMVVMKSAvIDEwMDAsCisgIHJhZGl4ID0gMgorIyAgICBpZiAhIGRlZmluZWQgKF9TVExQX1NUQVRJQ19DT05TVF9JTklUX0JVRykKKyAgOworICBzdGF0aWMgY29uc3QgYm9vbAorIyAgICBlbHNlCisgICwKKyMgICAgZW5kaWYKKyAgaXNfc3BlY2lhbGl6ZWQgPSB0cnVlLAorICBpc19zaWduZWQgPSBmYWxzZSwKKyAgaXNfaW50ZWdlciA9IHRydWUsCisgIGlzX2V4YWN0ID0gdHJ1ZSwKKyAgaXNfYm91bmRlZCA9IHRydWUsCisgIGlzX21vZHVsbyA9IHRydWUKKyMgICAgaWYgZGVmaW5lZCAoIF9TVExQX1NUQVRJQ19DT05TVF9JTklUX0JVRykKKyAgfQorIyAgICBlbmRpZgorICA7Cit9OworCisjICBlbmRpZiAvKiBfX0dOVUNfXyA+IDIwMDAtMTEtMDEgKi8KKworI2VuZGlmIC8qIF9TVExQX0xPTkdfTE9ORyAqLworCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKKy8vIFNwZWNpYWxpemF0aW9ucyBmb3IgYWxsIGJ1aWx0LWluIGZsb2F0aW5nLXBvaW50IHR5cGVzLgordGVtcGxhdGUgPGNsYXNzIF9fZHVtbXk+CitjbGFzcyBfTGltRyB7CitwdWJsaWM6CisgIHN0YXRpYyBmbG9hdCBfU1RMUF9DQUxMIGdldF9GX2luZigpOworICBzdGF0aWMgZmxvYXQgX1NUTFBfQ0FMTCBnZXRfRl9xTmFOKCk7CisgIHN0YXRpYyBmbG9hdCBfU1RMUF9DQUxMIGdldF9GX3NOYU4oKTsKKyAgc3RhdGljIGRvdWJsZSBfU1RMUF9DQUxMIGdldF9EX2luZigpOworICBzdGF0aWMgZG91YmxlIF9TVExQX0NBTEwgZ2V0X0RfcU5hTigpOworICBzdGF0aWMgZG91YmxlIF9TVExQX0NBTEwgZ2V0X0Rfc05hTigpOworCisjaWYgIWRlZmluZWQgKF9TVExQX05PX0xPTkdfRE9VQkxFKQorICBzdGF0aWMgbG9uZyBkb3VibGUgX1NUTFBfQ0FMTCBnZXRfTERfaW5mKCk7CisgIHN0YXRpYyBsb25nIGRvdWJsZSBfU1RMUF9DQUxMIGdldF9MRF9xTmFOKCk7CisgIHN0YXRpYyBsb25nIGRvdWJsZSBfU1RMUF9DQUxMIGdldF9MRF9zTmFOKCk7CisjZW5kaWYKK307CisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUKQorX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIF9MaW1HPGJvb2w+OworI2VuZGlmCisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCitfU1RMUF9URU1QTEFURV9OVUxMCitjbGFzcyBudW1lcmljX2xpbWl0czxmbG9hdD4KKyAgOiBwdWJsaWMgX1NUTFBfUFJJViBfRmxvYXRpbmdfbGltaXRzPGZsb2F0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMVF9NQU5UX0RJRywgICAvLyBCaW5hcnkgZGlnaXRzIG9mIHByZWNpc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMVF9ESUcsICAgICAgICAvLyBEZWNpbWFsIGRpZ2l0cyBvZiBwcmVjaXNpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTFRfTUlOX0VYUCwgICAgLy8gTWluaW11bSBleHBvbmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMVF9NQVhfRVhQLCAgICAvLyBNYXhpbXVtIGV4cG9uZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkxUX01JTl8xMF9FWFAsIC8vIE1pbmltdW0gYmFzZSAxMCBleHBvbmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMVF9NQVhfMTBfRVhQLCAvLyBNYXhpbXVtIGJhc2UgMTAgZXhwb25lbnQKKyNpZiBkZWZpbmVkIChfU1RMUF9OT19JRUM1NTlfU1VQUE9SVCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgICAgICAgICAgLy8gZG8gbm90IGNvbmZvcm0gdG8gaWVjNTU5CisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsICAgICAgICAgICAvLyBjb25mb3JtcyB0byBpZWM1NTkKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdW5kX3RvX25lYXJlc3Q+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGZsb2F0IChfU1RMUF9DQUxMIG1pbikgKCkgX1NUTFBfTk9USFJPVyB7IHJldHVybiBGTFRfTUlOOyB9CisgIHN0YXRpYyBmbG9hdCBfU1RMUF9DQUxMIGRlbm9ybV9taW4oKSBfU1RMUF9OT1RIUk9XIHsgcmV0dXJuIEZMVF9NSU47IH0KKyAgc3RhdGljIGZsb2F0IChfU1RMUF9DQUxMIG1heCkgKCkgX1NUTFBfTk9USFJPVyB7IF9TVExQX1VTSU5HX1ZFTkRPUl9DU1REIHJldHVybiBGTFRfTUFYOyB9CisgIHN0YXRpYyBmbG9hdCBfU1RMUF9DQUxMIGVwc2lsb24oKSBfU1RMUF9OT1RIUk9XIHsgcmV0dXJuIEZMVF9FUFNJTE9OOyB9CisgIHN0YXRpYyBmbG9hdCBfU1RMUF9DQUxMIHJvdW5kX2Vycm9yKCkgX1NUTFBfTk9USFJPVyB7IHJldHVybiAwLjVmOyB9IC8vIFVuaXRzOiB1bHBzLgorICBzdGF0aWMgIGZsb2F0IF9TVExQX0NBTEwgaW5maW5pdHkoKSBfU1RMUF9OT1RIUk9XIHsgcmV0dXJuIF9TVExQX1BSSVYgX0xpbUc8Ym9vbD46OmdldF9GX2luZigpOyB9CisgIHN0YXRpYyAgZmxvYXQgX1NUTFBfQ0FMTCBxdWlldF9OYU4oKSBfU1RMUF9OT1RIUk9XIHsgcmV0dXJuIF9TVExQX1BSSVYgX0xpbUc8Ym9vbD46OmdldF9GX3FOYU4oKTsgfQorICBzdGF0aWMgIGZsb2F0IF9TVExQX0NBTEwgc2lnbmFsaW5nX05hTigpIF9TVExQX05PVEhST1cgeyByZXR1cm4gX1NUTFBfUFJJViBfTGltRzxib29sPjo6Z2V0X0Zfc05hTigpOyB9Cit9OworCitfU1RMUF9URU1QTEFURV9OVUxMCitjbGFzcyBudW1lcmljX2xpbWl0czxkb3VibGU+CisgIDogcHVibGljIF9TVExQX1BSSVYgX0Zsb2F0aW5nX2xpbWl0czxkb3VibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJMX01BTlRfRElHLCAgIC8vIEJpbmFyeSBkaWdpdHMgb2YgcHJlY2lzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJMX0RJRywgICAgICAgIC8vIERlY2ltYWwgZGlnaXRzIG9mIHByZWNpc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCTF9NSU5fRVhQLCAgICAvLyBNaW5pbXVtIGV4cG9uZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJMX01BWF9FWFAsICAgIC8vIE1heGltdW0gZXhwb25lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQkxfTUlOXzEwX0VYUCwgLy8gTWluaW11bSBiYXNlIDEwIGV4cG9uZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJMX01BWF8xMF9FWFAsIC8vIE1heGltdW0gYmFzZSAxMCBleHBvbmVudAorI2lmIGRlZmluZWQgKF9TVExQX05PX0lFQzU1OV9TVVBQT1JUKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCAgICAgICAgICAvLyBkbyBub3QgY29uZm9ybSB0byBpZWM1NTkKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgICAgICAgICAgIC8vIGNvbmZvcm1zIHRvIGllYzU1OQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91bmRfdG9fbmVhcmVzdD4geworcHVibGljOgorICBzdGF0aWMgZG91YmxlIChfU1RMUF9DQUxMIG1pbikoKSBfU1RMUF9OT1RIUk9XIHsgcmV0dXJuIERCTF9NSU47IH0KKyAgc3RhdGljIGRvdWJsZSBfU1RMUF9DQUxMIGRlbm9ybV9taW4oKSBfU1RMUF9OT1RIUk9XIHsgcmV0dXJuIERCTF9NSU47IH0KKyAgc3RhdGljIGRvdWJsZSAoX1NUTFBfQ0FMTCBtYXgpKCkgX1NUTFBfTk9USFJPVyB7IF9TVExQX1VTSU5HX1ZFTkRPUl9DU1REIHJldHVybiBEQkxfTUFYOyB9CisgIHN0YXRpYyBkb3VibGUgX1NUTFBfQ0FMTCBlcHNpbG9uKCkgX1NUTFBfTk9USFJPVyB7IHJldHVybiBEQkxfRVBTSUxPTjsgfQorICBzdGF0aWMgZG91YmxlIF9TVExQX0NBTEwgcm91bmRfZXJyb3IoKSBfU1RMUF9OT1RIUk9XIHsgcmV0dXJuIDAuNTsgfSAvLyBVbml0czogdWxwcy4KKyAgc3RhdGljICBkb3VibGUgX1NUTFBfQ0FMTCBpbmZpbml0eSgpIF9TVExQX05PVEhST1cgeyByZXR1cm4gX1NUTFBfUFJJViBfTGltRzxib29sPjo6Z2V0X0RfaW5mKCk7IH0KKyAgc3RhdGljICBkb3VibGUgX1NUTFBfQ0FMTCBxdWlldF9OYU4oKSBfU1RMUF9OT1RIUk9XIHsgcmV0dXJuIF9TVExQX1BSSVYgX0xpbUc8Ym9vbD46OmdldF9EX3FOYU4oKTsgfQorICBzdGF0aWMgIGRvdWJsZSBfU1RMUF9DQUxMIHNpZ25hbGluZ19OYU4oKSBfU1RMUF9OT1RIUk9XIHsgcmV0dXJuIF9TVExQX1BSSVYgX0xpbUc8Ym9vbD46OmdldF9EX3NOYU4oKTsgfQorfTsKKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19MT05HX0RPVUJMRSkKKworX1NUTFBfVEVNUExBVEVfTlVMTAorY2xhc3MgbnVtZXJpY19saW1pdHM8bG9uZyBkb3VibGU+CisgIDogcHVibGljIF9TVExQX1BSSVYgX0Zsb2F0aW5nX2xpbWl0czxsb25nIGRvdWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMREJMX01BTlRfRElHLCAgLy8gQmluYXJ5IGRpZ2l0cyBvZiBwcmVjaXNpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMREJMX0RJRywgICAgICAgLy8gRGVjaW1hbCBkaWdpdHMgb2YgcHJlY2lzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTERCTF9NSU5fRVhQLCAgIC8vIE1pbmltdW0gZXhwb25lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMREJMX01BWF9FWFAsICAgLy8gTWF4aW11bSBleHBvbmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQkxfTUlOXzEwX0VYUCwvLyBNaW5pbXVtIGJhc2UgMTAgZXhwb25lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMREJMX01BWF8xMF9FWFAsLy8gTWF4aW11bSBiYXNlIDEwIGV4cG9uZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsICAgICAgICAgIC8vIGRvIG5vdCBjb25mb3JtIHRvIGllYzU1OQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdW5kX3RvX25lYXJlc3Q+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGxvbmcgZG91YmxlIChfU1RMUF9DQUxMIG1pbikgKCkgX1NUTFBfTk9USFJPVyB7IF9TVExQX1VTSU5HX1ZFTkRPUl9DU1REIHJldHVybiBMREJMX01JTjsgfQorICBzdGF0aWMgbG9uZyBkb3VibGUgX1NUTFBfQ0FMTCBkZW5vcm1fbWluKCkgX1NUTFBfTk9USFJPVyB7IF9TVExQX1VTSU5HX1ZFTkRPUl9DU1REIHJldHVybiBMREJMX01JTjsgfQorICBzdGF0aWMgbG9uZyBkb3VibGUgKF9TVExQX0NBTEwgbWF4KSAoKSBfU1RMUF9OT1RIUk9XIHsgX1NUTFBfVVNJTkdfVkVORE9SX0NTVEQgcmV0dXJuIExEQkxfTUFYOyB9CisgIHN0YXRpYyBsb25nIGRvdWJsZSBfU1RMUF9DQUxMIGVwc2lsb24oKSBfU1RMUF9OT1RIUk9XIHsgcmV0dXJuIExEQkxfRVBTSUxPTjsgfQorICBzdGF0aWMgbG9uZyBkb3VibGUgX1NUTFBfQ0FMTCByb3VuZF9lcnJvcigpIF9TVExQX05PVEhST1cgeyByZXR1cm4gNDsgfSAvLyBVbml0czogdWxwcy4KKyAgc3RhdGljIGxvbmcgZG91YmxlIF9TVExQX0NBTEwgaW5maW5pdHkoKSBfU1RMUF9OT1RIUk9XIHsgcmV0dXJuIF9TVExQX1BSSVYgX0xpbUc8Ym9vbD46OmdldF9MRF9pbmYoKTsgfQorICBzdGF0aWMgbG9uZyBkb3VibGUgX1NUTFBfQ0FMTCBxdWlldF9OYU4oKSBfU1RMUF9OT1RIUk9XIHsgcmV0dXJuIF9TVExQX1BSSVYgX0xpbUc8Ym9vbD46OmdldF9MRF9xTmFOKCk7IH0KKyAgc3RhdGljIGxvbmcgZG91YmxlIF9TVExQX0NBTEwgc2lnbmFsaW5nX05hTigpIF9TVExQX05PVEhST1cgeyByZXR1cm4gX1NUTFBfUFJJViBfTGltRzxib29sPjo6Z2V0X0xEX3NOYU4oKTsgfQorfTsKKworI2VuZGlmCisKKy8vIFdlIHdyaXRlIHNwZWNpYWwgdmFsdWVzIChJbmYgYW5kIE5hTikgYXMgYml0IHBhdHRlcm5zIGFuZAorLy8gY2FzdCB0aGUgdGhlIGFwcHJvcHJpYXRlIGZsb2F0aW5nLXBvaW50IHR5cGVzLgorX1NUTFBfRU5EX05BTUVTUEFDRQorCisjaWYgIWRlZmluZWQgKF9TVExQX0xJTktfVElNRV9JTlNUQU5USUFUSU9OKQorIyAgaW5jbHVkZSA8c3RsL19saW1pdHMuYz4KKyNlbmRpZgorCisjZW5kaWYKKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9fbGlzdC5jIGIvc3RsL19saXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEzNzZjMgotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9fbGlzdC5jCkBAIC0wLDAgKzEsMjQ2IEBACisvKgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisjaWZuZGVmIF9TVExQX0xJU1RfQworI2RlZmluZSBfU1RMUF9MSVNUX0MKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9MSVNUX0gKKyMgIGluY2x1ZGUgPHN0bC9fbGlzdC5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfQ0FSUkFZX0gKKyMgIGluY2x1ZGUgPHN0bC9fY2FycmF5Lmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9SQU5HRV9FUlJPUlNfSAorIyAgaW5jbHVkZSA8c3RsL19yYW5nZV9lcnJvcnMuaD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCisjaWYgZGVmaW5lZCAoX1NUTFBfRVhQT1NFX0dMT0JBTFNfSU1QTEVNRU5UQVRJT04pCit0ZW1wbGF0ZSA8Y2xhc3MgX0R1bW15Pgordm9pZCBfU1RMUF9DQUxMCitfTGlzdF9nbG9iYWw8X0R1bW15Pjo6X1RyYW5zZmVyKF9MaXN0X25vZGVfYmFzZSogX19wb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0xpc3Rfbm9kZV9iYXNlKiBfX2ZpcnN0LCBfTGlzdF9ub2RlX2Jhc2UqIF9fbGFzdCkgeworICBpZiAoX19wb3NpdGlvbiAhPSBfX2xhc3QpIHsKKyAgICAvLyBSZW1vdmUgW2ZpcnN0LCBsYXN0KSBmcm9tIGl0cyBvbGQgcG9zaXRpb24uCisgICAgX19sYXN0LT5fTV9wcmV2LT5fTV9uZXh0ICAgICA9IF9fcG9zaXRpb247CisgICAgX19maXJzdC0+X01fcHJldi0+X01fbmV4dCAgICA9IF9fbGFzdDsKKyAgICBfX3Bvc2l0aW9uLT5fTV9wcmV2LT5fTV9uZXh0ID0gX19maXJzdDsKKworICAgIC8vIFNwbGljZSBbZmlyc3QsIGxhc3QpIGludG8gaXRzIG5ldyBwb3NpdGlvbi4KKyAgICBfTm9kZV9iYXNlKiBfX3RtcCA9IF9fcG9zaXRpb24tPl9NX3ByZXY7CisgICAgX19wb3NpdGlvbi0+X01fcHJldiA9IF9fbGFzdC0+X01fcHJldjsKKyAgICBfX2xhc3QtPl9NX3ByZXYgICAgID0gX19maXJzdC0+X01fcHJldjsKKyAgICBfX2ZpcnN0LT5fTV9wcmV2ICAgID0gX190bXA7CisgIH0KK30KKyNlbmRpZiAvKiBfU1RMUF9FWFBPU0VfR0xPQkFMU19JTVBMRU1FTlRBVElPTiAqLworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Cit2b2lkIF9MaXN0X2Jhc2U8X1RwLF9BbGxvYz46OmNsZWFyKCkgeworICBfTm9kZSogX19jdXIgPSBfX1NUQVRJQ19DQVNUKF9Ob2RlKiwgX01fbm9kZS5fTV9kYXRhLl9NX25leHQpOworICB3aGlsZSAoX19jdXIgIT0gJihfTV9ub2RlLl9NX2RhdGEpKSB7CisgICAgX05vZGUqIF9fdG1wID0gX19jdXI7CisgICAgX19jdXIgPSBfX1NUQVRJQ19DQVNUKF9Ob2RlKiwgX19jdXItPl9NX25leHQpOworICAgIF9TVExQX1NURDo6X0Rlc3Ryb3koJl9fdG1wLT5fTV9kYXRhKTsKKyAgICB0aGlzLT5fTV9ub2RlLmRlYWxsb2NhdGUoX190bXAsIDEpOworICB9CisgIF9NX25vZGUuX01fZGF0YS5fTV9uZXh0ID0gJl9NX25vZGUuX01fZGF0YTsKKyAgX01fbm9kZS5fTV9kYXRhLl9NX3ByZXYgPSAmX01fbm9kZS5fTV9kYXRhOworfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfTkVTVEVEX1RZUEVfUEFSQU1fQlVHKQorIyAgZGVmaW5lIHNpemVfdHlwZSBzaXplX3QKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BUUl9TUEVDSUFMSVpBVElPTlMpCisjICBkZWZpbmUgbGlzdCBfU1RMUF9QVFJfSU1QTF9OQU1FKGxpc3QpCisjZWxpZiBkZWZpbmVkIChfU1RMUF9ERUJVRykKKyMgIGRlZmluZSBsaXN0IF9TVExQX05PTl9EQkdfTkFNRShsaXN0KQorI2Vsc2UKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK3ZvaWQgbGlzdDxfVHAsIF9BbGxvYz46OnJlc2l6ZShzaXplX3R5cGUgX19uZXdfc2l6ZSwgY29uc3QgX1RwJiBfX3gpIHsKKyAgaXRlcmF0b3IgX19pID0gYmVnaW4oKTsKKyAgc2l6ZV90eXBlIF9fbGVuID0gMDsKKyAgZm9yICggOyBfX2kgIT0gZW5kKCkgJiYgX19sZW4gPCBfX25ld19zaXplOyArK19faSwgKytfX2xlbik7CisKKyAgaWYgKF9fbGVuID09IF9fbmV3X3NpemUpCisgICAgZXJhc2UoX19pLCBlbmQoKSk7CisgIGVsc2UgLy8gX19pID09IGVuZCgpCisgICAgaW5zZXJ0KGVuZCgpLCBfX25ld19zaXplIC0gX19sZW4sIF9feCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK2xpc3Q8X1RwLCBfQWxsb2M+JiBsaXN0PF9UcCwgX0FsbG9jPjo6b3BlcmF0b3I9KGNvbnN0IGxpc3Q8X1RwLCBfQWxsb2M+JiBfX3gpIHsKKyAgaWYgKHRoaXMgIT0gJl9feCkgeworICAgIGl0ZXJhdG9yIF9fZmlyc3QxID0gYmVnaW4oKTsKKyAgICBpdGVyYXRvciBfX2xhc3QxID0gZW5kKCk7CisgICAgY29uc3RfaXRlcmF0b3IgX19maXJzdDIgPSBfX3guYmVnaW4oKTsKKyAgICBjb25zdF9pdGVyYXRvciBfX2xhc3QyID0gX194LmVuZCgpOworICAgIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDIpCisgICAgICAqX19maXJzdDErKyA9ICpfX2ZpcnN0MisrOworICAgIGlmIChfX2ZpcnN0MiA9PSBfX2xhc3QyKQorICAgICAgZXJhc2UoX19maXJzdDEsIF9fbGFzdDEpOworICAgIGVsc2UKKyAgICAgIGluc2VydChfX2xhc3QxLCBfX2ZpcnN0MiwgX19sYXN0Mik7CisgIH0KKyAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Cit2b2lkIGxpc3Q8X1RwLCBfQWxsb2M+OjpfTV9maWxsX2Fzc2lnbihzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9fdmFsKSB7CisgIGl0ZXJhdG9yIF9faSA9IGJlZ2luKCk7CisgIGZvciAoIDsgX19pICE9IGVuZCgpICYmIF9fbiA+IDA7ICsrX19pLCAtLV9fbikKKyAgICAqX19pID0gX192YWw7CisgIGlmIChfX24gPiAwKQorICAgIGluc2VydChlbmQoKSwgX19uLCBfX3ZhbCk7CisgIGVsc2UKKyAgICBlcmFzZShfX2ksIGVuZCgpKTsKK30KKworI2lmICFkZWZpbmVkIChsaXN0KQorX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYywgY2xhc3MgX1ByZWRpY2F0ZT4KK3ZvaWQgX1NfcmVtb3ZlX2lmKGxpc3Q8X1RwLCBfQWxsb2M+JiBfX3RoYXQsIF9QcmVkaWNhdGUgX19wcmVkKSAgeworICB0eXBlZGVmIHR5cGVuYW1lIGxpc3Q8X1RwLCBfQWxsb2M+OjppdGVyYXRvciBfTGl0ZXJhdG9yOworICBfTGl0ZXJhdG9yIF9fZmlyc3QgPSBfX3RoYXQuYmVnaW4oKTsKKyAgX0xpdGVyYXRvciBfX2xhc3QgPSBfX3RoYXQuZW5kKCk7CisgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkgeworICAgIF9MaXRlcmF0b3IgX19uZXh0ID0gX19maXJzdDsKKyAgICArK19fbmV4dDsKKyAgICBpZiAoX19wcmVkKCpfX2ZpcnN0KSkgX190aGF0LmVyYXNlKF9fZmlyc3QpOworICAgIF9fZmlyc3QgPSBfX25leHQ7CisgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jLCBjbGFzcyBfQmluYXJ5UHJlZGljYXRlPgordm9pZCBfU191bmlxdWUobGlzdDxfVHAsIF9BbGxvYz4mIF9fdGhhdCwgX0JpbmFyeVByZWRpY2F0ZSBfX2JpbmFyeV9wcmVkKSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgbGlzdDxfVHAsIF9BbGxvYz46Oml0ZXJhdG9yIF9MaXRlcmF0b3I7CisgIF9MaXRlcmF0b3IgX19maXJzdCA9IF9fdGhhdC5iZWdpbigpOworICBfTGl0ZXJhdG9yIF9fbGFzdCA9IF9fdGhhdC5lbmQoKTsKKyAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KSByZXR1cm47CisgIF9MaXRlcmF0b3IgX19uZXh0ID0gX19maXJzdDsKKyAgd2hpbGUgKCsrX19uZXh0ICE9IF9fbGFzdCkgeworICAgIGlmIChfX2JpbmFyeV9wcmVkKCpfX2ZpcnN0LCAqX19uZXh0KSkKKyAgICAgIF9fdGhhdC5lcmFzZShfX25leHQpOworICAgIGVsc2UKKyAgICAgIF9fZmlyc3QgPSBfX25leHQ7CisgICAgX19uZXh0ID0gX19maXJzdDsKKyAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2MsIGNsYXNzIF9TdHJpY3RXZWFrT3JkZXJpbmc+Cit2b2lkIF9TX21lcmdlKGxpc3Q8X1RwLCBfQWxsb2M+JiBfX3RoYXQsIGxpc3Q8X1RwLCBfQWxsb2M+JiBfX3gsCisgICAgICAgICAgICAgIF9TdHJpY3RXZWFrT3JkZXJpbmcgX19jb21wKSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgbGlzdDxfVHAsIF9BbGxvYz46Oml0ZXJhdG9yIF9MaXRlcmF0b3I7CisgIF9MaXRlcmF0b3IgX19maXJzdDEgPSBfX3RoYXQuYmVnaW4oKTsKKyAgX0xpdGVyYXRvciBfX2xhc3QxID0gX190aGF0LmVuZCgpOworICBfTGl0ZXJhdG9yIF9fZmlyc3QyID0gX194LmJlZ2luKCk7CisgIF9MaXRlcmF0b3IgX19sYXN0MiA9IF9feC5lbmQoKTsKKyAgaWYgKF9fdGhhdC5nZXRfYWxsb2NhdG9yKCkgPT0gX194LmdldF9hbGxvY2F0b3IoKSkgeworICAgIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDIpIHsKKyAgICAgIGlmIChfX2NvbXAoKl9fZmlyc3QyLCAqX19maXJzdDEpKSB7CisgICAgICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFfX2NvbXAoKl9fZmlyc3QxLCAqX19maXJzdDIpLCBfU3RsTXNnX0lOVkFMSURfU1RSSUNUX1dFQUtfUFJFRElDQVRFKQorICAgICAgICBfTGl0ZXJhdG9yIF9fbmV4dCA9IF9fZmlyc3QyOworICAgICAgICBfTGlzdF9nbG9iYWxfaW5zdDo6X1RyYW5zZmVyKF9fZmlyc3QxLl9NX25vZGUsIF9fZmlyc3QyLl9NX25vZGUsICgrK19fbmV4dCkuX01fbm9kZSk7CisgICAgICAgIF9fZmlyc3QyID0gX19uZXh0OworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICArK19fZmlyc3QxOworICAgIH0KKyAgICBpZiAoX19maXJzdDIgIT0gX19sYXN0MikKKyAgICAgIF9MaXN0X2dsb2JhbF9pbnN0OjpfVHJhbnNmZXIoX19sYXN0MS5fTV9ub2RlLCBfX2ZpcnN0Mi5fTV9ub2RlLCBfX2xhc3QyLl9NX25vZGUpOworICB9CisgIGVsc2UgeworICAgIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDIpIHsKKyAgICAgIGlmIChfX2NvbXAoKl9fZmlyc3QyLCAqX19maXJzdDEpKSB7CisgICAgICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFfX2NvbXAoKl9fZmlyc3QxLCAqX19maXJzdDIpLCBfU3RsTXNnX0lOVkFMSURfU1RSSUNUX1dFQUtfUFJFRElDQVRFKQorICAgICAgICBfX2ZpcnN0MSA9IF9fdGhhdC5pbnNlcnQoX19maXJzdDEsICpfX2ZpcnN0Mik7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgICsrX19maXJzdDE7CisgICAgfQorICAgIGlmIChfX2ZpcnN0MiAhPSBfX2xhc3QyKSB7CisgICAgICBfX3RoYXQuaW5zZXJ0KF9fZmlyc3QxLCBfX2ZpcnN0MiwgX19sYXN0Mik7CisgICAgfQorICAgIF9feC5jbGVhcigpOworICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYywgY2xhc3MgX1N0cmljdFdlYWtPcmRlcmluZz4KK3ZvaWQgX1Nfc29ydChsaXN0PF9UcCwgX0FsbG9jPiYgX190aGF0LCBfU3RyaWN0V2Vha09yZGVyaW5nIF9fY29tcCkgeworICAvLyBEbyBub3RoaW5nIGlmIHRoZSBsaXN0IGhhcyBsZW5ndGggMCBvciAxLgorICBpZiAoX190aGF0Ll9NX25vZGUuX01fZGF0YS5fTV9uZXh0ID09ICZfX3RoYXQuX01fbm9kZS5fTV9kYXRhIHx8CisgICAgICBfX3RoYXQuX01fbm9kZS5fTV9kYXRhLl9NX25leHQtPl9NX25leHQgPT0gJl9fdGhhdC5fTV9ub2RlLl9NX2RhdGEpCisgICAgcmV0dXJuOworCisgIGxpc3Q8X1RwLCBfQWxsb2M+IF9fY2FycnkoX190aGF0LmdldF9hbGxvY2F0b3IoKSk7CisgIGNvbnN0IGludCBOQiA9IDY0OworICBfU1RMUF9QUklWIF9DQXJyYXk8bGlzdDxfVHAsIF9BbGxvYz4sIE5CPiBfX2NvdW50ZXIoX19jYXJyeSk7CisgIGludCBfX2ZpbGwgPSAwOworICB3aGlsZSAoIV9fdGhhdC5lbXB0eSgpKSB7CisgICAgX19jYXJyeS5zcGxpY2UoX19jYXJyeS5iZWdpbigpLCBfX3RoYXQsIF9fdGhhdC5iZWdpbigpKTsKKyAgICBpbnQgX19pID0gMDsKKyAgICB3aGlsZSAoX19pIDwgX19maWxsICYmICFfX2NvdW50ZXJbX19pXS5lbXB0eSgpKSB7CisgICAgICBfU19tZXJnZShfX2NvdW50ZXJbX19pXSwgX19jYXJyeSwgX19jb21wKTsKKyAgICAgIF9fY2Fycnkuc3dhcChfX2NvdW50ZXJbX19pKytdKTsKKyAgICB9CisgICAgX19jYXJyeS5zd2FwKF9fY291bnRlcltfX2ldKTsKKyAgICBpZiAoX19pID09IF9fZmlsbCkgeworICAgICAgKytfX2ZpbGw7CisgICAgICBpZiAoX19maWxsID49IE5CKSB7CisgICAgICAgIC8vTG9va3MgbGlrZSB0aGUgbGlzdCBoYXMgdG9vIG1hbnkgZWxlbWVudHMgdG8gYmUgc29ydGVkIHdpdGggdGhpcyBhbGdvcml0aG06CisgICAgICAgIF9fc3RsX3Rocm93X292ZXJmbG93X2Vycm9yKCJsaXN0Ojpzb3J0Iik7CisgICAgICB9CisgICAgfQorICB9CisKKyAgZm9yIChpbnQgX19pID0gMTsgX19pIDwgX19maWxsOyArK19faSkKKyAgICBfU19tZXJnZShfX2NvdW50ZXJbX19pXSwgX19jb3VudGVyW19faSAtIDFdLCBfX2NvbXApOworICBfX3RoYXQuc3dhcChfX2NvdW50ZXJbX19maWxsIC0gMV0pOworfQorCisjaWYgZGVmaW5lZCAobGlzdCkKKyMgIHVuZGVmIGxpc3QKKyNlbmRpZgorCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYgLyogIF9TVExQX0xJU1RfQyAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RsL19saXN0LmggYi9zdGwvX2xpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2ZiOWJhCi0tLSAvZGV2L251bGwKKysrIGIvc3RsL19saXN0LmgKQEAgLTAsMCArMSw3MzIgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisvKiBOT1RFOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBTVEwgaGVhZGVycy4KKyAqICAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuCisgKi8KKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9MSVNUX0lNUExfSAorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9MSVNUX0lNUExfSAorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0FMR09CQVNFX0gKKyMgIGluY2x1ZGUgPHN0bC9fYWxnb2Jhc2UuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0FMTE9DX0gKKyMgIGluY2x1ZGUgPHN0bC9fYWxsb2MuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0lURVJBVE9SX0gKKyMgIGluY2x1ZGUgPHN0bC9faXRlcmF0b3IuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NPTlNUUlVDVF9ICisjICBpbmNsdWRlIDxzdGwvX2NvbnN0cnVjdC5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfRlVOQ1RJT05fQkFTRV9ICisjICBpbmNsdWRlIDxzdGwvX2Z1bmN0aW9uX2Jhc2UuaD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCitzdHJ1Y3QgX0xpc3Rfbm9kZV9iYXNlIHsKKyAgX0xpc3Rfbm9kZV9iYXNlKiBfTV9uZXh0OworICBfTGlzdF9ub2RlX2Jhc2UqIF9NX3ByZXY7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0R1bW15PgorY2xhc3MgX0xpc3RfZ2xvYmFsIHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBfTGlzdF9ub2RlX2Jhc2UgX05vZGVfYmFzZTsKKyAgc3RhdGljIHZvaWQgIF9TVExQX0NBTEwgX1RyYW5zZmVyKF9Ob2RlX2Jhc2UqIF9fcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX05vZGVfYmFzZSogX19maXJzdCwgX05vZGVfYmFzZSogX19sYXN0KTsKK307CisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUKQorX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIF9MaXN0X2dsb2JhbDxib29sPjsKKyNlbmRpZgordHlwZWRlZiBfTGlzdF9nbG9iYWw8Ym9vbD4gX0xpc3RfZ2xvYmFsX2luc3Q7CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitjbGFzcyBfTGlzdF9ub2RlIDogcHVibGljIF9MaXN0X25vZGVfYmFzZSB7CitwdWJsaWM6CisgIF9UcCBfTV9kYXRhOworICBfX1RSSVZJQUxfU1RVRkYoX0xpc3Rfbm9kZSkKK307CisKK3N0cnVjdCBfTGlzdF9pdGVyYXRvcl9iYXNlIHsKKyAgdHlwZWRlZiBzaXplX3QgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGU7CisgIHR5cGVkZWYgcHRyZGlmZl90ICAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICB0eXBlZGVmIGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OworCisgIF9MaXN0X25vZGVfYmFzZSogX01fbm9kZTsKKworICBfTGlzdF9pdGVyYXRvcl9iYXNlKF9MaXN0X25vZGVfYmFzZSogX194KSA6IF9NX25vZGUoX194KSB7fQorCisgIHZvaWQgX01faW5jcigpIHsgX01fbm9kZSA9IF9NX25vZGUtPl9NX25leHQ7IH0KKyAgdm9pZCBfTV9kZWNyKCkgeyBfTV9ub2RlID0gX01fbm9kZS0+X01fcHJldjsgfQorfTsKKworCit0ZW1wbGF0ZTxjbGFzcyBfVHAsIGNsYXNzIF9UcmFpdHM+CitzdHJ1Y3QgX0xpc3RfaXRlcmF0b3IgOiBwdWJsaWMgX0xpc3RfaXRlcmF0b3JfYmFzZSB7CisgIHR5cGVkZWYgX1RwIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6cG9pbnRlciAgICBwb2ludGVyOworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OnJlZmVyZW5jZSAgcmVmZXJlbmNlOworCisgIHR5cGVkZWYgX0xpc3RfaXRlcmF0b3I8X1RwLCBfVHJhaXRzPiAgICAgICAgIF9TZWxmOworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6Ol9Ob25Db25zdFRyYWl0cyAgICBfTm9uQ29uc3RUcmFpdHM7CisgIHR5cGVkZWYgX0xpc3RfaXRlcmF0b3I8X1RwLCBfTm9uQ29uc3RUcmFpdHM+IGl0ZXJhdG9yOworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6Ol9Db25zdFRyYWl0cyAgICAgICBfQ29uc3RUcmFpdHM7CisgIHR5cGVkZWYgX0xpc3RfaXRlcmF0b3I8X1RwLCBfQ29uc3RUcmFpdHM+ICAgIGNvbnN0X2l0ZXJhdG9yOworCisgIHR5cGVkZWYgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CisgIHR5cGVkZWYgX0xpc3Rfbm9kZTxfVHA+IF9Ob2RlOworICB0eXBlZGVmIHNpemVfdCBzaXplX3R5cGU7CisgIHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKKworICBleHBsaWNpdCBfTGlzdF9pdGVyYXRvcihfTGlzdF9ub2RlX2Jhc2UqIF9feCkgOiBfTGlzdF9pdGVyYXRvcl9iYXNlKF9feCkge30KKyAgX0xpc3RfaXRlcmF0b3IoKSA6IF9MaXN0X2l0ZXJhdG9yX2Jhc2UoMCkge30KKyAgLy9jb3B5IGNvbnN0cnVjdG9yIGZvciBpdGVyYXRvciBhbmQgY29uc3RydWN0b3IgZnJvbSBpdGVyYXRvciBmb3IgY29uc3RfaXRlcmF0b3IKKyAgX0xpc3RfaXRlcmF0b3IoY29uc3QgaXRlcmF0b3ImIF9feCkgOiAgX0xpc3RfaXRlcmF0b3JfYmFzZShfX3guX01fbm9kZSkge30KKworICByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gX19TVEFUSUNfQ0FTVChfTm9kZSosIHRoaXMtPl9NX25vZGUpLT5fTV9kYXRhOyB9CisKKyAgX1NUTFBfREVGSU5FX0FSUk9XX09QRVJBVE9SCisKKyAgX1NlbGYmIG9wZXJhdG9yKysoKSB7CisgICAgdGhpcy0+X01faW5jcigpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBfU2VsZiBvcGVyYXRvcisrKGludCkgeworICAgIF9TZWxmIF9fdG1wID0gKnRoaXM7CisgICAgdGhpcy0+X01faW5jcigpOworICAgIHJldHVybiBfX3RtcDsKKyAgfQorICBfU2VsZiYgb3BlcmF0b3ItLSgpIHsKKyAgICB0aGlzLT5fTV9kZWNyKCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIF9TZWxmIG9wZXJhdG9yLS0oaW50KSB7CisgICAgX1NlbGYgX190bXAgPSAqdGhpczsKKyAgICB0aGlzLT5fTV9kZWNyKCk7CisgICAgcmV0dXJuIF9fdG1wOworICB9CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdF9pdGVyYXRvciBfX3kgKSBjb25zdCB7CisgICAgcmV0dXJuIHRoaXMtPl9NX25vZGUgPT0gX195Ll9NX25vZGU7CisgIH0KKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0X2l0ZXJhdG9yIF9feSApIGNvbnN0IHsKKyAgICByZXR1cm4gdGhpcy0+X01fbm9kZSAhPSBfX3kuX01fbm9kZTsKKyAgfQorfTsKKworI2lmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9UcmFpdHM+CitzdHJ1Y3QgX190eXBlX3RyYWl0czxfU1RMUF9QUklWIF9MaXN0X2l0ZXJhdG9yPF9UcCwgX1RyYWl0cz4gPiB7CisgIHR5cGVkZWYgX19mYWxzZV90eXBlICAgaGFzX3RyaXZpYWxfZGVmYXVsdF9jb25zdHJ1Y3RvcjsKKyAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9jb3B5X2NvbnN0cnVjdG9yOworICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3I7CisgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjsKKyAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgICBpc19QT0RfdHlwZTsKK307CitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisjZW5kaWYgLyogX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTiAqLworCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX09MRF9IUF9JVEVSQVRPUl9RVUVSSUVTKQorX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVHJhaXRzPgoraW5saW5lIF9UcCogdmFsdWVfdHlwZShjb25zdCBfU1RMUF9QUklWIF9MaXN0X2l0ZXJhdG9yPF9UcCwgX1RyYWl0cz4mKSB7IHJldHVybiAwOyB9CitpbmxpbmUgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnkoY29uc3QgX1NUTFBfUFJJViBfTGlzdF9pdGVyYXRvcl9iYXNlJikgeyByZXR1cm4gYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcoKTt9CitpbmxpbmUgcHRyZGlmZl90KiBkaXN0YW5jZV90eXBlKGNvbnN0IF9TVExQX1BSSVYgX0xpc3RfaXRlcmF0b3JfYmFzZSYpIHsgcmV0dXJuIDA7IH0KK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKyNlbmRpZgorCisvLyBCYXNlIGNsYXNzIHRoYXQgZW5jYXBzdWxhdGVzIGRldGFpbHMgb2YgYWxsb2NhdG9ycyBhbmQgaGVscHMKKy8vIHRvIHNpbXBsaWZ5IEVICisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK2NsYXNzIF9MaXN0X2Jhc2UgeworcHJvdGVjdGVkOgorICBfU1RMUF9GT1JDRV9BTExPQ0FUT1JTKF9UcCwgX0FsbG9jKQorICB0eXBlZGVmIF9MaXN0X25vZGVfYmFzZSBfTm9kZV9iYXNlOworICB0eXBlZGVmIF9MaXN0X25vZGU8X1RwPiBfTm9kZTsKKyAgdHlwZWRlZiBfTGlzdF9iYXNlPF9UcCwgX0FsbG9jPiBfU2VsZjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2NfdHJhaXRzPF9Ob2RlLCBfQWxsb2M+OjphbGxvY2F0b3JfdHlwZSBfTm9kZV9hbGxvY2F0b3JfdHlwZTsKK3B1YmxpYzoKKyAgdHlwZWRlZiBfU1RMUF9hbGxvY19wcm94eTxfTm9kZV9iYXNlLCBfTm9kZSwgX05vZGVfYWxsb2NhdG9yX3R5cGU+IF9BbGxvY1Byb3h5OworICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY190cmFpdHM8X1RwLCBfQWxsb2M+OjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKKworICBhbGxvY2F0b3JfdHlwZSBnZXRfYWxsb2NhdG9yKCkgY29uc3QKKyAgeyByZXR1cm4gX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoKGNvbnN0IF9Ob2RlX2FsbG9jYXRvcl90eXBlJilfTV9ub2RlLCBfVHApOyB9CisKKyAgX0xpc3RfYmFzZShjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKSA6IF9NX25vZGUoX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoX19hLCBfTm9kZSksIF9Ob2RlX2Jhc2UoKSkKKyAgeyBfTV9lbXB0eV9pbml0aWFsaXplKCk7IH0KKyAgX0xpc3RfYmFzZShfX21vdmVfc291cmNlPF9TZWxmPiBzcmMpIDoKKyAgICBfTV9ub2RlKF9fbW92ZV9zb3VyY2U8X0FsbG9jUHJveHk+KHNyYy5nZXQoKS5fTV9ub2RlKSkgeworICAgIGlmIChzcmMuZ2V0KCkuZW1wdHkoKSkKKyAgICAgIC8vV2UgZm9yY2UgdGhpcyB0byBlbXB0eS4KKyAgICAgIF9NX2VtcHR5X2luaXRpYWxpemUoKTsKKyAgICBlbHNlIHsKKyAgICAgIHNyYy5nZXQoKS5fTV9lbXB0eV9pbml0aWFsaXplKCk7CisgICAgICBfTV9ub2RlLl9NX2RhdGEuX01fcHJldi0+X01fbmV4dCA9IF9NX25vZGUuX01fZGF0YS5fTV9uZXh0LT5fTV9wcmV2ID0gJl9NX25vZGUuX01fZGF0YTsKKyAgICB9CisgIH0KKworICB+X0xpc3RfYmFzZSgpCisgIHsgY2xlYXIoKTsgfQorCisgIHZvaWQgY2xlYXIoKTsKKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIF9NX25vZGUuX01fZGF0YS5fTV9uZXh0ID09ICZfTV9ub2RlLl9NX2RhdGE7IH0KKworICB2b2lkIF9NX2VtcHR5X2luaXRpYWxpemUoKSB7CisgICAgX01fbm9kZS5fTV9kYXRhLl9NX25leHQgPSAmX01fbm9kZS5fTV9kYXRhOworICAgIF9NX25vZGUuX01fZGF0YS5fTV9wcmV2ID0gX01fbm9kZS5fTV9kYXRhLl9NX25leHQ7CisgIH0KKworcHVibGljOgorICBfQWxsb2NQcm94eSBfTV9ub2RlOworfTsKKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QVFJfU1BFQ0lBTElaQVRJT05TKQorIyAgZGVmaW5lIGxpc3QgX1NUTFBfUFRSX0lNUExfTkFNRShsaXN0KQorI2VsaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpCisjICBkZWZpbmUgbGlzdCBfU1RMUF9OT05fREJHX05BTUUobGlzdCkKKyNlbHNlCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBfU1RMUF9ERUZBVUxUX0FMTE9DQVRPUl9TRUxFQ1QoX1RwKSA+CitjbGFzcyBsaXN0OworCisjaWYgIWRlZmluZWQgKGxpc3QpCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisjZW5kaWYKKworLy8gaGVscGVyIGZ1bmN0aW9ucyB0byByZWR1Y2UgY29kZSBkdXBsaWNhdGlvbgordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jLCBjbGFzcyBfUHJlZGljYXRlPgordm9pZCBfU19yZW1vdmVfaWYobGlzdDxfVHAsIF9BbGxvYz4mIF9fdGhhdCwgX1ByZWRpY2F0ZSBfX3ByZWQpOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2MsIGNsYXNzIF9CaW5hcnlQcmVkaWNhdGU+Cit2b2lkIF9TX3VuaXF1ZShsaXN0PF9UcCwgX0FsbG9jPiYgX190aGF0LCBfQmluYXJ5UHJlZGljYXRlIF9fYmluYXJ5X3ByZWQpOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2MsIGNsYXNzIF9TdHJpY3RXZWFrT3JkZXJpbmc+Cit2b2lkIF9TX21lcmdlKGxpc3Q8X1RwLCBfQWxsb2M+JiBfX3RoYXQsIGxpc3Q8X1RwLCBfQWxsb2M+JiBfX3gsCisgICAgICAgICAgICAgIF9TdHJpY3RXZWFrT3JkZXJpbmcgX19jb21wKTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jLCBjbGFzcyBfU3RyaWN0V2Vha09yZGVyaW5nPgordm9pZCBfU19zb3J0KGxpc3Q8X1RwLCBfQWxsb2M+JiBfX3RoYXQsIF9TdHJpY3RXZWFrT3JkZXJpbmcgX19jb21wKTsKKworI2lmICFkZWZpbmVkIChsaXN0KQorX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgorY2xhc3MgbGlzdCA6IHB1YmxpYyBfU1RMUF9QUklWIF9MaXN0X2Jhc2U8X1RwLCBfQWxsb2M+CisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EKSAmJiAhZGVmaW5lZCAobGlzdCkKKyAgICAgICAgICAgLCBwdWJsaWMgX19zdGxwb3J0X2NsYXNzPGxpc3Q8X1RwLCBfQWxsb2M+ID4KKyNlbmRpZgoreworICB0eXBlZGVmIF9TVExQX1BSSVYgX0xpc3RfYmFzZTxfVHAsIF9BbGxvYz4gX0Jhc2U7CisgIHR5cGVkZWYgbGlzdDxfVHAsIF9BbGxvYz4gX1NlbGY7CisgIHR5cGVkZWYgX1NUTFBfUFJJViBfTGlzdF9ub2RlPF9UcD4gX05vZGU7CisgIHR5cGVkZWYgX1NUTFBfUFJJViBfTGlzdF9ub2RlX2Jhc2UgX05vZGVfYmFzZTsKK3B1YmxpYzoKKyAgdHlwZWRlZiBfVHAgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiB2YWx1ZV90eXBlKiBwb2ludGVyOworICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUqIGNvbnN0X3BvaW50ZXI7CisgIHR5cGVkZWYgdmFsdWVfdHlwZSYgcmVmZXJlbmNlOworICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmIGNvbnN0X3JlZmVyZW5jZTsKKyAgdHlwZWRlZiBzaXplX3Qgc2l6ZV90eXBlOworICB0eXBlZGVmIHB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7CisgIF9TVExQX0ZPUkNFX0FMTE9DQVRPUlMoX1RwLCBfQWxsb2MpCisgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmFsbG9jYXRvcl90eXBlIGFsbG9jYXRvcl90eXBlOworICB0eXBlZGVmIGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnIF9JdGVyYXRvcl9jYXRlZ29yeTsKKworcHVibGljOgorICB0eXBlZGVmIF9TVExQX1BSSVYgX0xpc3RfaXRlcmF0b3I8X1RwLCBfTm9uY29uc3RfdHJhaXRzPF9UcD4gPiBpdGVyYXRvcjsKKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9MaXN0X2l0ZXJhdG9yPF9UcCwgX0NvbnN0X3RyYWl0czxfVHA+ID4gICAgY29uc3RfaXRlcmF0b3I7CisgIF9TVExQX0RFQ0xBUkVfQklESVJFQ1RJT05BTF9SRVZFUlNFX0lURVJBVE9SUzsKKworcHJvdGVjdGVkOgorI2lmICFkZWZpbmVkKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCisgIF9Ob2RlX2Jhc2UqIF9NX2NyZWF0ZV9ub2RlKGNvbnN0X3JlZmVyZW5jZSBfX3ggPSB2YWx1ZV90eXBlKCkpIHsKKyNlbHNlCisgIF9Ob2RlX2Jhc2UqIF9NX2NyZWF0ZV9ub2RlKGNvbnN0X3JlZmVyZW5jZSBfX3gpIHsKKyNlbmRpZiAvKiFfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKi8KKyAgICBfTm9kZSogX19wID0gdGhpcy0+X01fbm9kZS5hbGxvY2F0ZSgxKTsKKyAgICBfU1RMUF9UUlkgeworICAgICAgX0NvcHlfQ29uc3RydWN0KCZfX3AtPl9NX2RhdGEsIF9feCk7CisgICAgfQorICAgIF9TVExQX1VOV0lORCh0aGlzLT5fTV9ub2RlLmRlYWxsb2NhdGUoX19wLCAxKSkKKyAgICByZXR1cm4gX19wOworICB9CisKKyNpZiBkZWZpbmVkKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCisgIF9Ob2RlX2Jhc2UqIF9NX2NyZWF0ZV9ub2RlKCkgeworICAgIF9Ob2RlKiBfX3AgPSB0aGlzLT5fTV9ub2RlLmFsbG9jYXRlKDEpOworICAgIF9TVExQX1RSWSB7CisgICAgICBfU1RMUF9TVEQ6Ol9Db25zdHJ1Y3QoJl9fcC0+X01fZGF0YSk7CisgICAgfQorICAgIF9TVExQX1VOV0lORCh0aGlzLT5fTV9ub2RlLmRlYWxsb2NhdGUoX19wLCAxKSkKKyAgICByZXR1cm4gX19wOworICB9CisjZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKi8KKworcHVibGljOgorI2lmICFkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQorICBleHBsaWNpdCBsaXN0KHNpemVfdHlwZSBfX24sIGNvbnN0X3JlZmVyZW5jZSBfX3ZhbCA9IF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQodmFsdWVfdHlwZSksCisgICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisjZWxzZQorICBleHBsaWNpdCBsaXN0KHNpemVfdHlwZSBfX24pCisgICAgOiBfU1RMUF9QUklWIF9MaXN0X2Jhc2U8X1RwLCBfQWxsb2M+KGFsbG9jYXRvcl90eXBlKCkpCisgICAgeyB0aGlzLT5pbnNlcnQoYmVnaW4oKSwgX19uLCBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKHZhbHVlX3R5cGUpKTsgfQorICBsaXN0KHNpemVfdHlwZSBfX24sIGNvbnN0X3JlZmVyZW5jZSBfX3ZhbCkKKyAgICA6IF9TVExQX1BSSVYgX0xpc3RfYmFzZTxfVHAsIF9BbGxvYz4oYWxsb2NhdG9yX3R5cGUoKSkKKyAgICB7IHRoaXMtPmluc2VydChiZWdpbigpLCBfX24sIF9fdmFsKTsgfQorICBsaXN0KHNpemVfdHlwZSBfX24sIGNvbnN0X3JlZmVyZW5jZSBfX3ZhbCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0qLworICAgIDogX1NUTFBfUFJJViBfTGlzdF9iYXNlPF9UcCwgX0FsbG9jPihfX2EpCisgICAgeyB0aGlzLT5pbnNlcnQoYmVnaW4oKSwgX19uLCBfX3ZhbCk7IH0KKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIC8vIFdlIGRvbid0IG5lZWQgYW55IGRpc3BhdGNoaW5nIHRyaWNrcyBoZXJlLCBiZWNhdXNlIGluc2VydCBkb2VzIGFsbCBvZgorICAvLyB0aGF0IGFueXdheS4KKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICBsaXN0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hIF9TVExQX0FMTE9DQVRPUl9UWVBFX0RGTCkKKyAgICA6IF9TVExQX1BSSVYgX0xpc3RfYmFzZTxfVHAsIF9BbGxvYz4oX19hKQorICB7IF9NX2luc2VydChiZWdpbigpLCBfX2ZpcnN0LCBfX2xhc3QpOyB9CisKKyMgIGlmIGRlZmluZWQgKF9TVExQX05FRURTX0VYVFJBX1RFTVBMQVRFX0NPTlNUUlVDVE9SUykKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICBsaXN0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgICA6IF9TVExQX1BSSVYgX0xpc3RfYmFzZTxfVHAsIF9BbGxvYz4oYWxsb2NhdG9yX3R5cGUoKSkKKyAgeyBfTV9pbnNlcnQoYmVnaW4oKSwgX19maXJzdCwgX19sYXN0KTsgfQorIyAgZW5kaWYKKyNlbHNlIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKyAgbGlzdChjb25zdCB2YWx1ZV90eXBlKiBfX2ZpcnN0LCBjb25zdCB2YWx1ZV90eXBlKiBfX2xhc3QsCisgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfU1RMUF9QUklWIF9MaXN0X2Jhc2U8X1RwLCBfQWxsb2M+KF9fYSkKKyAgICB7IF9NX2luc2VydChiZWdpbigpLCBfX2ZpcnN0LCBfX2xhc3QpOyB9CisgIGxpc3QoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0LAorICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX1NUTFBfUFJJViBfTGlzdF9iYXNlPF9UcCwgX0FsbG9jPihfX2EpCisgICAgeyBfTV9pbnNlcnQoYmVnaW4oKSwgX19maXJzdCwgX19sYXN0KTsgfQorI2VuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKworI2lmICFkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQorICBleHBsaWNpdCBsaXN0KGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorI2Vsc2UKKyAgbGlzdCgpCisgICAgOiBfU1RMUF9QUklWIF9MaXN0X2Jhc2U8X1RwLCBfQWxsb2M+KGFsbG9jYXRvcl90eXBlKCkpIHt9CisgIGxpc3QoY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyNlbmRpZgorICAgIDogX1NUTFBfUFJJViBfTGlzdF9iYXNlPF9UcCwgX0FsbG9jPihfX2EpIHt9CisKKyAgbGlzdChjb25zdCBfU2VsZiYgX194KSA6IF9TVExQX1BSSVYgX0xpc3RfYmFzZTxfVHAsIF9BbGxvYz4oX194LmdldF9hbGxvY2F0b3IoKSkKKyAgeyBfTV9pbnNlcnQoYmVnaW4oKSwgX194LmJlZ2luKCksIF9feC5lbmQoKSk7IH0KKworICBsaXN0KF9fbW92ZV9zb3VyY2U8X1NlbGY+IHNyYykKKyAgICA6IF9TVExQX1BSSVYgX0xpc3RfYmFzZTxfVHAsIF9BbGxvYz4oX19tb3ZlX3NvdXJjZTxfQmFzZT4oc3JjLmdldCgpKSkge30KKworICB+bGlzdCgpIHt9CisKKyAgX1NlbGYmIG9wZXJhdG9yID0gKGNvbnN0IF9TZWxmJiBfX3gpOworCisgIGl0ZXJhdG9yIGJlZ2luKCkgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gaXRlcmF0b3IodGhpcy0+X01fbm9kZS5fTV9kYXRhLl9NX25leHQpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgICAgICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IodGhpcy0+X01fbm9kZS5fTV9kYXRhLl9NX25leHQpOyB9CisKKyAgaXRlcmF0b3IgZW5kKCkgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBpdGVyYXRvcigmdGhpcy0+X01fbm9kZS5fTV9kYXRhKTsgfQorICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCAgICAgICAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9fQ09OU1RfQ0FTVChfTm9kZV9iYXNlKiwgJnRoaXMtPl9NX25vZGUuX01fZGF0YSkpOyB9CisKKyAgcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSAgICAgICAgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgICAgICAgICAgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0ICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorCisgIHNpemVfdHlwZSBzaXplKCkgY29uc3QgeworICAgIHNpemVfdHlwZSBfX3Jlc3VsdCA9IGRpc3RhbmNlKGJlZ2luKCksIGVuZCgpKTsKKyAgICByZXR1cm4gX19yZXN1bHQ7CisgIH0KKyAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgeyByZXR1cm4gc2l6ZV90eXBlKC0xKTsgfQorCisgIHJlZmVyZW5jZSBmcm9udCgpICAgICAgICAgICAgIHsgcmV0dXJuICpiZWdpbigpOyB9CisgIGNvbnN0X3JlZmVyZW5jZSBmcm9udCgpIGNvbnN0IHsgcmV0dXJuICpiZWdpbigpOyB9CisgIHJlZmVyZW5jZSBiYWNrKCkgICAgICAgICAgICAgIHsgcmV0dXJuICooLS1lbmQoKSk7IH0KKyAgY29uc3RfcmVmZXJlbmNlIGJhY2soKSBjb25zdCAgeyByZXR1cm4gKigtLWVuZCgpKTsgfQorCitwcml2YXRlOgorICB2b2lkIF9NX3N3YXBfYXV4KF9TZWxmJiBfX3gpIHsKKyAgICBfX3guX01fbm9kZS5fTV9zd2FwX2FsbG9jKHRoaXMtPl9NX25vZGUpOworICAgIF9feC5fTV9ub2RlLl9NX2RhdGEuX01fbmV4dCA9IHRoaXMtPl9NX25vZGUuX01fZGF0YS5fTV9uZXh0OworICAgIF9feC5fTV9ub2RlLl9NX2RhdGEuX01fbmV4dC0+X01fcHJldiA9ICZfX3guX01fbm9kZS5fTV9kYXRhOworICAgIF9feC5fTV9ub2RlLl9NX2RhdGEuX01fcHJldiA9IHRoaXMtPl9NX25vZGUuX01fZGF0YS5fTV9wcmV2OworICAgIF9feC5fTV9ub2RlLl9NX2RhdGEuX01fcHJldi0+X01fbmV4dCA9ICZfX3guX01fbm9kZS5fTV9kYXRhOworICAgIHRoaXMtPl9NX2VtcHR5X2luaXRpYWxpemUoKTsKKyAgfQorCitwdWJsaWM6CisgIHZvaWQgc3dhcChfU2VsZiYgX194KSB7CisgICAgaWYgKF9feC5lbXB0eSgpKSB7CisgICAgICBpZiAodGhpcy0+ZW1wdHkoKSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICB0aGlzLT5fTV9zd2FwX2F1eChfX3gpOworICAgIH0gZWxzZSBpZiAodGhpcy0+ZW1wdHkoKSkgeworICAgICAgX194Ll9NX3N3YXBfYXV4KCp0aGlzKTsKKyAgICB9IGVsc2UgeworICAgICAgdGhpcy0+X01fbm9kZS5zd2FwKF9feC5fTV9ub2RlKTsKKyAgICAgIF9TVExQX1NURDo6c3dhcCh0aGlzLT5fTV9ub2RlLl9NX2RhdGEuX01fcHJldi0+X01fbmV4dCwgX194Ll9NX25vZGUuX01fZGF0YS5fTV9wcmV2LT5fTV9uZXh0KTsKKyAgICAgIF9TVExQX1NURDo6c3dhcCh0aGlzLT5fTV9ub2RlLl9NX2RhdGEuX01fbmV4dC0+X01fcHJldiwgX194Ll9NX25vZGUuX01fZGF0YS5fTV9uZXh0LT5fTV9wcmV2KTsKKyAgICB9CisgIH0KKworI2lmICFkZWZpbmVkKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pICYmICFkZWZpbmVkKF9TVExQX05PX0FOQUNIUk9OSVNNUykKKyAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBjb25zdF9yZWZlcmVuY2UgX194ID0gdmFsdWVfdHlwZSgpKSB7CisjZWxzZQorICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIGNvbnN0X3JlZmVyZW5jZSBfX3gpIHsKKyNlbmRpZiAvKiFfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNICYmICFfU1RMUF9OT19BTkFDSFJPTklTTVMqLworICAgIF9Ob2RlX2Jhc2UqIF9fdG1wID0gX01fY3JlYXRlX25vZGUoX194KTsKKyAgICBfTm9kZV9iYXNlKiBfX24gPSBfX3Bvcy5fTV9ub2RlOworICAgIF9Ob2RlX2Jhc2UqIF9fcCA9IF9fbi0+X01fcHJldjsKKyAgICBfX3RtcC0+X01fbmV4dCA9IF9fbjsKKyAgICBfX3RtcC0+X01fcHJldiA9IF9fcDsKKyAgICBfX3AtPl9NX25leHQgPSBfX3RtcDsKKyAgICBfX24tPl9NX3ByZXYgPSBfX3RtcDsKKyAgICByZXR1cm4gaXRlcmF0b3IoX190bXApOworICB9CisKK3ByaXZhdGU6CisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICB2b2lkIF9NX2luc2VydChpdGVyYXRvciBfX3BvcywgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXNJbnRlZ3JhbDxfSW5wdXRJdGVyYXRvcj46Ol9SZXQgX0ludGVncmFsOworICAgIF9NX2luc2VydF9kaXNwYXRjaChfX3BvcywgX19maXJzdCwgX19sYXN0LCBfSW50ZWdyYWwoKSk7CisgIH0KKworICAvLyBDaGVjayB3aGV0aGVyIGl0J3MgYW4gaW50ZWdyYWwgdHlwZS4gIElmIHNvLCBpdCdzIG5vdCBhbiBpdGVyYXRvci4KKyAgdGVtcGxhdGU8Y2xhc3MgX0ludGVnZXI+CisgIHZvaWQgX01faW5zZXJ0X2Rpc3BhdGNoKGl0ZXJhdG9yIF9fcG9zLCBfSW50ZWdlciBfX24sIF9JbnRlZ2VyIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX190cnVlX3R5cGUmIC8qX0lzSW50ZWdyYWwqLykgeworICAgIF9NX2ZpbGxfaW5zZXJ0KF9fcG9zLCBfX24sIF9feCk7CisgIH0KKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXI+CisgIHZvaWQgX01faW5zZXJ0X2Rpc3BhdGNoKGl0ZXJhdG9yIF9fcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qX0lzSW50ZWdyYWwqLykgeworI2Vsc2UgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworICB2b2lkIF9NX2luc2VydChpdGVyYXRvciBfX3BvcywgY29uc3QgdmFsdWVfdHlwZSogX19maXJzdCwgY29uc3QgdmFsdWVfdHlwZSogX19sYXN0KSB7CisgICAgZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisgICAgICBpbnNlcnQoX19wb3MsICpfX2ZpcnN0KTsKKyAgfQorICB2b2lkIF9NX2luc2VydChpdGVyYXRvciBfX3BvcywgY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KSB7CisjZW5kaWYgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworICAgIC8vV2UgdXNlIGEgdGVtcG9yYXJ5IGxpc3QgdG8gYXZvaWQgdGhlIGF1dG8gcmVmZXJlbmNlIHRyb3VibGVzIChpbmZpbml0ZSBsb29wKQorICAgIGZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorICAgICAgaW5zZXJ0KF9fcG9zLCAqX19maXJzdCk7CisgIH0KKworcHVibGljOgorI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lzSW50ZWdyYWw8X0lucHV0SXRlcmF0b3I+OjpfUmV0IF9JbnRlZ3JhbDsKKyAgICBfTV9zcGxpY2VfaW5zZXJ0X2Rpc3BhdGNoKF9fcG9zLCBfX2ZpcnN0LCBfX2xhc3QsIF9JbnRlZ3JhbCgpKTsKKyAgfQorCitwcml2YXRlOgorICAvLyBDaGVjayB3aGV0aGVyIGl0J3MgYW4gaW50ZWdyYWwgdHlwZS4gIElmIHNvLCBpdCdzIG5vdCBhbiBpdGVyYXRvci4KKyAgdGVtcGxhdGU8Y2xhc3MgX0ludGVnZXI+CisgIHZvaWQgX01fc3BsaWNlX2luc2VydF9kaXNwYXRjaChpdGVyYXRvciBfX3BvcywgX0ludGVnZXIgX19uLCBfSW50ZWdlciBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKl9Jc0ludGVncmFsKi8pIHsKKyAgICBfTV9maWxsX2luc2VydChfX3BvcywgX19uLCBfX3gpOworICB9CisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgorICB2b2lkIF9NX3NwbGljZV9pbnNlcnRfZGlzcGF0Y2goaXRlcmF0b3IgX19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypfSXNJbnRlZ3JhbCovKSB7CisjZWxzZSAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisgIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBjb25zdCB2YWx1ZV90eXBlKiBfX2ZpcnN0LCBjb25zdCB2YWx1ZV90eXBlKiBfX2xhc3QpIHsKKyAgICBfU2VsZiBfX3RtcChfX2ZpcnN0LCBfX2xhc3QsIHRoaXMtPmdldF9hbGxvY2F0b3IoKSk7CisgICAgc3BsaWNlKF9fcG9zLCBfX3RtcCk7CisgIH0KKyAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkgeworI2VuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKyAgICAvL1dlIHVzZSBhIHRlbXBvcmFyeSBsaXN0IHRvIGF2b2lkIHRoZSBhdXRvIHJlZmVyZW5jZSB0cm91YmxlcyAoaW5maW5pdGUgbG9vcCkKKyAgICBfU2VsZiBfX3RtcChfX2ZpcnN0LCBfX2xhc3QsIHRoaXMtPmdldF9hbGxvY2F0b3IoKSk7CisgICAgc3BsaWNlKF9fcG9zLCBfX3RtcCk7CisgIH0KKworcHVibGljOgorICB2b2lkIGluc2VydChpdGVyYXRvciBfX3Bvcywgc2l6ZV90eXBlIF9fbiwgY29uc3RfcmVmZXJlbmNlIF9feCkKKyAgeyBfTV9maWxsX2luc2VydChfX3BvcywgX19uLCBfX3gpOyB9CisKK3ByaXZhdGU6CisgIHZvaWQgX01fZmlsbF9pbnNlcnQoaXRlcmF0b3IgX19wb3MsIHNpemVfdHlwZSBfX24sIGNvbnN0X3JlZmVyZW5jZSBfX3gpIHsKKyAgICBmb3IgKCA7IF9fbiA+IDA7IC0tX19uKQorICAgICAgaW5zZXJ0KF9fcG9zLCBfX3gpOworICB9CisKK3B1YmxpYzoKKyAgdm9pZCBwdXNoX2Zyb250KGNvbnN0X3JlZmVyZW5jZSBfX3gpIHsgaW5zZXJ0KGJlZ2luKCksIF9feCk7IH0KKyAgdm9pZCBwdXNoX2JhY2sgKGNvbnN0X3JlZmVyZW5jZSBfX3gpIHsgaW5zZXJ0KGVuZCgpLCBfX3gpOyB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fQU5BQ0hST05JU01TKQorICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3IgX19wb3MpCisgIHsgcmV0dXJuIGluc2VydChfX3BvcywgX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRCh2YWx1ZV90eXBlKSk7IH0KKyAgdm9pZCBwdXNoX2Zyb250KCkge2luc2VydChiZWdpbigpKTt9CisgIHZvaWQgcHVzaF9iYWNrKCkge2luc2VydChlbmQoKSk7fQorIyBlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0gJiYgIV9TVExQX05PX0FOQUNIUk9OSVNNUyovCisKKyAgaXRlcmF0b3IgZXJhc2UoaXRlcmF0b3IgX19wb3MpIHsKKyAgICBfTm9kZV9iYXNlKiBfX25leHRfbm9kZSA9IF9fcG9zLl9NX25vZGUtPl9NX25leHQ7CisgICAgX05vZGVfYmFzZSogX19wcmV2X25vZGUgPSBfX3Bvcy5fTV9ub2RlLT5fTV9wcmV2OworICAgIF9Ob2RlKiBfX24gPSBfX1NUQVRJQ19DQVNUKF9Ob2RlKiwgX19wb3MuX01fbm9kZSk7CisgICAgX19wcmV2X25vZGUtPl9NX25leHQgPSBfX25leHRfbm9kZTsKKyAgICBfX25leHRfbm9kZS0+X01fcHJldiA9IF9fcHJldl9ub2RlOworICAgIF9TVExQX1NURDo6X0Rlc3Ryb3koJl9fbi0+X01fZGF0YSk7CisgICAgdGhpcy0+X01fbm9kZS5kZWFsbG9jYXRlKF9fbiwgMSk7CisgICAgcmV0dXJuIGl0ZXJhdG9yKF9fbmV4dF9ub2RlKTsKKyAgfQorCisgIGl0ZXJhdG9yIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkgeworICAgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkKKyAgICAgIGVyYXNlKF9fZmlyc3QrKyk7CisgICAgcmV0dXJuIF9fbGFzdDsKKyAgfQorCisjaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCisgIHZvaWQgcmVzaXplKHNpemVfdHlwZSBfX25ld19zaXplLCBjb25zdF9yZWZlcmVuY2UgX194ID0gdmFsdWVfdHlwZSgpKTsKKyNlbHNlCisgIHZvaWQgcmVzaXplKHNpemVfdHlwZSBfX25ld19zaXplLCBjb25zdF9yZWZlcmVuY2UgX194KTsKKyAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9fbmV3X3NpemUpCisgIHsgdGhpcy0+cmVzaXplKF9fbmV3X3NpemUsIF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQodmFsdWVfdHlwZSkpOyB9CisjZW5kaWYgLyohX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCisKKyAgdm9pZCBwb3BfZnJvbnQoKSB7IGVyYXNlKGJlZ2luKCkpOyB9CisgIHZvaWQgcG9wX2JhY2soKSB7CisgICAgaXRlcmF0b3IgX190bXAgPSBlbmQoKTsKKyAgICBlcmFzZSgtLV9fdG1wKTsKKyAgfQorCitwdWJsaWM6CisgIC8vIGFzc2lnbigpLCBhIGdlbmVyYWxpemVkIGFzc2lnbm1lbnQgbWVtYmVyIGZ1bmN0aW9uLiAgVHdvCisgIC8vIHZlcnNpb25zOiBvbmUgdGhhdCB0YWtlcyBhIGNvdW50LCBhbmQgb25lIHRoYXQgdGFrZXMgYSByYW5nZS4KKyAgLy8gVGhlIHJhbmdlIHZlcnNpb24gaXMgYSBtZW1iZXIgdGVtcGxhdGUsIHNvIHdlIGRpc3BhdGNoIG9uIHdoZXRoZXIKKyAgLy8gb3Igbm90IHRoZSB0eXBlIGlzIGFuIGludGVnZXIuCisKKyAgdm9pZCBhc3NpZ24oc2l6ZV90eXBlIF9fbiwgY29uc3RfcmVmZXJlbmNlIF9fdmFsKSB7IF9NX2ZpbGxfYXNzaWduKF9fbiwgX192YWwpOyB9CisKKyAgdm9pZCBfTV9maWxsX2Fzc2lnbihzaXplX3R5cGUgX19uLCBjb25zdF9yZWZlcmVuY2UgX192YWwpOworCisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICB2b2lkIGFzc2lnbihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Jc0ludGVncmFsPF9JbnB1dEl0ZXJhdG9yPjo6X1JldCBfSW50ZWdyYWw7CisgICAgX01fYXNzaWduX2Rpc3BhdGNoKF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnRlZ2VyPgorICB2b2lkIF9NX2Fzc2lnbl9kaXNwYXRjaChfSW50ZWdlciBfX24sIF9JbnRlZ2VyIF9fdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX3RydWVfdHlwZSYgLypfSXNJbnRlZ3JhbCovKSB7CisgICAgX01fZmlsbF9hc3NpZ24oX19uLCBfX3ZhbCk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZvaWQgX01fYXNzaWduX2Rpc3BhdGNoKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QyLCBfSW5wdXRJdGVyYXRvciBfX2xhc3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qX0lzSW50ZWdyYWwqLykgeworI2Vsc2UKKyAgdm9pZCBhc3NpZ24oY29uc3QgdmFsdWVfdHlwZSAqX19maXJzdDIsIGNvbnN0IHZhbHVlX3R5cGUgKl9fbGFzdDIpIHsKKyAgICBpdGVyYXRvciBfX2ZpcnN0MSA9IGJlZ2luKCk7CisgICAgaXRlcmF0b3IgX19sYXN0MSA9IGVuZCgpOworICAgIGZvciAoIDsgX19maXJzdDEgIT0gX19sYXN0MSAmJiBfX2ZpcnN0MiAhPSBfX2xhc3QyOyArK19fZmlyc3QxLCArK19fZmlyc3QyKQorICAgICAgKl9fZmlyc3QxID0gKl9fZmlyc3QyOworICAgIGlmIChfX2ZpcnN0MiA9PSBfX2xhc3QyKQorICAgICAgZXJhc2UoX19maXJzdDEsIF9fbGFzdDEpOworICAgIGVsc2UKKyAgICAgIGluc2VydChfX2xhc3QxLCBfX2ZpcnN0MiwgX19sYXN0Mik7CisgIH0KKyAgdm9pZCBhc3NpZ24oY29uc3RfaXRlcmF0b3IgX19maXJzdDIsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdDIpIHsKKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisgICAgaXRlcmF0b3IgX19maXJzdDEgPSBiZWdpbigpOworICAgIGl0ZXJhdG9yIF9fbGFzdDEgPSBlbmQoKTsKKyAgICBmb3IgKCA7IF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19maXJzdDIgIT0gX19sYXN0MjsgKytfX2ZpcnN0MSwgKytfX2ZpcnN0MikKKyAgICAgICpfX2ZpcnN0MSA9ICpfX2ZpcnN0MjsKKyAgICBpZiAoX19maXJzdDIgPT0gX19sYXN0MikKKyAgICAgIGVyYXNlKF9fZmlyc3QxLCBfX2xhc3QxKTsKKyAgICBlbHNlCisgICAgICBpbnNlcnQoX19sYXN0MSwgX19maXJzdDIsIF9fbGFzdDIpOworICB9CisKK3B1YmxpYzoKKyAgdm9pZCBzcGxpY2UoaXRlcmF0b3IgX19wb3MsIF9TZWxmJiBfX3gpIHsKKyAgICBpZiAoIV9feC5lbXB0eSgpKSB7CisgICAgICBpZiAodGhpcy0+Z2V0X2FsbG9jYXRvcigpID09IF9feC5nZXRfYWxsb2NhdG9yKCkpIHsKKyAgICAgICAgX1NUTFBfUFJJViBfTGlzdF9nbG9iYWxfaW5zdDo6X1RyYW5zZmVyKF9fcG9zLl9NX25vZGUsIF9feC5iZWdpbigpLl9NX25vZGUsIF9feC5lbmQoKS5fTV9ub2RlKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBpbnNlcnQoX19wb3MsIF9feC5iZWdpbigpLCBfX3guZW5kKCkpOworICAgICAgICBfX3guY2xlYXIoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgdm9pZCBzcGxpY2UoaXRlcmF0b3IgX19wb3MsIF9TZWxmJiBfX3gsIGl0ZXJhdG9yIF9faSkgeworICAgIGl0ZXJhdG9yIF9faiA9IF9faTsKKyAgICArK19fajsKKyAgICBpZiAoX19wb3MgPT0gX19pIHx8IF9fcG9zID09IF9faikgcmV0dXJuOworICAgIGlmICh0aGlzLT5nZXRfYWxsb2NhdG9yKCkgPT0gX194LmdldF9hbGxvY2F0b3IoKSkgeworICAgICAgX1NUTFBfUFJJViBfTGlzdF9nbG9iYWxfaW5zdDo6X1RyYW5zZmVyKF9fcG9zLl9NX25vZGUsIF9faS5fTV9ub2RlLCBfX2ouX01fbm9kZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgaW5zZXJ0KF9fcG9zLCAqX19pKTsKKyAgICAgIF9feC5lcmFzZShfX2kpOworICAgIH0KKyAgfQorICB2b2lkIHNwbGljZShpdGVyYXRvciBfX3BvcywgX1NlbGYmIF9feCwgaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KSB7CisgICAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KSB7CisgICAgICBpZiAodGhpcy0+Z2V0X2FsbG9jYXRvcigpID09IF9feC5nZXRfYWxsb2NhdG9yKCkpIHsKKyAgICAgICAgX1NUTFBfUFJJViBfTGlzdF9nbG9iYWxfaW5zdDo6X1RyYW5zZmVyKF9fcG9zLl9NX25vZGUsIF9fZmlyc3QuX01fbm9kZSwgX19sYXN0Ll9NX25vZGUpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGluc2VydChfX3BvcywgX19maXJzdCwgX19sYXN0KTsKKyAgICAgICAgX194LmVyYXNlKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgdm9pZCByZW1vdmUoY29uc3RfcmVmZXJlbmNlIF9fdmFsKSB7CisgICAgaXRlcmF0b3IgX19maXJzdCA9IGJlZ2luKCk7CisgICAgaXRlcmF0b3IgX19sYXN0ID0gZW5kKCk7CisgICAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0KSB7CisgICAgICBpdGVyYXRvciBfX25leHQgPSBfX2ZpcnN0OworICAgICAgKytfX25leHQ7CisgICAgICBpZiAoX192YWwgPT0gKl9fZmlyc3QpIGVyYXNlKF9fZmlyc3QpOworICAgICAgX19maXJzdCA9IF9fbmV4dDsKKyAgICB9CisgIH0KKworICB2b2lkIHVuaXF1ZSgpCisgIHsgX1NUTFBfUFJJViBfU191bmlxdWUoKnRoaXMsIGVxdWFsX3RvPHZhbHVlX3R5cGU+KCkpOyB9CisKKyAgdm9pZCBtZXJnZShfU2VsZiYgX194KQorICB7IF9TVExQX1BSSVYgX1NfbWVyZ2UoKnRoaXMsIF9feCwgbGVzczx2YWx1ZV90eXBlPigpKTsgfQorCisgIHZvaWQgcmV2ZXJzZSgpIHsKKyAgICBfTm9kZV9iYXNlKiBfX3AgPSAmdGhpcy0+X01fbm9kZS5fTV9kYXRhOworICAgIF9Ob2RlX2Jhc2UqIF9fdG1wID0gX19wOworICAgIGRvIHsKKyAgICAgIF9TVExQX1NURDo6c3dhcChfX3RtcC0+X01fbmV4dCwgX190bXAtPl9NX3ByZXYpOworICAgICAgX190bXAgPSBfX3RtcC0+X01fcHJldjsgICAgIC8vIE9sZCBuZXh0IG5vZGUgaXMgbm93IHByZXYuCisgICAgfSB3aGlsZSAoX190bXAgIT0gX19wKTsKKyAgfQorCisgIHZvaWQgc29ydCgpCisgIHsgX1NUTFBfUFJJViBfU19zb3J0KCp0aGlzLCBsZXNzPHZhbHVlX3R5cGU+KCkpOyB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX1ByZWRpY2F0ZT4KKyAgdm9pZCByZW1vdmVfaWYoX1ByZWRpY2F0ZSBfX3ByZWQpCisgIHsgX1NUTFBfUFJJViBfU19yZW1vdmVfaWYoKnRoaXMsIF9fcHJlZCk7IH0KKyAgdGVtcGxhdGUgPGNsYXNzIF9CaW5hcnlQcmVkaWNhdGU+CisgIHZvaWQgdW5pcXVlKF9CaW5hcnlQcmVkaWNhdGUgX19iaW5hcnlfcHJlZCkKKyAgeyBfU1RMUF9QUklWIF9TX3VuaXF1ZSgqdGhpcywgX19iaW5hcnlfcHJlZCk7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1N0cmljdFdlYWtPcmRlcmluZz4KKyAgdm9pZCBtZXJnZShfU2VsZiYgX194LAorICAgICAgICAgICAgIF9TdHJpY3RXZWFrT3JkZXJpbmcgX19jb21wKSB7CisgICAgX1NUTFBfUFJJViBfU19tZXJnZSgqdGhpcywgX194LCBfX2NvbXApOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9TdHJpY3RXZWFrT3JkZXJpbmc+CisgIHZvaWQgc29ydChfU3RyaWN0V2Vha09yZGVyaW5nIF9fY29tcCkKKyAgeyBfU1RMUF9QUklWIF9TX3NvcnQoKnRoaXMsIF9fY29tcCk7IH0KKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCit9OworCisjaWYgZGVmaW5lZCAobGlzdCkKKyMgIHVuZGVmIGxpc3QKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorI2VuZGlmCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2lmICFkZWZpbmVkIChfU1RMUF9MSU5LX1RJTUVfSU5TVEFOVElBVElPTikKKyMgIGluY2x1ZGUgPHN0bC9fbGlzdC5jPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUFRSX1NQRUNJQUxJWkFUSU9OUykKKyMgIGluY2x1ZGUgPHN0bC9wb2ludGVycy9fbGlzdC5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9ERUJVRykKKyMgIGluY2x1ZGUgPHN0bC9kZWJ1Zy9fbGlzdC5oPgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CitfU1RMUF9JTkxJTkVfTE9PUCBib29sICBfU1RMUF9DQUxMCitvcGVyYXRvcj09KGNvbnN0IGxpc3Q8X1RwLF9BbGxvYz4mIF9feCwgY29uc3QgbGlzdDxfVHAsX0FsbG9jPiYgX195KSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgbGlzdDxfVHAsX0FsbG9jPjo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7CisgIGNvbnN0X2l0ZXJhdG9yIF9fZW5kMSA9IF9feC5lbmQoKTsKKyAgY29uc3RfaXRlcmF0b3IgX19lbmQyID0gX195LmVuZCgpOworCisgIGNvbnN0X2l0ZXJhdG9yIF9faTEgPSBfX3guYmVnaW4oKTsKKyAgY29uc3RfaXRlcmF0b3IgX19pMiA9IF9feS5iZWdpbigpOworICB3aGlsZSAoX19pMSAhPSBfX2VuZDEgJiYgX19pMiAhPSBfX2VuZDIgJiYgKl9faTEgPT0gKl9faTIpIHsKKyAgICArK19faTE7CisgICAgKytfX2kyOworICB9CisgIHJldHVybiBfX2kxID09IF9fZW5kMSAmJiBfX2kyID09IF9fZW5kMjsKK30KKworI2RlZmluZSBfU1RMUF9FUVVBTF9PUEVSQVRPUl9TUEVDSUFMSVpFRAorI2RlZmluZSBfU1RMUF9URU1QTEFURV9IRUFERVIgICAgdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgorI2RlZmluZSBfU1RMUF9URU1QTEFURV9DT05UQUlORVIgbGlzdDxfVHAsIF9BbGxvYz4KKyNpbmNsdWRlIDxzdGwvX3JlbG9wc19jb250Lmg+CisjdW5kZWYgX1NUTFBfVEVNUExBVEVfQ09OVEFJTkVSCisjdW5kZWYgX1NUTFBfVEVNUExBVEVfSEVBREVSCisjdW5kZWYgX1NUTFBfRVFVQUxfT1BFUkFUT1JfU1BFQ0lBTElaRUQKKworI2lmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CitzdHJ1Y3QgX19tb3ZlX3RyYWl0czxsaXN0PF9UcCwgX0FsbG9jPiA+IHsKKyAgdHlwZWRlZiBfX3N0bHBfbW92YWJsZSBpbXBsZW1lbnRlZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX21vdmVfdHJhaXRzPF9BbGxvYz46OmNvbXBsZXRlIGNvbXBsZXRlOworfTsKKyNlbmRpZiAvKiBfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OICovCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2VuZGlmIC8qIF9TVExQX0lOVEVSTkFMX0xJU1RfSU1QTF9IICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvX2xvY2FsZS5oIGIvc3RsL19sb2NhbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTRmYTQzCi0tLSAvZGV2L251bGwKKysrIGIvc3RsL19sb2NhbGUuaApAQCAtMCwwICsxLDMyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKy8vIFdBUk5JTkc6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIEMrKworLy8gc3RhbmRhcmQgbGlicmFyeSBoZWFkZXJzLiAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgdGhpcyBoZWFkZXIKKy8vIGZpbGUgZGlyZWN0bHkuCisKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9MT0NBTEVfSAorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9MT0NBTEVfSAorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NTVERMSUIKKyMgIGluY2x1ZGUgPHN0bC9fY3N0ZGxpYi5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1dDSEFSCisjICBpbmNsdWRlIDxzdGwvX2N3Y2hhci5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfVEhSRUFEU19ICisjICBpbmNsdWRlIDxzdGwvX3RocmVhZHMuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX1NUUklOR19GV0RfSAorIyAgaW5jbHVkZSA8c3RsL19zdHJpbmdfZndkLmg+CisjZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKK2NsYXNzIF9Mb2NhbGVfaW1wbDsgICAgICAgIC8vIEZvcndhcmQgZGVjbGFyYXRpb24gb2Ygb3BhcXVlIHR5cGUuCitjbGFzcyBpb3NfYmFzZTsKK2NsYXNzIGxvY2FsZTsKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorYm9vbCBfX2xvY2FsZV9kb19vcGVyYXRvcl9jYWxsIChjb25zdCBsb2NhbGUmIF9fbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9feSk7CisKK19TVExQX0RFQ0xTUEVDIF9Mb2NhbGVfaW1wbCAqIF9TVExQX0NBTEwgX2dldF9Mb2NhbGVfaW1wbCggX0xvY2FsZV9pbXBsICpsb2NpbXBsICk7CitfU1RMUF9ERUNMU1BFQyBfTG9jYWxlX2ltcGwgKiBfU1RMUF9DQUxMIF9jb3B5X05hbWVsZXNzX0xvY2FsZV9pbXBsKCBfTG9jYWxlX2ltcGwgKmxvY2ltcGwgKTsKKwordGVtcGxhdGUgPGNsYXNzIF9GYWNldD4KK2Jvb2wgX0hhc0ZhY2V0KGNvbnN0IGxvY2FsZSYgX19sb2MsIGNvbnN0IF9GYWNldCogX19mYWNldCkgX1NUTFBfTk9USFJPVzsKKwordGVtcGxhdGUgPGNsYXNzIF9GYWNldD4KK19GYWNldCogX1VzZUZhY2V0KGNvbnN0IGxvY2FsZSYgX19sb2MsIGNvbnN0IF9GYWNldCogX19mYWNldCk7CisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfTVNWQzZfTUVNX1RfQlVHX1dPUktBUk9VTkQpCisjICBkZWZpbmUgbG9jYWxlIF9TVExQX05PX01FTV9UX05BTUUobG9jKQorI2VuZGlmCisKK2NsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIGxvY2FsZSB7CitwdWJsaWM6CisgIC8vIHR5cGVzOgorICBjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBmYWNldCA6IHByb3RlY3RlZCBfUmVmY291bnRfQmFzZSB7CisgIHByb3RlY3RlZDoKKyAgICAvKiBIZXJlIHdlIGZpbHRlciBfX2luaXRfY291bnQgdXNlciB2YWx1ZSB0byAwIG9yIDEgYmVjYXVzZSBfX2luaXRfY291bnQgaXMgYQorICAgICAqIHNpemVfdCBpbnN0YW5jZSBhbmQgX1JlZmNvdW50X0Jhc2UgdXNlIF9fc3RsX2F0b21pY190IGluc3RhbmNlcyB0aGF0IG1pZ2h0CisgICAgICogaGF2ZSBsb3dlciBzaXplb2YgYW5kIGdlbmVyYXRlIHJvbGwgaXNzdWVzLiAxIGlzIGVub3VnaCB0byBrZWVwIHRoZSBmYWNldAorICAgICAqIGFsaXZlIHdoZW4gcmVxdWlyZWQuCisgICAgICovCisgICAgZXhwbGljaXQgZmFjZXQoc2l6ZV90IF9faW5pdF9jb3VudCA9IDApIDogX1JlZmNvdW50X0Jhc2UoIF9faW5pdF9jb3VudCA9PSAwID8gMCA6IDEgKSB7fQorICAgIHZpcnR1YWwgfmZhY2V0KCk7CisgICAgZnJpZW5kIGNsYXNzIGxvY2FsZTsKKyAgICBmcmllbmQgY2xhc3MgX0xvY2FsZV9pbXBsOworICAgIGZyaWVuZCBmYWNldCAqIF9TVExQX0NBTEwgX2dldF9mYWNldCggZmFjZXQgKiApOworICAgIGZyaWVuZCB2b2lkIF9TVExQX0NBTEwgX3JlbGVhc2VfZmFjZXQoIGZhY2V0IComICk7CisKKyAgcHJpdmF0ZTogICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnZhbGlkYXRlIGFzc2lnbm1lbnQgYW5kIGNvcHlpbmcuCisgICAgZmFjZXQoY29uc3QgZmFjZXQmICkgLyogOiBfUmVmY291bnRfQmFzZSgxKSB7fSAqLzsKKyAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBmYWNldCYpOworICB9OworCisjaWYgZGVmaW5lZCAoX19NVlNfXykgfHwgZGVmaW5lZCAoX19PUzQwMF9fKQorICBzdHJ1Y3QKKyNlbHNlCisgIGNsYXNzCisjZW5kaWYKKyAgX1NUTFBfQ0xBU1NfREVDTFNQRUMgaWQgeworICAgIGZyaWVuZCBjbGFzcyBsb2NhbGU7CisgICAgZnJpZW5kIGNsYXNzIF9Mb2NhbGVfaW1wbDsKKyAgcHVibGljOgorICAgIHNpemVfdCBfTV9pbmRleDsKKyAgICBzdGF0aWMgc2l6ZV90IF9TX21heDsKKyAgfTsKKworICB0eXBlZGVmIGludCBjYXRlZ29yeTsKKyNpZiBkZWZpbmVkIChfU1RMUF9TVEFUSUNfQ09OU1RfSU5JVF9CVUcpCisgIGVudW0gX0NhdGVnb3J5IHsKKyNlbHNlCisgIHN0YXRpYyBjb25zdCBjYXRlZ29yeQorI2VuZGlmCisgICAgbm9uZSAgICAgID0gMHgwMDAsCisgICAgY29sbGF0ZSAgID0gMHgwMTAsCisgICAgY3R5cGUgICAgID0gMHgwMjAsCisgICAgbW9uZXRhcnkgID0gMHgwNDAsCisgICAgbnVtZXJpYyAgID0gMHgxMDAsCisgICAgdGltZSAgICAgID0gMHgyMDAsCisgICAgbWVzc2FnZXMgID0gMHg0MDAsCisgICAgYWxsICAgICAgID0gY29sbGF0ZSB8IGN0eXBlIHwgbW9uZXRhcnkgfCBudW1lcmljIHwgdGltZSB8IG1lc3NhZ2VzCisjaWYgZGVmaW5lZCAoX1NUTFBfU1RBVElDX0NPTlNUX0lOSVRfQlVHKQorICB9CisjZW5kaWYKKyAgOworCisgIC8vIGNvbnN0cnVjdC9jb3B5L2Rlc3Ryb3k6CisgIGxvY2FsZSgpIF9TVExQX05PVEhST1c7CisgIGxvY2FsZShjb25zdCBsb2NhbGUmKSBfU1RMUF9OT1RIUk9XOworICBleHBsaWNpdCBsb2NhbGUoY29uc3QgY2hhciAqKTsKKyAgbG9jYWxlKGNvbnN0IGxvY2FsZSYsIGNvbnN0IGNoYXIqLCBjYXRlZ29yeSk7CisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKSAmJiAhZGVmaW5lZCAoX1NUTFBfVVNFX01TVkM2X01FTV9UX0JVR19XT1JLQVJPVU5EKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZhY2V0PgorICBsb2NhbGUoY29uc3QgbG9jYWxlJiBfX2xvYywgX0ZhY2V0KiBfX2YpIHsKKyAgICBpZiAoIF9fZiAhPSAwICkgeworICAgICAgdGhpcy0+X01faW1wbCA9IF9nZXRfTG9jYWxlX2ltcGwoIF9jb3B5X05hbWVsZXNzX0xvY2FsZV9pbXBsKCBfX2xvYy5fTV9pbXBsICkgKTsKKyAgICAgIHRoaXMtPl9NX2luc2VydChfX2YsIF9GYWNldDo6aWQpOworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLT5fTV9pbXBsID0gX2dldF9Mb2NhbGVfaW1wbCggX19sb2MuX01faW1wbCApOworICAgIH0KKyAgfQorI2VuZGlmIC8vIF9TVExQX01FTUJFUl9URU1QTEFURVMKKworcHJvdGVjdGVkOgorICAvLyB0aG9zZSBhcmUgZm9yIGludGVybmFsIHVzZQorICBsb2NhbGUoX0xvY2FsZV9pbXBsKik7CisKK3B1YmxpYzoKKworICBsb2NhbGUoY29uc3QgbG9jYWxlJiwgY29uc3QgbG9jYWxlJiwgY2F0ZWdvcnkpOworICBjb25zdCBsb2NhbGUmIG9wZXJhdG9yPShjb25zdCBsb2NhbGUmKSBfU1RMUF9OT1RIUk9XOworCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX01TVkM2X01FTV9UX0JVR19XT1JLQVJPVU5EKQorICB2aXJ0dWFsCisjZW5kaWYKKyAgIH5sb2NhbGUoKSBfU1RMUF9OT1RIUk9XOworCisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykgJiYgIWRlZmluZWQgKF9TVExQX05PX0VYUExJQ0lUX0ZVTkNUSU9OX1RNUExfQVJHUykgJiYgXAorICAgIWRlZmluZWQoX1NUTFBfVVNFX01TVkM2X01FTV9UX0JVR19XT1JLQVJPVU5EKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZhY2V0PgorICBsb2NhbGUgY29tYmluZShjb25zdCBsb2NhbGUmIF9fbG9jKSBjb25zdCB7CisgICAgX0ZhY2V0ICpfX2ZhY2V0ID0gMDsKKyAgICBpZiAoIV9IYXNGYWNldChfX2xvYywgX19mYWNldCkpCisgICAgICBfTV90aHJvd19ydW50aW1lX2Vycm9yKCk7CisKKyAgICByZXR1cm4gbG9jYWxlKCp0aGlzLCBfVXNlRmFjZXQoX19sb2MsIF9fZmFjZXQpKTsKKyAgfQorI2VuZGlmIC8vIF9TVExQX01FTUJFUl9URU1QTEFURVMgJiYgIV9TVExQX05PX0VYUExJQ0lUX0ZVTkNUSU9OX1RNUExfQVJHUworCisgIC8vIGxvY2FsZSBvcGVyYXRpb25zOgorICBzdHJpbmcgbmFtZSgpIGNvbnN0OworCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBsb2NhbGUmKSBjb25zdDsKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGxvY2FsZSYpIGNvbnN0OworCisjaWYgIWRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpIHx8IGRlZmluZWQgKF9TVExQX0lOTElORV9NRU1CRVJfVEVNUExBVEVTKSB8fCAoZGVmaW5lZChfX01XRVJLU19fKSAmJiBfX01XRVJLU19fIDw9IDB4MjMwMSkKKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IHN0cmluZyYgX194LCBjb25zdCBzdHJpbmcmIF9feSkgY29uc3Q7CisjICBpZm5kZWYgX1NUTFBfTk9fV0NIQVJfVAorICBib29sIG9wZXJhdG9yKCkoY29uc3Qgd3N0cmluZyYgX194LCBjb25zdCB3c3RyaW5nJiBfX3kpIGNvbnN0OworIyAgZW5kaWYKKyNlbGlmICFkZWZpbmVkIChfU1RMUF9VU0VfTVNWQzZfTUVNX1RfQlVHX1dPUktBUk9VTkQpCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9feCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9feSkgY29uc3QKKyAgeyByZXR1cm4gX19sb2NhbGVfZG9fb3BlcmF0b3JfY2FsbCgqdGhpcywgX194LCBfX3kpOyB9CisjZW5kaWYKKworICAvLyBnbG9iYWwgbG9jYWxlIG9iamVjdHM6CisgIHN0YXRpYyBsb2NhbGUgX1NUTFBfQ0FMTCBnbG9iYWwoY29uc3QgbG9jYWxlJik7CisgIHN0YXRpYyBjb25zdCBsb2NhbGUmIF9TVExQX0NBTEwgY2xhc3NpYygpOworCisvL3Byb3RlY3RlZDogICAgICAgICAgICAgICAgICAgICAgICAgLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgbG9jYWxlIGdsb2JhbHMuCisgIGZhY2V0KiBfTV9nZXRfZmFjZXQoY29uc3QgaWQmKSBjb25zdDsKKyAgLy8gc2FtZSwgYnV0IHRocm93cworICBmYWNldCogX01fdXNlX2ZhY2V0KGNvbnN0IGlkJikgY29uc3Q7CisgIHN0YXRpYyB2b2lkIF9TVExQX0ZVTkNUSU9OX1RIUk9XUyBfU1RMUF9DQUxMIF9NX3Rocm93X3J1bnRpbWVfZXJyb3IoY29uc3QgY2hhciogPSAwKTsKKworcHJvdGVjdGVkOiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1vcmUgaGVscGVyIGZ1bmN0aW9ucy4KKyAgdm9pZCBfTV9pbnNlcnQoZmFjZXQqIF9fZiwgaWQmIF9faWQpOworCisgIC8vIGZyaWVuZHM6CisgIGZyaWVuZCBjbGFzcyBfTG9jYWxlX2ltcGw7CisgIGZyaWVuZCBjbGFzcyBpb3NfYmFzZTsKKworcHJvdGVjdGVkOiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERhdGEgbWVtYmVycworICBfTG9jYWxlX2ltcGwqIF9NX2ltcGw7CisgIF9Mb2NhbGVfaW1wbCogX01fZ2V0X2ltcGwoKSBjb25zdCB7IHJldHVybiBfTV9pbXBsOyB9Cit9OworCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX01TVkM2X01FTV9UX0JVR19XT1JLQVJPVU5EKQorIyAgdW5kZWYgbG9jYWxlCisjICBkZWZpbmUgX0xvY2FsZSBfU1RMUF9OT19NRU1fVF9OQU1FKGxvYykKKworY2xhc3MgbG9jYWxlIDogcHVibGljIF9Mb2NhbGUgeworcHVibGljOgorCisgIC8vIGNvbnN0cnVjdC9jb3B5L2Rlc3Ryb3k6CisgIGxvY2FsZSgpIF9TVExQX05PVEhST1cge30KKyAgbG9jYWxlKGNvbnN0IGxvY2FsZSYgX19sb2MpIF9TVExQX05PVEhST1cgOiBfTG9jYWxlKF9fbG9jKSB7fQorICBleHBsaWNpdCBsb2NhbGUoY29uc3QgY2hhciAqX19zdHIpIDogX0xvY2FsZShfX3N0cikge30KKyAgbG9jYWxlKGNvbnN0IGxvY2FsZSYgX19sb2MsIGNvbnN0IGNoYXIqIF9fc3RyLCBjYXRlZ29yeSBfX2NhdCkKKyAgICA6IF9Mb2NhbGUoX19sb2MsIF9fc3RyLCBfX2NhdCkge30KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZhY2V0PgorICBsb2NhbGUoY29uc3QgbG9jYWxlJiBfX2xvYywgX0ZhY2V0KiBfX2YpIHsKKyAgICBpZiAoIF9fZiAhPSAwICkgeworICAgICAgdGhpcy0+X01faW1wbCA9IF9nZXRfTG9jYWxlX2ltcGwoIF9jb3B5X05hbWVsZXNzX0xvY2FsZV9pbXBsKCBfX2xvYy5fTV9pbXBsICkgKTsKKyAgICAgIHRoaXMtPl9NX2luc2VydChfX2YsIF9GYWNldDo6aWQpOworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLT5fTV9pbXBsID0gX2dldF9Mb2NhbGVfaW1wbCggX19sb2MuX01faW1wbCApOworICAgIH0KKyAgfQorCitwcml2YXRlOgorICAvLyB0aG9zZSBhcmUgZm9yIGludGVybmFsIHVzZQorICBsb2NhbGUoX0xvY2FsZV9pbXBsKiBfX2ltcGwpIDogX0xvY2FsZShfX2ltcGwpIHt9CisgIGxvY2FsZShjb25zdCBfTG9jYWxlJiBfX2xvYykgOiBfTG9jYWxlKF9fbG9jKSB7fQorCitwdWJsaWM6CisKKyAgbG9jYWxlKGNvbnN0IGxvY2FsZSYgX19sb2MxLCBjb25zdCBsb2NhbGUmIF9fbG9jMiwgY2F0ZWdvcnkgX19jYXQpCisgICAgOiBfTG9jYWxlKF9fbG9jMSwgX19sb2MyLCBfX2NhdCkge30KKworICBjb25zdCBsb2NhbGUmIG9wZXJhdG9yPShjb25zdCBsb2NhbGUmIF9fbG9jKSBfU1RMUF9OT1RIUk9XIHsKKyAgICBfTG9jYWxlOjpvcGVyYXRvcj0oX19sb2MpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfRmFjZXQ+CisgIGxvY2FsZSBjb21iaW5lKGNvbnN0IGxvY2FsZSYgX19sb2MpIGNvbnN0IHsKKyAgICBfRmFjZXQgKl9fZmFjZXQgPSAwOworICAgIGlmICghX0hhc0ZhY2V0KF9fbG9jLCBfX2ZhY2V0KSkKKyAgICAgIF9NX3Rocm93X3J1bnRpbWVfZXJyb3IoKTsKKworICAgIHJldHVybiBsb2NhbGUoKnRoaXMsIF9Vc2VGYWNldChfX2xvYywgX19mYWNldCkpOworICB9CisKKyAgLy8gbG9jYWxlIG9wZXJhdGlvbnM6CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBsb2NhbGUmIF9fbG9jKSBjb25zdCB7IHJldHVybiBfTG9jYWxlOjpvcGVyYXRvcj09KF9fbG9jKTsgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3QgbG9jYWxlJiBfX2xvYykgY29uc3QgeyByZXR1cm4gX0xvY2FsZTo6b3BlcmF0b3IhPShfX2xvYyk7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX3gsCisgICAgICAgICAgICAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX3kpIGNvbnN0CisgIHsgcmV0dXJuIF9fbG9jYWxlX2RvX29wZXJhdG9yX2NhbGwoKnRoaXMsIF9feCwgX195KTsgfQorCisgIC8vIGdsb2JhbCBsb2NhbGUgb2JqZWN0czoKKyAgc3RhdGljIGxvY2FsZSBfU1RMUF9DQUxMIGdsb2JhbChjb25zdCBsb2NhbGUmIF9fbG9jKSB7CisgICAgcmV0dXJuIF9Mb2NhbGU6Omdsb2JhbChfX2xvYyk7CisgIH0KKyAgc3RhdGljIGNvbnN0IGxvY2FsZSYgX1NUTFBfQ0FMTCBjbGFzc2ljKCkgeworICAgIHJldHVybiBfX1NUQVRJQ19DQVNUKGNvbnN0IGxvY2FsZSYsIF9Mb2NhbGU6OmNsYXNzaWMoKSk7CisgIH0KKworICAvLyBmcmllbmRzOgorICBmcmllbmQgY2xhc3MgX0xvY2FsZV9pbXBsOworICBmcmllbmQgY2xhc3MgaW9zX2Jhc2U7Cit9OworCisjZW5kaWYgLyogX1NUTFBfVVNFX01TVkM2X01FTV9UX0JVR19XT1JLQVJPVU5EICovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWxlIGdsb2JhbHMKKworI2lmZGVmIF9TVExQX05PX0VYUExJQ0lUX0ZVTkNUSU9OX1RNUExfQVJHUwordGVtcGxhdGUgPGNsYXNzIF9GYWNldD4KK2lubGluZSBjb25zdCBfRmFjZXQmCitfVXNlX2ZhY2V0PF9GYWNldD46Om9wZXJhdG9yICooKSBjb25zdAorI2Vsc2UKK3RlbXBsYXRlIDxjbGFzcyBfRmFjZXQ+IGlubGluZSBjb25zdCBfRmFjZXQmIHVzZV9mYWNldChjb25zdCBsb2NhbGUmIF9fbG9jKQorI2VuZGlmCit7CisgIF9GYWNldCAqX19mYWNldCA9IDA7CisgIHJldHVybiAqX1VzZUZhY2V0KF9fbG9jLCBfX2ZhY2V0KTsKK30KKworCisjaWZkZWYgX1NUTFBfTk9fRVhQTElDSVRfRlVOQ1RJT05fVE1QTF9BUkdTCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZhY2V0Pgorc3RydWN0IGhhc19mYWNldCB7CisgIGNvbnN0IGxvY2FsZSYgX19sb2M7CisgIGhhc19mYWNldChjb25zdCBsb2NhbGUmIF9fcF9sb2MpIDogX19sb2MoX19wX2xvYykge30KKyAgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IF9TVExQX05PVEhST1cKKyNlbHNlCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZhY2V0PiBpbmxpbmUgYm9vbCBoYXNfZmFjZXQoY29uc3QgbG9jYWxlJiBfX2xvYykgX1NUTFBfTk9USFJPVworI2VuZGlmCit7CisgIF9GYWNldCAqX19mYWNldCA9IDA7CisgIHJldHVybiBfSGFzRmFjZXQoX19sb2MsIF9fZmFjZXQpOworfQorCisjaWZkZWYgX1NUTFBfTk9fRVhQTElDSVRfRlVOQ1RJT05fVE1QTF9BUkdTCit9OyAvLyBjbG9zZSBjbGFzcyBkZWZpbml0aW9uCisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9GYWNldD4KK2Jvb2wgX0hhc0ZhY2V0KGNvbnN0IGxvY2FsZSYgX19sb2MsIGNvbnN0IF9GYWNldCogX19mYWNldCkgX1NUTFBfTk9USFJPVworeyByZXR1cm4gKF9fbG9jLl9NX2dldF9mYWNldChfRmFjZXQ6OmlkKSAhPSAwKTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZhY2V0PgorX0ZhY2V0KiBfVXNlRmFjZXQoY29uc3QgbG9jYWxlJiBfX2xvYywgY29uc3QgX0ZhY2V0KiBfX2ZhY2V0KQoreyByZXR1cm4gX19TVEFUSUNfQ0FTVChfRmFjZXQqLCBfX2xvYy5fTV91c2VfZmFjZXQoX0ZhY2V0OjppZCkpOyB9CisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2VuZGlmIC8qIF9TVExQX0lOVEVSTkFMX0xPQ0FMRV9IICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CisKZGlmZiAtLWdpdCBhL3N0bC9fbWFwLmggYi9zdGwvX21hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ZDJlM2YKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvX21hcC5oCkBAIC0wLDAgKzEsNDI1IEBACisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBNb3Njb3cgQ2VudGVyIGZvciBTUEFSQyBUZWNobm9sb2d5CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworLyogTk9URTogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgU1RMIGhlYWRlcnMuCisgKiAgIFlvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LgorICovCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfTUFQX0gKKyNkZWZpbmUgX1NUTFBfSU5URVJOQUxfTUFQX0gKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9UUkVFX0gKKyMgIGluY2x1ZGUgPHN0bC9fdHJlZS5oPgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisvL1NwZWNpZmljIGl0ZXJhdG9yIHRyYWl0cyBjcmVhdGlvbgorX1NUTFBfQ1JFQVRFX0lURVJBVE9SX1RSQUlUUyhNYXBUcmFpdHNULCB0cmFpdHMpCisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIF9TVExQX0RGTF9UTVBMX1BBUkFNKF9Db21wYXJlLCBsZXNzPF9LZXk+ICksCisgICAgICAgICAgX1NUTFBfREVGQVVMVF9QQUlSX0FMTE9DQVRPUl9TRUxFQ1QoY29uc3QgX0tleSwgX1RwKSA+CitjbGFzcyBtYXAKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUEFSVElBTF9TUEVDX1dPUktBUk9VTkQpCisgICAgICAgICAgOiBwdWJsaWMgX19zdGxwb3J0X2NsYXNzPG1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2M+ID4KKyNlbmRpZgoreworICB0eXBlZGVmIG1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2M+IF9TZWxmOworcHVibGljOgorCisvLyB0eXBlZGVmczoKKworICB0eXBlZGVmIF9LZXkgICAgICAgICAgICAgICAgICBrZXlfdHlwZTsKKyAgdHlwZWRlZiBfVHAgICAgICAgICAgICAgICAgICAgZGF0YV90eXBlOworICB0eXBlZGVmIF9UcCAgICAgICAgICAgICAgICAgICBtYXBwZWRfdHlwZTsKKyAgdHlwZWRlZiBwYWlyPGNvbnN0IF9LZXksIF9UcD4gdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiBfQ29tcGFyZSAgICAgICAgICAgICAga2V5X2NvbXBhcmU7CisKKyAgY2xhc3MgdmFsdWVfY29tcGFyZQorICAgIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjx2YWx1ZV90eXBlLCB2YWx1ZV90eXBlLCBib29sPiB7CisgIGZyaWVuZCBjbGFzcyBtYXA8X0tleSxfVHAsX0NvbXBhcmUsX0FsbG9jPjsKKyAgcHJvdGVjdGVkIDoKKyAgICAvL2MgaXMgYSBTdGFuZGFyZCBuYW1lICgyMy4zLjEpLCBkbyBubyBtYWtlIGl0IFNUTHBvcnQgbmFtaW5nIGNvbnZlbnRpb24gY29tcGxpYW50LgorICAgIF9Db21wYXJlIGNvbXA7CisgICAgdmFsdWVfY29tcGFyZShfQ29tcGFyZSBfX2MpIDogY29tcChfX2MpIHt9CisgIHB1YmxpYzoKKyAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgdmFsdWVfdHlwZSYgX194LCBjb25zdCB2YWx1ZV90eXBlJiBfX3kpIGNvbnN0CisgICAgeyByZXR1cm4gY29tcChfX3guZmlyc3QsIF9feS5maXJzdCk7IH0KKyAgfTsKKworcHJvdGVjdGVkOgorICB0eXBlZGVmIF9TVExQX1BSSVYgX01hcFRyYWl0c1Q8dmFsdWVfdHlwZT4gX01hcFRyYWl0czsKKworcHVibGljOgorICAvL0ZvbGxvd2luZyB0eXBlZGVmIGhhdmUgdG8gYmUgcHVibGljIGZvciBfX21vdmVfdHJhaXRzIHNwZWNpYWxpemF0aW9uLgorICB0eXBlZGVmIF9TVExQX1BSSVYgX1JiX3RyZWU8a2V5X3R5cGUsIGtleV9jb21wYXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZSwgX1NUTFBfU0VMRUNUMVNUKHZhbHVlX3R5cGUsIF9LZXkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01hcFRyYWl0cywgX0FsbG9jPiBfUmVwX3R5cGU7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OnBvaW50ZXIgcG9pbnRlcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OmNvbnN0X3BvaW50ZXIgY29uc3RfcG9pbnRlcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OnJlZmVyZW5jZSByZWZlcmVuY2U7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpjb25zdF9yZWZlcmVuY2UgY29uc3RfcmVmZXJlbmNlOworICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6aXRlcmF0b3IgaXRlcmF0b3I7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OnJldmVyc2VfaXRlcmF0b3IgcmV2ZXJzZV9pdGVyYXRvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OnNpemVfdHlwZSBzaXplX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7CisKK3ByaXZhdGU6CisgIF9SZXBfdHlwZSBfTV90OyAgLy8gcmVkLWJsYWNrIHRyZWUgcmVwcmVzZW50aW5nIG1hcAorICBfU1RMUF9LRVlfVFlQRV9GT1JfQ09OVF9FWFQoa2V5X3R5cGUpCisKK3B1YmxpYzoKKyAgLy8gYWxsb2NhdGlvbi9kZWFsbG9jYXRpb24KKyAgbWFwKCkgOiBfTV90KF9Db21wYXJlKCksIGFsbG9jYXRvcl90eXBlKCkpIHt9CisjaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCisgIGV4cGxpY2l0IG1hcChjb25zdCBfQ29tcGFyZSYgX19jb21wLAorICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisjZWxzZQorICBleHBsaWNpdCBtYXAoY29uc3QgX0NvbXBhcmUmIF9fY29tcCkKKyAgICA6IF9NX3QoX19jb21wLCBhbGxvY2F0b3JfdHlwZSgpKSB7fQorICBleHBsaWNpdCBtYXAoY29uc3QgX0NvbXBhcmUmIF9fY29tcCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyNlbmRpZgorICAgIDogX01fdChfX2NvbXAsIF9fYSkge30KKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgbWFwKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgICA6IF9NX3QoX0NvbXBhcmUoKSwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICB7IF9NX3QuaW5zZXJ0X3VuaXF1ZShfX2ZpcnN0LCBfX2xhc3QpOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICBtYXAoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LCBjb25zdCBfQ29tcGFyZSYgX19jb21wLAorICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSBfU1RMUF9BTExPQ0FUT1JfVFlQRV9ERkwpCisgICAgOiBfTV90KF9fY29tcCwgX19hKSB7IF9NX3QuaW5zZXJ0X3VuaXF1ZShfX2ZpcnN0LCBfX2xhc3QpOyB9CisKKyMgIGlmIGRlZmluZWQgKF9TVExQX05FRURTX0VYVFJBX1RFTVBMQVRFX0NPTlNUUlVDVE9SUykKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICBtYXAoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LCBjb25zdCBfQ29tcGFyZSYgX19jb21wKQorICAgIDogX01fdChfX2NvbXAsIGFsbG9jYXRvcl90eXBlKCkpIHsgX01fdC5pbnNlcnRfdW5pcXVlKF9fZmlyc3QsIF9fbGFzdCk7IH0KKyMgIGVuZGlmCisKKyNlbHNlCisgIG1hcChjb25zdCB2YWx1ZV90eXBlKiBfX2ZpcnN0LCBjb25zdCB2YWx1ZV90eXBlKiBfX2xhc3QpCisgICAgOiBfTV90KF9Db21wYXJlKCksIGFsbG9jYXRvcl90eXBlKCkpCisgICAgeyBfTV90Lmluc2VydF91bmlxdWUoX19maXJzdCwgX19sYXN0KTsgfQorCisgIG1hcChjb25zdCB2YWx1ZV90eXBlKiBfX2ZpcnN0LAorICAgICAgY29uc3QgdmFsdWVfdHlwZSogX19sYXN0LCBjb25zdCBfQ29tcGFyZSYgX19jb21wLAorICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfTV90KF9fY29tcCwgX19hKSB7IF9NX3QuaW5zZXJ0X3VuaXF1ZShfX2ZpcnN0LCBfX2xhc3QpOyB9CisKKyAgbWFwKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKKyAgICA6IF9NX3QoX0NvbXBhcmUoKSwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICB7IF9NX3QuaW5zZXJ0X3VuaXF1ZShfX2ZpcnN0LCBfX2xhc3QpOyB9CisKKyAgbWFwKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCwgY29uc3QgX0NvbXBhcmUmIF9fY29tcCwKKyAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX01fdChfX2NvbXAsIF9fYSkgeyBfTV90Lmluc2VydF91bmlxdWUoX19maXJzdCwgX19sYXN0KTsgfQorI2VuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKworICBtYXAoY29uc3QgX1NlbGYmIF9feCkgOiBfTV90KF9feC5fTV90KSB7fQorCisgIG1hcChfX21vdmVfc291cmNlPF9TZWxmPiBzcmMpCisgICAgOiBfTV90KF9fbW92ZV9zb3VyY2U8X1JlcF90eXBlPihzcmMuZ2V0KCkuX01fdCkpIHt9CisKKyAgX1NlbGYmIG9wZXJhdG9yPShjb25zdCBfU2VsZiYgX194KSB7CisgICAgX01fdCA9IF9feC5fTV90OworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vIGFjY2Vzc29yczoKKyAga2V5X2NvbXBhcmUga2V5X2NvbXAoKSBjb25zdCB7IHJldHVybiBfTV90LmtleV9jb21wKCk7IH0KKyAgdmFsdWVfY29tcGFyZSB2YWx1ZV9jb21wKCkgY29uc3QgeyByZXR1cm4gdmFsdWVfY29tcGFyZShfTV90LmtleV9jb21wKCkpOyB9CisgIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdCB7IHJldHVybiBfTV90LmdldF9hbGxvY2F0b3IoKTsgfQorCisgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gX01fdC5iZWdpbigpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gX01fdC5iZWdpbigpOyB9CisgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIF9NX3QuZW5kKCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gX01fdC5lbmQoKTsgfQorICByZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIHsgcmV0dXJuIF9NX3QucmJlZ2luKCk7IH0KKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSBjb25zdCB7IHJldHVybiBfTV90LnJiZWdpbigpOyB9CisgIHJldmVyc2VfaXRlcmF0b3IgcmVuZCgpIHsgcmV0dXJuIF9NX3QucmVuZCgpOyB9CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0IHsgcmV0dXJuIF9NX3QucmVuZCgpOyB9CisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBfTV90LmVtcHR5KCk7IH0KKyAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCB7IHJldHVybiBfTV90LnNpemUoKTsgfQorICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCB7IHJldHVybiBfTV90Lm1heF9zaXplKCk7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIF9UcCYgb3BlcmF0b3JbXShjb25zdCBfS1QmIF9faykgeworICAgIGl0ZXJhdG9yIF9faSA9IGxvd2VyX2JvdW5kKF9fayk7CisgICAgLy8gX19pLT5maXJzdCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1aXZhbGVudCB0byBfX2suCisgICAgaWYgKF9faSA9PSBlbmQoKSB8fCBrZXlfY29tcCgpKF9faywgKCpfX2kpLmZpcnN0KSkKKyAgICAgIF9faSA9IGluc2VydChfX2ksIHZhbHVlX3R5cGUoX19rLCBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKF9UcCkpKTsKKyAgICByZXR1cm4gKCpfX2kpLnNlY29uZDsKKyAgfQorICB2b2lkIHN3YXAoX1NlbGYmIF9feCkgeyBfTV90LnN3YXAoX194Ll9NX3QpOyB9CisKKyAgLy8gaW5zZXJ0L2VyYXNlCisgIHBhaXI8aXRlcmF0b3IsYm9vbD4gaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgeyByZXR1cm4gX01fdC5pbnNlcnRfdW5pcXVlKF9feCk7IH0KKyAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgIHsgcmV0dXJuIF9NX3QuaW5zZXJ0X3VuaXF1ZShfX3BvcywgX194KTsgfQorI2lmZGVmIF9TVExQX01FTUJFUl9URU1QTEFURVMKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICB2b2lkIGluc2VydChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgIHsgX01fdC5pbnNlcnRfdW5pcXVlKF9fZmlyc3QsIF9fbGFzdCk7IH0KKyNlbHNlCisgIHZvaWQgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUqIF9fZmlyc3QsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbGFzdCkKKyAgeyBfTV90Lmluc2VydF91bmlxdWUoX19maXJzdCwgX19sYXN0KTsgfQorICB2b2lkIGluc2VydChjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpCisgIHsgX01fdC5pbnNlcnRfdW5pcXVlKF9fZmlyc3QsIF9fbGFzdCk7IH0KKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisKKyAgdm9pZCBlcmFzZShpdGVyYXRvciBfX3BvcykgeyBfTV90LmVyYXNlKF9fcG9zKTsgfQorICBzaXplX3R5cGUgZXJhc2UoY29uc3Qga2V5X3R5cGUmIF9feCkgeyByZXR1cm4gX01fdC5lcmFzZV91bmlxdWUoX194KTsgfQorICB2b2lkIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkgeyBfTV90LmVyYXNlKF9fZmlyc3QsIF9fbGFzdCk7IH0KKyAgdm9pZCBjbGVhcigpIHsgX01fdC5jbGVhcigpOyB9CisKKyAgLy8gbWFwIG9wZXJhdGlvbnM6CisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBpdGVyYXRvciBmaW5kKGNvbnN0IF9LVCYgX194KSB7IHJldHVybiBfTV90LmZpbmQoX194KTsgfQorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgY29uc3RfaXRlcmF0b3IgZmluZChjb25zdCBfS1QmIF9feCkgY29uc3QgeyByZXR1cm4gX01fdC5maW5kKF9feCk7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIHNpemVfdHlwZSBjb3VudChjb25zdCBfS1QmIF9feCkgY29uc3QgeyByZXR1cm4gX01fdC5maW5kKF9feCkgPT0gX01fdC5lbmQoKSA/IDAgOiAxOyB9CisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBpdGVyYXRvciBsb3dlcl9ib3VuZChjb25zdCBfS1QmIF9feCkgeyByZXR1cm4gX01fdC5sb3dlcl9ib3VuZChfX3gpOyB9CisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBjb25zdF9pdGVyYXRvciBsb3dlcl9ib3VuZChjb25zdCBfS1QmIF9feCkgY29uc3QgeyByZXR1cm4gX01fdC5sb3dlcl9ib3VuZChfX3gpOyB9CisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBpdGVyYXRvciB1cHBlcl9ib3VuZChjb25zdCBfS1QmIF9feCkgeyByZXR1cm4gX01fdC51cHBlcl9ib3VuZChfX3gpOyB9CisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBjb25zdF9pdGVyYXRvciB1cHBlcl9ib3VuZChjb25zdCBfS1QmIF9feCkgY29uc3QgeyByZXR1cm4gX01fdC51cHBlcl9ib3VuZChfX3gpOyB9CisKKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIHBhaXI8aXRlcmF0b3IsaXRlcmF0b3I+IGVxdWFsX3JhbmdlKGNvbnN0IF9LVCYgX194KQorICB7IHJldHVybiBfTV90LmVxdWFsX3JhbmdlX3VuaXF1ZShfX3gpOyB9CisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBwYWlyPGNvbnN0X2l0ZXJhdG9yLGNvbnN0X2l0ZXJhdG9yPiBlcXVhbF9yYW5nZShjb25zdCBfS1QmIF9feCkgY29uc3QKKyAgeyByZXR1cm4gX01fdC5lcXVhbF9yYW5nZV91bmlxdWUoX194KTsgfQorfTsKKworLy9TcGVjaWZpYyBpdGVyYXRvciB0cmFpdHMgY3JlYXRpb24KK19TVExQX0NSRUFURV9JVEVSQVRPUl9UUkFJVFMoTXVsdGltYXBUcmFpdHNULCB0cmFpdHMpCisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIF9TVExQX0RGTF9UTVBMX1BBUkFNKF9Db21wYXJlLCBsZXNzPF9LZXk+ICksCisgICAgICAgICAgX1NUTFBfREVGQVVMVF9QQUlSX0FMTE9DQVRPUl9TRUxFQ1QoY29uc3QgX0tleSwgX1RwKSA+CitjbGFzcyBtdWx0aW1hcAorI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QQVJUSUFMX1NQRUNfV09SS0FST1VORCkKKyAgICAgICAgICAgICAgIDogcHVibGljIF9fc3RscG9ydF9jbGFzczxtdWx0aW1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2M+ID4KKyNlbmRpZgoreworICB0eXBlZGVmIG11bHRpbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvYz4gX1NlbGY7CitwdWJsaWM6CisKKy8vIHR5cGVkZWZzOgorCisgIHR5cGVkZWYgX0tleSAgICAgICAgICAgICAgICAgIGtleV90eXBlOworICB0eXBlZGVmIF9UcCAgICAgICAgICAgICAgICAgICBkYXRhX3R5cGU7CisgIHR5cGVkZWYgX1RwICAgICAgICAgICAgICAgICAgIG1hcHBlZF90eXBlOworICB0eXBlZGVmIHBhaXI8Y29uc3QgX0tleSwgX1RwPiB2YWx1ZV90eXBlOworICB0eXBlZGVmIF9Db21wYXJlICAgICAgICAgICAgICBrZXlfY29tcGFyZTsKKworICBjbGFzcyB2YWx1ZV9jb21wYXJlIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjx2YWx1ZV90eXBlLCB2YWx1ZV90eXBlLCBib29sPiB7CisgICAgZnJpZW5kIGNsYXNzIG11bHRpbWFwPF9LZXksX1RwLF9Db21wYXJlLF9BbGxvYz47CisgIHByb3RlY3RlZDoKKyAgICAvL2NvbXAgaXMgYSBTdGFuZGFyZCBuYW1lICgyMy4zLjIpLCBkbyBubyBtYWtlIGl0IFNUTHBvcnQgbmFtaW5nIGNvbnZlbnRpb24gY29tcGxpYW50LgorICAgIF9Db21wYXJlIGNvbXA7CisgICAgdmFsdWVfY29tcGFyZShfQ29tcGFyZSBfX2MpIDogY29tcChfX2MpIHt9CisgIHB1YmxpYzoKKyAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgdmFsdWVfdHlwZSYgX194LCBjb25zdCB2YWx1ZV90eXBlJiBfX3kpIGNvbnN0CisgICAgeyByZXR1cm4gY29tcChfX3guZmlyc3QsIF9feS5maXJzdCk7IH0KKyAgfTsKKworcHJvdGVjdGVkOgorICAvL1NwZWNpZmljIGl0ZXJhdG9yIHRyYWl0cyBjcmVhdGlvbgorICB0eXBlZGVmIF9TVExQX1BSSVYgX011bHRpbWFwVHJhaXRzVDx2YWx1ZV90eXBlPiBfTXVsdGltYXBUcmFpdHM7CisKK3B1YmxpYzoKKyAgLy9Gb2xsb3dpbmcgdHlwZWRlZiBoYXZlIHRvIGJlIHB1YmxpYyBmb3IgX19tb3ZlX3RyYWl0cyBzcGVjaWFsaXphdGlvbi4KKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9SYl90cmVlPGtleV90eXBlLCBrZXlfY29tcGFyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGUsIF9TVExQX1NFTEVDVDFTVCh2YWx1ZV90eXBlLCBfS2V5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NdWx0aW1hcFRyYWl0cywgX0FsbG9jPiBfUmVwX3R5cGU7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OnBvaW50ZXIgcG9pbnRlcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OmNvbnN0X3BvaW50ZXIgY29uc3RfcG9pbnRlcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OnJlZmVyZW5jZSByZWZlcmVuY2U7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpjb25zdF9yZWZlcmVuY2UgY29uc3RfcmVmZXJlbmNlOworICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6aXRlcmF0b3IgaXRlcmF0b3I7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OnJldmVyc2VfaXRlcmF0b3IgcmV2ZXJzZV9pdGVyYXRvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OnNpemVfdHlwZSBzaXplX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7CisKK3ByaXZhdGU6CisgIF9SZXBfdHlwZSBfTV90OyAgLy8gcmVkLWJsYWNrIHRyZWUgcmVwcmVzZW50aW5nIG11bHRpbWFwCisgIF9TVExQX0tFWV9UWVBFX0ZPUl9DT05UX0VYVChrZXlfdHlwZSkKKworcHVibGljOgorICAvLyBhbGxvY2F0aW9uL2RlYWxsb2NhdGlvbgorICBtdWx0aW1hcCgpIDogX01fdChfQ29tcGFyZSgpLCBhbGxvY2F0b3JfdHlwZSgpKSB7IH0KKyAgZXhwbGljaXQgbXVsdGltYXAoY29uc3QgX0NvbXBhcmUmIF9fY29tcCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfTV90KF9fY29tcCwgX19hKSB7IH0KKworI2lmZGVmIF9TVExQX01FTUJFUl9URU1QTEFURVMKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICBtdWx0aW1hcChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgOiBfTV90KF9Db21wYXJlKCksIGFsbG9jYXRvcl90eXBlKCkpCisgICAgeyBfTV90Lmluc2VydF9lcXVhbChfX2ZpcnN0LCBfX2xhc3QpOyB9CisjIGlmZGVmIF9TVExQX05FRURTX0VYVFJBX1RFTVBMQVRFX0NPTlNUUlVDVE9SUworICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIG11bHRpbWFwKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgY29uc3QgX0NvbXBhcmUmIF9fY29tcCkKKyAgICA6IF9NX3QoX19jb21wLCBhbGxvY2F0b3JfdHlwZSgpKSB7IF9NX3QuaW5zZXJ0X2VxdWFsKF9fZmlyc3QsIF9fbGFzdCk7IH0KKyMgIGVuZGlmCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgbXVsdGltYXAoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICBjb25zdCBfQ29tcGFyZSYgX19jb21wLAorICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hIF9TVExQX0FMTE9DQVRPUl9UWVBFX0RGTCkKKyAgICA6IF9NX3QoX19jb21wLCBfX2EpIHsgX01fdC5pbnNlcnRfZXF1YWwoX19maXJzdCwgX19sYXN0KTsgfQorI2Vsc2UKKyAgbXVsdGltYXAoY29uc3QgdmFsdWVfdHlwZSogX19maXJzdCwgY29uc3QgdmFsdWVfdHlwZSogX19sYXN0KQorICAgIDogX01fdChfQ29tcGFyZSgpLCBhbGxvY2F0b3JfdHlwZSgpKQorICAgIHsgX01fdC5pbnNlcnRfZXF1YWwoX19maXJzdCwgX19sYXN0KTsgfQorICBtdWx0aW1hcChjb25zdCB2YWx1ZV90eXBlKiBfX2ZpcnN0LCBjb25zdCB2YWx1ZV90eXBlKiBfX2xhc3QsCisgICAgICAgICAgIGNvbnN0IF9Db21wYXJlJiBfX2NvbXAsCisgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX01fdChfX2NvbXAsIF9fYSkgeyBfTV90Lmluc2VydF9lcXVhbChfX2ZpcnN0LCBfX2xhc3QpOyB9CisKKyAgbXVsdGltYXAoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KQorICAgIDogX01fdChfQ29tcGFyZSgpLCBhbGxvY2F0b3JfdHlwZSgpKQorICAgIHsgX01fdC5pbnNlcnRfZXF1YWwoX19maXJzdCwgX19sYXN0KTsgfQorICBtdWx0aW1hcChjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgIGNvbnN0IF9Db21wYXJlJiBfX2NvbXAsCisgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX01fdChfX2NvbXAsIF9fYSkgeyBfTV90Lmluc2VydF9lcXVhbChfX2ZpcnN0LCBfX2xhc3QpOyB9CisjZW5kaWYgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworCisgIG11bHRpbWFwKGNvbnN0IF9TZWxmJiBfX3gpIDogX01fdChfX3guX01fdCkge30KKworICBtdWx0aW1hcChfX21vdmVfc291cmNlPF9TZWxmPiBzcmMpCisgICAgOiBfTV90KF9fbW92ZV9zb3VyY2U8X1JlcF90eXBlPihzcmMuZ2V0KCkuX01fdCkpIHt9CisKKyAgX1NlbGYmIG9wZXJhdG9yPShjb25zdCBfU2VsZiYgX194KSB7CisgICAgX01fdCA9IF9feC5fTV90OworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vIGFjY2Vzc29yczoKKworICBrZXlfY29tcGFyZSBrZXlfY29tcCgpIGNvbnN0IHsgcmV0dXJuIF9NX3Qua2V5X2NvbXAoKTsgfQorICB2YWx1ZV9jb21wYXJlIHZhbHVlX2NvbXAoKSBjb25zdCB7IHJldHVybiB2YWx1ZV9jb21wYXJlKF9NX3Qua2V5X2NvbXAoKSk7IH0KKyAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IHsgcmV0dXJuIF9NX3QuZ2V0X2FsbG9jYXRvcigpOyB9CisKKyAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBfTV90LmJlZ2luKCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBfTV90LmJlZ2luKCk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gX01fdC5lbmQoKTsgfQorICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBfTV90LmVuZCgpOyB9CisgIHJldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgeyByZXR1cm4gX01fdC5yYmVnaW4oKTsgfQorICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0IHsgcmV0dXJuIF9NX3QucmJlZ2luKCk7IH0KKyAgcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgeyByZXR1cm4gX01fdC5yZW5kKCk7IH0KKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgY29uc3QgeyByZXR1cm4gX01fdC5yZW5kKCk7IH0KKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIF9NX3QuZW1wdHkoKTsgfQorICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX3Quc2l6ZSgpOyB9CisgIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX3QubWF4X3NpemUoKTsgfQorICB2b2lkIHN3YXAoX1NlbGYmIF9feCkgeyBfTV90LnN3YXAoX194Ll9NX3QpOyB9CisKKyAgLy8gaW5zZXJ0L2VyYXNlCisgIGl0ZXJhdG9yIGluc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX3gpIHsgcmV0dXJuIF9NX3QuaW5zZXJ0X2VxdWFsKF9feCk7IH0KKyAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpIHsgcmV0dXJuIF9NX3QuaW5zZXJ0X2VxdWFsKF9fcG9zLCBfX3gpOyB9CisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICB2b2lkIGluc2VydChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgIHsgX01fdC5pbnNlcnRfZXF1YWwoX19maXJzdCwgX19sYXN0KTsgfQorI2Vsc2UKKyAgdm9pZCBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSogX19maXJzdCwgY29uc3QgdmFsdWVfdHlwZSogX19sYXN0KQorICB7IF9NX3QuaW5zZXJ0X2VxdWFsKF9fZmlyc3QsIF9fbGFzdCk7IH0KKyAgdm9pZCBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KQorICB7IF9NX3QuaW5zZXJ0X2VxdWFsKF9fZmlyc3QsIF9fbGFzdCk7IH0KKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisgIHZvaWQgZXJhc2UoaXRlcmF0b3IgX19wb3MpIHsgX01fdC5lcmFzZShfX3Bvcyk7IH0KKyAgc2l6ZV90eXBlIGVyYXNlKGNvbnN0IGtleV90eXBlJiBfX3gpIHsgcmV0dXJuIF9NX3QuZXJhc2UoX194KTsgfQorICB2b2lkIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkgeyBfTV90LmVyYXNlKF9fZmlyc3QsIF9fbGFzdCk7IH0KKyAgdm9pZCBjbGVhcigpIHsgX01fdC5jbGVhcigpOyB9CisKKyAgLy8gbXVsdGltYXAgb3BlcmF0aW9uczoKKworICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgaXRlcmF0b3IgZmluZChjb25zdCBfS1QmIF9feCkgeyByZXR1cm4gX01fdC5maW5kKF9feCk7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIGNvbnN0X2l0ZXJhdG9yIGZpbmQoY29uc3QgX0tUJiBfX3gpIGNvbnN0IHsgcmV0dXJuIF9NX3QuZmluZChfX3gpOyB9CisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBzaXplX3R5cGUgY291bnQoY29uc3QgX0tUJiBfX3gpIGNvbnN0IHsgcmV0dXJuIF9NX3QuY291bnQoX194KTsgfQorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgaXRlcmF0b3IgbG93ZXJfYm91bmQoY29uc3QgX0tUJiBfX3gpIHsgcmV0dXJuIF9NX3QubG93ZXJfYm91bmQoX194KTsgfQorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgY29uc3RfaXRlcmF0b3IgbG93ZXJfYm91bmQoY29uc3QgX0tUJiBfX3gpIGNvbnN0IHsgcmV0dXJuIF9NX3QubG93ZXJfYm91bmQoX194KTsgfQorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgaXRlcmF0b3IgdXBwZXJfYm91bmQoY29uc3QgX0tUJiBfX3gpIHsgcmV0dXJuIF9NX3QudXBwZXJfYm91bmQoX194KTsgfQorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgY29uc3RfaXRlcmF0b3IgdXBwZXJfYm91bmQoY29uc3QgX0tUJiBfX3gpIGNvbnN0IHsgcmV0dXJuIF9NX3QudXBwZXJfYm91bmQoX194KTsgfQorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgcGFpcjxpdGVyYXRvcixpdGVyYXRvcj4gZXF1YWxfcmFuZ2UoY29uc3QgX0tUJiBfX3gpCisgIHsgcmV0dXJuIF9NX3QuZXF1YWxfcmFuZ2UoX194KTsgfQorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgcGFpcjxjb25zdF9pdGVyYXRvcixjb25zdF9pdGVyYXRvcj4gZXF1YWxfcmFuZ2UoY29uc3QgX0tUJiBfX3gpIGNvbnN0CisgIHsgcmV0dXJuIF9NX3QuZXF1YWxfcmFuZ2UoX194KTsgfQorfTsKKworI2RlZmluZSBfU1RMUF9URU1QTEFURV9IRUFERVIgdGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvYz4KKyNkZWZpbmUgX1NUTFBfVEVNUExBVEVfQ09OVEFJTkVSIG1hcDxfS2V5LF9UcCxfQ29tcGFyZSxfQWxsb2M+CisjaW5jbHVkZSA8c3RsL19yZWxvcHNfY29udC5oPgorI3VuZGVmICBfU1RMUF9URU1QTEFURV9DT05UQUlORVIKKyNkZWZpbmUgX1NUTFBfVEVNUExBVEVfQ09OVEFJTkVSIG11bHRpbWFwPF9LZXksX1RwLF9Db21wYXJlLF9BbGxvYz4KKyNpbmNsdWRlIDxzdGwvX3JlbG9wc19jb250Lmg+CisjdW5kZWYgIF9TVExQX1RFTVBMQVRFX0NPTlRBSU5FUgorI3VuZGVmICBfU1RMUF9URU1QTEFURV9IRUFERVIKKworI2lmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZSwgY2xhc3MgX0FsbG9jPgorc3RydWN0IF9fbW92ZV90cmFpdHM8bWFwPF9LZXksX1RwLF9Db21wYXJlLF9BbGxvYz4gPiA6CisgIF9TVExQX1BSSVYgX19tb3ZlX3RyYWl0c19hdXg8dHlwZW5hbWUgbWFwPF9LZXksX1RwLF9Db21wYXJlLF9BbGxvYz46Ol9SZXBfdHlwZT4KK3t9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZSwgY2xhc3MgX0FsbG9jPgorc3RydWN0IF9fbW92ZV90cmFpdHM8bXVsdGltYXA8X0tleSxfVHAsX0NvbXBhcmUsX0FsbG9jPiA+IDoKKyAgX1NUTFBfUFJJViBfX21vdmVfdHJhaXRzX2F1eDx0eXBlbmFtZSBtdWx0aW1hcDxfS2V5LF9UcCxfQ29tcGFyZSxfQWxsb2M+OjpfUmVwX3R5cGU+Cit7fTsKKyNlbmRpZgorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9NQVBfSCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgorCmRpZmYgLS1naXQgYS9zdGwvX21ic3RhdGVfdC5oIGIvc3RsL19tYnN0YXRlX3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWE5MzZmCi0tLSAvZGV2L251bGwKKysrIGIvc3RsL19tYnN0YXRlX3QuaApAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9NQlNUQVRFX1QKKyNkZWZpbmUgX1NUTFBfSU5URVJOQUxfTUJTVEFURV9UCisKKyNpZiAoZGVmaW5lZCAoX19PcGVuQlNEX18pIHx8IGRlZmluZWQgKF9fRnJlZUJTRF9fKSkgJiYgZGVmaW5lZCAoX19HTlVDX18pICYmICFkZWZpbmVkIChfR0xJQkNQUF9IQVZFX01CU1RBVEVfVCkKKyMgIGRlZmluZSBfX21ic3RhdGVfdF9kZWZpbmVkIC8qIG1ic3RhdGVfdCBkZWZpbmVkIGluIG5hdGl2ZSA8Y3djaGFyPiwgc28gbm90IGRlZmluZWQgaW4gQyEgKi8KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfTk9fTkFUSVZFX01CU1RBVEVfVCkgJiYgIWRlZmluZWQgKF9TVExQX05PX01CU1RBVEVfVCkgJiYgIWRlZmluZWQgKF9NQlNUQVRFX1QpICYmICFkZWZpbmVkIChfX21ic3RhdGVfdF9kZWZpbmVkKQorIyAgZGVmaW5lIF9TVExQX1VTRV9PV05fTUJTVEFURV9UCisjICBkZWZpbmUgX01CU1RBVEVfVAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfT1dOX01CU1RBVEVfVCkKK3R5cGVkZWYgaW50IG1ic3RhdGVfdDsKKworIyAgaWYgZGVmaW5lZCAoX19jcGx1c3BsdXMpCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKK3VzaW5nIDo6bWJzdGF0ZV90OworX1NUTFBfRU5EX05BTUVTUEFDRQorIyAgZW5kaWYKKworI2VuZGlmIC8qIF9TVExQX1VTRV9PV05fTUJTVEFURV9UICovCisKKyNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9NQlNUQVRFX1QgKi8KZGlmZiAtLWdpdCBhL3N0bC9fbWVzc2FnZXNfZmFjZXRzLmggYi9zdGwvX21lc3NhZ2VzX2ZhY2V0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViNGY4NjkKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvX21lc3NhZ2VzX2ZhY2V0cy5oCkBAIC0wLDAgKzEsMTgxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisvLyBXQVJOSU5HOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBDKysKKy8vIHN0YW5kYXJkIGxpYnJhcnkgaGVhZGVycy4gIFlvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gdXNlIHRoaXMgaGVhZGVyCisvLyBmaWxlIGRpcmVjdGx5LgorCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfTUVTU0FHRVNfSAorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9NRVNTQUdFU19ICisKKyNpZm5kZWYgX1NUTFBfSU9TX0JBU0VfSAorIyAgaW5jbHVkZSA8c3RsL19pb3NfYmFzZS5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfQ19MT0NBTEVfSAorIyAgaW5jbHVkZSA8c3RsL2NfbG9jYWxlLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9TVFJJTkdfSAorIyAgaW5jbHVkZSA8c3RsL19zdHJpbmcuaD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworLy8gbWVzc2FnZXMgZmFjZXRzCisKK2NsYXNzIG1lc3NhZ2VzX2Jhc2UgeworICBwdWJsaWM6CisgICAgdHlwZWRlZiBpbnQgY2F0YWxvZzsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+IGNsYXNzIG1lc3NhZ2VzIHt9OworCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCitjbGFzcyBfTWVzc2FnZXM7CitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKworX1NUTFBfVEVNUExBVEVfTlVMTAorY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgbWVzc2FnZXM8Y2hhcj4gOiBwdWJsaWMgbG9jYWxlOjpmYWNldCwgcHVibGljIG1lc3NhZ2VzX2Jhc2UgeworICBmcmllbmQgY2xhc3MgX0xvY2FsZV9pbXBsOworcHVibGljOgorICB0eXBlZGVmIG1lc3NhZ2VzX2Jhc2U6OmNhdGFsb2cgY2F0YWxvZzsKKyAgdHlwZWRlZiBjaGFyICAgICAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKKyAgdHlwZWRlZiBzdHJpbmcgICAgc3RyaW5nX3R5cGU7CisKKyAgZXhwbGljaXQgbWVzc2FnZXMoc2l6ZV90IF9fcmVmcyA9IDApOworCisgIGNhdGFsb2cgb3Blbihjb25zdCBzdHJpbmcmIF9fZm4sIGNvbnN0IGxvY2FsZSYgX19sb2MpIGNvbnN0CisgIHsgcmV0dXJuIGRvX29wZW4oX19mbiwgX19sb2MpOyB9CisgIHN0cmluZ190eXBlIGdldChjYXRhbG9nIF9fYywgaW50IF9fc2V0LCBpbnQgX19tc2dpZCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZ190eXBlJiBfX2RmYXVsdCkgY29uc3QKKyAgeyByZXR1cm4gZG9fZ2V0KF9fYywgX19zZXQsIF9fbXNnaWQsIF9fZGZhdWx0KTsgfQorICBpbmxpbmUgdm9pZCBjbG9zZShjYXRhbG9nIF9fYykgY29uc3QKKyAgeyBkb19jbG9zZShfX2MpOyB9CisKKyAgc3RhdGljIF9TVExQX1NUQVRJQ19NRU1CRVJfREVDTFNQRUMgbG9jYWxlOjppZCBpZDsKKworcHJpdmF0ZToKKyAgbWVzc2FnZXMoX1NUTFBfUFJJViBfTWVzc2FnZXMqKTsKKworcHJvdGVjdGVkOgorICBtZXNzYWdlcyhzaXplX3QsIF9Mb2NhbGVfbWVzc2FnZXMqKTsKKyAgfm1lc3NhZ2VzKCk7CisKKyAgdmlydHVhbCBjYXRhbG9nICAgICBkb19vcGVuKGNvbnN0IHN0cmluZyYgX19mbiwgY29uc3QgbG9jYWxlJiBfX2xvYykgY29uc3Q7CisgIHZpcnR1YWwgc3RyaW5nX3R5cGUgZG9fZ2V0KGNhdGFsb2cgX19jLCBpbnQgX19zZXQsIGludCBfX21zZ2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmdfdHlwZSYgX19kZmF1bHQpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgICAgICAgIGRvX2Nsb3NlKGNhdGFsb2cgX19jKSBjb25zdDsKKworICB2b2lkIF9NX2luaXRpYWxpemUoY29uc3QgY2hhciogX19uYW1lKTsKKworcHJpdmF0ZToKKyAgX1NUTFBfUFJJViBfTWVzc2FnZXMqIF9NX2ltcGw7Cit9OworCisjaWYgIWRlZmluZWQgKF9TVExQX05PX1dDSEFSX1QpCisKK19TVExQX1RFTVBMQVRFX05VTEwKK2NsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIG1lc3NhZ2VzPHdjaGFyX3Q+IDogcHVibGljIGxvY2FsZTo6ZmFjZXQsIHB1YmxpYyBtZXNzYWdlc19iYXNlIHsKKyAgZnJpZW5kIGNsYXNzIF9Mb2NhbGVfaW1wbDsKK3B1YmxpYzoKKyAgdHlwZWRlZiBtZXNzYWdlc19iYXNlOjpjYXRhbG9nIGNhdGFsb2c7CisgIHR5cGVkZWYgd2NoYXJfdCAgICAgICAgICAgICAgICBjaGFyX3R5cGU7CisgIHR5cGVkZWYgd3N0cmluZyAgc3RyaW5nX3R5cGU7CisKKyAgZXhwbGljaXQgbWVzc2FnZXMoc2l6ZV90IF9fcmVmcyA9IDApOworCisgIGlubGluZSBjYXRhbG9nIG9wZW4oY29uc3Qgc3RyaW5nJiBfX2ZuLCBjb25zdCBsb2NhbGUmIF9fbG9jKSBjb25zdAorICAgIHsgcmV0dXJuIGRvX29wZW4oX19mbiwgX19sb2MpOyB9CisgIGlubGluZSBzdHJpbmdfdHlwZSBnZXQoY2F0YWxvZyBfX2MsIGludCBfX3NldCwgaW50IF9fbXNnaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nX3R5cGUmIF9fZGZhdWx0KSBjb25zdAorICAgIHsgcmV0dXJuIGRvX2dldChfX2MsIF9fc2V0LCBfX21zZ2lkLCBfX2RmYXVsdCk7IH0KKyAgaW5saW5lIHZvaWQgY2xvc2UoY2F0YWxvZyBfX2MpIGNvbnN0CisgICAgeyBkb19jbG9zZShfX2MpOyB9CisKKyAgc3RhdGljIF9TVExQX1NUQVRJQ19NRU1CRVJfREVDTFNQRUMgbG9jYWxlOjppZCBpZDsKKworcHJpdmF0ZToKKyAgbWVzc2FnZXMoX1NUTFBfUFJJViBfTWVzc2FnZXMqKTsKKworcHJvdGVjdGVkOgorICBtZXNzYWdlcyhzaXplX3QsIF9Mb2NhbGVfbWVzc2FnZXMqKTsKKyAgfm1lc3NhZ2VzKCk7CisKKyAgdmlydHVhbCBjYXRhbG9nICAgICBkb19vcGVuKGNvbnN0IHN0cmluZyYgX19mbiwgY29uc3QgbG9jYWxlJiBfX2xvYykgY29uc3Q7CisgIHZpcnR1YWwgc3RyaW5nX3R5cGUgZG9fZ2V0KGNhdGFsb2cgX19jLCBpbnQgX19zZXQsIGludCBfX21zZ2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmdfdHlwZSYgX19kZmF1bHQpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgICAgICAgIGRvX2Nsb3NlKGNhdGFsb2cgX19jKSBjb25zdDsKKworICB2b2lkIF9NX2luaXRpYWxpemUoY29uc3QgY2hhciogX19uYW1lKTsKKworcHJpdmF0ZToKKyAgX1NUTFBfUFJJViBfTWVzc2FnZXMqIF9NX2ltcGw7Cit9OworCisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4gY2xhc3MgbWVzc2FnZXNfYnluYW1lIHt9OworCitfU1RMUF9URU1QTEFURV9OVUxMCitjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBtZXNzYWdlc19ieW5hbWU8Y2hhcj4gOiBwdWJsaWMgbWVzc2FnZXM8Y2hhcj4geworcHVibGljOgorICB0eXBlZGVmIG1lc3NhZ2VzX2Jhc2U6OmNhdGFsb2cgY2F0YWxvZzsKKyAgdHlwZWRlZiBzdHJpbmcgICAgIHN0cmluZ190eXBlOworCisgIGV4cGxpY2l0IG1lc3NhZ2VzX2J5bmFtZShjb25zdCBjaGFyKiBfX25hbWUsIHNpemVfdCBfX3JlZnMgPSAwLCBfTG9jYWxlX25hbWVfaGludCogX19oaW50ID0gMCk7CisKK3Byb3RlY3RlZDoKKyAgfm1lc3NhZ2VzX2J5bmFtZSgpOworCitwcml2YXRlOgorICB0eXBlZGVmIG1lc3NhZ2VzX2J5bmFtZTxjaGFyPiBfU2VsZjsKKyAgLy9leHBsaWNpdGVseSBkZWZpbmVkIGFzIHByaXZhdGUgdG8gYXZvaWQgd2FybmluZ3M6CisgIG1lc3NhZ2VzX2J5bmFtZShfU2VsZiBjb25zdCYpOworICBfU2VsZiYgb3BlcmF0b3IgPSAoX1NlbGYgY29uc3QmKTsKK307CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkKK19TVExQX1RFTVBMQVRFX05VTEwKK2NsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIG1lc3NhZ2VzX2J5bmFtZTx3Y2hhcl90PiA6IHB1YmxpYyBtZXNzYWdlczx3Y2hhcl90PiB7CitwdWJsaWM6CisgIHR5cGVkZWYgbWVzc2FnZXNfYmFzZTo6Y2F0YWxvZyBjYXRhbG9nOworICB0eXBlZGVmIHdzdHJpbmcgICAgICAgICAgICAgICAgc3RyaW5nX3R5cGU7CisKKyAgZXhwbGljaXQgbWVzc2FnZXNfYnluYW1lKGNvbnN0IGNoYXIqIF9fbmFtZSwgc2l6ZV90IF9fcmVmcyA9IDAsIF9Mb2NhbGVfbmFtZV9oaW50KiBfX2hpbnQgPSAwKTsKKworcHJvdGVjdGVkOgorICB+bWVzc2FnZXNfYnluYW1lKCk7CisKK3ByaXZhdGU6CisgIHR5cGVkZWYgbWVzc2FnZXNfYnluYW1lPHdjaGFyX3Q+IF9TZWxmOworICAvL2V4cGxpY2l0ZWx5IGRlZmluZWQgYXMgcHJpdmF0ZSB0byBhdm9pZCB3YXJuaW5nczoKKyAgbWVzc2FnZXNfYnluYW1lKF9TZWxmIGNvbnN0Jik7CisgIF9TZWxmJiBvcGVyYXRvciA9IChfU2VsZiBjb25zdCYpOworfTsKKyNlbmRpZiAvKiBXQ0hBUl9UICovCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2VuZGlmIC8qIF9TVExQX0lOVEVSTkFMX01FU1NBR0VTX0ggKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKKwpkaWZmIC0tZ2l0IGEvc3RsL19tb25ldGFyeS5jIGIvc3RsL19tb25ldGFyeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MDExMjgKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvX21vbmV0YXJ5LmMKQEAgLTAsMCArMSw2MDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisjaWZuZGVmIF9TVExQX01PTkVUQVJZX0MKKyNkZWZpbmUgX1NUTFBfTU9ORVRBUllfQworCisjIGlmbmRlZiBfU1RMUF9JTlRFUk5BTF9NT05FVEFSWV9ICisjICBpbmNsdWRlIDxzdGwvX21vbmV0YXJ5Lmg+CisjIGVuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfSU9TX0gKKyMgaW5jbHVkZSA8c3RsL19pb3MuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX05VTV9QVVRfSAorIyBpbmNsdWRlIDxzdGwvX251bV9wdXQuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX05VTV9HRVRfSAorIyBpbmNsdWRlIDxzdGwvX251bV9nZXQuaD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworI2lmIChfU1RMUF9TVEFUSUNfVEVNUExBVEVfREFUQSA+IDApCisKKyMgIGlmICFkZWZpbmVkIChfX0JPUkxBTkRDX18pCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfSW5wdXRJdGVyYXRvcj4KK2xvY2FsZTo6aWQgbW9uZXlfZ2V0PF9DaGFyVCwgX0lucHV0SXRlcmF0b3I+OjppZDsKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX091dHB1dEl0ZXJhdG9yPgorbG9jYWxlOjppZCBtb25leV9wdXQ8X0NoYXJULCBfT3V0cHV0SXRlcmF0b3I+OjppZDsKKyMgIGVuZGlmCisKKyMgIGlmIChkZWZpbmVkIChfX0NZR1dJTl9fKSB8fCBkZWZpbmVkIChfX01JTkdXMzJfXykpICYmIFwKKyAgICAgICBkZWZpbmVkIChfU1RMUF9VU0VfRFlOQU1JQ19MSUIpICYmICFkZWZpbmVkIChfX0JVSUxESU5HX1NUTFBPUlQpCisvKgorICogVW5kZXIgY3lnd2luLCB3aGVuIFNUTHBvcnQgaXMgdXNlZCBhcyBhIHNoYXJlZCBsaWJyYXJ5LCB0aGUgaWQgbmVlZHMKKyAqIHRvIGJlIHNwZWNpZmllZCBhcyBpbXBvcnRlZCBvdGhlcndpc2UgdGhleSB3aWxsIGJlIGR1cGxpY2F0ZWQgaW4gdGhlCisgKiBjYWxsaW5nIGV4ZWN1dGFibGUuCisgKi8KK3RlbXBsYXRlIDw+CitfU1RMUF9ERUNMU1BFQyBsb2NhbGU6OmlkIG1vbmV5X2dldDxjaGFyLCBpc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4gPjo6aWQ7CisvKgordGVtcGxhdGUgPD4KK19TVExQX0RFQ0xTUEVDIGxvY2FsZTo6aWQgbW9uZXlfZ2V0PGNoYXIsIGNvbnN0IGNoYXIqPjo6aWQ7CisqLworCit0ZW1wbGF0ZSA8PgorX1NUTFBfREVDTFNQRUMgbG9jYWxlOjppZCBtb25leV9wdXQ8Y2hhciwgb3N0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+ID46OmlkOwordGVtcGxhdGUgPD4KK19TVExQX0RFQ0xTUEVDIGxvY2FsZTo6aWQgbW9uZXlfcHV0PGNoYXIsIGNoYXIqPjo6aWQ7CisKKyMgICAgaWYgIWRlZmluZWQgKF9TVExQX05PX1dDSEFSX1QpCit0ZW1wbGF0ZSA8PgorX1NUTFBfREVDTFNQRUMgbG9jYWxlOjppZCBtb25leV9nZXQ8d2NoYXJfdCwgaXN0cmVhbWJ1Zl9pdGVyYXRvcjx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+ID46OmlkOwordGVtcGxhdGUgPD4KK19TVExQX0RFQ0xTUEVDIGxvY2FsZTo6aWQgbW9uZXlfZ2V0PHdjaGFyX3QsIGNvbnN0IHdjaGFyX3QqPjo6aWQ7CisKK3RlbXBsYXRlIDw+CitfU1RMUF9ERUNMU1BFQyBsb2NhbGU6OmlkIG1vbmV5X3B1dDx3Y2hhcl90LCBvc3RyZWFtYnVmX2l0ZXJhdG9yPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4gPjo6aWQ7Cit0ZW1wbGF0ZSA8PgorX1NUTFBfREVDTFNQRUMgbG9jYWxlOjppZCBtb25leV9wdXQ8d2NoYXJfdCwgd2NoYXJfdCo+OjppZDsKKyMgICAgZW5kaWYKKworIyAgZW5kaWYKKworI2Vsc2UgLyogKCBfU1RMUF9TVEFUSUNfVEVNUExBVEVfREFUQSA+IDAgKSAqLworCisvL3R5cGVkZWYgbW9uZXlfZ2V0PGNoYXIsIGNvbnN0IGNoYXIqPiBtb25leV9nZXRfY2hhcjsKKy8vdHlwZWRlZiBtb25leV9wdXQ8Y2hhciwgY2hhcio+IG1vbmV5X3B1dF9jaGFyOwordHlwZWRlZiBtb25leV9nZXQ8Y2hhciwgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+ID4gbW9uZXlfZ2V0X2NoYXJfMjsKK3R5cGVkZWYgbW9uZXlfcHV0PGNoYXIsIG9zdHJlYW1idWZfaXRlcmF0b3I8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiA+IG1vbmV5X3B1dF9jaGFyXzI7CisKKy8vX19ERUNMQVJFX0lOU1RBTkNFKGxvY2FsZTo6aWQsIG1vbmV5X2dldF9jaGFyOjppZCwgKTsKKy8vX19ERUNMQVJFX0lOU1RBTkNFKGxvY2FsZTo6aWQsIG1vbmV5X3B1dF9jaGFyOjppZCwgKTsKK19fREVDTEFSRV9JTlNUQU5DRShsb2NhbGU6OmlkLCBtb25leV9nZXRfY2hhcl8yOjppZCwgKTsKK19fREVDTEFSRV9JTlNUQU5DRShsb2NhbGU6OmlkLCBtb25leV9wdXRfY2hhcl8yOjppZCwgKTsKKworIyAgaWZuZGVmIF9TVExQX05PX1dDSEFSX1QKKworLy90eXBlZGVmIG1vbmV5X2dldDx3Y2hhcl90LCBjb25zdCB3Y2hhcl90Kj4gbW9uZXlfZ2V0X3djaGFyX3Q7CisvL3R5cGVkZWYgbW9uZXlfZ2V0PHdjaGFyX3QsIGlzdHJlYW1idWZfaXRlcmF0b3I8d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPiA+IG1vbmV5X2dldF93Y2hhcl90XzI7Cit0eXBlZGVmIG1vbmV5X3B1dDx3Y2hhcl90LCB3Y2hhcl90Kj4gbW9uZXlfcHV0X3djaGFyX3Q7Cit0eXBlZGVmIG1vbmV5X3B1dDx3Y2hhcl90LCBvc3RyZWFtYnVmX2l0ZXJhdG9yPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4gPiBtb25leV9wdXRfd2NoYXJfdF8yOworCisvL19fREVDTEFSRV9JTlNUQU5DRShsb2NhbGU6OmlkLCBtb25leV9nZXRfd2NoYXJfdDo6aWQsICk7CisvL19fREVDTEFSRV9JTlNUQU5DRShsb2NhbGU6OmlkLCBtb25leV9wdXRfd2NoYXJfdDo6aWQsICk7CitfX0RFQ0xBUkVfSU5TVEFOQ0UobG9jYWxlOjppZCwgbW9uZXlfZ2V0X3djaGFyX3RfMjo6aWQsICk7CitfX0RFQ0xBUkVfSU5TVEFOQ0UobG9jYWxlOjppZCwgbW9uZXlfcHV0X3djaGFyX3RfMjo6aWQsICk7CisKKyMgIGVuZGlmCisjZW5kaWYgLyogKCBfU1RMUF9TVEFUSUNfVEVNUExBVEVfREFUQSA+IDAgKSAqLworCisvLyBtb25leV9nZXQgZmFjZXRzCisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKworLy8gaGVscGVyIGZ1bmN0aW9ucyBmb3IgZG9fZ2V0Cit0ZW1wbGF0ZSA8Y2xhc3MgX0luSXQxLCBjbGFzcyBfSW5JdDI+CitwYWlyPF9Jbkl0MSwgYm9vbD4gX19nZXRfc3RyaW5nKCBfSW5JdDEgX19maXJzdCwgX0luSXQxIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Jbkl0MiBfX3N0cl9maXJzdCwgX0luSXQyIF9fc3RyX2xhc3QpIHsKKyAgd2hpbGUgKCBfX2ZpcnN0ICE9IF9fbGFzdCAmJiBfX3N0cl9maXJzdCAhPSBfX3N0cl9sYXN0ICYmICpfX2ZpcnN0ID09ICpfX3N0cl9maXJzdCApIHsKKyAgICArK19fZmlyc3Q7CisgICAgKytfX3N0cl9maXJzdDsKKyAgfQorICByZXR1cm4gbWFrZV9wYWlyKF9fZmlyc3QsIF9fc3RyX2ZpcnN0ID09IF9fc3RyX2xhc3QpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0luSXQsIGNsYXNzIF9PdUl0LCBjbGFzcyBfQ2hhclQ+Citib29sCitfX2dldF9tb25ldGFyeV92YWx1ZShfSW5JdCYgX19maXJzdCwgX0luSXQgX19sYXN0LCBfT3VJdCBfX291dF9pdGUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdHlwZTxfQ2hhclQ+JiBfY190eXBlLAorICAgICAgICAgICAgICAgICAgICAgX0NoYXJUIF9fcG9pbnQsIGludCBfX2ZyYWNfZGlnaXRzLCBfQ2hhclQgX19zZXAsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIF9fZ3JvdXBpbmcsIGJvb2wgJl9fc3ludGF4X29rKSB7CisgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCB8fCAhX2NfdHlwZS5pcyhjdHlwZV9iYXNlOjpkaWdpdCwgKl9fZmlyc3QpKQorICAgIHJldHVybiBmYWxzZTsKKworICBjaGFyIF9fZ3JvdXBfc2l6ZXNbMTI4XTsKKyAgY2hhciogX19ncm91cF9zaXplc19lbmQgPSBfX2dyb3VwaW5nLmVtcHR5KCk/IDAgOiBfX2dyb3VwX3NpemVzOworICBjaGFyICAgX19jdXJyZW50X2dyb3VwX3NpemUgPSAwOworCisgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkgeworICAgIGlmIChfY190eXBlLmlzKGN0eXBlX2Jhc2U6OmRpZ2l0LCAqX19maXJzdCkpIHsKKyAgICAgICsrX19jdXJyZW50X2dyb3VwX3NpemU7CisgICAgICAqX19vdXRfaXRlKysgPSAqX19maXJzdCsrOworICAgIH0KKyAgICBlbHNlIGlmIChfX2dyb3VwX3NpemVzX2VuZCkgeworICAgICAgaWYgKCpfX2ZpcnN0ID09IF9fc2VwKSB7CisgICAgICAgICpfX2dyb3VwX3NpemVzX2VuZCsrID0gX19jdXJyZW50X2dyb3VwX3NpemU7CisgICAgICAgIF9fY3VycmVudF9ncm91cF9zaXplID0gMDsKKyAgICAgICAgKytfX2ZpcnN0OworICAgICAgfQorICAgICAgZWxzZSBicmVhazsKKyAgICB9CisgICAgZWxzZQorICAgICAgYnJlYWs7CisgIH0KKworICBpZiAoX19ncm91cGluZy5lbXB0eSgpKQorICAgIF9fc3ludGF4X29rID0gdHJ1ZTsKKyAgZWxzZSB7CisgICAgaWYgKF9fZ3JvdXBfc2l6ZXNfZW5kICE9IF9fZ3JvdXBfc2l6ZXMpCisgICAgICAqX19ncm91cF9zaXplc19lbmQrKyA9IF9fY3VycmVudF9ncm91cF9zaXplOworCisgICAgX19zeW50YXhfb2sgPSBfX3ZhbGlkX2dyb3VwaW5nKF9fZ3JvdXBfc2l6ZXMsIF9fZ3JvdXBfc2l6ZXNfZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2dyb3VwaW5nLmRhdGEoKSwgX19ncm91cGluZy5kYXRhKCkrIF9fZ3JvdXBpbmcuc2l6ZSgpKTsKKworICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCB8fCAqX19maXJzdCAhPSBfX3BvaW50KSB7CisgICAgICBmb3IgKGludCBfX2RpZ2l0cyA9IDA7IF9fZGlnaXRzICE9IF9fZnJhY19kaWdpdHM7ICsrX19kaWdpdHMpCisgICAgICAgICpfX291dF9pdGUrKyA9IF9DaGFyVCgnMCcpOworICAgICAgcmV0dXJuIHRydWU7IC8vIE9LIG5vdCB0byBoYXZlIGRlY2ltYWwgcG9pbnQKKyAgICB9CisgIH0KKworICArK19fZmlyc3Q7CisKKyAgaW50IF9fZGlnaXRzID0gMDsKKworICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QgJiYgX2NfdHlwZS5pcyhjdHlwZV9iYXNlOjpkaWdpdCwgKl9fZmlyc3QpKSB7CisgICAgICAqX19vdXRfaXRlKysgPSAqX19maXJzdCsrOworICAgICArK19fZGlnaXRzOworICB9CisKKyAgX19zeW50YXhfb2sgPSBfX3N5bnRheF9vayAmJiAoX19kaWdpdHMgPT0gX19mcmFjX2RpZ2l0cyk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX1N0clR5cGU+CitfSW5wdXRJdGVyIF9fbW9uZXlfZG9fZ2V0KF9JbnB1dEl0ZXIgX19zLCBfSW5wdXRJdGVyIF9fZW5kLCBib29sICBfX2ludGwsCisgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZSYgIF9fc3RyLCBpb3NfYmFzZTo6aW9zdGF0ZSYgIF9fZXJyLAorICAgICAgICAgICAgICAgICAgICAgX1N0clR5cGUmIF9fZGlnaXRzLCBib29sICZfX2lzX3Bvc2l0aXZlLCBfQ2hhclQqIC8qX19kdW1teSovKSB7CisgIGlmIChfX3MgPT0gX19lbmQpIHsKKyAgICBfX2VyciB8PSBpb3NfYmFzZTo6ZW9mYml0OworICAgIHJldHVybiBfX3M7CisgIH0KKworICB0eXBlZGVmIF9DaGFyVCBjaGFyX3R5cGU7CisgIHR5cGVkZWYgX1N0clR5cGUgc3RyaW5nX3R5cGU7CisgIHR5cGVkZWYgX0lucHV0SXRlciBpdGVyX3R5cGU7CisgIHR5cGVkZWYgbW9uZXlwdW5jdDxjaGFyX3R5cGUsIGZhbHNlPiBfUHVuY3Q7CisgIHR5cGVkZWYgbW9uZXlwdW5jdDxjaGFyX3R5cGUsIHRydWU+ICBfUHVuY3RfaW50bDsKKyAgdHlwZWRlZiBjdHlwZTxjaGFyX3R5cGU+ICAgICAgICAgICAgIF9DdHlwZTsKKworICBsb2NhbGUgX19sb2MgPSBfX3N0ci5nZXRsb2MoKTsKKyAgY29uc3QgX1B1bmN0JiAgICAgIF9fcHVuY3QgICAgICA9IHVzZV9mYWNldDxfUHVuY3Q+KF9fbG9jKSA7CisgIGNvbnN0IF9QdW5jdF9pbnRsJiBfX3B1bmN0X2ludGwgPSB1c2VfZmFjZXQ8X1B1bmN0X2ludGw+KF9fbG9jKSA7CisgIGNvbnN0IF9DdHlwZSYgICAgICBfX2NfdHlwZSAgICAgPSB1c2VfZmFjZXQ8X0N0eXBlPihfX2xvYykgOworCisgIG1vbmV5X2Jhc2U6OnBhdHRlcm4gX19mb3JtYXQgPSBfX2ludGwgPyBfX3B1bmN0X2ludGwubmVnX2Zvcm1hdCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfX3B1bmN0Lm5lZ19mb3JtYXQoKTsKKyAgc3RyaW5nX3R5cGUgX19ucyA9IF9faW50bCA/IF9fcHVuY3RfaW50bC5uZWdhdGl2ZV9zaWduKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF9fcHVuY3QubmVnYXRpdmVfc2lnbigpOworICBzdHJpbmdfdHlwZSBfX3BzID0gX19pbnRsID8gX19wdW5jdF9pbnRsLnBvc2l0aXZlX3NpZ24oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX19wdW5jdC5wb3NpdGl2ZV9zaWduKCk7CisgIGludCBfX2k7CisgIGJvb2wgX19zeW1ib2xfcmVxdWlyZWQgPSAoX19zdHIuZmxhZ3MoKSAmIGlvc19iYXNlOjpzaG93YmFzZSkgIT0gMDsKKyAgc3RyaW5nX3R5cGUgX19idWY7CisgIGJhY2tfaW5zZXJ0X2l0ZXJhdG9yPHN0cmluZ190eXBlPiBfX291dF9pdGUoX19idWYpOworCisgIGZvciAoX19pID0gMDsgX19pIDwgNDsgKytfX2kpIHsKKyAgICBzd2l0Y2ggKF9fZm9ybWF0LmZpZWxkW19faV0pIHsKKyAgICBjYXNlIG1vbmV5X2Jhc2U6Om5vbmU6CisgICAgICBpZiAoX19pID09IDMpIHsKKyAgICAgICAgaWYgKF9fY190eXBlLmlzKGN0eXBlX2Jhc2U6OnNwYWNlLCAqX19zKSkgeworICAgICAgICAgIF9fZXJyID0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisgICAgICAgICAgcmV0dXJuIF9fczsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHdoaWxlIChfX3MgIT0gX19lbmQgJiYgX19jX3R5cGUuaXMoY3R5cGVfYmFzZTo6c3BhY2UsICpfX3MpKQorICAgICAgICArK19fczsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgbW9uZXlfYmFzZTo6c3BhY2U6CisgICAgICBpZiAoIV9fY190eXBlLmlzKGN0eXBlX2Jhc2U6OnNwYWNlLCAqX19zKSkgeworICAgICAgICBfX2VyciA9IGlvc19iYXNlOjpmYWlsYml0OworICAgICAgICByZXR1cm4gX19zOworICAgICAgfQorICAgICAgKytfX3M7CisgICAgICB3aGlsZSAoX19zICE9IF9fZW5kICYmIF9fY190eXBlLmlzKGN0eXBlX2Jhc2U6OnNwYWNlLCAqX19zKSkKKyAgICAgICAgKytfX3M7CisgICAgICBicmVhazsKKyAgICBjYXNlIG1vbmV5X2Jhc2U6OnN5bWJvbDogeworICAgICAgc3RyaW5nX3R5cGUgX19jdXJzID0gX19pbnRsID8gX19wdW5jdF9pbnRsLmN1cnJfc3ltYm9sKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF9fcHVuY3QuY3Vycl9zeW1ib2woKTsKKyAgICAgIHBhaXI8aXRlcl90eXBlLCBib29sPgorICAgICAgX19yZXN1bHQgID0gX19nZXRfc3RyaW5nKF9fcywgX19lbmQsIF9fY3Vycy5iZWdpbigpLCBfX2N1cnMuZW5kKCkpOworICAgICAgaWYgKCFfX3Jlc3VsdC5zZWNvbmQgJiYgX19zeW1ib2xfcmVxdWlyZWQpCisgICAgICAgIF9fZXJyID0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisgICAgICBfX3MgPSBfX3Jlc3VsdC5maXJzdDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIG1vbmV5X2Jhc2U6OnNpZ246IHsKKyAgICAgIGlmIChfX3MgPT0gX19lbmQpIHsKKyAgICAgICAgaWYgKF9fcHMuZW1wdHkoKSkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKF9fbnMuZW1wdHkoKSkgeworICAgICAgICAgIF9faXNfcG9zaXRpdmUgPSBmYWxzZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBfX2VyciA9IGlvc19iYXNlOjpmYWlsYml0OworICAgICAgICByZXR1cm4gX19zOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGlmIChfX3BzLmVtcHR5KCkpIHsKKyAgICAgICAgICBpZiAoX19ucy5lbXB0eSgpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgaWYgKCpfX3MgPT0gX19uc1swXSkgeworICAgICAgICAgICAgKytfX3M7CisgICAgICAgICAgICBfX2lzX3Bvc2l0aXZlID0gZmFsc2U7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIGlmICgqX19zID09IF9fcHNbMF0pIHsKKyAgICAgICAgICAgICsrX19zOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChfX25zLmVtcHR5KCkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBpZiAoKl9fcyA9PSBfX25zWzBdKSB7CisgICAgICAgICAgICArK19fczsKKyAgICAgICAgICAgIF9faXNfcG9zaXRpdmUgPSBmYWxzZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBfX2VyciA9IGlvc19iYXNlOjpmYWlsYml0OworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gX19zOworICAgIH0KKyAgICBjYXNlIG1vbmV5X2Jhc2U6OnZhbHVlOiB7CisgICAgICBjaGFyX3R5cGUgX19wb2ludCA9IF9faW50bCA/IF9fcHVuY3RfaW50bC5kZWNpbWFsX3BvaW50KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX19wdW5jdC5kZWNpbWFsX3BvaW50KCk7CisgICAgICBpbnQgX19mcmFjX2RpZ2l0cyA9IF9faW50bCA/IF9fcHVuY3RfaW50bC5mcmFjX2RpZ2l0cygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF9fcHVuY3QuZnJhY19kaWdpdHMoKTsKKyAgICAgIHN0cmluZyBfX2dyb3VwaW5nID0gX19pbnRsID8gX19wdW5jdF9pbnRsLmdyb3VwaW5nKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX19wdW5jdC5ncm91cGluZygpOworICAgICAgYm9vbCBfX3N5bnRheF9vayA9IHRydWU7CisKKyAgICAgIGJvb2wgX19yZXN1bHQ7CisKKyAgICAgIGNoYXJfdHlwZSBfX3NlcCA9IF9fZ3JvdXBpbmcuZW1wdHkoKSA/IGNoYXJfdHlwZSgpIDoKKyAgICAgIF9faW50bCA/IF9fcHVuY3RfaW50bC50aG91c2FuZHNfc2VwKCkgOiBfX3B1bmN0LnRob3VzYW5kc19zZXAoKTsKKworICAgICAgX19yZXN1bHQgPSBfX2dldF9tb25ldGFyeV92YWx1ZShfX3MsIF9fZW5kLCBfX291dF9pdGUsIF9fY190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3BvaW50LCBfX2ZyYWNfZGlnaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3NlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19ncm91cGluZywgX19zeW50YXhfb2spOworCisgICAgICBpZiAoIV9fc3ludGF4X29rKQorICAgICAgICBfX2VyciB8PSBpb3NfYmFzZTo6ZmFpbGJpdDsKKyAgICAgIGlmICghX19yZXN1bHQpIHsKKyAgICAgICAgX19lcnIgPSBpb3NfYmFzZTo6ZmFpbGJpdDsKKyAgICAgICAgcmV0dXJuIF9fczsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsb3NlIG1vbmV5X2Jhc2U6OnZhbHVlIGNhc2UKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2xvc2Ugc3dpdGNoIHN0YXRlbWVudAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDbG9zZSBmb3IgbG9vcAorCisgIGlmIChfX2lzX3Bvc2l0aXZlKSB7CisgICAgaWYgKF9fcHMuc2l6ZSgpID4gMSkgeworICAgICAgcGFpcjxfSW5wdXRJdGVyLCBib29sPgorICAgICAgICBfX3Jlc3VsdCA9IF9fZ2V0X3N0cmluZyhfX3MsIF9fZW5kLCBfX3BzLmJlZ2luKCkgKyAxLCBfX3BzLmVuZCgpKTsKKyAgICAgIF9fcyA9IF9fcmVzdWx0LmZpcnN0OworICAgICAgaWYgKCFfX3Jlc3VsdC5zZWNvbmQpCisgICAgICAgIF9fZXJyIHw9IGlvczo6ZmFpbGJpdDsKKyAgICB9CisgICAgaWYgKCEoX19lcnIgJiBpb3NfYmFzZTo6ZmFpbGJpdCkpCisgICAgICBfX2RpZ2l0cyA9IF9fYnVmOworICB9CisgIGVsc2UgeworICAgIGlmIChfX25zLnNpemUoKSA+IDEpIHsKKyAgICAgIHBhaXI8X0lucHV0SXRlciwgYm9vbD4KKyAgICAgICAgX19yZXN1bHQgPSBfX2dldF9zdHJpbmcoX19zLCBfX2VuZCwgX19ucy5iZWdpbigpICsgMSwgX19ucy5lbmQoKSk7CisgICAgICBfX3MgPSBfX3Jlc3VsdC5maXJzdDsKKyAgICAgIGlmICghX19yZXN1bHQuc2Vjb25kKQorICAgICAgICBfX2VyciB8PSBpb3M6OmZhaWxiaXQ7CisgICAgfQorICAgIGlmICghKF9fZXJyICYgaW9zOjpmYWlsYml0KSkgeworICAgICAgX19kaWdpdHMgPSBfX2NfdHlwZS53aWRlbignLScpOworICAgICAgX19kaWdpdHMgKz0gX19idWY7CisgICAgfQorICB9CisgIGlmIChfX3MgPT0gX19lbmQpCisgICAgX19lcnIgfD0gaW9zOjplb2ZiaXQ7CisKKyAgcmV0dXJuIF9fczsKK30KKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKKy8vPT09PT0gbWV0aG9kcyA9PT09PT0KK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9JbnB1dEl0ZXI+CitfSW5wdXRJdGVyCittb25leV9nZXQ8X0NoYXJULCBfSW5wdXRJdGVyPjo6ZG9fZ2V0KF9JbnB1dEl0ZXIgX19zLCBfSW5wdXRJdGVyICBfX2VuZCwgYm9vbCAgX19pbnRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZSYgIF9fc3RyLCBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX0xPTkdFU1RfRkxPQVRfVFlQRSYgX191bml0cykgY29uc3QgeworICBzdHJpbmdfdHlwZSBfX2J1ZjsKKyAgYm9vbCBfX2lzX3Bvc2l0aXZlID0gdHJ1ZTsKKyAgX19zID0gX1NUTFBfUFJJViBfX21vbmV5X2RvX2dldChfX3MsIF9fZW5kLCBfX2ludGwsIF9fc3RyLCBfX2VyciwgX19idWYsIF9faXNfcG9zaXRpdmUsIChfQ2hhclQqKTApOworCisgIGlmIChfX2VyciA9PSBpb3NfYmFzZTo6Z29vZGJpdCB8fCBfX2VyciA9PSBpb3NfYmFzZTo6ZW9mYml0KSB7CisgICAgdHlwZW5hbWUgc3RyaW5nX3R5cGU6Oml0ZXJhdG9yIF9fYiA9IF9fYnVmLmJlZ2luKCksIF9fZSA9IF9fYnVmLmVuZCgpOworCisgICAgaWYgKCFfX2lzX3Bvc2l0aXZlKSArK19fYjsKKyAgICAvLyBDYW4ndCB1c2UgYXRvbGQsIHNpbmNlIGl0IG1pZ2h0IGJlIHdjaGFyX3QuIERvbid0IGdldCBjb25mdXNlZCBieSBuYW1lIGJlbG93IDoKKyAgICAvLyBpdCdzIHBlcmZlY3RseSBjYXBhYmxlIG9mIHJlYWRpbmcgbG9uZyBkb3VibGUuCisgICAgX1NUTFBfUFJJViBfX2dldF9kZWNpbWFsX2ludGVnZXIoX19iLCBfX2UsIF9fdW5pdHMsIChfQ2hhclQqKTApOworCisgICAgaWYgKCFfX2lzX3Bvc2l0aXZlKSB7CisgICAgICBfX3VuaXRzID0gLV9fdW5pdHM7CisgICAgfQorICB9CisKKyAgcmV0dXJuIF9fczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0lucHV0SXRlcj4KK19JbnB1dEl0ZXIKK21vbmV5X2dldDxfQ2hhclQsIF9JbnB1dEl0ZXI+Ojpkb19nZXQoaXRlcl90eXBlIF9fcywgaXRlcl90eXBlICBfX2VuZCwgYm9vbCAgX19pbnRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZSYgIF9fc3RyLCBpb3NfYmFzZTo6aW9zdGF0ZSYgIF9fZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdHlwZSYgX19kaWdpdHMpIGNvbnN0IHsKKyAgYm9vbCBfX2lzX3Bvc2l0aXZlID0gdHJ1ZTsKKyAgcmV0dXJuIF9TVExQX1BSSVYgX19tb25leV9kb19nZXQoX19zLCBfX2VuZCwgX19pbnRsLCBfX3N0ciwgX19lcnIsIF9fZGlnaXRzLCBfX2lzX3Bvc2l0aXZlLCAoX0NoYXJUKikwKTsKK30KKworLy8gbW9uZXlfcHV0IGZhY2V0cworCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9PdXRwdXRJdGVyLCBjbGFzcyBfU3RyX1R5cGUsIGNsYXNzIF9TdHI+CitfT3V0cHV0SXRlciBfX21vbmV5X2RvX3B1dChfT3V0cHV0SXRlciBfX3MsIGJvb2wgIF9faW50bCwgaW9zX2Jhc2UmICBfX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DaGFyVCBfX2ZpbGwsIGNvbnN0IF9TdHImIF9fZGlnaXRzLCBib29sIF9fY2hlY2tfZGlnaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX1N0cl9UeXBlICogLypfX2R1bW15Ki8pIHsKKyAgdHlwZWRlZiBfQ2hhclQgY2hhcl90eXBlOworICB0eXBlZGVmIF9TdHJfVHlwZSBzdHJpbmdfdHlwZTsKKyAgdHlwZWRlZiBjdHlwZTxjaGFyX3R5cGU+ICAgICAgICAgICAgIF9DdHlwZTsKKyAgdHlwZWRlZiBtb25leXB1bmN0PGNoYXJfdHlwZSwgZmFsc2U+IF9QdW5jdDsKKyAgdHlwZWRlZiBtb25leXB1bmN0PGNoYXJfdHlwZSwgdHJ1ZT4gIF9QdW5jdF9pbnRsOworCisgIGxvY2FsZSBfX2xvYyA9IF9fc3RyLmdldGxvYygpOworICBjb25zdCBfQ3R5cGUmICAgICAgX19jX3R5cGUgICAgID0gdXNlX2ZhY2V0PF9DdHlwZT4oX19sb2MpIDsKKyAgY29uc3QgX1B1bmN0JiAgICAgIF9fcHVuY3QgICAgICA9IHVzZV9mYWNldDxfUHVuY3Q+KF9fbG9jKSA7CisgIGNvbnN0IF9QdW5jdF9pbnRsJiBfX3B1bmN0X2ludGwgPSB1c2VfZmFjZXQ8X1B1bmN0X2ludGw+KF9fbG9jKSA7CisKKyAgLy8gc29tZSBzcGVjaWFsIGNoYXJhY3RlcnMKKyAgY2hhcl90eXBlIF9fbWludXMgPSBfX2NfdHlwZS53aWRlbignLScpOworICBjaGFyX3R5cGUgX19wbHVzICA9IF9fY190eXBlLndpZGVuKCcrJyk7CisgIGNoYXJfdHlwZSBfX3NwYWNlID0gX19jX3R5cGUud2lkZW4oJyAnKTsKKyAgY2hhcl90eXBlIF9femVybyAgPSBfX2NfdHlwZS53aWRlbignMCcpOworICBjaGFyX3R5cGUgX19wb2ludCA9IF9faW50bCA/IF9fcHVuY3RfaW50bC5kZWNpbWFsX3BvaW50KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfX3B1bmN0LmRlY2ltYWxfcG9pbnQoKTsKKworICBjaGFyX3R5cGUgX19zZXAgPSBfX2ludGwgPyBfX3B1bmN0X2ludGwudGhvdXNhbmRzX3NlcCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF9fcHVuY3QudGhvdXNhbmRzX3NlcCgpOworCisgIHN0cmluZyBfX2dyb3VwaW5nID0gX19pbnRsID8gX19wdW5jdF9pbnRsLmdyb3VwaW5nKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfX3B1bmN0Lmdyb3VwaW5nKCk7CisKKyAgaW50IF9fZnJhY19kaWdpdHMgICAgICA9IF9faW50bCA/IF9fcHVuY3RfaW50bC5mcmFjX2RpZ2l0cygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfX3B1bmN0LmZyYWNfZGlnaXRzKCk7CisKKyAgc3RyaW5nX3R5cGUgX19jdXJyX3N5bSA9IF9faW50bCA/IF9fcHVuY3RfaW50bC5jdXJyX3N5bWJvbCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfX3B1bmN0LmN1cnJfc3ltYm9sKCk7CisKKyAgLy8gaWYgdGhlcmUgYXJlIG5vIGRpZ2l0cyB3ZSBhcmUgZ29pbmcgdG8gcmV0dXJuIF9fcy4gIElmIHRoZXJlCisgIC8vIGFyZSBkaWdpdHMsIGJ1dCBub3QgZW5vdWdoIHRvIGZpbGwgdGhlIGZyYWNfZGlnaXRzLCB3ZSBhcmUKKyAgLy8gZ29pbmcgdG8gYWRkIHplcm9zLiAgSSBkb24ndCBrbm93IHdoZXRoZXIgdGhpcyBpcyByaWdodCBvcgorICAvLyBub3QuCisgIGlmIChfX2RpZ2l0cy5lbXB0eSgpKQorICAgIHJldHVybiBfX3M7CisKKyAgdHlwZW5hbWUgc3RyaW5nX3R5cGU6OmNvbnN0X2l0ZXJhdG9yIF9fZGlnaXRzX2ZpcnN0ID0gX19kaWdpdHMuYmVnaW4oKTsKKyAgdHlwZW5hbWUgc3RyaW5nX3R5cGU6OmNvbnN0X2l0ZXJhdG9yIF9fZGlnaXRzX2xhc3QgID0gX19kaWdpdHMuZW5kKCk7CisKKyAgYm9vbCBfX2lzX25lZ2F0aXZlID0gKl9fZGlnaXRzX2ZpcnN0ID09IF9fbWludXM7CisgIGlmIChfX2lzX25lZ2F0aXZlKQorICAgICsrX19kaWdpdHNfZmlyc3Q7CisKKyNpZiAhZGVmaW5lZCAoX19CT1JMQU5EQ19fKQorICBzdHJpbmdfdHlwZSBfX3NpZ24gPSBfX2ludGwgPyBfX2lzX25lZ2F0aXZlID8gX19wdW5jdF9pbnRsLm5lZ2F0aXZlX3NpZ24oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX19wdW5jdF9pbnRsLnBvc2l0aXZlX3NpZ24oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfX2lzX25lZ2F0aXZlID8gX19wdW5jdC5uZWdhdGl2ZV9zaWduKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF9fcHVuY3QucG9zaXRpdmVfc2lnbigpOworI2Vsc2UKKyAgc3RyaW5nX3R5cGUgX19zaWduOworICBpZiAoX19pbnRsKSB7CisgICAgaWYgKF9faXNfbmVnYXRpdmUpCisgICAgICBfX3NpZ24gPSBfX3B1bmN0X2ludGwubmVnYXRpdmVfc2lnbigpOworICAgIGVsc2UKKyAgICAgIF9fc2lnbiA9IF9fcHVuY3RfaW50bC5wb3NpdGl2ZV9zaWduKCk7CisgIH0KKyAgZWxzZSB7CisgICAgaWYgKF9faXNfbmVnYXRpdmUpCisgICAgICBfX3NpZ24gPSBfX3B1bmN0Lm5lZ2F0aXZlX3NpZ24oKTsKKyAgICBlbHNlCisgICAgICBfX3NpZ24gPSBfX3B1bmN0LnBvc2l0aXZlX3NpZ24oKTsKKyAgfQorI2VuZGlmCisKKyAgaWYgKF9fY2hlY2tfZGlnaXRzKSB7CisgICAgdHlwZW5hbWUgc3RyaW5nX3R5cGU6OmNvbnN0X2l0ZXJhdG9yIF9fY3AgPSBfX2RpZ2l0c19maXJzdDsKKyAgICB3aGlsZSAoX19jcCAhPSBfX2RpZ2l0c19sYXN0ICYmIF9fY190eXBlLmlzKGN0eXBlX2Jhc2U6OmRpZ2l0LCAqX19jcCkpCisgICAgICArK19fY3A7CisgICAgaWYgKF9fY3AgPT0gX19kaWdpdHNfZmlyc3QpCisgICAgICByZXR1cm4gX19zOworICAgIF9fZGlnaXRzX2xhc3QgPSBfX2NwOworICB9CisKKyAgLy8gSWYgZ3JvdXBpbmcgaXMgcmVxdWlyZWQsIHdlIG1ha2UgYSBjb3B5IG9mIF9fZGlnaXRzIGFuZAorICAvLyBpbnNlcnQgdGhlIGdyb3VwaW5nLgorICBfU1RMUF9CQVNJQ19JT1NUUklORyhjaGFyX3R5cGUpIF9fbmV3X2RpZ2l0czsKKyAgaWYgKCFfX2dyb3VwaW5nLmVtcHR5KCkpIHsKKyAgICBfX25ld19kaWdpdHMuYXNzaWduKF9fZGlnaXRzX2ZpcnN0LCBfX2RpZ2l0c19sYXN0KTsKKyAgICBfX2luc2VydF9ncm91cGluZyhfX25ld19kaWdpdHMsCisgICAgICAgICAgICAgICAgICAgICAgX19uZXdfZGlnaXRzLnNpemUoKSAtIF9fZnJhY19kaWdpdHMsCisgICAgICAgICAgICAgICAgICAgICAgX19ncm91cGluZywKKyAgICAgICAgICAgICAgICAgICAgICBfX3NlcCwgX19wbHVzLCBfX21pbnVzLCAwKTsKKyAgICBfX2RpZ2l0c19maXJzdCA9IF9fbmV3X2RpZ2l0cy5iZWdpbigpOyAvLyA8PC0tCisgICAgX19kaWdpdHNfbGFzdCAgPSBfX25ld19kaWdpdHMuZW5kKCk7ICAgLy8gPDwtLQorICB9CisKKyAgLy8gRGV0ZXJtaW5lIHRoZSBhbW91bnQgb2YgcGFkZGluZyByZXF1aXJlZCwgaWYgYW55LgorICBzdHJlYW1zaXplIF9fd2lkdGggPSBfX3N0ci53aWR0aCgpOworCisjaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpICYmIChkZWZpbmVkKF9fSFBfYUNDKSAmJiAoX19IUF9hQ0MgPD0gMSkpCisgIHNpemVfdCBfX3ZhbHVlX2xlbmd0aCA9IG9wZXJhdG9yIC0oX19kaWdpdHNfbGFzdCwgX19kaWdpdHNfZmlyc3QpOworI2Vsc2UKKyAgc2l6ZV90IF9fdmFsdWVfbGVuZ3RoID0gX19kaWdpdHNfbGFzdCAtIF9fZGlnaXRzX2ZpcnN0OworI2VuZGlmCisKKyAgc2l6ZV90IF9fbGVuZ3RoID0gX192YWx1ZV9sZW5ndGggKyBfX3NpZ24uc2l6ZSgpOworCisgIGlmIChfX2ZyYWNfZGlnaXRzICE9IDApCisgICAgKytfX2xlbmd0aDsKKworICBib29sIF9fZ2VuZXJhdGVfY3VyciA9IChfX3N0ci5mbGFncygpICYgaW9zX2Jhc2U6OnNob3diYXNlKSAhPTA7CisgIGlmIChfX2dlbmVyYXRlX2N1cnIpCisgICAgX19sZW5ndGggKz0gX19jdXJyX3N5bS5zaXplKCk7CisgIG1vbmV5X2Jhc2U6OnBhdHRlcm4gX19mb3JtYXQgPSBfX2ludGwgPyAoX19pc19uZWdhdGl2ZSA/IF9fcHVuY3RfaW50bC5uZWdfZm9ybWF0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX19wdW5jdF9pbnRsLnBvc19mb3JtYXQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChfX2lzX25lZ2F0aXZlID8gX19wdW5jdC5uZWdfZm9ybWF0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX19wdW5jdC5wb3NfZm9ybWF0KCkpOworICB7CisgICAgLy9Gb3IgdGhlIG1vbWVudCB0aGUgZm9sbG93aW5nIGlzIGNvbW1lbnRlZCBmb3IgZGVjb2RpbmcgcmVhc29uLgorICAgIC8vTm8gcmVhc29uIHRvIGFkZCBhIHNwYWNlIGxhc3QgaWYgdGhlIG1vbmV5IHN5bWJvbCBkbyBub3QgaGF2ZSB0byBiZSBkaXNwbGF5CisgICAgLy9pZiAoX19mb3JtYXQuZmllbGRbM10gPT0gKGNoYXIpIG1vbmV5X2Jhc2U6OnN5bWJvbCAmJiAhX19nZW5lcmF0ZV9jdXJyKSB7CisgICAgLy8gIGlmIChfX2Zvcm1hdC5maWVsZFsyXSA9PSAoY2hhcikgbW9uZXlfYmFzZTo6c3BhY2UpIHsKKyAgICAvLyAgICBfX2Zvcm1hdC5maWVsZFsyXSA9IChjaGFyKSBtb25leV9iYXNlOjpub25lOworICAgIC8vICB9CisgICAgLy99CisgICAgLy9zcGFjZSBjYW4gb25seSBiZSBzZWNvbmQgb3IgdGhpcmQgYW5kIG9ubHkgb25jZSAoMjIuMi42LjMtMSk6CisgICAgaWYgKChfX2Zvcm1hdC5maWVsZFsxXSA9PSAoY2hhcikgbW9uZXlfYmFzZTo6c3BhY2UpIHx8CisgICAgICAgIChfX2Zvcm1hdC5maWVsZFsyXSA9PSAoY2hhcikgbW9uZXlfYmFzZTo6c3BhY2UpKQorICAgICAgKytfX2xlbmd0aDsKKyAgfQorCisgIGNvbnN0IGJvb2wgX19uZWVkX2ZpbGwgPSAoKChzaXplb2Yoc3RyZWFtc2l6ZSkgPiBzaXplb2Yoc2l6ZV90KSkgJiYgKF9fU1RBVElDX0NBU1Qoc3RyZWFtc2l6ZSwgX19sZW5ndGgpIDwgX193aWR0aCkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChzaXplb2Yoc3RyZWFtc2l6ZSkgPD0gc2l6ZW9mKHNpemVfdCkpICYmIChfX2xlbmd0aCA8IF9fU1RBVElDX0NBU1Qoc2l6ZV90LCBfX3dpZHRoKSkpKTsKKyAgc3RyZWFtc2l6ZSBfX2ZpbGxfYW10ID0gX19uZWVkX2ZpbGwgPyBfX3dpZHRoIC0gX19sZW5ndGggOiAwOworCisgIGlvc19iYXNlOjpmbXRmbGFncyBfX2ZpbGxfcG9zID0gX19zdHIuZmxhZ3MoKSAmIGlvc19iYXNlOjphZGp1c3RmaWVsZDsKKworICBpZiAoX19maWxsX2FtdCAhPSAwICYmCisgICAgICAhKF9fZmlsbF9wb3MgJiAoaW9zX2Jhc2U6OmxlZnQgfCBpb3NfYmFzZTo6aW50ZXJuYWwpKSkKKyAgICBfX3MgPSBfX2ZpbGxfbihfX3MsIF9fZmlsbF9hbXQsIF9fZmlsbCk7CisKKyAgZm9yIChpbnQgX19pID0gMDsgX19pIDwgNDsgKytfX2kpIHsKKyAgICBjaGFyIF9fZmZpZWxkID0gX19mb3JtYXQuZmllbGRbX19pXTsKKyAgICBzd2l0Y2ggKF9fZmZpZWxkKSB7CisgICAgICBjYXNlIG1vbmV5X2Jhc2U6Om5vbmU6CisgICAgICAgIGlmIChfX2ZpbGxfYW10ICE9IDAgJiYgX19maWxsX3BvcyA9PSBpb3NfYmFzZTo6aW50ZXJuYWwpCisgICAgICAgICAgX19zID0gX19maWxsX24oX19zLCBfX2ZpbGxfYW10LCBfX2ZpbGwpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgbW9uZXlfYmFzZTo6c3BhY2U6CisgICAgICAgICpfX3MrKyA9IF9fc3BhY2U7CisgICAgICAgIGlmIChfX2ZpbGxfYW10ICE9IDAgJiYgX19maWxsX3BvcyA9PSBpb3NfYmFzZTo6aW50ZXJuYWwpCisgICAgICAgICAgX19zID0gX19maWxsX24oX19zLCBfX2ZpbGxfYW10LCBfX2ZpbGwpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgbW9uZXlfYmFzZTo6c3ltYm9sOgorICAgICAgICBpZiAoX19nZW5lcmF0ZV9jdXJyKQorICAgICAgICAgIF9fcyA9IGNvcHkoX19jdXJyX3N5bS5iZWdpbigpLCBfX2N1cnJfc3ltLmVuZCgpLCBfX3MpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgbW9uZXlfYmFzZTo6c2lnbjoKKyAgICAgICAgaWYgKCFfX3NpZ24uZW1wdHkoKSkKKyAgICAgICAgICAqX19zKysgPSBfX3NpZ25bMF07CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBtb25leV9iYXNlOjp2YWx1ZToKKyAgICAgICAgaWYgKF9fZnJhY19kaWdpdHMgPT0gMCkgeworICAgICAgICAgIF9fcyA9IGNvcHkoX19kaWdpdHNfZmlyc3QsIF9fZGlnaXRzX2xhc3QsIF9fcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKChpbnQpX192YWx1ZV9sZW5ndGggPD0gX19mcmFjX2RpZ2l0cykgeworICAgICAgICAgICAgLy8gaWYgd2Ugc2VlICc5JyBoZXJlLCB3ZSBzaG91bGQgb3V0IDAuMDkKKyAgICAgICAgICAgICpfX3MrKyA9IF9femVybzsgIC8vIGludGVnZXIgcGFydCBpcyB6ZXJvCisgICAgICAgICAgICAqX19zKysgPSBfX3BvaW50OyAvLyBkZWNpbWFsIHBvaW50CisgICAgICAgICAgICBfX3MgPSAgX19maWxsX24oX19zLCBfX2ZyYWNfZGlnaXRzIC0gX192YWx1ZV9sZW5ndGgsIF9femVybyk7IC8vIHplcm9zCisgICAgICAgICAgICBfX3MgPSBjb3B5KF9fZGlnaXRzX2ZpcnN0LCBfX2RpZ2l0c19sYXN0LCBfX3MpOyAvLyBkaWdpdHMKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX19zID0gY29weShfX2RpZ2l0c19maXJzdCwgX19kaWdpdHNfbGFzdCAtIF9fZnJhY19kaWdpdHMsIF9fcyk7CisgICAgICAgICAgICBpZiAoX19mcmFjX2RpZ2l0cyAhPSAwKSB7CisgICAgICAgICAgICAgICpfX3MrKyA9IF9fcG9pbnQ7CisgICAgICAgICAgICAgIF9fcyA9IGNvcHkoX19kaWdpdHNfbGFzdCAtIF9fZnJhY19kaWdpdHMsIF9fZGlnaXRzX2xhc3QsIF9fcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0gLy9DbG9zZSBmb3Igc3dpdGNoCisgIH0gLy8gQ2xvc2UgZm9yIGxvb3AKKworICAvLyBPdXB1dCByZXN0IG9mIHNpZ24gaWYgbmVjZXNzYXJ5LgorICBpZiAoX19zaWduLnNpemUoKSA+IDEpCisgICAgX19zID0gY29weShfX3NpZ24uYmVnaW4oKSArIDEsIF9fc2lnbi5lbmQoKSwgX19zKTsKKyAgaWYgKF9fZmlsbF9hbXQgIT0gMCAmJgorICAgICAgIShfX2ZpbGxfcG9zICYgKGlvc19iYXNlOjpyaWdodCB8IGlvc19iYXNlOjppbnRlcm5hbCkpKQorICAgIF9fcyA9IF9fZmlsbF9uKF9fcywgX19maWxsX2FtdCwgX19maWxsKTsKKworICByZXR1cm4gX19zOworfQorCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX091dHB1dEl0ZXI+CitfT3V0cHV0SXRlcgorbW9uZXlfcHV0PF9DaGFyVCwgX091dHB1dEl0ZXI+CisgOjpkb19wdXQoX091dHB1dEl0ZXIgX19zLCBib29sIF9faW50bCwgaW9zX2Jhc2UmIF9fc3RyLAorICAgICAgICAgIGNoYXJfdHlwZSBfX2ZpbGwsIF9TVExQX0xPTkdFU1RfRkxPQVRfVFlQRSBfX3VuaXRzKSBjb25zdCB7CisgIF9TVExQX0JBU0lDX0lPU1RSSU5HKGNoYXJfdHlwZSkgX19kaWdpdHM7CisgIF9TVExQX1BSSVYgX19nZXRfbW9uZXlfZGlnaXRzKF9fZGlnaXRzLCBfX3N0ciwgX191bml0cyk7CisgIHJldHVybiBfU1RMUF9QUklWIF9fbW9uZXlfZG9fcHV0KF9fcywgX19pbnRsLCBfX3N0ciwgX19maWxsLCBfX2RpZ2l0cywgZmFsc2UsIF9fU1RBVElDX0NBU1Qoc3RyaW5nX3R5cGUqLCAwKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9PdXRwdXRJdGVyPgorX091dHB1dEl0ZXIKK21vbmV5X3B1dDxfQ2hhclQsIF9PdXRwdXRJdGVyPgorIDo6ZG9fcHV0KF9PdXRwdXRJdGVyIF9fcywgYm9vbCBfX2ludGwsIGlvc19iYXNlJiBfX3N0ciwKKyAgICAgICAgICBjaGFyX3R5cGUgX19maWxsLCBjb25zdCBzdHJpbmdfdHlwZSYgX19kaWdpdHMpIGNvbnN0IHsKKyAgcmV0dXJuIF9TVExQX1BSSVYgX19tb25leV9kb19wdXQoX19zLCBfX2ludGwsIF9fc3RyLCBfX2ZpbGwsIF9fZGlnaXRzLCB0cnVlLCBfX1NUQVRJQ19DQVNUKHN0cmluZ190eXBlKiwgMCkpOworfQorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNlbmRpZiAvKiBfU1RMUF9NT05FVEFSWV9DICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvX21vbmV0YXJ5LmggYi9zdGwvX21vbmV0YXJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA2ZjJlOAotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9fbW9uZXRhcnkuaApAQCAtMCwwICsxLDQ2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKy8vIFdBUk5JTkc6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIEMrKworLy8gc3RhbmRhcmQgbGlicmFyeSBoZWFkZXJzLiAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgdGhpcyBoZWFkZXIKKy8vIGZpbGUgZGlyZWN0bHkuCisKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9NT05FVEFSWV9ICisjZGVmaW5lIF9TVExQX0lOVEVSTkFMX01PTkVUQVJZX0gKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DVFlQRV9ICisjICBpbmNsdWRlIDxzdGwvX2N0eXBlLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9PU1RSRUFNQlVGX0lURVJBVE9SX0gKKyMgIGluY2x1ZGUgPHN0bC9fb3N0cmVhbWJ1Zl9pdGVyYXRvci5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfSVNUUkVBTUJVRl9JVEVSQVRPUl9ICisjICBpbmNsdWRlIDxzdGwvX2lzdHJlYW1idWZfaXRlcmF0b3IuaD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworY2xhc3MgbW9uZXlfYmFzZSB7CitwdWJsaWM6CisgIGVudW0gcGFydCB7bm9uZSwgc3BhY2UsIHN5bWJvbCwgc2lnbiwgdmFsdWV9OworICBzdHJ1Y3QgcGF0dGVybiB7CisgICAgY2hhciBmaWVsZFs0XTsKKyAgfTsKK307CisKKy8vIG1vbmV5cHVuY3QgZmFjZXRzOiBmb3J3YXJkIGRlY2xhcmF0aW9uCit0ZW1wbGF0ZSA8Y2xhc3MgX2NoYXJULCBfU1RMUF9ERkxfTk9OX1RZUEVfUEFSQU0oYm9vbCwgX0ludGVybmF0aW9uYWwsIGZhbHNlKSA+IGNsYXNzIG1vbmV5cHVuY3Qge307CisKKy8vIG1vbmV5X2dldCBmYWNldHMKKworI2lmIGRlZmluZWQgKF9TVExQX0xJTUlURURfREVGQVVMVF9URU1QTEFURVMpCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfSW5wdXRJdGVyPgorI2Vsc2UKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9JbnB1dEl0ZXIgPSBpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVCwgY2hhcl90cmFpdHM8X0NoYXJUPiA+ID4KKyNlbmRpZgorY2xhc3MgbW9uZXlfZ2V0IDogcHVibGljIGxvY2FsZTo6ZmFjZXQgeworICBmcmllbmQgY2xhc3MgX0xvY2FsZV9pbXBsOworCitwdWJsaWM6CisgIHR5cGVkZWYgX0NoYXJUICAgICAgICAgICAgICAgY2hhcl90eXBlOworICB0eXBlZGVmIF9JbnB1dEl0ZXIgICAgICAgICAgIGl0ZXJfdHlwZTsKKyAgdHlwZWRlZiBiYXNpY19zdHJpbmc8X0NoYXJULCBjaGFyX3RyYWl0czxfQ2hhclQ+LCBhbGxvY2F0b3I8X0NoYXJUPiA+IHN0cmluZ190eXBlOworCisgIG1vbmV5X2dldChzaXplX3QgX19yZWZzID0gMCkgOiBsb2NhbGU6OmZhY2V0KF9fcmVmcykge30KKyAgaXRlcl90eXBlIGdldChpdGVyX3R5cGUgX19zLCBpdGVyX3R5cGUgIF9fZW5kLCBib29sIF9faW50bCwKKyAgICAgICAgICAgICAgICBpb3NfYmFzZSYgIF9fc3RyLCBpb3NfYmFzZTo6aW9zdGF0ZSYgIF9fZXJyLAorICAgICAgICAgICAgICAgIF9TVExQX0xPTkdFU1RfRkxPQVRfVFlQRSYgX191bml0cykgY29uc3QKKyAgICB7IHJldHVybiBkb19nZXQoX19zLCAgX19lbmQsIF9faW50bCwgIF9fc3RyLCAgX19lcnIsIF9fdW5pdHMpOyB9CisgIGl0ZXJfdHlwZSBnZXQoaXRlcl90eXBlIF9fcywgaXRlcl90eXBlICBfX2VuZCwgYm9vbCBfX2ludGwsCisgICAgICAgICAgICAgICAgaW9zX2Jhc2UmICBfX3N0ciwgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLAorICAgICAgICAgICAgICAgIHN0cmluZ190eXBlJiBfX2RpZ2l0cykgY29uc3QKKyAgICB7IHJldHVybiBkb19nZXQoX19zLCAgX19lbmQsIF9faW50bCwgIF9fc3RyLCAgX19lcnIsIF9fZGlnaXRzKTsgfQorCisgIHN0YXRpYyBfU1RMUF9TVEFUSUNfTUVNQkVSX0RFQ0xTUEVDIGxvY2FsZTo6aWQgaWQ7CisKK3Byb3RlY3RlZDoKKyAgfm1vbmV5X2dldCgpIHt9CisgIHZpcnR1YWwgaXRlcl90eXBlIGRvX2dldChpdGVyX3R5cGUgX19zLCBpdGVyX3R5cGUgIF9fZW5kLCBib29sICBfX2ludGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZSYgIF9fc3RyLCBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9MT05HRVNUX0ZMT0FUX1RZUEUmIF9fdW5pdHMpIGNvbnN0OworICB2aXJ0dWFsIGl0ZXJfdHlwZSBkb19nZXQoaXRlcl90eXBlIF9fcywgaXRlcl90eXBlIF9fZW5kLCBib29sIF9faW50bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlJiAgX19zdHIsIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ190eXBlJiBfX2RpZ2l0cykgY29uc3Q7Cit9OworCisKKy8vIG1vbmV5cHVuY3QgZmFjZXRzOiBkZWZpbml0aW9uIG9mIHNwZWNpYWxpemF0aW9ucworCitfU1RMUF9URU1QTEFURV9OVUxMCitjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBtb25leXB1bmN0PGNoYXIsIHRydWU+IDogcHVibGljIGxvY2FsZTo6ZmFjZXQsIHB1YmxpYyBtb25leV9iYXNlIHsKKworcHVibGljOgorICB0eXBlZGVmIGNoYXIgICAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKKyAgdHlwZWRlZiBzdHJpbmcgICAgICAgICAgICAgICBzdHJpbmdfdHlwZTsKKyAgZXhwbGljaXQgbW9uZXlwdW5jdCBfU1RMUF9QU1BFQzIoY2hhciwgdHJ1ZSkgKHNpemVfdCBfX3JlZnMgPSAwKTsKKworICBjaGFyICAgICAgICBkZWNpbWFsX3BvaW50KCkgY29uc3QgeyByZXR1cm4gZG9fZGVjaW1hbF9wb2ludCgpOyB9CisgIGNoYXIgICAgICAgIHRob3VzYW5kc19zZXAoKSBjb25zdCB7IHJldHVybiBkb190aG91c2FuZHNfc2VwKCk7IH0KKyAgc3RyaW5nICAgICAgZ3JvdXBpbmcoKSAgICAgIGNvbnN0IHsgcmV0dXJuIGRvX2dyb3VwaW5nKCk7IH0KKyAgc3RyaW5nX3R5cGUgY3Vycl9zeW1ib2woKSAgIGNvbnN0IHsgcmV0dXJuIGRvX2N1cnJfc3ltYm9sKCk7IH0KKyAgc3RyaW5nX3R5cGUgcG9zaXRpdmVfc2lnbigpIGNvbnN0IHsgcmV0dXJuIGRvX3Bvc2l0aXZlX3NpZ24oKTsgfQorICBzdHJpbmdfdHlwZSBuZWdhdGl2ZV9zaWduKCkgY29uc3QgeyByZXR1cm4gZG9fbmVnYXRpdmVfc2lnbigpOyB9CisgIGludCAgICAgICAgIGZyYWNfZGlnaXRzKCkgICBjb25zdCB7IHJldHVybiBkb19mcmFjX2RpZ2l0cygpOyB9CisgIHBhdHRlcm4gICAgIHBvc19mb3JtYXQoKSAgICBjb25zdCB7IHJldHVybiBkb19wb3NfZm9ybWF0KCk7IH0KKyAgcGF0dGVybiAgICAgbmVnX2Zvcm1hdCgpICAgIGNvbnN0IHsgcmV0dXJuIGRvX25lZ19mb3JtYXQoKTsgfQorCisgIHN0YXRpYyBfU1RMUF9TVEFUSUNfTUVNQkVSX0RFQ0xTUEVDIGxvY2FsZTo6aWQgaWQ7CisjIGlmIGRlZmluZWQgKF9TVExQX1NUQVRJQ19DT05TVF9JTklUX0JVRykKKyAgZW51bSBfSW50bFZhbCB7IGludGwgPSAxIH0gOworIyBlbHNlCisgIHN0YXRpYyBjb25zdCBib29sIGludGwgPSB0cnVlOworIyBlbmRpZgorCitwcm90ZWN0ZWQ6CisgIHBhdHRlcm4gX01fcG9zX2Zvcm1hdDsKKyAgcGF0dGVybiBfTV9uZWdfZm9ybWF0OworCisgIH5tb25leXB1bmN0IF9TVExQX1BTUEVDMihjaGFyLCB0cnVlKSAoKTsKKworICB2aXJ0dWFsIGNoYXIgICAgICAgIGRvX2RlY2ltYWxfcG9pbnQoKSBjb25zdDsKKyAgdmlydHVhbCBjaGFyICAgICAgICBkb190aG91c2FuZHNfc2VwKCkgY29uc3Q7CisgIHZpcnR1YWwgc3RyaW5nICAgICAgZG9fZ3JvdXBpbmcoKSAgICAgIGNvbnN0OworCisgIHZpcnR1YWwgc3RyaW5nICAgICAgZG9fY3Vycl9zeW1ib2woKSAgIGNvbnN0OworCisgIHZpcnR1YWwgc3RyaW5nICAgICAgZG9fcG9zaXRpdmVfc2lnbigpIGNvbnN0OworICB2aXJ0dWFsIHN0cmluZyAgICAgIGRvX25lZ2F0aXZlX3NpZ24oKSBjb25zdDsKKyAgdmlydHVhbCBpbnQgICAgICAgICBkb19mcmFjX2RpZ2l0cygpICAgY29uc3Q7CisgIHZpcnR1YWwgcGF0dGVybiAgICAgZG9fcG9zX2Zvcm1hdCgpICAgIGNvbnN0OworICB2aXJ0dWFsIHBhdHRlcm4gICAgIGRvX25lZ19mb3JtYXQoKSAgICBjb25zdDsKKworICBmcmllbmQgY2xhc3MgX0xvY2FsZV9pbXBsOworfTsKKworX1NUTFBfVEVNUExBVEVfTlVMTAorY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgbW9uZXlwdW5jdDxjaGFyLCBmYWxzZT4gOiBwdWJsaWMgbG9jYWxlOjpmYWNldCwgcHVibGljIG1vbmV5X2Jhc2UKK3sKK3B1YmxpYzoKKyAgdHlwZWRlZiBjaGFyICAgICAgICAgICAgICAgICBjaGFyX3R5cGU7CisgIHR5cGVkZWYgc3RyaW5nICAgICAgICAgICAgICAgc3RyaW5nX3R5cGU7CisKKyAgZXhwbGljaXQgbW9uZXlwdW5jdCBfU1RMUF9QU1BFQzIoY2hhciwgZmFsc2UpIChzaXplX3QgX19yZWZzID0gMCk7CisKKyAgY2hhciAgICAgICAgZGVjaW1hbF9wb2ludCgpIGNvbnN0IHsgcmV0dXJuIGRvX2RlY2ltYWxfcG9pbnQoKTsgfQorICBjaGFyICAgICAgICB0aG91c2FuZHNfc2VwKCkgY29uc3QgeyByZXR1cm4gZG9fdGhvdXNhbmRzX3NlcCgpOyB9CisgIHN0cmluZyAgICAgIGdyb3VwaW5nKCkgICAgICBjb25zdCB7IHJldHVybiBkb19ncm91cGluZygpOyB9CisgIHN0cmluZ190eXBlIGN1cnJfc3ltYm9sKCkgICBjb25zdCB7IHJldHVybiBkb19jdXJyX3N5bWJvbCgpOyB9CisgIHN0cmluZ190eXBlIHBvc2l0aXZlX3NpZ24oKSBjb25zdCB7IHJldHVybiBkb19wb3NpdGl2ZV9zaWduKCk7IH0KKyAgc3RyaW5nX3R5cGUgbmVnYXRpdmVfc2lnbigpIGNvbnN0IHsgcmV0dXJuIGRvX25lZ2F0aXZlX3NpZ24oKTsgfQorICBpbnQgICAgICAgICBmcmFjX2RpZ2l0cygpICAgY29uc3QgeyByZXR1cm4gZG9fZnJhY19kaWdpdHMoKTsgfQorICBwYXR0ZXJuICAgICBwb3NfZm9ybWF0KCkgICAgY29uc3QgeyByZXR1cm4gZG9fcG9zX2Zvcm1hdCgpOyB9CisgIHBhdHRlcm4gICAgIG5lZ19mb3JtYXQoKSAgICBjb25zdCB7IHJldHVybiBkb19uZWdfZm9ybWF0KCk7IH0KKworICBzdGF0aWMgX1NUTFBfU1RBVElDX01FTUJFUl9ERUNMU1BFQyBsb2NhbGU6OmlkIGlkOworIyBpZiBkZWZpbmVkIChfU1RMUF9TVEFUSUNfQ09OU1RfSU5JVF9CVUcpCisgIGVudW0gX0ludGxWYWwgeyBpbnRsID0gMCB9IDsKKyMgZWxzZQorICBzdGF0aWMgY29uc3QgYm9vbCBpbnRsID0gZmFsc2U7CisjIGVuZGlmCisKK3Byb3RlY3RlZDoKKyAgcGF0dGVybiBfTV9wb3NfZm9ybWF0OworICBwYXR0ZXJuIF9NX25lZ19mb3JtYXQ7CisKKyAgfm1vbmV5cHVuY3QgX1NUTFBfUFNQRUMyKGNoYXIsIGZhbHNlKSAoKTsKKworICB2aXJ0dWFsIGNoYXIgICAgICAgIGRvX2RlY2ltYWxfcG9pbnQoKSBjb25zdDsKKyAgdmlydHVhbCBjaGFyICAgICAgICBkb190aG91c2FuZHNfc2VwKCkgY29uc3Q7CisgIHZpcnR1YWwgc3RyaW5nICAgICAgZG9fZ3JvdXBpbmcoKSAgICAgIGNvbnN0OworCisgIHZpcnR1YWwgc3RyaW5nICAgICAgZG9fY3Vycl9zeW1ib2woKSAgIGNvbnN0OworCisgIHZpcnR1YWwgc3RyaW5nICAgICAgZG9fcG9zaXRpdmVfc2lnbigpIGNvbnN0OworICB2aXJ0dWFsIHN0cmluZyAgICAgIGRvX25lZ2F0aXZlX3NpZ24oKSBjb25zdDsKKyAgdmlydHVhbCBpbnQgICAgICAgICBkb19mcmFjX2RpZ2l0cygpICAgY29uc3Q7CisgIHZpcnR1YWwgcGF0dGVybiAgICAgZG9fcG9zX2Zvcm1hdCgpICAgIGNvbnN0OworICB2aXJ0dWFsIHBhdHRlcm4gICAgIGRvX25lZ19mb3JtYXQoKSAgICBjb25zdDsKKworICBmcmllbmQgY2xhc3MgX0xvY2FsZV9pbXBsOworfTsKKworCisjIGlmbmRlZiBfU1RMUF9OT19XQ0hBUl9UCisKK19TVExQX1RFTVBMQVRFX05VTEwKK2NsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIG1vbmV5cHVuY3Q8d2NoYXJfdCwgdHJ1ZT4gOiBwdWJsaWMgbG9jYWxlOjpmYWNldCwgcHVibGljIG1vbmV5X2Jhc2UKK3sKKyAgZnJpZW5kIGNsYXNzIF9Mb2NhbGVfaW1wbDsKK3B1YmxpYzoKKyAgdHlwZWRlZiB3Y2hhcl90ICAgICAgICAgICAgICAgICBjaGFyX3R5cGU7CisgIHR5cGVkZWYgd3N0cmluZyAgICAgICAgICAgICAgICAgc3RyaW5nX3R5cGU7CisgIGV4cGxpY2l0IG1vbmV5cHVuY3QgX1NUTFBfUFNQRUMyKHdjaGFyX3QsIHRydWUpIChzaXplX3QgX19yZWZzID0gMCk7CisgIHdjaGFyX3QgICAgIGRlY2ltYWxfcG9pbnQoKSBjb25zdCB7IHJldHVybiBkb19kZWNpbWFsX3BvaW50KCk7IH0KKyAgd2NoYXJfdCAgICAgdGhvdXNhbmRzX3NlcCgpIGNvbnN0IHsgcmV0dXJuIGRvX3Rob3VzYW5kc19zZXAoKTsgfQorICBzdHJpbmcgICAgICBncm91cGluZygpICAgICAgY29uc3QgeyByZXR1cm4gZG9fZ3JvdXBpbmcoKTsgfQorICBzdHJpbmdfdHlwZSBjdXJyX3N5bWJvbCgpICAgY29uc3QgeyByZXR1cm4gZG9fY3Vycl9zeW1ib2woKTsgfQorICBzdHJpbmdfdHlwZSBwb3NpdGl2ZV9zaWduKCkgY29uc3QgeyByZXR1cm4gZG9fcG9zaXRpdmVfc2lnbigpOyB9CisgIHN0cmluZ190eXBlIG5lZ2F0aXZlX3NpZ24oKSBjb25zdCB7IHJldHVybiBkb19uZWdhdGl2ZV9zaWduKCk7IH0KKyAgaW50ICAgICAgICAgZnJhY19kaWdpdHMoKSAgIGNvbnN0IHsgcmV0dXJuIGRvX2ZyYWNfZGlnaXRzKCk7IH0KKyAgcGF0dGVybiAgICAgcG9zX2Zvcm1hdCgpICAgIGNvbnN0IHsgcmV0dXJuIGRvX3Bvc19mb3JtYXQoKTsgfQorICBwYXR0ZXJuICAgICBuZWdfZm9ybWF0KCkgICAgY29uc3QgeyByZXR1cm4gZG9fbmVnX2Zvcm1hdCgpOyB9CisKKyAgc3RhdGljIF9TVExQX1NUQVRJQ19NRU1CRVJfREVDTFNQRUMgbG9jYWxlOjppZCBpZDsKKyMgaWYgZGVmaW5lZCAoX1NUTFBfU1RBVElDX0NPTlNUX0lOSVRfQlVHKQorICBlbnVtIF9JbnRsVmFsIHsgaW50bCA9IDEgfSA7CisjIGVsc2UKKyAgc3RhdGljIGNvbnN0IGJvb2wgaW50bCA9IHRydWU7CisjIGVuZGlmCisKK3Byb3RlY3RlZDoKKyAgcGF0dGVybiBfTV9wb3NfZm9ybWF0OworICBwYXR0ZXJuIF9NX25lZ19mb3JtYXQ7CisKKyAgfm1vbmV5cHVuY3QgX1NUTFBfUFNQRUMyKHdjaGFyX3QsIHRydWUpICgpOworCisgIHZpcnR1YWwgd2NoYXJfdCAgICAgZG9fZGVjaW1hbF9wb2ludCgpIGNvbnN0OworICB2aXJ0dWFsIHdjaGFyX3QgICAgIGRvX3Rob3VzYW5kc19zZXAoKSBjb25zdDsKKyAgdmlydHVhbCBzdHJpbmcgICAgICBkb19ncm91cGluZygpICAgICAgY29uc3Q7CisKKyAgdmlydHVhbCBzdHJpbmdfdHlwZSBkb19jdXJyX3N5bWJvbCgpICAgY29uc3Q7CisKKyAgdmlydHVhbCBzdHJpbmdfdHlwZSBkb19wb3NpdGl2ZV9zaWduKCkgY29uc3Q7CisgIHZpcnR1YWwgc3RyaW5nX3R5cGUgZG9fbmVnYXRpdmVfc2lnbigpIGNvbnN0OworICB2aXJ0dWFsIGludCAgICAgICAgIGRvX2ZyYWNfZGlnaXRzKCkgICBjb25zdDsKKyAgdmlydHVhbCBwYXR0ZXJuICAgICBkb19wb3NfZm9ybWF0KCkgICAgY29uc3Q7CisgIHZpcnR1YWwgcGF0dGVybiAgICAgZG9fbmVnX2Zvcm1hdCgpICAgIGNvbnN0OworfTsKKworCitfU1RMUF9URU1QTEFURV9OVUxMCitjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBtb25leXB1bmN0PHdjaGFyX3QsIGZhbHNlPiA6IHB1YmxpYyBsb2NhbGU6OmZhY2V0LCBwdWJsaWMgbW9uZXlfYmFzZQoreworICBmcmllbmQgY2xhc3MgX0xvY2FsZV9pbXBsOworcHVibGljOgorICB0eXBlZGVmIHdjaGFyX3QgICAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKKyAgdHlwZWRlZiB3c3RyaW5nICAgICAgICAgICAgICAgICBzdHJpbmdfdHlwZTsKKyAgZXhwbGljaXQgbW9uZXlwdW5jdCBfU1RMUF9QU1BFQzIod2NoYXJfdCwgZmFsc2UpIChzaXplX3QgX19yZWZzID0gMCk7CisgIHdjaGFyX3QgICAgIGRlY2ltYWxfcG9pbnQoKSBjb25zdCB7IHJldHVybiBkb19kZWNpbWFsX3BvaW50KCk7IH0KKyAgd2NoYXJfdCAgICAgdGhvdXNhbmRzX3NlcCgpIGNvbnN0IHsgcmV0dXJuIGRvX3Rob3VzYW5kc19zZXAoKTsgfQorICBzdHJpbmcgICAgICBncm91cGluZygpICAgICAgY29uc3QgeyByZXR1cm4gZG9fZ3JvdXBpbmcoKTsgfQorICBzdHJpbmdfdHlwZSBjdXJyX3N5bWJvbCgpICAgY29uc3QgeyByZXR1cm4gZG9fY3Vycl9zeW1ib2woKTsgfQorICBzdHJpbmdfdHlwZSBwb3NpdGl2ZV9zaWduKCkgY29uc3QgeyByZXR1cm4gZG9fcG9zaXRpdmVfc2lnbigpOyB9CisgIHN0cmluZ190eXBlIG5lZ2F0aXZlX3NpZ24oKSBjb25zdCB7IHJldHVybiBkb19uZWdhdGl2ZV9zaWduKCk7IH0KKyAgaW50ICAgICAgICAgZnJhY19kaWdpdHMoKSAgIGNvbnN0IHsgcmV0dXJuIGRvX2ZyYWNfZGlnaXRzKCk7IH0KKyAgcGF0dGVybiAgICAgcG9zX2Zvcm1hdCgpICAgIGNvbnN0IHsgcmV0dXJuIGRvX3Bvc19mb3JtYXQoKTsgfQorICBwYXR0ZXJuICAgICBuZWdfZm9ybWF0KCkgICAgY29uc3QgeyByZXR1cm4gZG9fbmVnX2Zvcm1hdCgpOyB9CisKKyAgc3RhdGljIF9TVExQX1NUQVRJQ19NRU1CRVJfREVDTFNQRUMgbG9jYWxlOjppZCBpZDsKKyMgaWYgZGVmaW5lZCAoX1NUTFBfU1RBVElDX0NPTlNUX0lOSVRfQlVHKQorICBlbnVtIF9JbnRsVmFsIHsgaW50bCA9IDAgfSA7CisjIGVsc2UKKyAgc3RhdGljIGNvbnN0IGJvb2wgaW50bCA9IGZhbHNlOworIyBlbmRpZgorCitwcm90ZWN0ZWQ6CisgIHBhdHRlcm4gX01fcG9zX2Zvcm1hdDsKKyAgcGF0dGVybiBfTV9uZWdfZm9ybWF0OworCisgIH5tb25leXB1bmN0IF9TVExQX1BTUEVDMih3Y2hhcl90LCBmYWxzZSkgKCk7CisKKyAgdmlydHVhbCB3Y2hhcl90ICAgICBkb19kZWNpbWFsX3BvaW50KCkgY29uc3Q7CisgIHZpcnR1YWwgd2NoYXJfdCAgICAgZG9fdGhvdXNhbmRzX3NlcCgpIGNvbnN0OworICB2aXJ0dWFsIHN0cmluZyAgICAgIGRvX2dyb3VwaW5nKCkgICAgICBjb25zdDsKKworICB2aXJ0dWFsIHN0cmluZ190eXBlIGRvX2N1cnJfc3ltYm9sKCkgICBjb25zdDsKKworICB2aXJ0dWFsIHN0cmluZ190eXBlIGRvX3Bvc2l0aXZlX3NpZ24oKSBjb25zdDsKKyAgdmlydHVhbCBzdHJpbmdfdHlwZSBkb19uZWdhdGl2ZV9zaWduKCkgY29uc3Q7CisgIHZpcnR1YWwgaW50ICAgICAgICAgZG9fZnJhY19kaWdpdHMoKSAgIGNvbnN0OworICB2aXJ0dWFsIHBhdHRlcm4gICAgIGRvX3Bvc19mb3JtYXQoKSAgICBjb25zdDsKKyAgdmlydHVhbCBwYXR0ZXJuICAgICBkb19uZWdfZm9ybWF0KCkgICAgY29uc3Q7Cit9OworCisjIGVuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfY2hhclQsIF9TVExQX0RGTF9OT05fVFlQRV9QQVJBTShib29sICwgX0ludGVybmF0aW9uYWwgLCBmYWxzZSkgPiBjbGFzcyBtb25leXB1bmN0X2J5bmFtZSB7fTsKKworX1NUTFBfVEVNUExBVEVfTlVMTAorY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgbW9uZXlwdW5jdF9ieW5hbWU8Y2hhciwgdHJ1ZT4gOiBwdWJsaWMgbW9uZXlwdW5jdDxjaGFyLCB0cnVlPiB7CitwdWJsaWM6CisgIHR5cGVkZWYgbW9uZXlfYmFzZTo6cGF0dGVybiAgIHBhdHRlcm47CisgIHR5cGVkZWYgY2hhciAgICAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKKyAgdHlwZWRlZiBzdHJpbmcgICAgICAgICAgICAgICAgc3RyaW5nX3R5cGU7CisKKyAgZXhwbGljaXQgbW9uZXlwdW5jdF9ieW5hbWUgX1NUTFBfUFNQRUMyKGNoYXIsIHRydWUpIChjb25zdCBjaGFyICogX19uYW1lLCBzaXplX3QgX19yZWZzID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTG9jYWxlX25hbWVfaGludCogX19oaW50ID0gMCk7CisKK3Byb3RlY3RlZDoKKyAgX0xvY2FsZV9tb25ldGFyeSogX01fbW9uZXRhcnk7CisgIH5tb25leXB1bmN0X2J5bmFtZSBfU1RMUF9QU1BFQzIoY2hhciwgdHJ1ZSkgKCk7CisgIHZpcnR1YWwgY2hhciAgICAgICAgZG9fZGVjaW1hbF9wb2ludCgpIGNvbnN0OworICB2aXJ0dWFsIGNoYXIgICAgICAgIGRvX3Rob3VzYW5kc19zZXAoKSBjb25zdDsKKyAgdmlydHVhbCBzdHJpbmcgICAgICBkb19ncm91cGluZygpICAgICAgY29uc3Q7CisKKyAgdmlydHVhbCBzdHJpbmdfdHlwZSBkb19jdXJyX3N5bWJvbCgpICAgY29uc3Q7CisKKyAgdmlydHVhbCBzdHJpbmdfdHlwZSBkb19wb3NpdGl2ZV9zaWduKCkgY29uc3Q7CisgIHZpcnR1YWwgc3RyaW5nX3R5cGUgZG9fbmVnYXRpdmVfc2lnbigpIGNvbnN0OworICB2aXJ0dWFsIGludCAgICAgICAgIGRvX2ZyYWNfZGlnaXRzKCkgICBjb25zdDsKKworcHJpdmF0ZToKKyAgdHlwZWRlZiBtb25leXB1bmN0X2J5bmFtZTxjaGFyLCB0cnVlPiBfU2VsZjsKKyAgLy9leHBsaWNpdGVseSBkZWZpbmVkIGFzIHByaXZhdGUgdG8gYXZvaWQgd2FybmluZ3M6CisgIG1vbmV5cHVuY3RfYnluYW1lKF9TZWxmIGNvbnN0Jik7CisgIF9TZWxmJiBvcGVyYXRvciA9IChfU2VsZiBjb25zdCYpOworfTsKKworX1NUTFBfVEVNUExBVEVfTlVMTAorY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgbW9uZXlwdW5jdF9ieW5hbWU8Y2hhciwgZmFsc2U+IDogcHVibGljIG1vbmV5cHVuY3Q8Y2hhciwgZmFsc2U+Cit7CitwdWJsaWM6CisgIHR5cGVkZWYgbW9uZXlfYmFzZTo6cGF0dGVybiAgIHBhdHRlcm47CisgIHR5cGVkZWYgY2hhciAgICAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKKyAgdHlwZWRlZiBzdHJpbmcgICAgICAgICAgICAgICAgc3RyaW5nX3R5cGU7CisKKyAgZXhwbGljaXQgbW9uZXlwdW5jdF9ieW5hbWUgX1NUTFBfUFNQRUMyKGNoYXIsIGZhbHNlKSAoY29uc3QgY2hhciAqIF9fbmFtZSwgc2l6ZV90IF9fcmVmcyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Mb2NhbGVfbmFtZV9oaW50KiBfX2hpbnQgPSAwKTsKKworcHJvdGVjdGVkOgorICBfTG9jYWxlX21vbmV0YXJ5KiBfTV9tb25ldGFyeTsKKyAgfm1vbmV5cHVuY3RfYnluYW1lIF9TVExQX1BTUEVDMihjaGFyLCBmYWxzZSkgKCk7CisgIHZpcnR1YWwgY2hhciAgICAgICAgZG9fZGVjaW1hbF9wb2ludCgpIGNvbnN0OworICB2aXJ0dWFsIGNoYXIgICAgICAgIGRvX3Rob3VzYW5kc19zZXAoKSBjb25zdDsKKyAgdmlydHVhbCBzdHJpbmcgICAgICBkb19ncm91cGluZygpICAgICAgY29uc3Q7CisKKyAgdmlydHVhbCBzdHJpbmdfdHlwZSBkb19jdXJyX3N5bWJvbCgpICAgY29uc3Q7CisKKyAgdmlydHVhbCBzdHJpbmdfdHlwZSBkb19wb3NpdGl2ZV9zaWduKCkgY29uc3Q7CisgIHZpcnR1YWwgc3RyaW5nX3R5cGUgZG9fbmVnYXRpdmVfc2lnbigpIGNvbnN0OworICB2aXJ0dWFsIGludCAgICAgICAgIGRvX2ZyYWNfZGlnaXRzKCkgICBjb25zdDsKKworcHJpdmF0ZToKKyAgdHlwZWRlZiBtb25leXB1bmN0X2J5bmFtZTxjaGFyLCBmYWxzZT4gX1NlbGY7CisgIC8vZXhwbGljaXRlbHkgZGVmaW5lZCBhcyBwcml2YXRlIHRvIGF2b2lkIHdhcm5pbmdzOgorICBtb25leXB1bmN0X2J5bmFtZShfU2VsZiBjb25zdCYpOworICBfU2VsZiYgb3BlcmF0b3IgPSAoX1NlbGYgY29uc3QmKTsKKyAgZnJpZW5kIF9Mb2NhbGVfbmFtZV9oaW50KiBfTG9jYWxlX2V4dHJhY3RfaGludChtb25leXB1bmN0X2J5bmFtZTxjaGFyLCBmYWxzZT4qKTsKK307CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkKK19TVExQX1RFTVBMQVRFX05VTEwKK2NsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIG1vbmV5cHVuY3RfYnluYW1lPHdjaGFyX3QsIHRydWU+IDogcHVibGljIG1vbmV5cHVuY3Q8d2NoYXJfdCwgdHJ1ZT4KK3sKK3B1YmxpYzoKKyAgdHlwZWRlZiBtb25leV9iYXNlOjpwYXR0ZXJuICAgcGF0dGVybjsKKyAgdHlwZWRlZiB3Y2hhcl90ICAgICAgICAgICAgICAgY2hhcl90eXBlOworICB0eXBlZGVmIHdzdHJpbmcgICAgICAgICAgICAgICBzdHJpbmdfdHlwZTsKKworICBleHBsaWNpdCBtb25leXB1bmN0X2J5bmFtZSBfU1RMUF9QU1BFQzIod2NoYXJfdCwgdHJ1ZSkgKGNvbnN0IGNoYXIgKiBfX25hbWUsIHNpemVfdCBfX3JlZnMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Mb2NhbGVfbmFtZV9oaW50KiBfX2hpbnQgPSAwKTsKKworcHJvdGVjdGVkOgorICBfTG9jYWxlX21vbmV0YXJ5KiBfTV9tb25ldGFyeTsKKyAgfm1vbmV5cHVuY3RfYnluYW1lIF9TVExQX1BTUEVDMih3Y2hhcl90LCB0cnVlKSAoKTsKKyAgdmlydHVhbCB3Y2hhcl90ICAgICBkb19kZWNpbWFsX3BvaW50KCkgY29uc3Q7CisgIHZpcnR1YWwgd2NoYXJfdCAgICAgZG9fdGhvdXNhbmRzX3NlcCgpIGNvbnN0OworICB2aXJ0dWFsIHN0cmluZyAgICAgIGRvX2dyb3VwaW5nKCkgICAgICBjb25zdDsKKworICB2aXJ0dWFsIHN0cmluZ190eXBlIGRvX2N1cnJfc3ltYm9sKCkgICBjb25zdDsKKworICB2aXJ0dWFsIHN0cmluZ190eXBlIGRvX3Bvc2l0aXZlX3NpZ24oKSBjb25zdDsKKyAgdmlydHVhbCBzdHJpbmdfdHlwZSBkb19uZWdhdGl2ZV9zaWduKCkgY29uc3Q7CisgIHZpcnR1YWwgaW50ICAgICAgICAgZG9fZnJhY19kaWdpdHMoKSAgIGNvbnN0OworCitwcml2YXRlOgorICB0eXBlZGVmIG1vbmV5cHVuY3RfYnluYW1lPHdjaGFyX3QsIHRydWU+IF9TZWxmOworICAvL2V4cGxpY2l0ZWx5IGRlZmluZWQgYXMgcHJpdmF0ZSB0byBhdm9pZCB3YXJuaW5nczoKKyAgbW9uZXlwdW5jdF9ieW5hbWUoX1NlbGYgY29uc3QmKTsKKyAgX1NlbGYmIG9wZXJhdG9yID0gKF9TZWxmIGNvbnN0Jik7Cit9OworCitfU1RMUF9URU1QTEFURV9OVUxMCitjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBtb25leXB1bmN0X2J5bmFtZTx3Y2hhcl90LCBmYWxzZT4gOiBwdWJsaWMgbW9uZXlwdW5jdDx3Y2hhcl90LCBmYWxzZT4KK3sKK3B1YmxpYzoKKyAgdHlwZWRlZiBtb25leV9iYXNlOjpwYXR0ZXJuICAgcGF0dGVybjsKKyAgdHlwZWRlZiB3Y2hhcl90ICAgICAgICAgICAgICAgY2hhcl90eXBlOworICB0eXBlZGVmIHdzdHJpbmcgICAgICAgICAgICAgICBzdHJpbmdfdHlwZTsKKworICBleHBsaWNpdCBtb25leXB1bmN0X2J5bmFtZSBfU1RMUF9QU1BFQzIod2NoYXJfdCwgZmFsc2UpIChjb25zdCBjaGFyICogX19uYW1lLCBzaXplX3QgX19yZWZzID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0xvY2FsZV9uYW1lX2hpbnQqIF9faGludCA9IDApOworCitwcm90ZWN0ZWQ6CisgIF9Mb2NhbGVfbW9uZXRhcnkqIF9NX21vbmV0YXJ5OworICB+bW9uZXlwdW5jdF9ieW5hbWUgX1NUTFBfUFNQRUMyKHdjaGFyX3QsIGZhbHNlKSAoKTsKKyAgdmlydHVhbCB3Y2hhcl90ICAgICBkb19kZWNpbWFsX3BvaW50KCkgY29uc3Q7CisgIHZpcnR1YWwgd2NoYXJfdCAgICAgZG9fdGhvdXNhbmRzX3NlcCgpIGNvbnN0OworICB2aXJ0dWFsIHN0cmluZyAgICAgIGRvX2dyb3VwaW5nKCkgICAgICBjb25zdDsKKworICB2aXJ0dWFsIHN0cmluZ190eXBlIGRvX2N1cnJfc3ltYm9sKCkgICBjb25zdDsKKworICB2aXJ0dWFsIHN0cmluZ190eXBlIGRvX3Bvc2l0aXZlX3NpZ24oKSBjb25zdDsKKyAgdmlydHVhbCBzdHJpbmdfdHlwZSBkb19uZWdhdGl2ZV9zaWduKCkgY29uc3Q7CisgIHZpcnR1YWwgaW50ICAgICAgICAgZG9fZnJhY19kaWdpdHMoKSAgIGNvbnN0OworCitwcml2YXRlOgorICB0eXBlZGVmIG1vbmV5cHVuY3RfYnluYW1lPHdjaGFyX3QsIGZhbHNlPiBfU2VsZjsKKyAgLy9leHBsaWNpdGVseSBkZWZpbmVkIGFzIHByaXZhdGUgdG8gYXZvaWQgd2FybmluZ3M6CisgIG1vbmV5cHVuY3RfYnluYW1lKF9TZWxmIGNvbnN0Jik7CisgIF9TZWxmJiBvcGVyYXRvciA9IChfU2VsZiBjb25zdCYpOworfTsKKyNlbmRpZgorCisvLz09PT09IG1ldGhvZHMgPT09PT09CisKKworLy8gbW9uZXlfcHV0IGZhY2V0cworCisjaWYgZGVmaW5lZCAoX1NUTFBfTElNSVRFRF9ERUZBVUxUX1RFTVBMQVRFUykKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9PdXRwdXRJdGVyPgorI2Vsc2UKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9PdXRwdXRJdGVyID0gb3N0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQsIGNoYXJfdHJhaXRzPF9DaGFyVD4gPiA+CisjZW5kaWYKK2NsYXNzIG1vbmV5X3B1dCA6IHB1YmxpYyBsb2NhbGU6OmZhY2V0IHsKKyAgZnJpZW5kIGNsYXNzIF9Mb2NhbGVfaW1wbDsKKworcHVibGljOgorICB0eXBlZGVmIF9DaGFyVCAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKKyAgdHlwZWRlZiBfT3V0cHV0SXRlciAgICAgICAgICBpdGVyX3R5cGU7CisgIHR5cGVkZWYgYmFzaWNfc3RyaW5nPF9DaGFyVCwgY2hhcl90cmFpdHM8X0NoYXJUPiwgYWxsb2NhdG9yPF9DaGFyVD4gPiBzdHJpbmdfdHlwZTsKKworICBtb25leV9wdXQoc2l6ZV90IF9fcmVmcyA9IDApIDogbG9jYWxlOjpmYWNldChfX3JlZnMpIHt9CisgIGl0ZXJfdHlwZSBwdXQoaXRlcl90eXBlIF9fcywgYm9vbCBfX2ludGwsIGlvc19iYXNlJiBfX3N0ciwKKyAgICAgICAgICAgICAgICBjaGFyX3R5cGUgIF9fZmlsbCwgX1NUTFBfTE9OR0VTVF9GTE9BVF9UWVBFIF9fdW5pdHMpIGNvbnN0CisgICAgeyByZXR1cm4gZG9fcHV0KF9fcywgX19pbnRsLCBfX3N0ciwgX19maWxsLCBfX3VuaXRzKTsgfQorICBpdGVyX3R5cGUgcHV0KGl0ZXJfdHlwZSBfX3MsIGJvb2wgX19pbnRsLCBpb3NfYmFzZSYgX19zdHIsCisgICAgICAgICAgICAgICAgY2hhcl90eXBlICBfX2ZpbGwsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nX3R5cGUmIF9fZGlnaXRzKSBjb25zdAorICAgIHsgcmV0dXJuIGRvX3B1dChfX3MsIF9faW50bCwgX19zdHIsIF9fZmlsbCwgX19kaWdpdHMpOyB9CisKKyAgc3RhdGljIF9TVExQX1NUQVRJQ19NRU1CRVJfREVDTFNQRUMgbG9jYWxlOjppZCBpZDsKKworcHJvdGVjdGVkOgorICB+bW9uZXlfcHV0KCkge30KKyAgdmlydHVhbCBpdGVyX3R5cGUgZG9fcHV0KGl0ZXJfdHlwZSBfX3MsIGJvb2wgIF9faW50bCwgaW9zX2Jhc2UmICBfX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfdHlwZSBfX2ZpbGwsIF9TVExQX0xPTkdFU1RfRkxPQVRfVFlQRSBfX3VuaXRzKSBjb25zdDsKKyAgdmlydHVhbCBpdGVyX3R5cGUgZG9fcHV0KGl0ZXJfdHlwZSBfX3MsIGJvb2wgIF9faW50bCwgaW9zX2Jhc2UmICBfX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfdHlwZSBfX2ZpbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmdfdHlwZSYgX19kaWdpdHMpIGNvbnN0OworfTsKKworIyBpZiBkZWZpbmVkIChfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUKQorX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIG1vbmV5X2dldDxjaGFyLCBpc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4gPjsKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBtb25leV9wdXQ8Y2hhciwgb3N0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+ID47CisvL19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBtb25leV9nZXQ8Y2hhciwgY29uc3QgY2hhciogPjsKKy8vX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIG1vbmV5X3B1dDxjaGFyLCBjaGFyKiA+OworIyAgaWYgISBkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQorX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIG1vbmV5X2dldDx3Y2hhcl90LCBpc3RyZWFtYnVmX2l0ZXJhdG9yPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4gPjsKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBtb25leV9wdXQ8d2NoYXJfdCwgb3N0cmVhbWJ1Zl9pdGVyYXRvcjx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+ID47CisvLyBfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgbW9uZXlfZ2V0PHdjaGFyX3QsIGNvbnN0IHdjaGFyX3QqID47CisvLyBfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgbW9uZXlfcHV0PHdjaGFyX3QsIHdjaGFyX3QqID47CisjICBlbmRpZgorIyBlbmRpZiAvKiBfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUICovCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2lmIGRlZmluZWQgKF9TVExQX0VYUE9TRV9TVFJFQU1fSU1QTEVNRU5UQVRJT04pICYmICFkZWZpbmVkIChfU1RMUF9MSU5LX1RJTUVfSU5TVEFOVElBVElPTikKKyMgIGluY2x1ZGUgPHN0bC9fbW9uZXRhcnkuYz4KKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfTU9ORVRBUllfSCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgorCisKZGlmZiAtLWdpdCBhL3N0bC9fbW92ZV9jb25zdHJ1Y3RfZndrLmggYi9zdGwvX21vdmVfY29uc3RydWN0X2Z3ay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNjVhOWQKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvX21vdmVfY29uc3RydWN0X2Z3ay5oCkBAIC0wLDAgKzEsMTYwIEBACisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMworICogRnJhbudvaXMgRHVtb250CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfTU9WRV9DT05TVFJVQ1RfRldLX0gKKyNkZWZpbmUgX1NUTFBfTU9WRV9DT05TVFJVQ1RfRldLX0gKKworI2lmbmRlZiBfU1RMUF9UWVBFX1RSQUlUU19ICisjICBpbmNsdWRlIDxzdGwvdHlwZV90cmFpdHMuaD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1vdmUgY29uc3RydWN0b3IgZnJhbWV3b3JrCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqUGFydGlhbCBtb3ZlOgorICpUaGUgc291cmNlIEhBUyB0byBiZSBhIHZhbGlkIGluc3RhbmNlIGFmdGVyIHRoZSBtb3ZlIQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorY2xhc3MgX19tb3ZlX3NvdXJjZSB7CitwdWJsaWM6CisgIGV4cGxpY2l0IF9fbW92ZV9zb3VyY2UgKF9UcCAmX3NyYykgOiBfTV9kYXRhKF9zcmMpCisgIHt9CisKKyAgX1RwJiBnZXQoKSBjb25zdAorICB7IHJldHVybiBfTV9kYXRhOyB9Citwcml2YXRlOgorICBfVHAgJl9NX2RhdGE7CisKKyAgLy9XZSBleHBsaWNpdGVseSBmb3JiaWQgYXNzaWdubWVudCB0byBhdm9pZCB3YXJuaW5nOgorICB0eXBlZGVmIF9fbW92ZV9zb3VyY2U8X1RwPiBfU2VsZjsKKyAgX1NlbGYmIG9wZXJhdG9yID0gKF9TZWxmIGNvbnN0Jik7Cit9OworCisvL0NsYXNzIHVzZWQgdG8gc2lnbmFsIG1vdmUgY29uc3RydWN0b3Igc3VwcG9ydCwgaW1wbGVtZW50YXRpb24gYW5kIHR5cGUuCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9fbW92ZV90cmFpdHMgeworICAvKgorICAgKiBpbXBsZW1lbnRlZCB0ZWxscyBpZiBhIHRoZSBzcGVjaWFsIG1vdmUgY29uc3RydWN0b3IgaGFzIHRvIGJlIGNhbGxlZCBvciB0aGUgY2xhc3NpYworICAgKiBjb3B5IGNvbnN0cnVjdG9yIGlzIGp1c3QgZmluZS4gTW9zdCBvZiB0aGUgdGltZSB0aGUgY29weSBjb25zdHJ1Y3RvciBpcyBmaW5lIG9ubHkKKyAgICogaWYgdGhlIGZvbGxvd2luZyBpbmZvIGlzIHRydWUuCisgICAqLworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QQVJUSUFMX1NQRUNfV09SS0FST1VORCkgJiYgXAorICAgIWRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pICYmIFwKKyAgICFkZWZpbmVkIChfU1RMUF9OT19NT1ZFX1NFTUFOVElDKQorICB0eXBlZGVmIHR5cGVuYW1lIF9Jc1NUTHBvcnRDbGFzczxfVHA+OjpfUmV0IGltcGxlbWVudGVkOworI2Vsc2UKKyAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgaW1wbGVtZW50ZWQ7CisjZW5kaWYKKyAgLyoKKyAgICogY29tcGxldGUgdGVsbHMgaWYgdGhlIG1vdmUgaXMgY29tcGxldGUgb3IgcGFydGlhbCwgdGhhdCBpcyB0byBzYXksIGRvZXMgdGhlIHNvdXJjZQorICAgKiBuZWVkcyB0byBiZSBkZXN0cm95ZWQgb25jZSBpdCBoYXMgYmVlbiBtb3ZlZC4KKyAgICovCisgIHR5cGVkZWYgdHlwZW5hbWUgX190eXBlX3RyYWl0czxfVHA+OjpoYXNfdHJpdmlhbF9kZXN0cnVjdG9yIGNvbXBsZXRlOworfTsKKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19NT1ZFX1NFTUFOVElDKQordHlwZWRlZiBfX3RydWVfdHlwZSBfX3N0bHBfbW92YWJsZTsKKyNlbHNlCit0eXBlZGVmIF9fZmFsc2VfdHlwZSBfX3N0bHBfbW92YWJsZTsKKyNlbmRpZgorCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKKy8qCisgKiBUaGlzIHN0cnVjdCBzaG91bGQgbmV2ZXIgYmUgdXNlZCBpZiB0aGUgdXNlciBoYXMgbm90IGV4cGxpY2l0ZWx5IHN0aXB1bGF0ZWQKKyAqIHRoYXQgaXRzIGNsYXNzIHN1cHBvcnQgdGhlIGZ1bGwgbW92ZSBjb25jZXB0LiBUbyBjaGVjayB0aGF0IHRoZSByZXR1cm4gdHlwZQorICogaW4gc3VjaCBhIGNhc2Ugd2lsbCBiZSBfX2ludmFsaWRfc291cmNlPF9UcD4gdG8gZ2VuZXJhdGUgYSBjb21waWxlIGVycm9yCisgKiByZXZlYWxpbmcgdGhlIGNvbmZpZ3VyYXRpb24gcHJvYmxlbS4KKyAqLwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfTW92ZVNvdXJjZVRyYWl0cyB7CisgIHR5cGVkZWYgdHlwZW5hbWUgX19tb3ZlX3RyYWl0czxfVHA+OjppbXBsZW1lbnRlZCBfTXZJbXBSZXQ7CisjaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKQorICB0eXBlZGVmIHR5cGVuYW1lIF9fc2VsZWN0VDxfTXZJbXBSZXQsCisjZWxzZQorICBlbnVtIHtfTXZJbXAgPSBfX3R5cGUyYm9vbDxfTXZJbXBSZXQ+OjpfUmV0fTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX3NlbGVjdDxfTXZJbXAsCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX21vdmVfc291cmNlPF9UcD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1RwIGNvbnN0Jj46Ol9SZXQgX1R5cGU7Cit9OworCisvL1RoZSBoZWxwZXIgZnVuY3Rpb24KK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX1NUTFBfVFlQRU5BTUVfT05fUkVUVVJOX1RZUEUgX01vdmVTb3VyY2VUcmFpdHM8X1RwPjo6X1R5cGUKK19Bc01vdmVTb3VyY2UgKF9UcCAmc3JjKSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgX01vdmVTb3VyY2VUcmFpdHM8X1RwPjo6X1R5cGUgX1NyY1R5cGU7CisgIHJldHVybiBfU3JjVHlwZShzcmMpOworfQorCisvL0hlbHBlciBzdHJ1Y3RzIHVzZWQgZm9yIG1hbnkgY2xhc3MuCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9fbW92ZV90cmFpdHNfYXV4IHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX21vdmVfdHJhaXRzPF9UcD46OmltcGxlbWVudGVkIGltcGxlbWVudGVkOworICB0eXBlZGVmIHR5cGVuYW1lIF9fbW92ZV90cmFpdHM8X1RwPjo6Y29tcGxldGUgY29tcGxldGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwMSwgY2xhc3MgX1RwMj4KK3N0cnVjdCBfX21vdmVfdHJhaXRzX2F1eDIgeworICB0eXBlZGVmIF9fbW92ZV90cmFpdHM8X1RwMT4gX01vdmVUcmFpdHMxOworICB0eXBlZGVmIF9fbW92ZV90cmFpdHM8X1RwMj4gX01vdmVUcmFpdHMyOworCisgIHR5cGVkZWYgdHlwZW5hbWUgX0xvcjI8dHlwZW5hbWUgX01vdmVUcmFpdHMxOjppbXBsZW1lbnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfTW92ZVRyYWl0czI6OmltcGxlbWVudGVkPjo6X1JldCBpbXBsZW1lbnRlZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfTGFuZDI8dHlwZW5hbWUgX01vdmVUcmFpdHMxOjpjb21wbGV0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX01vdmVUcmFpdHMyOjpjb21wbGV0ZT46Ol9SZXQgY29tcGxldGU7Cit9OworCisvKgorICogTW9zdCBvZiB0aGUgdGltZSBhIGNsYXNzIGltcGxlbWVudCBhIG1vdmUgY29uc3RydWN0b3IgYnV0IGl0cyB1c2UgZGVwZW5kcworICogb24gYSB0aGlyZCBwYXJ0eSwgdGhpcyBpcyB3aGF0IHRoZSBmb2xsb3dpbmcgc3RydWN0IGFyZSBmb3IuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX19tb3ZlX3RyYWl0c19oZWxwIHsKKyAgdHlwZWRlZiBfX3RydWVfdHlwZSBpbXBsZW1lbnRlZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX21vdmVfdHJhaXRzPF9UcD46OmNvbXBsZXRlIGNvbXBsZXRlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcDEsIGNsYXNzIF9UcDI+CitzdHJ1Y3QgX19tb3ZlX3RyYWl0c19oZWxwMSB7CisgIHR5cGVkZWYgX19tb3ZlX3RyYWl0czxfVHAxPiBfTW92ZVRyYWl0czE7CisgIHR5cGVkZWYgX19tb3ZlX3RyYWl0czxfVHAyPiBfTW92ZVRyYWl0czI7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBfTG9yMjx0eXBlbmFtZSBfTW92ZVRyYWl0czE6OmltcGxlbWVudGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9Nb3ZlVHJhaXRzMjo6aW1wbGVtZW50ZWQ+OjpfUmV0IGltcGxlbWVudGVkOworICB0eXBlZGVmIHR5cGVuYW1lIF9MYW5kMjx0eXBlbmFtZSBfTW92ZVRyYWl0czE6OmNvbXBsZXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfTW92ZVRyYWl0czI6OmNvbXBsZXRlPjo6X1JldCBjb21wbGV0ZTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAxLCBjbGFzcyBfVHAyPgorc3RydWN0IF9fbW92ZV90cmFpdHNfaGVscDIgeworICB0eXBlZGVmIF9fbW92ZV90cmFpdHM8X1RwMT4gX01vdmVUcmFpdHMxOworICB0eXBlZGVmIF9fbW92ZV90cmFpdHM8X1RwMj4gX01vdmVUcmFpdHMyOworCisgIHR5cGVkZWYgX19zdGxwX21vdmFibGUgaW1wbGVtZW50ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0xhbmQyPHR5cGVuYW1lIF9Nb3ZlVHJhaXRzMTo6Y29tcGxldGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9Nb3ZlVHJhaXRzMjo6Y29tcGxldGU+OjpfUmV0IGNvbXBsZXRlOworfTsKKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2VuZGlmIC8qIF9TVExQX01PVkVfQ09OU1RSVUNUX0ZXS19IICovCmRpZmYgLS1naXQgYS9zdGwvX25ldy5oIGIvc3RsL19uZXcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWJjNWZhCi0tLSAvZGV2L251bGwKKysrIGIvc3RsL19uZXcuaApAQCAtMCwwICsxLDE2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfTkVXCisjZGVmaW5lIF9TVExQX0lOVEVSTkFMX05FVworCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NTVERERUYKKy8vIHNpemVfdAorIyAgaW5jbHVkZSA8c3RsL19jc3RkZGVmLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fQk9STEFORENfXykgJiYgKF9fQk9STEFORENfXyA8IDB4NTgwKQorLy8gbmV3LmggdXNlcyA6Om1hbGxvYyA7KAorIyAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ1BQX0NfSEVBREVSKGNzdGRsaWIpCit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6bWFsbG9jOworI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTkVXX05FV19IRUFERVIpCisjICBpZiBkZWZpbmVkIChfU1RMUF9CUk9LRU5fQkFEX0FMTE9DX0NMQVNTKQorIyAgICBkZWZpbmUgYmFkX2FsbG9jIF9TVExQX05VTExJRklFRF9CUk9LRU5fQkFEX0FMTE9DX0NMQVNTCisjICAgIGRlZmluZSBub3Rocm93X3QgX1NUTFBfTlVMTElGSUVEX0JST0tFTl9CQURfTk9USFJPV19UX0NMQVNTCisjICAgIGRlZmluZSBub3Rocm93IF9TVExQX05VTExJRklFRF9CUk9LRU5fQkFEX05PVEhST1cKKyMgIGVuZGlmCisKKy8vIGVNYmVkZGVkIFZpc3VhbCBDKysgLk5FVCB1bmZvcnR1bmF0ZWx5IHVzZXMgX0lOQ19ORVcgZm9yIGJvdGggPG5ldy5oPiBhbmQgPG5ldz4KKy8vIHdlIHVuZGVmaW5lIHRoZSBzeW1ib2wgdG8gZ2V0IHRoZSBzdHVmZiBpbiB0aGUgU0RLJ3MgPG5ldz4KKyMgIGlmIGRlZmluZWQgKF9TVExQX1dDRV9ORVQpICYmIGRlZmluZWQgKF9JTkNfTkVXKQorIyAgICB1bmRlZiBfSU5DX05FVworIyAgZW5kaWYKKworIyAgaWYgZGVmaW5lZCAobmV3KQorLyogU1RMcG9ydCBjYW5ub3QgcmVwbGFjZSBuYXRpdmUgU3RkIGxpYnJhcnkgbmV3IGhlYWRlciBpZiBuZXcgaXMgYSBtYWNybywKKyAqIHBsZWFzZSBkZWZpbmUgbmV3IG1hY3JvIGFmdGVyIDxuZXc+IGhlYWRlciBpbmNsdXNpb24uCisgKi8KKyMgICAgZXJyb3IgQ2Fubm90IGluY2x1ZGUgbmF0aXZlIG5ldyBoZWFkZXIgYXMgbmV3IGlzIGEgbWFjcm8uCisjICBlbmRpZgorCisjICBpbmNsdWRlIF9TVExQX05BVElWRV9DUFBfUlVOVElNRV9IRUFERVIobmV3KQorCisjICBpZiBkZWZpbmVkIChfU1RMUF9CUk9LRU5fQkFEX0FMTE9DX0NMQVNTKQorIyAgICB1bmRlZiBiYWRfYWxsb2MKKyMgICAgdW5kZWYgbm90aHJvd190CisjICAgIHVuZGVmIG5vdGhyb3cKKyMgICAgdW5kZWYgX1NUTFBfTlVMTElGSUVEX0JST0tFTl9CQURfQUxMT0NfQ0xBU1MKKyMgICAgdW5kZWYgX1NUTFBfTlVMTElGSUVEX0JST0tFTl9CQURfTk9USFJPV19UX0NMQVNTCisjICAgIHVuZGVmIF9TVExQX05VTExJRklFRF9CUk9LRU5fQkFEX05PVEhST1cKKyMgIGVuZGlmCisjZWxzZQorIyAgaW5jbHVkZSA8bmV3Lmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX05PX0JBRF9BTExPQykgJiYgIWRlZmluZWQgKF9TVExQX05FV19ET05UX1RIUk9XX0JBRF9BTExPQykKKyMgIGRlZmluZSBfU1RMUF9ORVdfRE9OVF9USFJPV19CQURfQUxMT0MgMQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfRVhDRVBUSU9OUykgJiYgZGVmaW5lZCAoX1NUTFBfTkVXX0RPTlRfVEhST1dfQkFEX0FMTE9DKQorCisjICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfRVhDRVBUSU9OCisjICAgIGluY2x1ZGUgPHN0bC9fZXhjZXB0aW9uLmg+CisjICBlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfTk9fQkFEX0FMTE9DKQorc3RydWN0IG5vdGhyb3dfdCB7fTsKKyMgICAgZGVmaW5lIG5vdGhyb3cgbm90aHJvd190KCkKKyMgIGVuZGlmCisKKy8qCisgKiBTVExwb3J0IG93biBiYWRfYWxsb2MgZXhjZXB0aW9uIHRvIGJlIHVzZWQgaWYgdGhlIG5hdGl2ZSBDKysgbGlicmFyeQorICogZG8gbm90IGRlZmluZSBpdCBvciB3aGVuIHRoZSBuZXcgb3BlcmF0b3IgZG8gbm90IHRocm93IGl0IHRvIGF2b2lkCisgKiBhIHVzZWxlc3MgbGlicmFyeSBkZXBlbmRlbmN5LgorICovCitjbGFzcyBiYWRfYWxsb2MgOiBwdWJsaWMgZXhjZXB0aW9uIHsKK3B1YmxpYzoKKyAgYmFkX2FsbG9jICgpIF9TVExQX05PVEhST1dfSU5IRVJFTlRMWSB7IH0KKyAgYmFkX2FsbG9jKGNvbnN0IGJhZF9hbGxvYyYpIF9TVExQX05PVEhST1dfSU5IRVJFTlRMWSB7IH0KKyAgYmFkX2FsbG9jJiBvcGVyYXRvcj0oY29uc3QgYmFkX2FsbG9jJikgX1NUTFBfTk9USFJPV19JTkhFUkVOVExZIHtyZXR1cm4gKnRoaXM7fQorICB+YmFkX2FsbG9jICgpIF9TVExQX05PVEhST1dfSU5IRVJFTlRMWSB7IH0KKyAgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IF9TVExQX05PVEhST1dfSU5IRVJFTlRMWSB7IHJldHVybiAiYmFkIGFsbG9jIjsgfQorfTsKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYgLyogX1NUTFBfVVNFX0VYQ0VQVElPTlMgJiYgKF9TVExQX05PX0JBRF9BTExPQyB8fCBfU1RMUF9ORVdfRE9OVF9USFJPV19CQURfQUxMT0MpICovCisKKyNpZiBkZWZpbmVkIChfU1RMUF9SVFRJX0JVRykKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCitpbmxpbmUgdm9pZCogX1NUTFBfQ0FMTCBfX3N0bF9uZXcoc2l6ZV90IF9fbikKK3sgcmV0dXJuIDo6bWFsbG9jKF9fbik7IH0KKworaW5saW5lIHZvaWQgX1NUTFBfQ0FMTCBfX3N0bF9kZWxldGUodm9pZCogX19wKQoreyA6OmZyZWUoX19wKTsgfQorX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZWxzZSAvKiBfU1RMUF9SVFRJX0JVRyAqLworCisjICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfT1dOX05BTUVTUEFDRSkKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKKyMgICAgaWYgIWRlZmluZWQgKF9TVExQX05FV19ET05UX1RIUk9XX0JBRF9BTExPQykKK3VzaW5nIF9TVExQX1ZFTkRPUl9FWENFUFRfU1REOjpiYWRfYWxsb2M7CisjICAgIGVuZGlmCisKKyMgICAgaWYgIWRlZmluZWQgKF9TVExQX05PX0JBRF9BTExPQykKK3VzaW5nIF9TVExQX1ZFTkRPUl9FWENFUFRfU1REOjpub3Rocm93X3Q7Cit1c2luZyBfU1RMUF9WRU5ET1JfRVhDRVBUX1NURDo6bm90aHJvdzsKKyMgICAgICBpZiBkZWZpbmVkIChfU1RMUF9HTE9CQUxfTkVXX0hBTkRMRVIpCit1c2luZyA6Om5ld19oYW5kbGVyOwordXNpbmcgOjpzZXRfbmV3X2hhbmRsZXI7CisjICAgICAgZWxzZQordXNpbmcgX1NUTFBfVkVORE9SX0VYQ0VQVF9TVEQ6Om5ld19oYW5kbGVyOwordXNpbmcgX1NUTFBfVkVORE9SX0VYQ0VQVF9TVEQ6OnNldF9uZXdfaGFuZGxlcjsKKyMgICAgICBlbmRpZgorIyAgICBlbmRpZiAvKiAhX1NUTFBfTk9fQkFEX0FMTE9DICovCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKyMgIGVuZGlmIC8qIF9TVExQX1VTRV9PV05fTkFNRVNQQUNFICovCisKKyMgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9FWENFUFRJT05TKSAmJiBcCisgICAgIChkZWZpbmVkIChfU1RMUF9OT19ORVdfTkVXX0hFQURFUikgfHwgZGVmaW5lZCAoX1NUTFBfTkVXX0RPTlRfVEhST1dfQkFEX0FMTE9DKSkKKyMgICAgZGVmaW5lIF9TVExQX0NIRUNLX05VTExfQUxMT0MoX194KSB2b2lkKiBfX3kgPSBfX3g7IGlmIChfX3kgPT0gMCkgeyBfU1RMUF9USFJPVyhfU1RMUF9TVEQ6OmJhZF9hbGxvYygpKTsgfSByZXR1cm4gX195CisjICBlbHNlCisjICAgIGRlZmluZSBfU1RMUF9DSEVDS19OVUxMX0FMTE9DKF9feCkgcmV0dXJuIF9feAorIyAgZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKKyMgIGlmICgoZGVmaW5lZCAoX19JQk1DUFBfXykgfHwgZGVmaW5lZCAoX19PUzQwMF9fKSB8fCBkZWZpbmVkIChfX3hsQ19fKSB8fCBkZWZpbmVkIChxVGlkeUhlYXApKSAmJiBkZWZpbmVkIChfX0RFQlVHX0FMTE9DX18pKQoraW5saW5lIHZvaWQqIF9TVExQX0NBTEwgX19zdGxfbmV3KHNpemVfdCBfX24pICAgeyBfU1RMUF9DSEVDS19OVUxMX0FMTE9DKDo6b3BlcmF0b3IgX1NUTFBfTkVXKF9fbiwgX19GSUxFX18sIF9fTElORV9fKSk7IH0KK2lubGluZSB2b2lkICBfU1RMUF9DQUxMIF9fc3RsX2RlbGV0ZSh2b2lkKiBfX3ApIHsgOjpvcGVyYXRvciBkZWxldGUoX19wLCBfX0ZJTEVfXywgX19MSU5FX18pOyB9CisjICBlbHNlCitpbmxpbmUgdm9pZCogX1NUTFBfQ0FMTCBfX3N0bF9uZXcoc2l6ZV90IF9fbikgICB7IF9TVExQX0NIRUNLX05VTExfQUxMT0MoOjpvcGVyYXRvciBfU1RMUF9ORVcoX19uKSk7IH0KK2lubGluZSB2b2lkICBfU1RMUF9DQUxMIF9fc3RsX2RlbGV0ZSh2b2lkKiBfX3ApIHsgOjpvcGVyYXRvciBkZWxldGUoX19wKTsgfQorIyAgZW5kaWYKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2VuZGlmIC8qIF9TVExQX1JUVElfQlVHICovCisKKyNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9ORVcgKi8KKworCisvKgorICogTG9jYWwgVmFyaWFibGVzOgorICogbW9kZTpDKysKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvc3RsL19udWxsX3N0cmVhbS5oIGIvc3RsL19udWxsX3N0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjZGI3YTIKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvX251bGxfc3RyZWFtLmgKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMAorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfTlVMTF9TVFJFQU1fSAorIyBkZWZpbmUgX1NUTFBfTlVMTF9TVFJFQU1fSAorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworc3RydWN0IF9fbnVsbF9zdHJlYW0KK3sKKyAgICB2b2lkIGZsdXNoKCkgeyB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorX19udWxsX3N0cmVhbSYgb3BlcmF0b3IgPDwoX19udWxsX3N0cmVhbSYgX194LCBjb25zdCBfVHAmICkKK3sKKyAgICByZXR1cm4gX194OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorX19udWxsX3N0cmVhbSYgb3BlcmF0b3IgPj4oY29uc3QgX1RwJiwgX19udWxsX3N0cmVhbSYgX194ICkKK3sKKyAgICByZXR1cm4gX194OworfQorCitleHRlcm4gX19udWxsX3N0cmVhbSBjaW4sIGNvdXQsIGNlcnIsIGVuZGwsIHdzLCBoZXgsIGRlYzsKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjIGVuZGlmCmRpZmYgLS1naXQgYS9zdGwvX251bV9nZXQuYyBiL3N0bC9fbnVtX2dldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMTI5OTMKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvX251bV9nZXQuYwpAQCAtMCwwICsxLDY3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKyNpZm5kZWYgX1NUTFBfTlVNX0dFVF9DCisjZGVmaW5lIF9TVExQX05VTV9HRVRfQworCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX05VTV9HRVRfSAorIyAgaW5jbHVkZSA8c3RsL19udW1fZ2V0Lmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9MSU1JVFMKKyMgIGluY2x1ZGUgPHN0bC9fbGltaXRzLmg+CisjZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKworX1NUTFBfREVDTFNQRUMgdW5zaWduZWQgY2hhciBfU1RMUF9DQUxMIF9fZGlnaXRfdmFsX3RhYmxlKHVuc2lnbmVkKTsKK19TVExQX0RFQ0xTUEVDIGNvbnN0IGNoYXIqIF9TVExQX0NBTEwgX19uYXJyb3dfYXRvbXMoKTsKKwordGVtcGxhdGUgPCBjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfSW50ZWdlciwgY2xhc3MgX0NoYXJUPgorX0lucHV0SXRlciBfU1RMUF9DQUxMCitfX2RvX2dldF9pbnRlZ2VyKF9JbnB1dEl0ZXImLCBfSW5wdXRJdGVyJiwgaW9zX2Jhc2UmLCBpb3NfYmFzZTo6aW9zdGF0ZSYsIF9JbnRlZ2VyJiwgX0NoYXJUKik7CisKKy8vIF9fZG9fZ2V0X2ludGVnZXIgYW5kIGl0cyBoZWxwZXIgZnVuY3Rpb25zLgorCitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMIF9fZ2V0X2ZkaWdpdChjaGFyIF9fYywgY29uc3QgY2hhciopCit7IHJldHVybiBfX2MgPj0gJzAnICYmIF9fYyA8PSAnOSc7IH0KKworaW5saW5lIGJvb2wgX1NUTFBfQ0FMTCBfX2dldF9mZGlnaXRfb3Jfc2VwKGNoYXImIF9fYywgY2hhciBfX3NlcCwgY29uc3QgY2hhciAqX19kaWdpdHMpIHsKKyAgaWYgKF9fYyA9PSBfX3NlcCkgeworICAgIF9fYyA9ICcsJyA7CisgICAgcmV0dXJuIHRydWUgOworICB9CisgIGVsc2UKKyAgICByZXR1cm4gIF9fZ2V0X2ZkaWdpdChfX2MsIF9fZGlnaXRzKTsKK30KKworaW5saW5lIGludCBfU1RMUF9DQUxMCitfX2dldF9kaWdpdF9mcm9tX3RhYmxlKHVuc2lnbmVkIF9faW5kZXgpCit7IHJldHVybiAoX19pbmRleCA+IDEyNyA/IDB4RkYgOiBfX2RpZ2l0X3ZhbF90YWJsZShfX2luZGV4KSk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9DaGFyVD4KK2ludAorX19nZXRfYmFzZV9vcl96ZXJvKF9JbnB1dEl0ZXImIF9faW5faXRlLCBfSW5wdXRJdGVyJiBfX2VuZCwgaW9zX2Jhc2UmIF9fc3RyLCBfQ2hhclQqKSB7CisgIF9DaGFyVCBfX2F0b21zWzVdOworICBjb25zdCBjdHlwZTxfQ2hhclQ+JiBfX2NfdHlwZSA9ICpfX1NUQVRJQ19DQVNUKGNvbnN0IGN0eXBlPF9DaGFyVD4qLCBfX3N0ci5fTV9jdHlwZV9mYWNldCgpKTsKKworICBfX2NfdHlwZS53aWRlbihfX25hcnJvd19hdG9tcygpLCBfX25hcnJvd19hdG9tcygpICsgNSwgX19hdG9tcyk7CisKKyAgYm9vbCBfX25lZ2F0aXZlID0gZmFsc2U7CisgIF9DaGFyVCBfX2MgPSAqX19pbl9pdGU7CisKKyAgaWYgKF9fYyA9PSBfX2F0b21zWzFdIC8qIF9feG1pbnVzX2NoYXIgKi8gKSB7CisgICAgX19uZWdhdGl2ZSA9IHRydWU7CisgICAgKytfX2luX2l0ZTsKKyAgfQorICBlbHNlIGlmIChfX2MgPT0gX19hdG9tc1swXSAvKiBfX3hwbHVzX2NoYXIgKi8gKQorICAgICsrX19pbl9pdGU7CisKKyAgaW50IF9fYmFzZTsKKyAgaW50IF9fdmFsaWRfemVybyA9IDA7CisKKyAgaW9zX2Jhc2U6OmZtdGZsYWdzIF9fYmFzZWZpZWxkID0gX19zdHIuZmxhZ3MoKSAmIGlvc19iYXNlOjpiYXNlZmllbGQ7CisKKyAgc3dpdGNoIChfX2Jhc2VmaWVsZCkgeworICBjYXNlIGlvc19iYXNlOjpvY3Q6CisgICAgX19iYXNlID0gODsKKyAgICBicmVhazsKKyAgY2FzZSBpb3NfYmFzZTo6ZGVjOgorICAgIF9fYmFzZSA9IDEwOworICAgIGJyZWFrOworICBjYXNlIGlvc19iYXNlOjpoZXg6CisgICAgX19iYXNlID0gMTY7CisgICAgaWYgKF9faW5faXRlICE9IF9fZW5kICYmICpfX2luX2l0ZSA9PSBfX2F0b21zWzJdIC8qIF9femVyb19jaGFyICovICkgeworICAgICAgKytfX2luX2l0ZTsKKyAgICAgIGlmIChfX2luX2l0ZSAhPSBfX2VuZCAmJgorICAgICAgICAgICgqX19pbl9pdGUgPT0gX19hdG9tc1szXSAvKiBfX3hfY2hhciAqLyB8fCAqX19pbl9pdGUgPT0gX19hdG9tc1s0XSAvKiBfX1hfY2hhciAqLyApKQorICAgICAgICArK19faW5faXRlOworICAgICAgZWxzZQorICAgICAgICBfX3ZhbGlkX3plcm8gPSAxOyAvLyBUaGF0IHplcm8gaXMgdmFsaWQgYnkgaXRzZWxmLgorICAgIH0KKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBpZiAoX19pbl9pdGUgIT0gX19lbmQgJiYgKl9faW5faXRlID09IF9fYXRvbXNbMl0gLyogX196ZXJvX2NoYXIgKi8gKSB7CisgICAgICArK19faW5faXRlOworICAgICAgaWYgKF9faW5faXRlICE9IF9fZW5kICYmCisgICAgICAgICAgKCpfX2luX2l0ZSA9PSBfX2F0b21zWzNdIC8qIF9feF9jaGFyICovIHx8ICpfX2luX2l0ZSA9PSBfX2F0b21zWzRdIC8qIF9fWF9jaGFyICovICkpIHsKKyAgICAgICAgKytfX2luX2l0ZTsKKyAgICAgICAgX19iYXNlID0gMTY7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfX2Jhc2UgPSA4OworICAgICAgICAgIF9fdmFsaWRfemVybyA9IDE7IC8vIFRoYXQgemVybyBpcyBzdGlsbCB2YWxpZCBieSBpdHNlbGYuCisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgICAgX19iYXNlID0gMTA7CisgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIChfX2Jhc2UgPDwgMikgfCAoKGludClfX25lZ2F0aXZlIDw8IDEpIHwgX192YWxpZF96ZXJvOworfQorCisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfSW50ZWdlciwgY2xhc3MgX0NoYXJUPgorYm9vbCBfU1RMUF9DQUxMCitfX2dldF9pbnRlZ2VyKF9JbnB1dEl0ZXImIF9fZmlyc3QsIF9JbnB1dEl0ZXImIF9fbGFzdCwKKyAgICAgICAgICAgICAgaW50IF9fYmFzZSwgX0ludGVnZXImIF9fdmFsLAorICAgICAgICAgICAgICBpbnQgX19nb3QsIGJvb2wgX19pc19uZWdhdGl2ZSwgX0NoYXJUIF9fc2VwYXJhdG9yLCBjb25zdCBzdHJpbmcmIF9fZ3JvdXBpbmcsIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKl9Jc1NpZ25lZCovKSB7CisgIGJvb2wgX19vdmZsb3cgPSBmYWxzZTsKKyAgX0ludGVnZXIgX19yZXN1bHQgPSAwOworICBib29sIF9faXNfZ3JvdXAgPSAhX19ncm91cGluZy5lbXB0eSgpOworICBjaGFyIF9fZ3JvdXBfc2l6ZXNbNjRdOworICBjaGFyIF9fY3VycmVudF9ncm91cF9zaXplID0gMDsKKyAgY2hhciogX19ncm91cF9zaXplc19lbmQgPSBfX2dyb3VwX3NpemVzOworCisgIF9JbnRlZ2VyIF9fb3Zlcl9iYXNlID0gKG51bWVyaWNfbGltaXRzPF9JbnRlZ2VyPjo6bWluKSgpIC8gX19TVEFUSUNfQ0FTVChfSW50ZWdlciwgX19iYXNlKTsKKworICAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdCA7ICsrX19maXJzdCkgeworCisgICAgIGNvbnN0IF9DaGFyVCBfX2MgPSAqX19maXJzdDsKKworICAgICBpZiAoX19pc19ncm91cCAmJiBfX2MgPT0gX19zZXBhcmF0b3IpIHsKKyAgICAgICAqX19ncm91cF9zaXplc19lbmQrKyA9IF9fY3VycmVudF9ncm91cF9zaXplOworICAgICAgIF9fY3VycmVudF9ncm91cF9zaXplID0gMDsKKyAgICAgICBjb250aW51ZTsKKyAgICAgfQorCisgICAgIGludCBfX24gPSBfX2dldF9kaWdpdF9mcm9tX3RhYmxlKF9fYyk7CisKKyAgICAgaWYgKF9fbiA+PSBfX2Jhc2UpCisgICAgICAgYnJlYWs7CisKKyAgICAgKytfX2dvdDsKKyAgICAgKytfX2N1cnJlbnRfZ3JvdXBfc2l6ZTsKKworICAgICBpZiAoX19yZXN1bHQgPCBfX292ZXJfYmFzZSkKKyAgICAgICBfX292ZmxvdyA9IHRydWU7ICAvLyBkb24ndCBuZWVkIHRvIGtlZXAgYWNjdW11bGF0aW5nCisgICAgIGVsc2UgeworICAgICAgIF9JbnRlZ2VyIF9fbmV4dCA9IF9fU1RBVElDX0NBU1QoX0ludGVnZXIsIF9fYmFzZSAqIF9fcmVzdWx0IC0gX19uKTsKKyAgICAgICBpZiAoX19yZXN1bHQgIT0gMCkKKyAgICAgICAgIF9fb3ZmbG93ID0gX19vdmZsb3cgfHwgX19uZXh0ID49IF9fcmVzdWx0OworICAgICAgIF9fcmVzdWx0ID0gX19uZXh0OworICAgICB9CisgICB9CisKKyAgIGlmIChfX2lzX2dyb3VwICYmIF9fZ3JvdXBfc2l6ZXNfZW5kICE9IF9fZ3JvdXBfc2l6ZXMpIHsKKyAgICAgKl9fZ3JvdXBfc2l6ZXNfZW5kKysgPSBfX2N1cnJlbnRfZ3JvdXBfc2l6ZTsKKyAgIH0KKworICAgLy8gZmJwIDogYWRkZWQgdG8gbm90IG1vZGlmeSB2YWx1ZSBpZiBub3RoaW5nIHdhcyByZWFkCisgICBpZiAoX19nb3QgPiAwKSB7CisgICAgICAgX192YWwgPSBfX292ZmxvdyA/IF9faXNfbmVnYXRpdmUgPyAobnVtZXJpY19saW1pdHM8X0ludGVnZXI+OjptaW4pKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChudW1lcmljX2xpbWl0czxfSW50ZWdlcj46Om1heCkoKQorICAgICAgICAgICAgICAgICAgICAgICAgOiBfX2lzX25lZ2F0aXZlID8gX19yZXN1bHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF9fU1RBVElDX0NBU1QoX0ludGVnZXIsIC1fX3Jlc3VsdCk7CisgICB9CisgIC8vIG92ZXJmbG93IGlzIGJlaW5nIHRyZWF0ZWQgYXMgZmFpbHVyZQorICByZXR1cm4gKChfX2dvdCA+IDApICYmICFfX292ZmxvdykgJiYKKyAgICAgICAgICAoX19pc19ncm91cCA9PSAwIHx8CisgICAgICAgICAgIF9fdmFsaWRfZ3JvdXBpbmcoX19ncm91cF9zaXplcywgX19ncm91cF9zaXplc19lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19ncm91cGluZy5kYXRhKCksIF9fZ3JvdXBpbmcuZGF0YSgpKyBfX2dyb3VwaW5nLnNpemUoKSkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX0ludGVnZXIsIGNsYXNzIF9DaGFyVD4KK2Jvb2wgX1NUTFBfQ0FMTAorX19nZXRfaW50ZWdlcihfSW5wdXRJdGVyJiBfX2ZpcnN0LCBfSW5wdXRJdGVyJiBfX2xhc3QsCisgICAgICAgICAgICAgIGludCBfX2Jhc2UsIF9JbnRlZ2VyJiBfX3ZhbCwKKyAgICAgICAgICAgICAgaW50IF9fZ290LCBib29sIF9faXNfbmVnYXRpdmUsIF9DaGFyVCBfX3NlcGFyYXRvciwgY29uc3Qgc3RyaW5nJiBfX2dyb3VwaW5nLCBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qX0lzU2lnbmVkKi8pIHsKKyAgYm9vbCBfX292ZmxvdyA9IGZhbHNlOworICBfSW50ZWdlciBfX3Jlc3VsdCA9IDA7CisgIGJvb2wgX19pc19ncm91cCA9ICFfX2dyb3VwaW5nLmVtcHR5KCk7CisgIGNoYXIgX19ncm91cF9zaXplc1s2NF07CisgIGNoYXIgX19jdXJyZW50X2dyb3VwX3NpemUgPSAwOworICBjaGFyKiBfX2dyb3VwX3NpemVzX2VuZCA9IF9fZ3JvdXBfc2l6ZXM7CisKKyAgX0ludGVnZXIgIF9fb3Zlcl9iYXNlID0gKG51bWVyaWNfbGltaXRzPF9JbnRlZ2VyPjo6bWF4KSgpIC8gX19TVEFUSUNfQ0FTVChfSW50ZWdlciwgX19iYXNlKTsKKworICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0IDsgKytfX2ZpcnN0KSB7CisKKyAgICBjb25zdCBfQ2hhclQgX19jID0gKl9fZmlyc3Q7CisKKyAgICBpZiAoX19pc19ncm91cCAmJiBfX2MgPT0gX19zZXBhcmF0b3IpIHsKKyAgICAgICpfX2dyb3VwX3NpemVzX2VuZCsrID0gX19jdXJyZW50X2dyb3VwX3NpemU7CisgICAgICBfX2N1cnJlbnRfZ3JvdXBfc2l6ZSA9IDA7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBpbnQgX19uID0gX19nZXRfZGlnaXRfZnJvbV90YWJsZShfX2MpOworCisgICAgaWYgKF9fbiA+PSBfX2Jhc2UpCisgICAgICBicmVhazsKKworICAgICsrX19nb3Q7CisgICAgKytfX2N1cnJlbnRfZ3JvdXBfc2l6ZTsKKworICAgIGlmIChfX3Jlc3VsdCA+IF9fb3Zlcl9iYXNlKQorICAgICAgX19vdmZsb3cgPSB0cnVlOyAgLy9kb24ndCBuZWVkIHRvIGtlZXAgYWNjdW11bGF0aW5nCisgICAgZWxzZSB7CisgICAgICBfSW50ZWdlciBfX25leHQgPSBfX1NUQVRJQ19DQVNUKF9JbnRlZ2VyLCBfX2Jhc2UgKiBfX3Jlc3VsdCArIF9fbik7CisgICAgICBpZiAoX19yZXN1bHQgIT0gMCkKKyAgICAgICAgX19vdmZsb3cgPSBfX292ZmxvdyB8fCBfX25leHQgPD0gX19yZXN1bHQ7CisgICAgICAgIF9fcmVzdWx0ID0gX19uZXh0OworICAgICAgfQorICB9CisKKyAgaWYgKF9faXNfZ3JvdXAgJiYgX19ncm91cF9zaXplc19lbmQgIT0gX19ncm91cF9zaXplcykgeworICAgICAgKl9fZ3JvdXBfc2l6ZXNfZW5kKysgPSBfX2N1cnJlbnRfZ3JvdXBfc2l6ZTsKKyAgfQorCisgIC8vIGZicCA6IGFkZGVkIHRvIG5vdCBtb2RpZnkgdmFsdWUgaWYgbm90aGluZyB3YXMgcmVhZAorICBpZiAoX19nb3QgPiAwKSB7CisgICAgICBfX3ZhbCA9IF9fb3ZmbG93ID8gKG51bWVyaWNfbGltaXRzPF9JbnRlZ2VyPjo6bWF4KSgpCisgICAgICAgICAgICAgICAgICAgICAgIDogKF9faXNfbmVnYXRpdmUgPyBfX1NUQVRJQ19DQVNUKF9JbnRlZ2VyLCAtX19yZXN1bHQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfX3Jlc3VsdCk7CisgIH0KKworICAvLyBvdmVyZmxvdyBpcyBiZWluZyB0cmVhdGVkIGFzIGZhaWx1cmUKKyAgcmV0dXJuICgoX19nb3QgPiAwKSAmJiAhX19vdmZsb3cpICYmCisgICAgICAgICAgKF9faXNfZ3JvdXAgPT0gMCB8fAorICAgICAgICAgICBfX3ZhbGlkX2dyb3VwaW5nKF9fZ3JvdXBfc2l6ZXMsIF9fZ3JvdXBfc2l6ZXNfZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZ3JvdXBpbmcuZGF0YSgpLCBfX2dyb3VwaW5nLmRhdGEoKSsgX19ncm91cGluZy5zaXplKCkpKTsKK30KKworCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX0ludGVnZXIsIGNsYXNzIF9DaGFyVD4KK2Jvb2wgX1NUTFBfQ0FMTAorX19nZXRfZGVjaW1hbF9pbnRlZ2VyKF9JbnB1dEl0ZXImIF9fZmlyc3QsIF9JbnB1dEl0ZXImIF9fbGFzdCwgX0ludGVnZXImIF9fdmFsLCBfQ2hhclQqIC8qZHVtbXkqLykgeworICBzdHJpbmcgX19ncnA7CisgIC8vSGVyZSB0aGVyZSBpcyBubyBncm91cGluZyBzbyBzZXBhcmF0b3IgaXMgbm90IGltcG9ydGFudCwgd2UganVzdCBwYXNzIHRoZSBkZWZhdWx0IGNoYXJhdGVyLgorICByZXR1cm4gX19nZXRfaW50ZWdlcihfX2ZpcnN0LCBfX2xhc3QsIDEwLCBfX3ZhbCwgMCwgZmFsc2UsIF9DaGFyVCgpIC8qc2VwYXJhdG9yKi8sIF9fZ3JwLCBfX2ZhbHNlX3R5cGUoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfSW50ZWdlciwgY2xhc3MgX0NoYXJUPgorX0lucHV0SXRlciBfU1RMUF9DQUxMCitfX2RvX2dldF9pbnRlZ2VyKF9JbnB1dEl0ZXImIF9faW5faXRlLCBfSW5wdXRJdGVyJiBfX2VuZCwgaW9zX2Jhc2UmIF9fc3RyLAorICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIF9JbnRlZ2VyJiBfX3ZhbCwgX0NoYXJUKiBfX3BjKSB7CisjaWYgZGVmaW5lZCAoX19IUF9hQ0MpICYmIChfX0hQX2FDQyA9PSAxKQorICBib29sIF9Jc1NpZ25lZCA9ICEoKF9JbnRlZ2VyKSgtMSkgPiAwKTsKKyNlbHNlCisgIHR5cGVkZWYgdHlwZW5hbWUgX19ib29sMnR5cGU8bnVtZXJpY19saW1pdHM8X0ludGVnZXI+Ojppc19zaWduZWQ+OjpfUmV0IF9Jc1NpZ25lZDsKKyNlbmRpZgorCisgIGNvbnN0IG51bXB1bmN0PF9DaGFyVD4mIF9fbnVtcHVuY3QgPSAqX19TVEFUSUNfQ0FTVChjb25zdCBudW1wdW5jdDxfQ2hhclQ+KiwgX19zdHIuX01fbnVtcHVuY3RfZmFjZXQoKSk7CisgIGNvbnN0IHN0cmluZyYgX19ncm91cGluZyA9IF9fc3RyLl9NX2dyb3VwaW5nKCk7IC8vIGNhY2hlZCBjb3B5CisKKyAgY29uc3QgaW50IF9fYmFzZV9vcl96ZXJvID0gX19nZXRfYmFzZV9vcl96ZXJvKF9faW5faXRlLCBfX2VuZCwgX19zdHIsIF9fcGMpOworICBpbnQgIF9fZ290ID0gX19iYXNlX29yX3plcm8gJiAxOworCisgIGJvb2wgX19yZXN1bHQ7CisKKyAgaWYgKF9faW5faXRlID09IF9fZW5kKSB7ICAgICAgLy8gV2UgbWF5IGhhdmUgYWxyZWFkeSByZWFkIGEgMC4gIElmIHNvLAorCisgICAgaWYgKF9fZ290ID4gMCkgeyAgICAgICAvLyB0aGUgcmVzdWx0IGlzIDAgZXZlbiBpZiB3ZSdyZSBhdCBlb2YuCisgICAgICBfX3ZhbCA9IDA7CisgICAgICBfX3Jlc3VsdCA9IHRydWU7CisgICAgfQorICAgIGVsc2UKKyAgICAgIF9fcmVzdWx0ID0gZmFsc2U7CisgIH0KKyAgZWxzZSB7CisgICAgY29uc3QgYm9vbCBfX25lZ2F0aXZlID0gKF9fYmFzZV9vcl96ZXJvICYgMikgIT0gMDsKKyAgICBjb25zdCBpbnQgX19iYXNlID0gX19iYXNlX29yX3plcm8gPj4gMjsKKworI2lmIGRlZmluZWQgKF9fSFBfYUNDKSAmJiAoX19IUF9hQ0MgPT0gMSkKKyAgICBpZiAoX0lzU2lnbmVkKQorICAgICAgX19yZXN1bHQgPSBfX2dldF9pbnRlZ2VyKF9faW5faXRlLCBfX2VuZCwgX19iYXNlLCAgX192YWwsIF9fZ290LCBfX25lZ2F0aXZlLCBfX251bXB1bmN0LnRob3VzYW5kc19zZXAoKSwgX19ncm91cGluZywgX190cnVlX3R5cGUoKSApOworICAgIGVsc2UKKyAgICAgIF9fcmVzdWx0ID0gX19nZXRfaW50ZWdlcihfX2luX2l0ZSwgX19lbmQsIF9fYmFzZSwgIF9fdmFsLCBfX2dvdCwgX19uZWdhdGl2ZSwgX19udW1wdW5jdC50aG91c2FuZHNfc2VwKCksIF9fZ3JvdXBpbmcsIF9fZmFsc2VfdHlwZSgpICk7CisjZWxzZQorICAgIF9fcmVzdWx0ID0gX19nZXRfaW50ZWdlcihfX2luX2l0ZSwgX19lbmQsIF9fYmFzZSwgIF9fdmFsLCBfX2dvdCwgX19uZWdhdGl2ZSwgX19udW1wdW5jdC50aG91c2FuZHNfc2VwKCksIF9fZ3JvdXBpbmcsIF9Jc1NpZ25lZCgpKTsKKyMgZW5kaWYKKyAgfQorCisgIF9fZXJyID0gX19TVEFUSUNfQ0FTVChpb3NfYmFzZTo6aW9zdGF0ZSwgX19yZXN1bHQgPyBpb3NfYmFzZTo6Z29vZGJpdCA6IGlvc19iYXNlOjpmYWlsYml0KTsKKworICBpZiAoX19pbl9pdGUgPT0gX19lbmQpCisgICAgX19lcnIgfD0gaW9zX2Jhc2U6OmVvZmJpdDsKKyAgcmV0dXJuIF9faW5faXRlOworfQorCisvLyBfX3JlYWRfZmxvYXQgYW5kIGl0cyBoZWxwZXIgZnVuY3Rpb25zLgordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9DaGFyVD4KK19JbnB1dEl0ZXIgIF9TVExQX0NBTEwKK19fY29weV9zaWduKF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsIF9faW9zdHJpbmcmIF9fdiwKKyAgICAgICAgICAgIF9DaGFyVCBfX3hwbHVzLCBfQ2hhclQgX194bWludXMpIHsKKyAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KSB7CisgICAgX0NoYXJUIF9fYyA9ICpfX2ZpcnN0OworICAgIGlmIChfX2MgPT0gX194cGx1cykKKyAgICAgICsrX19maXJzdDsKKyAgICBlbHNlIGlmIChfX2MgPT0gX194bWludXMpIHsKKyAgICAgIF9fdi5wdXNoX2JhY2soJy0nKTsKKyAgICAgICsrX19maXJzdDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIF9fZmlyc3Q7Cit9CisKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9DaGFyVD4KK2Jvb2wgX1NUTFBfQ0FMTAorX19jb3B5X2RpZ2l0cyhfSW5wdXRJdGVyJiBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgX19pb3N0cmluZyYgX192LCBjb25zdCBfQ2hhclQqIF9fZGlnaXRzKSB7CisgIGJvb2wgX19vayA9IGZhbHNlOworCisgIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkgeworICAgIF9DaGFyVCBfX2MgPSAqX19maXJzdDsKKyAgICBpZiAoX19nZXRfZmRpZ2l0KF9fYywgX19kaWdpdHMpKSB7CisgICAgICBfX3YucHVzaF9iYWNrKChjaGFyKV9fYyk7CisgICAgICBfX29rID0gdHJ1ZTsKKyAgICB9CisgICAgZWxzZQorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIF9fb2s7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfQ2hhclQ+Citib29sIF9TVExQX0NBTEwKK19fY29weV9ncm91cGVkX2RpZ2l0cyhfSW5wdXRJdGVyJiBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICBfX2lvc3RyaW5nJiBfX3YsIGNvbnN0IF9DaGFyVCAqIF9fZGlnaXRzLAorICAgICAgICAgICAgICAgICAgICAgIF9DaGFyVCBfX3NlcCwgY29uc3Qgc3RyaW5nJiBfX2dyb3VwaW5nLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wmIF9fZ3JvdXBpbmdfb2spIHsKKyAgYm9vbCBfX29rID0gZmFsc2U7CisgIGNoYXIgX19ncm91cF9zaXplc1s2NF07CisgIGNoYXIqX19ncm91cF9zaXplc19lbmQgPSBfX2dyb3VwX3NpemVzOworICBjaGFyIF9fY3VycmVudF9ncm91cF9zaXplID0gMDsKKworICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpIHsKKyAgICBfQ2hhclQgX19jID0gKl9fZmlyc3Q7CisgICAgYm9vbCBfX3RtcCA9IF9fZ2V0X2ZkaWdpdF9vcl9zZXAoX19jLCBfX3NlcCwgX19kaWdpdHMpOworICAgIGlmIChfX3RtcCkgeworICAgICAgaWYgKF9fYyA9PSAnLCcpIHsKKyAgICAgICAgKl9fZ3JvdXBfc2l6ZXNfZW5kKysgPSBfX2N1cnJlbnRfZ3JvdXBfc2l6ZTsKKyAgICAgICAgX19jdXJyZW50X2dyb3VwX3NpemUgPSAwOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIF9fb2sgPSB0cnVlOworICAgICAgICBfX3YucHVzaF9iYWNrKChjaGFyKV9fYyk7CisgICAgICAgICsrX19jdXJyZW50X2dyb3VwX3NpemU7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKF9fZ3JvdXBfc2l6ZXNfZW5kICE9IF9fZ3JvdXBfc2l6ZXMpCisgICAgKl9fZ3JvdXBfc2l6ZXNfZW5kKysgPSBfX2N1cnJlbnRfZ3JvdXBfc2l6ZTsKKyAgX19ncm91cGluZ19vayA9IF9fdmFsaWRfZ3JvdXBpbmcoX19ncm91cF9zaXplcywgX19ncm91cF9zaXplc19lbmQsIF9fZ3JvdXBpbmcuZGF0YSgpLCBfX2dyb3VwaW5nLmRhdGEoKSArIF9fZ3JvdXBpbmcuc2l6ZSgpKTsKKyAgcmV0dXJuIF9fb2s7Cit9CisKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9DaGFyVD4KK2Jvb2wgX1NUTFBfQ0FMTAorX19yZWFkX2Zsb2F0KF9faW9zdHJpbmcmIF9fYnVmLCBfSW5wdXRJdGVyJiBfX2luX2l0ZSwgX0lucHV0SXRlciYgX19lbmQsIGlvc19iYXNlJiBfX3MsIF9DaGFyVCopIHsKKyAgLy8gQ3JlYXRlIGEgc3RyaW5nLCBjb3B5aW5nIGNoYXJhY3RlcnMgb2YgdGhlIGZvcm0KKyAgLy8gWystXT8gWzAtOV0qIC4/IFswLTldKiAoW2VFXSBbKy1dPyBbMC05XSspPworCisgIGJvb2wgX19kaWdpdHNfYmVmb3JlX2RvdCAvKiA9IGZhbHNlICovOworICBib29sIF9fZGlnaXRzX2FmdGVyX2RvdCA9IGZhbHNlOworICBib29sIF9fb2s7CisKKyAgYm9vbCAgIF9fZ3JvdXBpbmdfb2sgPSB0cnVlOworCisgIGNvbnN0IGN0eXBlPF9DaGFyVD4mIF9fY3QgPSAqX19TVEFUSUNfQ0FTVChjb25zdCBjdHlwZTxfQ2hhclQ+KiwgX19zLl9NX2N0eXBlX2ZhY2V0KCkpOworICBjb25zdCBudW1wdW5jdDxfQ2hhclQ+JiBfX251bXB1bmN0ID0gKl9fU1RBVElDX0NBU1QoY29uc3QgbnVtcHVuY3Q8X0NoYXJUPiosIF9fcy5fTV9udW1wdW5jdF9mYWNldCgpKTsKKyAgY29uc3Qgc3RyaW5nJiBfX2dyb3VwaW5nID0gX19zLl9NX2dyb3VwaW5nKCk7IC8vIGNhY2hlZCBjb3B5CisKKyAgX0NoYXJUIF9fZG90ID0gX19udW1wdW5jdC5kZWNpbWFsX3BvaW50KCk7CisgIF9DaGFyVCBfX3NlcCA9IF9fbnVtcHVuY3QudGhvdXNhbmRzX3NlcCgpOworCisgIF9DaGFyVCBfX2RpZ2l0c1sxMF07CisgIF9DaGFyVCBfX3hwbHVzOworICBfQ2hhclQgX194bWludXM7CisKKyAgX0NoYXJUIF9fcG93X2U7CisgIF9DaGFyVCBfX3Bvd19FOworCisgIF9Jbml0aWFsaXplX2dldF9mbG9hdChfX2N0LCBfX3hwbHVzLCBfX3htaW51cywgX19wb3dfZSwgX19wb3dfRSwgX19kaWdpdHMpOworCisgIC8vIEdldCBhbiBvcHRpb25hbCBzaWduCisgIF9faW5faXRlID0gX19jb3B5X3NpZ24oX19pbl9pdGUsIF9fZW5kLCBfX2J1ZiwgX194cGx1cywgX194bWludXMpOworCisgIC8vIEdldCBhbiBvcHRpb25hbCBzdHJpbmcgb2YgZGlnaXRzLgorICBpZiAoIV9fZ3JvdXBpbmcuZW1wdHkoKSkKKyAgICBfX2RpZ2l0c19iZWZvcmVfZG90ID0gX19jb3B5X2dyb3VwZWRfZGlnaXRzKF9faW5faXRlLCBfX2VuZCwgX19idWYsIF9fZGlnaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19zZXAsIF9fZ3JvdXBpbmcsIF9fZ3JvdXBpbmdfb2spOworICBlbHNlCisgICAgX19kaWdpdHNfYmVmb3JlX2RvdCA9IF9fY29weV9kaWdpdHMoX19pbl9pdGUsIF9fZW5kLCBfX2J1ZiwgX19kaWdpdHMpOworCisgIC8vIEdldCBhbiBvcHRpb25hbCBkZWNpbWFsIHBvaW50LCBhbmQgYW4gb3B0aW9uYWwgc3RyaW5nIG9mIGRpZ2l0cy4KKyAgaWYgKF9faW5faXRlICE9IF9fZW5kICYmICpfX2luX2l0ZSA9PSBfX2RvdCkgeworICAgIF9fYnVmLnB1c2hfYmFjaygnLicpOworICAgICsrX19pbl9pdGU7CisgICAgX19kaWdpdHNfYWZ0ZXJfZG90ID0gX19jb3B5X2RpZ2l0cyhfX2luX2l0ZSwgX19lbmQsIF9fYnVmLCBfX2RpZ2l0cyk7CisgIH0KKworICAvLyBUaGVyZSBoYXZlIHRvIGJlIHNvbWUgZGlnaXRzLCBzb21ld2hlcmUuCisgIF9fb2sgPSBfX2RpZ2l0c19iZWZvcmVfZG90IHx8IF9fZGlnaXRzX2FmdGVyX2RvdDsKKworICAvLyBHZXQgYW4gb3B0aW9uYWwgZXhwb25lbnQuCisgIGlmIChfX29rICYmIF9faW5faXRlICE9IF9fZW5kICYmICgqX19pbl9pdGUgPT0gX19wb3dfZSB8fCAqX19pbl9pdGUgPT0gX19wb3dfRSkpIHsKKyAgICBfX2J1Zi5wdXNoX2JhY2soJ2UnKTsKKyAgICArK19faW5faXRlOworICAgIF9faW5faXRlID0gX19jb3B5X3NpZ24oX19pbl9pdGUsIF9fZW5kLCBfX2J1ZiwgX194cGx1cywgX194bWludXMpOworICAgIF9fb2sgPSBfX2NvcHlfZGlnaXRzKF9faW5faXRlLCBfX2VuZCwgX19idWYsIF9fZGlnaXRzKTsKKyAgICAvLyBJZiB3ZSBoYXZlIGFuIGV4cG9uZW50IHRoZW4gdGhlIHNpZ24KKyAgICAvLyBpcyBvcHRpb25hbCBidXQgdGhlIGRpZ2l0cyBhcmVuJ3QuCisgIH0KKworICByZXR1cm4gX19vazsKK30KKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKKy8vCisvLyBudW1fZ2V0PD4sIG51bV9wdXQ8PgorLy8KKworI2lmICggX1NUTFBfU1RBVElDX1RFTVBMQVRFX0RBVEEgPiAwICkKKyMgIGlmICFkZWZpbmVkIChfX0JPUkxBTkRDX18pCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfSW5wdXRJdGVyYXRvcj4KK2xvY2FsZTo6aWQgbnVtX2dldDxfQ2hhclQsIF9JbnB1dEl0ZXJhdG9yPjo6aWQ7CisjICBlbmRpZgorCisjICBpZiAoZGVmaW5lZCAoX19DWUdXSU5fXykgfHwgZGVmaW5lZCAoX19NSU5HVzMyX18pKSAmJiBcCisgICAgICAgZGVmaW5lZCAoX1NUTFBfVVNFX0RZTkFNSUNfTElCKSAmJiAhZGVmaW5lZCAoX19CVUlMRElOR19TVExQT1JUKQorLyoKKyAqIFVuZGVyIGN5Z3dpbiwgd2hlbiBTVExwb3J0IGlzIHVzZWQgYXMgYSBzaGFyZWQgbGlicmFyeSwgdGhlIGlkIG5lZWRzCisgKiB0byBiZSBzcGVjaWZpZWQgYXMgaW1wb3J0ZWQgb3RoZXJ3aXNlIHRoZXkgd2lsbCBiZSBkdXBsaWNhdGVkIGluIHRoZQorICogY2FsbGluZyBleGVjdXRhYmxlLgorICovCit0ZW1wbGF0ZSA8PgorX1NUTFBfREVDTFNQRUMgbG9jYWxlOjppZCBudW1fZ2V0PGNoYXIsIGlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiA+OjppZDsKKy8qCit0ZW1wbGF0ZSA8PgorX1NUTFBfREVDTFNQRUMgbG9jYWxlOjppZCBudW1fZ2V0PGNoYXIsIGNvbnN0IGNoYXIqPjo6aWQ7CisqLworCisjICAgIGlmICFkZWZpbmVkIChTVExQX05PX1dDSEFSX1QpCit0ZW1wbGF0ZSA8PgorX1NUTFBfREVDTFNQRUMgbG9jYWxlOjppZCBudW1fZ2V0PHdjaGFyX3QsIGlzdHJlYW1idWZfaXRlcmF0b3I8d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPiA+OjppZDsKKy8qCit0ZW1wbGF0ZSA8PgorX1NUTFBfREVDTFNQRUMgbG9jYWxlOjppZCBudW1fZ2V0PHdjaGFyX3QsIGNvbnN0IHdjaGFyX3QqPjo6aWQ7CisqLworIyAgICBlbmRpZgorCisjICBlbmRpZiAvKiBfX0NZR1dJTl9fICYmIF9TVExQX1VTRV9EWU5BTUlDX0xJQiAqLworCisjZWxzZSAvKiAoIF9TVExQX1NUQVRJQ19URU1QTEFURV9EQVRBID4gMCApICovCisKKy8vdHlwZWRlZiBudW1fZ2V0PGNoYXIsIGNvbnN0IGNoYXIqPiBudW1fZ2V0X2NoYXI7Cit0eXBlZGVmIG51bV9nZXQ8Y2hhciwgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+ID4gbnVtX2dldF9jaGFyXzI7CisKKy8vX19ERUNMQVJFX0lOU1RBTkNFKGxvY2FsZTo6aWQsIG51bV9nZXRfY2hhcjo6aWQsICk7CitfX0RFQ0xBUkVfSU5TVEFOQ0UobG9jYWxlOjppZCwgbnVtX2dldF9jaGFyXzI6OmlkLCApOworCisjICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkKKworLy90eXBlZGVmIG51bV9nZXQ8d2NoYXJfdCwgY29uc3Qgd2NoYXJfdCo+IG51bV9nZXRfd2NoYXJfdDsKK3R5cGVkZWYgbnVtX2dldDx3Y2hhcl90LCBpc3RyZWFtYnVmX2l0ZXJhdG9yPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4gPiBudW1fZ2V0X3djaGFyX3RfMjsKKworLy9fX0RFQ0xBUkVfSU5TVEFOQ0UobG9jYWxlOjppZCwgbnVtX2dldF93Y2hhcl90OjppZCwgKTsKK19fREVDTEFSRV9JTlNUQU5DRShsb2NhbGU6OmlkLCBudW1fZ2V0X3djaGFyX3RfMjo6aWQsICk7CisKKyMgIGVuZGlmCisKKyNlbmRpZiAvKiAoIF9TVExQX1NUQVRJQ19URU1QTEFURV9EQVRBID4gMCApICovCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fQk9PTCkKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9JbnB1dEl0ZXI+CitfSW5wdXRJdGVyCitudW1fZ2V0PF9DaGFyVCwgX0lucHV0SXRlcj46OmRvX2dldChfSW5wdXRJdGVyIF9faW5faXRlLCBfSW5wdXRJdGVyIF9fZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2UmIF9fcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgYm9vbCYgX194KSBjb25zdCB7CisgIGlmIChfX3MuZmxhZ3MoKSAmIGlvc19iYXNlOjpib29sYWxwaGEpIHsKKyAgICBsb2NhbGUgX19sb2MgPSBfX3MuZ2V0bG9jKCk7CisgICAgY29uc3QgX051bXB1bmN0JiBfX25wID0gKl9fU1RBVElDX0NBU1QoY29uc3QgX051bXB1bmN0KiwgX19zLl9NX251bXB1bmN0X2ZhY2V0KCkpOworICAgIC8vICAgIGNvbnN0IG51bXB1bmN0PF9DaGFyVD4mIF9fbnAgPSB1c2VfZmFjZXQ8bnVtcHVuY3Q8X0NoYXJUPiA+KF9fbG9jKSA7CisvLyAgICBjb25zdCBjdHlwZTxfQ2hhclQ+JiBfX2N0ID0gICAgdXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihfX2xvYykgOworCisgICAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVD4gX190cnVlbmFtZSAgPSBfX25wLnRydWVuYW1lKCk7CisgICAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVD4gX19mYWxzZW5hbWUgPSBfX25wLmZhbHNlbmFtZSgpOworICAgIGJvb2wgX190cnVlX29rICA9IHRydWU7CisgICAgYm9vbCBfX2ZhbHNlX29rID0gdHJ1ZTsKKworICAgIHNpemVfdCBfX24gPSAwOworICAgIGZvciAoIDsgX19pbl9pdGUgIT0gX19lbmQ7ICsrX19pbl9pdGUpIHsKKyAgICAgIF9DaGFyVCBfX2MgPSAqX19pbl9pdGU7CisgICAgICBfX3RydWVfb2sgID0gX190cnVlX29rICAmJiAoX19jID09IF9fdHJ1ZW5hbWVbX19uXSk7CisgICAgICBfX2ZhbHNlX29rID0gX19mYWxzZV9vayAmJiAoX19jID09IF9fZmFsc2VuYW1lW19fbl0pOworICAgICAgKytfX247CisKKyAgICAgIGlmICgoIV9fdHJ1ZV9vayAmJiAhX19mYWxzZV9vaykgfHwKKyAgICAgICAgICAoX190cnVlX29rICAmJiBfX24gPj0gX190cnVlbmFtZS5zaXplKCkpIHx8CisgICAgICAgICAgKF9fZmFsc2Vfb2sgJiYgX19uID49IF9fZmFsc2VuYW1lLnNpemUoKSkpIHsKKyAgICAgICAgKytfX2luX2l0ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGlmIChfX3RydWVfb2sgICYmIF9fbiA8IF9fdHJ1ZW5hbWUuc2l6ZSgpKSAgX190cnVlX29rICA9IGZhbHNlOworICAgIGlmIChfX2ZhbHNlX29rICYmIF9fbiA8IF9fZmFsc2VuYW1lLnNpemUoKSkgX19mYWxzZV9vayA9IGZhbHNlOworCisgICAgaWYgKF9fdHJ1ZV9vayB8fCBfX2ZhbHNlX29rKSB7CisgICAgICBfX2VyciA9IGlvc19iYXNlOjpnb29kYml0OworICAgICAgX194ID0gX190cnVlX29rOworICAgIH0KKyAgICBlbHNlCisgICAgICBfX2VyciA9IGlvc19iYXNlOjpmYWlsYml0OworCisgICAgaWYgKF9faW5faXRlID09IF9fZW5kKQorICAgICAgX19lcnIgfD0gaW9zX2Jhc2U6OmVvZmJpdDsKKworICAgIHJldHVybiBfX2luX2l0ZTsKKyAgfQorCisgIGVsc2UgeworICAgIGxvbmcgX19seDsKKyAgICBfSW5wdXRJdGVyIF9fdG1wID0gdGhpcy0+ZG9fZ2V0KF9faW5faXRlLCBfX2VuZCwgX19zLCBfX2VyciwgX19seCk7CisgICAgaWYgKCEoX19lcnIgJiBpb3NfYmFzZTo6ZmFpbGJpdCkpIHsKKyAgICAgIGlmIChfX2x4ID09IDApCisgICAgICAgIF9feCA9IGZhbHNlOworICAgICAgZWxzZSBpZiAoX19seCA9PSAxKQorICAgICAgICBfX3ggPSB0cnVlOworICAgICAgZWxzZQorICAgICAgICBfX2VyciB8PSBpb3NfYmFzZTo6ZmFpbGJpdDsKKyAgICB9CisgICAgcmV0dXJuIF9fdG1wOworICB9Cit9CisKKyNlbmRpZiAvKiBfU1RMUF9OT19CT09MICovCisKKyNpZiBkZWZpbmVkIChfU1RMUF9GSVhfTElCUkFSWV9JU1NVRVMpCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfSW5wdXRJdGVyPgorX0lucHV0SXRlcgorbnVtX2dldDxfQ2hhclQsIF9JbnB1dEl0ZXI+Ojpkb19nZXQoX0lucHV0SXRlciBfX2luX2l0ZSwgX0lucHV0SXRlciBfX2VuZCwgaW9zX2Jhc2UmIF9fc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCBzaG9ydCYgX192YWwpIGNvbnN0Cit7IHJldHVybiBfU1RMUF9QUklWIF9fZG9fZ2V0X2ludGVnZXIoX19pbl9pdGUsIF9fZW5kLCBfX3N0ciwgX19lcnIsIF9fdmFsLCAoX0NoYXJUKikwICk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0lucHV0SXRlcj4KK19JbnB1dEl0ZXIKK251bV9nZXQ8X0NoYXJULCBfSW5wdXRJdGVyPjo6ZG9fZ2V0KF9JbnB1dEl0ZXIgX19pbl9pdGUsIF9JbnB1dEl0ZXIgX19lbmQsIGlvc19iYXNlJiBfX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgaW50JiBfX3ZhbCkgY29uc3QKK3sgcmV0dXJuIF9TVExQX1BSSVYgX19kb19nZXRfaW50ZWdlcihfX2luX2l0ZSwgX19lbmQsIF9fc3RyLCBfX2VyciwgX192YWwsIChfQ2hhclQqKTAgKTsgfQorCisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0lucHV0SXRlcj4KK19JbnB1dEl0ZXIKK251bV9nZXQ8X0NoYXJULCBfSW5wdXRJdGVyPjo6ZG9fZ2V0KF9JbnB1dEl0ZXIgX19pbl9pdGUsIF9JbnB1dEl0ZXIgX19lbmQsIGlvc19iYXNlJiBfX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgbG9uZyYgX192YWwpIGNvbnN0Cit7IHJldHVybiBfU1RMUF9QUklWIF9fZG9fZ2V0X2ludGVnZXIoX19pbl9pdGUsIF9fZW5kLCBfX3N0ciwgX19lcnIsIF9fdmFsLCAoX0NoYXJUKikwICk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0lucHV0SXRlcj4KK19JbnB1dEl0ZXIKK251bV9nZXQ8X0NoYXJULCBfSW5wdXRJdGVyPjo6ZG9fZ2V0KF9JbnB1dEl0ZXIgX19pbl9pdGUsIF9JbnB1dEl0ZXIgX19lbmQsIGlvc19iYXNlJiBfX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0JiBfX3ZhbCkgY29uc3QKK3sgcmV0dXJuIF9TVExQX1BSSVYgX19kb19nZXRfaW50ZWdlcihfX2luX2l0ZSwgX19lbmQsIF9fc3RyLCBfX2VyciwgX192YWwsIChfQ2hhclQqKTAgKTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfSW5wdXRJdGVyPgorX0lucHV0SXRlcgorbnVtX2dldDxfQ2hhclQsIF9JbnB1dEl0ZXI+Ojpkb19nZXQoX0lucHV0SXRlciBfX2luX2l0ZSwgX0lucHV0SXRlciBfX2VuZCwgaW9zX2Jhc2UmIF9fc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50JiBfX3ZhbCkgY29uc3QKK3sgcmV0dXJuIF9TVExQX1BSSVYgX19kb19nZXRfaW50ZWdlcihfX2luX2l0ZSwgX19lbmQsIF9fc3RyLCBfX2VyciwgX192YWwsIChfQ2hhclQqKTAgKTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfSW5wdXRJdGVyPgorX0lucHV0SXRlcgorbnVtX2dldDxfQ2hhclQsIF9JbnB1dEl0ZXI+Ojpkb19nZXQoX0lucHV0SXRlciBfX2luX2l0ZSwgX0lucHV0SXRlciBfX2VuZCwgaW9zX2Jhc2UmIF9fc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyYgX192YWwpIGNvbnN0Cit7IHJldHVybiBfU1RMUF9QUklWIF9fZG9fZ2V0X2ludGVnZXIoX19pbl9pdGUsIF9fZW5kLCBfX3N0ciwgX19lcnIsIF9fdmFsLCAoX0NoYXJUKikwICk7IH0KKworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfSW5wdXRJdGVyPgorX0lucHV0SXRlcgorbnVtX2dldDxfQ2hhclQsIF9JbnB1dEl0ZXI+Ojpkb19nZXQoX0lucHV0SXRlciBfX2luX2l0ZSwgX0lucHV0SXRlciBfX2VuZCwgaW9zX2Jhc2UmIF9fc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQmIF9fdmFsKSBjb25zdCB7CisgIF9TVExQX1BSSVYgX19pb3N0cmluZyBfX2J1ZiA7CisgIGJvb2wgX19vayA9IF9TVExQX1BSSVYgX19yZWFkX2Zsb2F0KF9fYnVmLCBfX2luX2l0ZSwgX19lbmQsIF9fc3RyLCAoX0NoYXJUKikwICk7CisgIF9TVExQX1BSSVYgX19zdHJpbmdfdG9fZmxvYXQoX19idWYsIF9fdmFsKTsKKyAgX19lcnIgPSBfX1NUQVRJQ19DQVNUKGlvc19iYXNlOjppb3N0YXRlLCBfX29rID8gaW9zX2Jhc2U6Omdvb2RiaXQgOiBpb3NfYmFzZTo6ZmFpbGJpdCk7CisgIGlmIChfX2luX2l0ZSA9PSBfX2VuZCkKKyAgICBfX2VyciB8PSBpb3NfYmFzZTo6ZW9mYml0OworICByZXR1cm4gX19pbl9pdGU7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9JbnB1dEl0ZXI+CitfSW5wdXRJdGVyCitudW1fZ2V0PF9DaGFyVCwgX0lucHV0SXRlcj46OmRvX2dldChfSW5wdXRJdGVyIF9faW5faXRlLCBfSW5wdXRJdGVyIF9fZW5kLCBpb3NfYmFzZSYgX19zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUmIF9fdmFsKSBjb25zdCB7CisgIF9TVExQX1BSSVYgX19pb3N0cmluZyBfX2J1ZiA7CisgIGJvb2wgX19vayA9IF9TVExQX1BSSVYgX19yZWFkX2Zsb2F0KF9fYnVmLCBfX2luX2l0ZSwgX19lbmQsIF9fc3RyLCAoX0NoYXJUKikwICk7CisgIF9TVExQX1BSSVYgX19zdHJpbmdfdG9fZmxvYXQoX19idWYsIF9fdmFsKTsKKyAgX19lcnIgPSBfX1NUQVRJQ19DQVNUKGlvc19iYXNlOjppb3N0YXRlLCBfX29rID8gaW9zX2Jhc2U6Omdvb2RiaXQgOiBpb3NfYmFzZTo6ZmFpbGJpdCk7CisgIGlmIChfX2luX2l0ZSA9PSBfX2VuZCkKKyAgICBfX2VyciB8PSBpb3NfYmFzZTo6ZW9mYml0OworICByZXR1cm4gX19pbl9pdGU7Cit9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTE9OR19ET1VCTEUpCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfSW5wdXRJdGVyPgorX0lucHV0SXRlcgorbnVtX2dldDxfQ2hhclQsIF9JbnB1dEl0ZXI+Ojpkb19nZXQoX0lucHV0SXRlciBfX2luX2l0ZSwgX0lucHV0SXRlciBfX2VuZCwgaW9zX2Jhc2UmIF9fc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBkb3VibGUmIF9fdmFsKSBjb25zdCB7CisgIF9TVExQX1BSSVYgX19pb3N0cmluZyBfX2J1ZiA7CisgIGJvb2wgX19vayA9IF9TVExQX1BSSVYgX19yZWFkX2Zsb2F0KF9fYnVmLCBfX2luX2l0ZSwgX19lbmQsIF9fc3RyLCAoX0NoYXJUKikwICk7CisgIF9TVExQX1BSSVYgX19zdHJpbmdfdG9fZmxvYXQoX19idWYsIF9fdmFsKTsKKyAgX19lcnIgPSBfX1NUQVRJQ19DQVNUKGlvc19iYXNlOjppb3N0YXRlLCBfX29rID8gaW9zX2Jhc2U6Omdvb2RiaXQgOiBpb3NfYmFzZTo6ZmFpbGJpdCk7CisgIGlmIChfX2luX2l0ZSA9PSBfX2VuZCkKKyAgICBfX2VyciB8PSBpb3NfYmFzZTo6ZW9mYml0OworICByZXR1cm4gX19pbl9pdGU7Cit9CisjZW5kaWYgLyogX1NUTFBfTk9fTE9OR19ET1VCTEUgKi8KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0lucHV0SXRlcj4KK19JbnB1dEl0ZXIKK251bV9nZXQ8X0NoYXJULCBfSW5wdXRJdGVyPjo6ZG9fZ2V0KF9JbnB1dEl0ZXIgX19pbl9pdGUsIF9JbnB1dEl0ZXIgX19lbmQsIGlvc19iYXNlJiBfX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqJiBfX3ApIGNvbnN0IHsKKyNpZiBkZWZpbmVkIChfU1RMUF9MT05HX0xPTkcpICYmICFkZWZpbmVkIChfX01SQ19fKSAgICAvLyp0eSAxMi8wNy8yMDAxIC0gTXJDcHAgY2FuIG5vdCBjYXN0IGZyb20gbG9uZyBsb25nIHRvIHZvaWQqCisgIHVuc2lnbmVkIF9TVExQX0xPTkdfTE9ORyBfX3ZhbDsKKyNlbHNlCisgIHVuc2lnbmVkIGxvbmcgX192YWw7CisjZW5kaWYKKyAgICBpdGVyX3R5cGUgX190bXAgPSBfU1RMUF9QUklWIF9fZG9fZ2V0X2ludGVnZXIoX19pbl9pdGUsIF9fZW5kLCBfX3N0ciwgX19lcnIsIF9fdmFsLCAoX0NoYXJUKikwICk7CisgICAgaWYgKCEoX19lcnIgJiBpb3NfYmFzZTo6ZmFpbGJpdCkpCisgICAgICBfX3AgPSBfX1JFSU5URVJQUkVUX0NBU1Qodm9pZCosX192YWwpOworICAgIHJldHVybiBfX3RtcDsKKyAgfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfTE9OR19MT05HKQordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0lucHV0SXRlcj4KK19JbnB1dEl0ZXIKK251bV9nZXQ8X0NoYXJULCBfSW5wdXRJdGVyPjo6ZG9fZ2V0KF9JbnB1dEl0ZXIgX19pbl9pdGUsIF9JbnB1dEl0ZXIgX19lbmQsIGlvc19iYXNlJiBfX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX0xPTkdfTE9ORyYgX192YWwpIGNvbnN0IHsKKyAgcmV0dXJuIF9TVExQX1BSSVYgX19kb19nZXRfaW50ZWdlcihfX2luX2l0ZSwgX19lbmQsIF9fc3RyLCBfX2VyciwgX192YWwsIChfQ2hhclQqKTAgKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0lucHV0SXRlcj4KK19JbnB1dEl0ZXIKK251bV9nZXQ8X0NoYXJULCBfSW5wdXRJdGVyPjo6ZG9fZ2V0KF9JbnB1dEl0ZXIgX19pbl9pdGUsIF9JbnB1dEl0ZXIgX19lbmQsIGlvc19iYXNlJiBfX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIF9TVExQX0xPTkdfTE9ORyYgX192YWwpIGNvbnN0IHsKKyAgcmV0dXJuIF9TVExQX1BSSVYgX19kb19nZXRfaW50ZWdlcihfX2luX2l0ZSwgX19lbmQsIF9fc3RyLCBfX2VyciwgX192YWwsIChfQ2hhclQqKTAgKTsKK30KKyNlbmRpZiAvKiBfU1RMUF9MT05HX0xPTkcgKi8KKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYgLyogX1NUTFBfTlVNRVJJQ19GQUNFVFNfQyAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RsL19udW1fZ2V0LmggYi9zdGwvX251bV9nZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzY0ZWVhCi0tLSAvZGV2L251bGwKKysrIGIvc3RsL19udW1fZ2V0LmgKQEAgLTAsMCArMSwyMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisvLyBXQVJOSU5HOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBDKysKKy8vIHN0YW5kYXJkIGxpYnJhcnkgaGVhZGVycy4gIFlvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gdXNlIHRoaXMgaGVhZGVyCisvLyBmaWxlIGRpcmVjdGx5LgorCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfTlVNX0dFVF9ICisjZGVmaW5lIF9TVExQX0lOVEVSTkFMX05VTV9HRVRfSAorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0lTVFJFQU1CVUZfSVRFUkFUT1JfSAorIyAgaW5jbHVkZSA8c3RsL19pc3RyZWFtYnVmX2l0ZXJhdG9yLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9DX0xPQ0FMRV9ICisjICBpbmNsdWRlIDxzdGwvY19sb2NhbGUuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX05VTVBVTkNUX0gKKyMgIGluY2x1ZGUgPHN0bC9fbnVtcHVuY3QuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NUWVBFX0gKKyMgIGluY2x1ZGUgPHN0bC9fY3R5cGUuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0lPU1RSRUFNX1NUUklOR19ICisjICBpbmNsdWRlIDxzdGwvX2lvc3RyZWFtX3N0cmluZy5oPgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG51bV9nZXQgZmFjZXRzCisKKyNpZiBkZWZpbmVkIChfU1RMUF9MSU1JVEVEX0RFRkFVTFRfVEVNUExBVEVTKQordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0lucHV0SXRlcj4KKyNlbHNlCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfSW5wdXRJdGVyID0gaXN0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQsIGNoYXJfdHJhaXRzPF9DaGFyVD4gPiA+CisjZW5kaWYKK2NsYXNzIG51bV9nZXQ6IHB1YmxpYyBsb2NhbGU6OmZhY2V0IHsKKyAgZnJpZW5kIGNsYXNzIF9Mb2NhbGVfaW1wbDsKK3B1YmxpYzoKKyAgdHlwZWRlZiBfQ2hhclQgICAgIGNoYXJfdHlwZTsKKyAgdHlwZWRlZiBfSW5wdXRJdGVyIGl0ZXJfdHlwZTsKKworICBleHBsaWNpdCBudW1fZ2V0KHNpemVfdCBfX3JlZnMgPSAwKTogbG9jYWxlOjpmYWNldChfX3JlZnMpIHt9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fQk9PTCkKKyAgX0lucHV0SXRlciBnZXQoX0lucHV0SXRlciBfX2lpLCBfSW5wdXRJdGVyIF9fZW5kLCBpb3NfYmFzZSYgX19zdHIsCisgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgYm9vbCYgX192YWwpIGNvbnN0CisgIHsgcmV0dXJuIGRvX2dldChfX2lpLCBfX2VuZCwgX19zdHIsIF9fZXJyLCBfX3ZhbCk7IH0KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfRklYX0xJQlJBUllfSVNTVUVTKQorICBfSW5wdXRJdGVyIGdldChfSW5wdXRJdGVyIF9faWksIF9JbnB1dEl0ZXIgX19lbmQsIGlvc19iYXNlJiBfX3N0ciwKKyAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCBzaG9ydCYgX192YWwpIGNvbnN0CisgIHsgcmV0dXJuIGRvX2dldChfX2lpLCBfX2VuZCwgX19zdHIsIF9fZXJyLCBfX3ZhbCk7IH0KKworICBfSW5wdXRJdGVyIGdldChfSW5wdXRJdGVyIF9faWksIF9JbnB1dEl0ZXIgX19lbmQsIGlvc19iYXNlJiBfX3N0ciwKKyAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCBpbnQmIF9fdmFsKSBjb25zdAorICB7IHJldHVybiBkb19nZXQoX19paSwgX19lbmQsIF9fc3RyLCBfX2VyciwgX192YWwpOyB9CisjZW5kaWYKKworICBfSW5wdXRJdGVyIGdldChfSW5wdXRJdGVyIF9faWksIF9JbnB1dEl0ZXIgX19lbmQsIGlvc19iYXNlJiBfX3N0ciwKKyAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCBsb25nJiBfX3ZhbCkgY29uc3QKKyAgeyByZXR1cm4gZG9fZ2V0KF9faWksIF9fZW5kLCBfX3N0ciwgX19lcnIsIF9fdmFsKTsgfQorCisgIF9JbnB1dEl0ZXIgZ2V0KF9JbnB1dEl0ZXIgX19paSwgX0lucHV0SXRlciBfX2VuZCwgaW9zX2Jhc2UmIF9fc3RyLAorICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIHVuc2lnbmVkIHNob3J0JiBfX3ZhbCkgY29uc3QKKyAgeyByZXR1cm4gZG9fZ2V0KF9faWksIF9fZW5kLCBfX3N0ciwgX19lcnIsIF9fdmFsKTsgfQorCisgIF9JbnB1dEl0ZXIgZ2V0KF9JbnB1dEl0ZXIgX19paSwgX0lucHV0SXRlciBfX2VuZCwgaW9zX2Jhc2UmIF9fc3RyLAorICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIHVuc2lnbmVkIGludCYgX192YWwpIGNvbnN0CisgIHsgcmV0dXJuIGRvX2dldChfX2lpLCBfX2VuZCwgX19zdHIsIF9fZXJyLCBfX3ZhbCk7IH0KKworICBfSW5wdXRJdGVyIGdldChfSW5wdXRJdGVyIF9faWksIF9JbnB1dEl0ZXIgX19lbmQsIGlvc19iYXNlJiBfX3N0ciwKKyAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCB1bnNpZ25lZCBsb25nJiBfX3ZhbCkgY29uc3QKKyAgeyByZXR1cm4gZG9fZ2V0KF9faWksIF9fZW5kLCBfX3N0ciwgX19lcnIsIF9fdmFsKTsgfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfTE9OR19MT05HKQorICBfSW5wdXRJdGVyIGdldChfSW5wdXRJdGVyIF9faWksIF9JbnB1dEl0ZXIgX19lbmQsIGlvc19iYXNlJiBfX3N0ciwKKyAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCBfU1RMUF9MT05HX0xPTkcmIF9fdmFsKSBjb25zdAorICB7IHJldHVybiBkb19nZXQoX19paSwgX19lbmQsIF9fc3RyLCBfX2VyciwgX192YWwpOyB9CisKKyAgX0lucHV0SXRlciBnZXQoX0lucHV0SXRlciBfX2lpLCBfSW5wdXRJdGVyIF9fZW5kLCBpb3NfYmFzZSYgX19zdHIsCisgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgdW5zaWduZWQgX1NUTFBfTE9OR19MT05HJiBfX3ZhbCkgY29uc3QKKyAgeyByZXR1cm4gZG9fZ2V0KF9faWksIF9fZW5kLCBfX3N0ciwgX19lcnIsIF9fdmFsKTsgfQorI2VuZGlmIC8qIF9TVExQX0xPTkdfTE9ORyAqLworCisgIF9JbnB1dEl0ZXIgZ2V0KF9JbnB1dEl0ZXIgX19paSwgX0lucHV0SXRlciBfX2VuZCwgaW9zX2Jhc2UmIF9fc3RyLAorICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIGZsb2F0JiBfX3ZhbCkgY29uc3QKKyAgeyByZXR1cm4gZG9fZ2V0KF9faWksIF9fZW5kLCBfX3N0ciwgX19lcnIsIF9fdmFsKTsgfQorCisgIF9JbnB1dEl0ZXIgZ2V0KF9JbnB1dEl0ZXIgX19paSwgX0lucHV0SXRlciBfX2VuZCwgaW9zX2Jhc2UmIF9fc3RyLAorICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIGRvdWJsZSYgX192YWwpIGNvbnN0CisgIHsgcmV0dXJuIGRvX2dldChfX2lpLCBfX2VuZCwgX19zdHIsIF9fZXJyLCBfX3ZhbCk7IH0KKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19MT05HX0RPVUJMRSkKKyAgX0lucHV0SXRlciBnZXQoX0lucHV0SXRlciBfX2lpLCBfSW5wdXRJdGVyIF9fZW5kLCBpb3NfYmFzZSYgX19zdHIsCisgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgbG9uZyBkb3VibGUmIF9fdmFsKSBjb25zdAorICB7IHJldHVybiBkb19nZXQoX19paSwgX19lbmQsIF9fc3RyLCBfX2VyciwgX192YWwpOyB9CisjIGVuZGlmCisKKyAgX0lucHV0SXRlciBnZXQoX0lucHV0SXRlciBfX2lpLCBfSW5wdXRJdGVyIF9fZW5kLCBpb3NfYmFzZSYgX19zdHIsCisgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2Vyciwgdm9pZComIF9fdmFsKSBjb25zdAorICB7IHJldHVybiBkb19nZXQoX19paSwgX19lbmQsIF9fc3RyLCBfX2VyciwgX192YWwpOyB9CisKKyAgc3RhdGljIF9TVExQX1NUQVRJQ19NRU1CRVJfREVDTFNQRUMgbG9jYWxlOjppZCBpZDsKKworcHJvdGVjdGVkOgorICB+bnVtX2dldCgpIHt9CisKKyAgdHlwZWRlZiBzdHJpbmcgICAgICAgICAgICAgICBzdHJpbmdfdHlwZTsKKyAgdHlwZWRlZiBjdHlwZTxfQ2hhclQ+ICAgICAgICBfQ3R5cGU7CisgIHR5cGVkZWYgbnVtcHVuY3Q8X0NoYXJUPiAgICAgX051bXB1bmN0OworCisjaWYgIWRlZmluZWQgKF9TVExQX05PX0JPT0wpCisgIHZpcnR1YWwgX0lucHV0SXRlciBkb19nZXQoX0lucHV0SXRlciBfX2lpLCBfSW5wdXRJdGVyIF9fZW5kLCBpb3NfYmFzZSYgX19zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCBib29sJiBfX3ZhbCkgY29uc3Q7CisjZW5kaWYKKworICB2aXJ0dWFsIF9JbnB1dEl0ZXIgZG9fZ2V0KF9JbnB1dEl0ZXIgX19paSwgX0lucHV0SXRlciBfX2VuZCwgaW9zX2Jhc2UmIF9fc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgbG9uZyYgX192YWwpIGNvbnN0OworICB2aXJ0dWFsIF9JbnB1dEl0ZXIgZG9fZ2V0KF9JbnB1dEl0ZXIgX19paSwgX0lucHV0SXRlciBfX2VuZCwgaW9zX2Jhc2UmIF9fc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgdW5zaWduZWQgc2hvcnQmIF9fdmFsKSBjb25zdDsKKyAgdmlydHVhbCBfSW5wdXRJdGVyIGRvX2dldChfSW5wdXRJdGVyIF9faWksIF9JbnB1dEl0ZXIgX19lbmQsIGlvc19iYXNlJiBfX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIHVuc2lnbmVkIGludCYgX192YWwpIGNvbnN0OworICB2aXJ0dWFsIF9JbnB1dEl0ZXIgZG9fZ2V0KF9JbnB1dEl0ZXIgX19paSwgX0lucHV0SXRlciBfX2VuZCwgaW9zX2Jhc2UmIF9fc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgdW5zaWduZWQgbG9uZyYgX192YWwpIGNvbnN0OworCisjaWYgZGVmaW5lZCAoX1NUTFBfRklYX0xJQlJBUllfSVNTVUVTKQorICAvLyBpc3N1ZSAxMTggOiB0aG9zZSBhcmUgYWN0dWFsbHkgbm90IHN1cHBvc2VkIHRvIGJlIGhlcmUKKyAgdmlydHVhbCBfSW5wdXRJdGVyIGRvX2dldChfSW5wdXRJdGVyIF9faWksIF9JbnB1dEl0ZXIgX19lbmQsIGlvc19iYXNlJiBfX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIHNob3J0JiBfX3ZhbCkgY29uc3Q7CisgIHZpcnR1YWwgX0lucHV0SXRlciBkb19nZXQoX0lucHV0SXRlciBfX2lpLCBfSW5wdXRJdGVyIF9fZW5kLCBpb3NfYmFzZSYgX19zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCBpbnQmIF9fdmFsKSBjb25zdDsKKyNlbmRpZgorCisgIHZpcnR1YWwgX0lucHV0SXRlciBkb19nZXQoX0lucHV0SXRlciBfX2lpLCBfSW5wdXRJdGVyIF9fZW5kLCBpb3NfYmFzZSYgX19zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCBmbG9hdCYgX192YWwpIGNvbnN0OworICB2aXJ0dWFsIF9JbnB1dEl0ZXIgZG9fZ2V0KF9JbnB1dEl0ZXIgX19paSwgX0lucHV0SXRlciBfX2VuZCwgaW9zX2Jhc2UmIF9fc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgZG91YmxlJiBfX3ZhbCkgY29uc3Q7CisgIHZpcnR1YWwgX0lucHV0SXRlciBkb19nZXQoX0lucHV0SXRlciBfX2lpLCBfSW5wdXRJdGVyIF9fZW5kLCBpb3NfYmFzZSYgX19zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCB2b2lkKiYgX19wKSBjb25zdDsKKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19MT05HX0RPVUJMRSkKKyAgdmlydHVhbCBfSW5wdXRJdGVyIGRvX2dldChfSW5wdXRJdGVyIF9faWksIF9JbnB1dEl0ZXIgX19lbmQsIGlvc19iYXNlJiBfX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIGxvbmcgZG91YmxlJiBfX3ZhbCkgY29uc3Q7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX0xPTkdfTE9ORykKKyAgdmlydHVhbCBfSW5wdXRJdGVyIGRvX2dldChfSW5wdXRJdGVyIF9faWksIF9JbnB1dEl0ZXIgX19lbmQsIGlvc19iYXNlJiBfX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIF9TVExQX0xPTkdfTE9ORyYgX192YWwpIGNvbnN0OworICB2aXJ0dWFsIF9JbnB1dEl0ZXIgZG9fZ2V0KF9JbnB1dEl0ZXIgX19paSwgX0lucHV0SXRlciBfX2VuZCwgaW9zX2Jhc2UmIF9fc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgdW5zaWduZWQgX1NUTFBfTE9OR19MT05HJiBfX3ZhbCkgY29uc3Q7CisjZW5kaWYKKworfTsKKworCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCkKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBudW1fZ2V0PGNoYXIsIGlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiA+OworLy8gX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIG51bV9nZXQ8Y2hhciwgY29uc3QgY2hhcio+OworIyAgaWYgIWRlZmluZWQgKF9TVExQX05PX1dDSEFSX1QpCitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgbnVtX2dldDx3Y2hhcl90LCBpc3RyZWFtYnVmX2l0ZXJhdG9yPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4gPjsKKy8vIF9TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBudW1fZ2V0PHdjaGFyX3QsIGNvbnN0IHdjaGFyX3QqPjsKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX0VYUE9TRV9TVFJFQU1fSU1QTEVNRU5UQVRJT04pCisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKworX1NUTFBfREVDTFNQRUMgYm9vbCBfU1RMUF9DQUxMIF9fdmFsaWRfZ3JvdXBpbmcoY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX0ludGVnZXIsIGNsYXNzIF9DaGFyVD4KK2Jvb2wgX1NUTFBfQ0FMTAorX19nZXRfZGVjaW1hbF9pbnRlZ2VyKF9JbnB1dEl0ZXImIF9fZmlyc3QsIF9JbnB1dEl0ZXImIF9fbGFzdCwgX0ludGVnZXImIF9fdmFsLCBfQ2hhclQqKTsKKworIyAgaWYgIWRlZmluZWQgKF9TVExQX05PX1dDSEFSX1QpCitib29sIF9TVExQX0RFQ0xTUEVDIF9TVExQX0NBTEwgX19nZXRfZmRpZ2l0KHdjaGFyX3QmLCBjb25zdCB3Y2hhcl90Kik7Citib29sIF9TVExQX0RFQ0xTUEVDIF9TVExQX0NBTEwgX19nZXRfZmRpZ2l0X29yX3NlcCh3Y2hhcl90Jiwgd2NoYXJfdCwgY29uc3Qgd2NoYXJfdCopOworIyAgZW5kaWYKKworaW5saW5lIHZvaWQgIF9TVExQX0NBTEwKK19Jbml0aWFsaXplX2dldF9mbG9hdChjb25zdCBjdHlwZTxjaGFyPiYsCisgICAgICAgICAgICAgICAgICAgICAgIGNoYXImIFBsdXMsIGNoYXImIE1pbnVzLAorICAgICAgICAgICAgICAgICAgICAgICBjaGFyJiBwb3dfZSwgY2hhciYgcG93X0UsCisgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqKSB7CisgIFBsdXMgPSAnKyc7CisgIE1pbnVzID0gJy0nOworICBwb3dfZSA9ICdlJzsKKyAgcG93X0UgPSAnRSc7Cit9CisKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQordm9pZCBfU1RMUF9ERUNMU1BFQyBfU1RMUF9DQUxMIF9Jbml0aWFsaXplX2dldF9mbG9hdChjb25zdCBjdHlwZTx3Y2hhcl90PiYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdjaGFyX3QmLCB3Y2hhcl90Jiwgd2NoYXJfdCYsIHdjaGFyX3QmLCB3Y2hhcl90Kik7CisjICBlbmRpZgordm9pZCBfU1RMUF9ERUNMU1BFQyBfU1RMUF9DQUxMIF9fc3RyaW5nX3RvX2Zsb2F0KGNvbnN0IF9faW9zdHJpbmcmLCBmbG9hdCYpOwordm9pZCBfU1RMUF9ERUNMU1BFQyBfU1RMUF9DQUxMIF9fc3RyaW5nX3RvX2Zsb2F0KGNvbnN0IF9faW9zdHJpbmcmLCBkb3VibGUmKTsKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9OT19MT05HX0RPVUJMRSkKK3ZvaWQgX1NUTFBfREVDTFNQRUMgX1NUTFBfQ0FMTCBfX3N0cmluZ190b19mbG9hdChjb25zdCBfX2lvc3RyaW5nJiwgbG9uZyBkb3VibGUmKTsKKyMgIGVuZGlmCisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCisjZW5kaWYgLyogX1NUTFBfRVhQT1NFX1NUUkVBTV9JTVBMRU1FTlRBVElPTiAqLworCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNpZiBkZWZpbmVkIChfU1RMUF9FWFBPU0VfU1RSRUFNX0lNUExFTUVOVEFUSU9OKSAmJiAhZGVmaW5lZCAoX1NUTFBfTElOS19USU1FX0lOU1RBTlRJQVRJT04pCisjICBpbmNsdWRlIDxzdGwvX251bV9nZXQuYz4KKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfTlVNX0dFVF9IICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CisKZGlmZiAtLWdpdCBhL3N0bC9fbnVtX3B1dC5jIGIvc3RsL19udW1fcHV0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJjN2MzYgotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9fbnVtX3B1dC5jCkBAIC0wLDAgKzEsNTUyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworI2lmbmRlZiBfU1RMUF9OVU1fUFVUX0MKKyNkZWZpbmUgX1NUTFBfTlVNX1BVVF9DCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfTlVNX1BVVF9ICisjICBpbmNsdWRlIDxzdGwvX251bV9wdXQuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0xJTUlUUworIyAgaW5jbHVkZSA8c3RsL19saW1pdHMuaD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCisvLyBfX2RvX3B1dF9mbG9hdCBhbmQgaXRzIGhlbHBlciBmdW5jdGlvbnMuICBTdHJhdGVneTogd3JpdGUgdGhlIG91dHB1dAorLy8gdG8gYSBidWZmZXIgb2YgY2hhciwgdHJhbnNmb3JtIHRoZSBidWZmZXIgdG8gX0NoYXJULCBhbmQgdGhlbiBjb3B5CisvLyBpdCB0byB0aGUgb3V0cHV0LgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG51bV9wdXQgZmFjZXQKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX091dHB1dEl0ZXI+CitfT3V0cHV0SXRlciAgX1NUTFBfQ0FMTAorX19jb3B5X2Zsb2F0X2FuZF9maWxsKGNvbnN0IF9DaGFyVCogX19maXJzdCwgY29uc3QgX0NoYXJUKiBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXIgX19vaSwKKyAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1zaXplIF9fd2lkdGgsIF9DaGFyVCBfX2ZpbGwsCisgICAgICAgICAgICAgICAgICAgICAgX0NoYXJUIF9feHBsdXMsIF9DaGFyVCBfX3htaW51cykgeworICBpZiAoX193aWR0aCA8PSBfX2xhc3QgLSBfX2ZpcnN0KQorICAgIHJldHVybiBjb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19vaSk7CisgIGVsc2UgeworICAgIHN0cmVhbXNpemUgX19wYWQgPSBfX3dpZHRoIC0gKF9fbGFzdCAtIF9fZmlyc3QpOworICAgIGlvc19iYXNlOjpmbXRmbGFncyBfX2RpciA9IF9fZmxhZ3MgJiBpb3NfYmFzZTo6YWRqdXN0ZmllbGQ7CisKKyAgICBpZiAoX19kaXIgPT0gaW9zX2Jhc2U6OmxlZnQpIHsKKyAgICAgIF9fb2kgPSBjb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19vaSk7CisgICAgICByZXR1cm4gX19maWxsX24oX19vaSwgX19wYWQsIF9fZmlsbCk7CisgICAgfQorICAgIGVsc2UgaWYgKF9fZGlyID09IGlvc19iYXNlOjppbnRlcm5hbCAmJiBfX2ZpcnN0ICE9IF9fbGFzdCAmJgorICAgICAgICAgICAgICgqX19maXJzdCA9PSBfX3hwbHVzIHx8ICpfX2ZpcnN0ID09IF9feG1pbnVzKSkgeworICAgICAgKl9fb2krKyA9ICpfX2ZpcnN0Kys7CisgICAgICBfX29pID0gX19maWxsX24oX19vaSwgX19wYWQsIF9fZmlsbCk7CisgICAgICByZXR1cm4gY29weShfX2ZpcnN0LCBfX2xhc3QsIF9fb2kpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIF9fb2kgPSBfX2ZpbGxfbihfX29pLCBfX3BhZCwgX19maWxsKTsKKyAgICAgIHJldHVybiBjb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19vaSk7CisgICAgfQorICB9Cit9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkKKy8vIEhlbHBlciByb3V0aW5lIGZvciB3Y2hhcl90Cit0ZW1wbGF0ZSA8Y2xhc3MgX091dHB1dEl0ZXI+CitfT3V0cHV0SXRlciAgX1NUTFBfQ0FMTAorX19wdXRfZmxvYXQoX19pb3N0cmluZyAmX19zdHIsIF9PdXRwdXRJdGVyIF9fb2ksCisgICAgICAgICAgICBpb3NfYmFzZSYgX19mLCB3Y2hhcl90IF9fZmlsbCwKKyAgICAgICAgICAgIHdjaGFyX3QgX19kZWNpbWFsX3BvaW50LCB3Y2hhcl90IF9fc2VwLAorICAgICAgICAgICAgc2l6ZV90IF9fZ3JvdXBfcG9zLCBjb25zdCBzdHJpbmcmIF9fZ3JvdXBpbmcpIHsKKyAgY29uc3QgY3R5cGU8d2NoYXJfdD4mIF9fY3QgPSAqX19TVEFUSUNfQ0FTVChjb25zdCBjdHlwZTx3Y2hhcl90PiosIF9fZi5fTV9jdHlwZV9mYWNldCgpKTsKKworICBfX2lvd3N0cmluZyBfX3didWY7CisgIF9fY29udmVydF9mbG9hdF9idWZmZXIoX19zdHIsIF9fd2J1ZiwgX19jdCwgX19kZWNpbWFsX3BvaW50KTsKKworICBpZiAoIV9fZ3JvdXBpbmcuZW1wdHkoKSkgeworICAgIF9faW5zZXJ0X2dyb3VwaW5nKF9fd2J1ZiwgX19ncm91cF9wb3MsIF9fZ3JvdXBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgX19zZXAsIF9fY3Qud2lkZW4oJysnKSwgX19jdC53aWRlbignLScpLCAwKTsKKyAgfQorCisgIHJldHVybiBfX2NvcHlfZmxvYXRfYW5kX2ZpbGwoX19DT05TVF9DQVNUKHdjaGFyX3QqLCBfX3didWYuZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0NPTlNUX0NBU1Qod2NoYXJfdCosIF9fd2J1Zi5kYXRhKCkpICsgX193YnVmLnNpemUoKSwgX19vaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2YuZmxhZ3MoKSwgX19mLndpZHRoKDApLCBfX2ZpbGwsIF9fY3Qud2lkZW4oJysnKSwgX19jdC53aWRlbignLScpKTsKK30KKyNlbmRpZiAvKiBXQ0hBUl9UICovCisKKy8vIEhlbHBlciByb3V0aW5lIGZvciBjaGFyCit0ZW1wbGF0ZSA8Y2xhc3MgX091dHB1dEl0ZXI+CitfT3V0cHV0SXRlciAgX1NUTFBfQ0FMTAorX19wdXRfZmxvYXQoX19pb3N0cmluZyAmX19zdHIsIF9PdXRwdXRJdGVyIF9fb2ksCisgICAgICAgICAgICBpb3NfYmFzZSYgX19mLCBjaGFyIF9fZmlsbCwKKyAgICAgICAgICAgIGNoYXIgX19kZWNpbWFsX3BvaW50LCBjaGFyIF9fc2VwLAorICAgICAgICAgICAgc2l6ZV90IF9fZ3JvdXBfcG9zLCBjb25zdCBzdHJpbmcmIF9fZ3JvdXBpbmcpIHsKKyAgaWYgKChfX2dyb3VwX3BvcyA8IF9fc3RyLnNpemUoKSkgJiYgKF9fc3RyW19fZ3JvdXBfcG9zXSA9PSAnLicpKSB7CisgICAgX19zdHJbX19ncm91cF9wb3NdID0gX19kZWNpbWFsX3BvaW50OworICB9CisKKyAgaWYgKCFfX2dyb3VwaW5nLmVtcHR5KCkpIHsKKyAgICBfX2luc2VydF9ncm91cGluZyhfX3N0ciwgX19ncm91cF9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgX19ncm91cGluZywgX19zZXAsICcrJywgJy0nLCAwKTsKKyAgfQorCisgIHJldHVybiBfX2NvcHlfZmxvYXRfYW5kX2ZpbGwoX19DT05TVF9DQVNUKGNoYXIqLCBfX3N0ci5kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fQ09OU1RfQ0FTVChjaGFyKiwgX19zdHIuZGF0YSgpKSArIF9fc3RyLnNpemUoKSwgX19vaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2YuZmxhZ3MoKSwgX19mLndpZHRoKDApLCBfX2ZpbGwsICcrJywgJy0nKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX091dHB1dEl0ZXIsIGNsYXNzIF9GbG9hdD4KK19PdXRwdXRJdGVyIF9TVExQX0NBTEwKK19fZG9fcHV0X2Zsb2F0KF9PdXRwdXRJdGVyIF9fcywgaW9zX2Jhc2UmIF9fZiwKKyAgICAgICAgICAgICAgICBfQ2hhclQgX19maWxsLCBfRmxvYXQgX194KSB7CisgIF9faW9zdHJpbmcgX19idWY7CisKKyAgc2l6ZV90IF9fZ3JvdXBfcG9zID0gX193cml0ZV9mbG9hdChfX2J1ZiwgX19mLmZsYWdzKCksIChpbnQpX19mLnByZWNpc2lvbigpLCBfX3gpOworCisgIGNvbnN0IG51bXB1bmN0PF9DaGFyVD4mIF9fbnAgPSAqX19TVEFUSUNfQ0FTVChjb25zdCBudW1wdW5jdDxfQ2hhclQ+KiwgX19mLl9NX251bXB1bmN0X2ZhY2V0KCkpOworCisgIHJldHVybiBfX3B1dF9mbG9hdChfX2J1ZiwgX19zLCBfX2YsIF9fZmlsbCwKKyAgICAgICAgICAgICAgICAgICAgIF9fbnAuZGVjaW1hbF9wb2ludCgpLCBfX25wLnRob3VzYW5kc19zZXAoKSwKKyAgICAgICAgICAgICAgICAgICAgIF9fZ3JvdXBfcG9zLCBfX2YuX01fZ3JvdXBpbmcoKSk7Cit9CisKK2lubGluZSB2b2lkIF9fZ2V0X21vbmV5X2RpZ2l0c19hdXggKF9faW9zdHJpbmcgJl9fYnVmLCBpb3NfYmFzZSAmLCBfU1RMUF9MT05HRVNUX0ZMT0FUX1RZUEUgX194KQoreyBfX2dldF9mbG9vcl9kaWdpdHMoX19idWYsIF9feCk7IH0KKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQoraW5saW5lIHZvaWQgX19nZXRfbW9uZXlfZGlnaXRzX2F1eCAoX19pb3dzdHJpbmcgJl9fd2J1ZiwgaW9zX2Jhc2UgJl9fZiwgX1NUTFBfTE9OR0VTVF9GTE9BVF9UWVBFIF9feCkgeworICBfX2lvc3RyaW5nIF9fYnVmOworICBfX2dldF9mbG9vcl9kaWdpdHMoX19idWYsIF9feCk7CisKKyAgY29uc3QgY3R5cGU8d2NoYXJfdD4mIF9fY3QgPSAqX19TVEFUSUNfQ0FTVChjb25zdCBjdHlwZTx3Y2hhcl90PiosIF9fZi5fTV9jdHlwZV9mYWNldCgpKTsKKyAgX19jb252ZXJ0X2Zsb2F0X2J1ZmZlcihfX2J1ZiwgX193YnVmLCBfX2N0LCB3Y2hhcl90KDApLCBmYWxzZSk7Cit9CisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KK3ZvaWQgX1NUTFBfQ0FMTCBfX2dldF9tb25leV9kaWdpdHMoX1NUTFBfQkFTSUNfSU9TVFJJTkcoX0NoYXJUKSAmX19idWYsIGlvc19iYXNlJiBfX2YsIF9TVExQX0xPTkdFU1RfRkxPQVRfVFlQRSBfX3gpCit7IF9fZ2V0X21vbmV5X2RpZ2l0c19hdXgoX19idWYsIF9fZiwgX194KTsgfQorCisvLyBfTV9kb19wdXRfaW50ZWdlciBhbmQgaXRzIGhlbHBlciBmdW5jdGlvbnMuCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9PdXRwdXRJdGVyPgorX091dHB1dEl0ZXIgX1NUTFBfQ0FMTAorX19jb3B5X2ludGVnZXJfYW5kX2ZpbGwoY29uc3QgX0NoYXJUKiBfX2J1ZiwgcHRyZGlmZl90IF9fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXIgX19vaSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjpmbXRmbGFncyBfX2ZsZywgc3RyZWFtc2l6ZSBfX3dpZCwgX0NoYXJUIF9fZmlsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9DaGFyVCBfX3hwbHVzLCBfQ2hhclQgX194bWludXMpIHsKKyAgaWYgKF9fbGVuID49IF9fd2lkKQorICAgIHJldHVybiBjb3B5KF9fYnVmLCBfX2J1ZiArIF9fbGVuLCBfX29pKTsKKyAgZWxzZSB7CisgICAgLy9jYXN0aW5nIG51bWVyaWNfbGltaXRzPHB0cmRpZmZfdD46Om1heCB0byBzdHJlYW1zaXplIG9ubHkgd29ya3MgaXMgcHRyZGlmZl90IGlzIHNpZ25lZCBvciBzdHJlYW1zaXplIHJlcHJlc2VudGF0aW9uCisgICAgLy9pcyBsYXJnZXIgdGhhbiBwdHJkaWZmX3Qgb25lLgorICAgIF9TVExQX1NUQVRJQ19BU1NFUlQoKChzaXplb2Yoc3RyZWFtc2l6ZSkgPiBzaXplb2YocHRyZGlmZl90KSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZW9mKHN0cmVhbXNpemUpID09IHNpemVvZihwdHJkaWZmX3QpKSkgJiYgbnVtZXJpY19saW1pdHM8cHRyZGlmZl90Pjo6aXNfc2lnbmVkKQorICAgIHB0cmRpZmZfdCBfX3BhZCA9IF9fU1RBVElDX0NBU1QocHRyZGlmZl90LCAobWluKSAoX19TVEFUSUNfQ0FTVChzdHJlYW1zaXplLCAobnVtZXJpY19saW1pdHM8cHRyZGlmZl90Pjo6bWF4KSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fU1RBVElDX0NBU1Qoc3RyZWFtc2l6ZSwgX193aWQgLSBfX2xlbikpKTsKKyAgICBpb3NfYmFzZTo6Zm10ZmxhZ3MgX19kaXIgPSBfX2ZsZyAmIGlvc19iYXNlOjphZGp1c3RmaWVsZDsKKworICAgIGlmIChfX2RpciA9PSBpb3NfYmFzZTo6bGVmdCkgeworICAgICAgX19vaSA9IGNvcHkoX19idWYsIF9fYnVmICsgX19sZW4sIF9fb2kpOworICAgICAgcmV0dXJuIF9fZmlsbF9uKF9fb2ksIF9fcGFkLCBfX2ZpbGwpOworICAgIH0KKyAgICBlbHNlIGlmIChfX2RpciA9PSBpb3NfYmFzZTo6aW50ZXJuYWwgJiYgX19sZW4gIT0gMCAmJgorICAgICAgICAgICAgIChfX2J1ZlswXSA9PSBfX3hwbHVzIHx8IF9fYnVmWzBdID09IF9feG1pbnVzKSkgeworICAgICAgKl9fb2krKyA9IF9fYnVmWzBdOworICAgICAgX19vaSA9IF9fZmlsbF9uKF9fb2ksIF9fcGFkLCBfX2ZpbGwpOworICAgICAgcmV0dXJuIGNvcHkoX19idWYgKyAxLCBfX2J1ZiArIF9fbGVuLCBfX29pKTsKKyAgICB9CisgICAgZWxzZSBpZiAoX19kaXIgPT0gaW9zX2Jhc2U6OmludGVybmFsICYmIF9fbGVuID49IDIgICYmCisgICAgICAgICAgICAgKF9fZmxnICYgaW9zX2Jhc2U6OnNob3diYXNlKSAmJgorICAgICAgICAgICAgIChfX2ZsZyAmIGlvc19iYXNlOjpiYXNlZmllbGQpID09IGlvc19iYXNlOjpoZXgpIHsKKyAgICAgICpfX29pKysgPSBfX2J1ZlswXTsKKyAgICAgICpfX29pKysgPSBfX2J1ZlsxXTsKKyAgICAgIF9fb2kgPSBfX2ZpbGxfbihfX29pLCBfX3BhZCwgX19maWxsKTsKKyAgICAgIHJldHVybiBjb3B5KF9fYnVmICsgMiwgX19idWYgKyBfX2xlbiwgX19vaSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgX19vaSA9IF9fZmlsbF9uKF9fb2ksIF9fcGFkLCBfX2ZpbGwpOworICAgICAgcmV0dXJuIGNvcHkoX19idWYsIF9fYnVmICsgX19sZW4sIF9fb2kpOworICAgIH0KKyAgfQorfQorCisjaWYgIWRlZmluZWQgKF9TVExQX05PX1dDSEFSX1QpCisvLyBIZWxwZXIgZnVuY3Rpb24gZm9yIHdjaGFyX3QKK3RlbXBsYXRlIDxjbGFzcyBfT3V0cHV0SXRlcj4KK19PdXRwdXRJdGVyIF9TVExQX0NBTEwKK19fcHV0X2ludGVnZXIoY2hhciogX19idWYsIGNoYXIqIF9faWVuZCwgX091dHB1dEl0ZXIgX19zLAorICAgICAgICAgICAgICBpb3NfYmFzZSYgX19mLAorICAgICAgICAgICAgICBpb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncywgd2NoYXJfdCBfX2ZpbGwpIHsKKyAgbG9jYWxlIF9fbG9jID0gX19mLmdldGxvYygpOworICAvLyAgY29uc3QgY3R5cGU8d2NoYXJfdD4mIF9fY3QgPSB1c2VfZmFjZXQ8Y3R5cGU8d2NoYXJfdD4gPihfX2xvYyk7CisgIGNvbnN0IGN0eXBlPHdjaGFyX3Q+JiBfX2N0ID0gKl9fU1RBVElDX0NBU1QoY29uc3QgY3R5cGU8d2NoYXJfdD4qLCBfX2YuX01fY3R5cGVfZmFjZXQoKSk7CisKKyAgd2NoYXJfdCBfX3hwbHVzICA9IF9fY3Qud2lkZW4oJysnKTsKKyAgd2NoYXJfdCBfX3htaW51cyA9IF9fY3Qud2lkZW4oJy0nKTsKKworICB3Y2hhcl90IF9fd2J1Zls2NF07CisgIF9fY3Qud2lkZW4oX19idWYsIF9faWVuZCwgX193YnVmKTsKKyAgcHRyZGlmZl90IF9fbGVuID0gX19pZW5kIC0gX19idWY7CisgIHdjaGFyX3QqIF9fZWVuZCA9IF9fd2J1ZiArIF9fbGVuOworCisgIC8vICBjb25zdCBudW1wdW5jdDx3Y2hhcl90PiYgX19ucCA9IHVzZV9mYWNldDxudW1wdW5jdDx3Y2hhcl90PiA+KF9fbG9jKTsKKyAgLy8gIGNvbnN0IHN0cmluZyYgX19ncm91cGluZyA9IF9fbnAuZ3JvdXBpbmcoKTsKKworICBjb25zdCBudW1wdW5jdDx3Y2hhcl90PiYgX19ucCA9ICpfX1NUQVRJQ19DQVNUKGNvbnN0IG51bXB1bmN0PHdjaGFyX3Q+KiwgX19mLl9NX251bXB1bmN0X2ZhY2V0KCkpOworICBjb25zdCBzdHJpbmcmIF9fZ3JvdXBpbmcgPSBfX2YuX01fZ3JvdXBpbmcoKTsKKworICBpZiAoIV9fZ3JvdXBpbmcuZW1wdHkoKSkgeworICAgIGludCBfX2Jhc2VjaGFyczsKKyAgICBpZiAoX19mbGFncyAmIGlvc19iYXNlOjpzaG93YmFzZSkKKyAgICAgIHN3aXRjaCAoX19mbGFncyAmIGlvc19iYXNlOjpiYXNlZmllbGQpIHsKKyAgICAgICAgY2FzZSBpb3NfYmFzZTo6aGV4OiBfX2Jhc2VjaGFycyA9IDI7IGJyZWFrOworICAgICAgICBjYXNlIGlvc19iYXNlOjpvY3Q6IF9fYmFzZWNoYXJzID0gMTsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IF9fYmFzZWNoYXJzID0gMDsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICBfX2Jhc2VjaGFycyA9IDA7CisKKyAgICBfX2xlbiA9IF9faW5zZXJ0X2dyb3VwaW5nKF9fd2J1ZiwgX19lZW5kLCBfX2dyb3VwaW5nLCBfX25wLnRob3VzYW5kc19zZXAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9feHBsdXMsIF9feG1pbnVzLCBfX2Jhc2VjaGFycyk7CisgIH0KKworICByZXR1cm4gX19jb3B5X2ludGVnZXJfYW5kX2ZpbGwoKHdjaGFyX3QqKV9fd2J1ZiwgX19sZW4sIF9fcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZmxhZ3MsIF9fZi53aWR0aCgwKSwgX19maWxsLCBfX3hwbHVzLCBfX3htaW51cyk7Cit9CisjZW5kaWYKKworLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBjaGFyCit0ZW1wbGF0ZSA8Y2xhc3MgX091dHB1dEl0ZXI+CitfT3V0cHV0SXRlciBfU1RMUF9DQUxMCitfX3B1dF9pbnRlZ2VyKGNoYXIqIF9fYnVmLCBjaGFyKiBfX2llbmQsIF9PdXRwdXRJdGVyIF9fcywKKyAgICAgICAgICAgICAgaW9zX2Jhc2UmIF9fZiwgaW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MsIGNoYXIgX19maWxsKSB7CisgIGNoYXIgX19ncnBidWZbNjRdOworICBwdHJkaWZmX3QgX19sZW4gPSBfX2llbmQgLSBfX2J1ZjsKKworICAvLyAgY29uc3QgbnVtcHVuY3Q8Y2hhcj4mIF9fbnAgPSB1c2VfZmFjZXQ8bnVtcHVuY3Q8Y2hhcj4gPihfX2YuZ2V0bG9jKCkpOworICAvLyAgY29uc3Qgc3RyaW5nJiBfX2dyb3VwaW5nID0gX19ucC5ncm91cGluZygpOworCisgIGNvbnN0IG51bXB1bmN0PGNoYXI+JiBfX25wID0gKl9fU1RBVElDX0NBU1QoY29uc3QgbnVtcHVuY3Q8Y2hhcj4qLCBfX2YuX01fbnVtcHVuY3RfZmFjZXQoKSk7CisgIGNvbnN0IHN0cmluZyYgX19ncm91cGluZyA9IF9fZi5fTV9ncm91cGluZygpOworCisgIGlmICghX19ncm91cGluZy5lbXB0eSgpKSB7CisgICAgaW50IF9fYmFzZWNoYXJzOworICAgIGlmIChfX2ZsYWdzICYgaW9zX2Jhc2U6OnNob3diYXNlKQorICAgICAgc3dpdGNoIChfX2ZsYWdzICYgaW9zX2Jhc2U6OmJhc2VmaWVsZCkgeworICAgICAgICBjYXNlIGlvc19iYXNlOjpoZXg6IF9fYmFzZWNoYXJzID0gMjsgYnJlYWs7CisgICAgICAgIGNhc2UgaW9zX2Jhc2U6Om9jdDogX19iYXNlY2hhcnMgPSAxOyBicmVhazsKKyAgICAgICAgZGVmYXVsdDogX19iYXNlY2hhcnMgPSAwOworICAgICAgfQorICAgIGVsc2UKKyAgICAgIF9fYmFzZWNoYXJzID0gMDsKKworICAgICAvLyBtYWtlIHN1cmUgdGhlcmUgaXMgcm9vbSBhdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIKKyAgICAgLy8gd2UgcGFzcyB0byBfX2luc2VydF9ncm91cGluZworICAgIGNvcHkoX19idWYsIF9faWVuZCwgKGNoYXIgKikgX19ncnBidWYpOworICAgIF9fYnVmID0gX19ncnBidWY7CisgICAgX19pZW5kID0gX19ncnBidWYgKyBfX2xlbjsKKyAgICBfX2xlbiA9IF9faW5zZXJ0X2dyb3VwaW5nKF9fYnVmLCBfX2llbmQsIF9fZ3JvdXBpbmcsIF9fbnAudGhvdXNhbmRzX3NlcCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJysnLCAnLScsIF9fYmFzZWNoYXJzKTsKKyAgfQorCisgIHJldHVybiBfX2NvcHlfaW50ZWdlcl9hbmRfZmlsbChfX2J1ZiwgX19sZW4sIF9fcywgX19mbGFncywgX19mLndpZHRoKDApLCBfX2ZpbGwsICcrJywgJy0nKTsKK30KKworI2lmIGRlZmluZWQgKF9TVExQX0xPTkdfTE9ORykKK3R5cGVkZWYgX1NUTFBfTE9OR19MT05HIF9fbWF4X2ludF90OwordHlwZWRlZiB1bnNpZ25lZCBfU1RMUF9MT05HX0xPTkcgX191bWF4X2ludF90OworI2Vsc2UKK3R5cGVkZWYgbG9uZyBfX21heF9pbnRfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBfX3VtYXhfaW50X3Q7CisjZW5kaWYKKworX1NUTFBfREVDTFNQRUMgY29uc3QgY2hhciogX1NUTFBfQ0FMTCBfX2hleF9jaGFyX3RhYmxlX2xvKCk7CitfU1RMUF9ERUNMU1BFQyBjb25zdCBjaGFyKiBfU1RMUF9DQUxMIF9faGV4X2NoYXJfdGFibGVfaGkoKTsKKwordGVtcGxhdGUgPGNsYXNzIF9JbnRlZ2VyPgoraW5saW5lIGNoYXIqIF9TVExQX0NBTEwKK19fd3JpdGVfZGVjaW1hbF9iYWNrd2FyZChjaGFyKiBfX3B0ciwgX0ludGVnZXIgX194LCBpb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncywgY29uc3QgX190cnVlX3R5cGUmIC8qIGlzX3NpZ25lZCAqLykgeworICBjb25zdCBib29sIF9fbmVnYXRpdmUgPSBfX3ggPCAwIDsKKyAgX19tYXhfaW50X3QgX190ZW1wID0gX194OworICBfX3VtYXhfaW50X3QgX191dGVtcCA9IF9fbmVnYXRpdmU/LV9fdGVtcDpfX3RlbXA7CisKKyAgZm9yICg7IF9fdXRlbXAgIT0gMDsgX191dGVtcCAvPSAxMCkKKyAgICAqLS1fX3B0ciA9IChjaGFyKSgoaW50KShfX3V0ZW1wICUgMTApICsgJzAnKTsKKyAgLy8gcHV0IHNpZ24gaWYgbmVlZGVkIG9yIHJlcXVlc3RlZAorICBpZiAoX19uZWdhdGl2ZSkKKyAgICAqLS1fX3B0ciA9ICctJzsKKyAgZWxzZSBpZiAoX19mbGFncyAmIGlvc19iYXNlOjpzaG93cG9zKQorICAgICotLV9fcHRyID0gJysnOworICByZXR1cm4gX19wdHI7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW50ZWdlcj4KK2lubGluZSBjaGFyKiBfU1RMUF9DQUxMCitfX3dyaXRlX2RlY2ltYWxfYmFja3dhcmQoY2hhciogX19wdHIsIF9JbnRlZ2VyIF9feCwgaW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MsIGNvbnN0IF9fZmFsc2VfdHlwZSYgLyogaXNfc2lnbmVkICovKSB7CisgIGZvciAoOyBfX3ggIT0gMDsgX194IC89IDEwKQorICAgICotLV9fcHRyID0gKGNoYXIpKChpbnQpKF9feCAlIDEwKSArICcwJyk7CisgIC8vIHB1dCBzaWduIGlmIHJlcXVlc3RlZAorICBpZiAoX19mbGFncyAmIGlvc19iYXNlOjpzaG93cG9zKQorICAgICotLV9fcHRyID0gJysnOworICByZXR1cm4gX19wdHI7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW50ZWdlcj4KK2NoYXIqIF9TVExQX0NBTEwKK19fd3JpdGVfaW50ZWdlcl9iYWNrd2FyZChjaGFyKiBfX2J1ZiwgaW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MsIF9JbnRlZ2VyIF9feCkgeworICBjaGFyKiBfX3B0ciA9IF9fYnVmOworCisgIGlmIChfX3ggPT0gMCkgeworICAgICotLV9fcHRyID0gJzAnOworICAgIGlmICgoX19mbGFncyAmIGlvc19iYXNlOjpzaG93cG9zKSAmJiAoKF9fZmxhZ3MgJiAoaW9zX2Jhc2U6Om9jdCB8IGlvc19iYXNlOjpoZXgpKSA9PSAwKSkKKyAgICAgICotLV9fcHRyID0gJysnOworICAgIC8vIG9jdCBvciBoZXggYmFzZSBzaGFsbCBub3QgYmUgYWRkZWQgdG8gdGhlIDAgdmFsdWUgKHNlZSAnIycgZmxhZyBpbiBDIGZvcm1hdGluZyBzdHJpbmdzKQorICB9CisgIGVsc2UgeworICAgIHN3aXRjaCAoX19mbGFncyAmIGlvc19iYXNlOjpiYXNlZmllbGQpIHsKKyAgICAgIGNhc2UgaW9zX2Jhc2U6Om9jdDoKKyAgICAgICAgeworICAgICAgICAgIF9fdW1heF9pbnRfdCBfX3RlbXAgPSBfX3g7CisgICAgICAgICAgLy8gaWYgdGhlIHNpemUgb2YgaW50ZWdlciBpcyBsZXNzIHRoYW4gOCwgY2xlYXIgdXBwZXIgcGFydAorICAgICAgICAgIGlmICggc2l6ZW9mKF9feCkgPCA4ICAmJiBzaXplb2YoX191bWF4X2ludF90KSA+PSA4ICkKKyAgICAgICAgICAgIF9fdGVtcCAmPSAweEZGRkZGRkZGOworCisgICAgICAgICAgZm9yICg7IF9fdGVtcCAhPSAwOyBfX3RlbXAgPj49MykKKyAgICAgICAgICAgICotLV9fcHRyID0gKGNoYXIpKCgoKHVuc2lnbmVkKV9fdGVtcCkmIDB4NykgKyAnMCcpOworCisgICAgICAgICAgLy8gcHV0IGxlYWRpbmcgJzAnIGlmIHNob3diYXNlIGlzIHNldAorICAgICAgICAgIGlmIChfX2ZsYWdzICYgaW9zX2Jhc2U6OnNob3diYXNlKQorICAgICAgICAgICAgKi0tX19wdHIgPSAnMCc7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIGlvc19iYXNlOjpoZXg6CisgICAgICAgIHsKKyAgICAgICAgICBjb25zdCBjaGFyKiBfX3RhYmxlX3B0ciA9IChfX2ZsYWdzICYgaW9zX2Jhc2U6OnVwcGVyY2FzZSkgPworICAgICAgICAgICAgX19oZXhfY2hhcl90YWJsZV9oaSgpIDogX19oZXhfY2hhcl90YWJsZV9sbygpOworICAgICAgICAgIF9fdW1heF9pbnRfdCBfX3RlbXAgPSBfX3g7CisgICAgICAgICAgLy8gaWYgdGhlIHNpemUgb2YgaW50ZWdlciBpcyBsZXNzIHRoYW4gOCwgY2xlYXIgdXBwZXIgcGFydAorICAgICAgICAgIGlmICggc2l6ZW9mKF9feCkgPCA4ICAmJiBzaXplb2YoX191bWF4X2ludF90KSA+PSA4ICkKKyAgICAgICAgICAgIF9fdGVtcCAmPSAweEZGRkZGRkZGOworCisgICAgICAgICAgZm9yICg7IF9fdGVtcCAhPSAwOyBfX3RlbXAgPj49NCkKKyAgICAgICAgICAgICotLV9fcHRyID0gX190YWJsZV9wdHJbKCh1bnNpZ25lZClfX3RlbXAgJiAweEYpXTsKKworICAgICAgICAgIGlmIChfX2ZsYWdzICYgaW9zX2Jhc2U6OnNob3diYXNlKSB7CisgICAgICAgICAgICAqLS1fX3B0ciA9IF9fdGFibGVfcHRyWzE2XTsKKyAgICAgICAgICAgICotLV9fcHRyID0gJzAnOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIC8vY2FzZSBpb3NfYmFzZTo6ZGVjOgorICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworI2lmIGRlZmluZWQoX19IUF9hQ0MpICYmIChfX0hQX2FDQyA9PSAxKQorICAgICAgICAgIGJvb2wgX0lzU2lnbmVkID0gISgoX0ludGVnZXIpLTEgPiAwKTsKKyAgICAgICAgICBpZiAoX0lzU2lnbmVkKQorICAgICAgICAgICAgX19wdHIgPSBfX3dyaXRlX2RlY2ltYWxfYmFja3dhcmQoX19wdHIsIF9feCwgX19mbGFncywgX190cnVlX3R5cGUoKSApOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9fcHRyID0gX193cml0ZV9kZWNpbWFsX2JhY2t3YXJkKF9fcHRyLCBfX3gsIF9fZmxhZ3MsIF9fZmFsc2VfdHlwZSgpICk7CisjZWxzZQorICAgICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19ib29sMnR5cGU8bnVtZXJpY19saW1pdHM8X0ludGVnZXI+Ojppc19zaWduZWQ+OjpfUmV0IF9Jc1NpZ25lZDsKKyAgICAgICAgICBfX3B0ciA9IF9fd3JpdGVfZGVjaW1hbF9iYWNrd2FyZChfX3B0ciwgX194LCBfX2ZsYWdzLCBfSXNTaWduZWQoKSk7CisjZW5kaWYKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICAvLyByZXR1cm4gcG9pbnRlciB0byBiZWdpbm5pbmcgb2YgdGhlIHN0cmluZworICByZXR1cm4gX19wdHI7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9PdXRwdXRJdGVyLCBjbGFzcyBfSW50ZWdlcj4KK19PdXRwdXRJdGVyIF9TVExQX0NBTEwKK19fZG9fcHV0X2ludGVnZXIoX091dHB1dEl0ZXIgX19zLCBpb3NfYmFzZSYgX19mLCBfQ2hhclQgX19maWxsLCBfSW50ZWdlciBfX3gpIHsKKyAgLy8gYnVmZmVyIHNpemUgPSBudW1iZXIgb2YgYnl0ZXMgKiBudW1iZXIgb2YgZGlnaXQgbmVjZXNzYXJ5IGluIHRoZSBzbWFsbGVzdCBTdGFuZGFyZCBiYXNlIChiYXNlIDgsIDMgZGlnaXRzL2J5dGUpCisgIC8vICAgICAgICAgICAgICAgcGx1cyB0aGUgbG9uZ2VzdCBiYXNlIHJlcHJlc2VudGF0aW9uICcweCcKKyAgLy8gRG8gbm90IHVzZSBfX2J1Zl9zaXplIHRvIGRlZmluZSBfX2J1ZiBzdGF0aWMgYnVmZmVyLCBzb21lIGNvbXBpbGVycyAoSFAgYUNDKSBkbyBub3QgYWNjZXB0IGNvbnN0IHZhcmlhYmxlIGFzCisgIC8vIHRoZSBzcGVjaWZpY2F0aW9uIG9mIGEgc3RhdGljIGJ1ZmZlciBzaXplLgorICBjaGFyIF9fYnVmW3NpemVvZihfSW50ZWdlcikgKiAzICsgMl07CisgIGNvbnN0IHB0cmRpZmZfdCBfX2J1Zl9zaXplID0gc2l6ZW9mKF9fYnVmKSAvIHNpemVvZihjaGFyKTsKKyAgaW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX2YuZmxhZ3MoKTsKKyAgY2hhciogX19pYmVnID0gX193cml0ZV9pbnRlZ2VyX2JhY2t3YXJkKChjaGFyKilfX2J1ZitfX2J1Zl9zaXplLCBfX2ZsYWdzLCBfX3gpOworICByZXR1cm4gX19wdXRfaW50ZWdlcihfX2liZWcsIChjaGFyKilfX2J1ZitfX2J1Zl9zaXplLCBfX3MsIF9fZiwgX19mbGFncywgX19maWxsKTsKK30KKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKKy8vCisvLyBudW1fcHV0PD4KKy8vCisKKyNpZiAoX1NUTFBfU1RBVElDX1RFTVBMQVRFX0RBVEEgPiAwKQorCisjICBpZiAhZGVmaW5lZCAoX19CT1JMQU5EQ19fKQordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX091dHB1dEl0ZXJhdG9yPgorbG9jYWxlOjppZCBudW1fcHV0PF9DaGFyVCwgX091dHB1dEl0ZXJhdG9yPjo6aWQ7CisjICBlbmRpZgorCisjICBpZiAoZGVmaW5lZCAoX19DWUdXSU5fXykgfHwgZGVmaW5lZCAoX19NSU5HVzMyX18pKSAmJiBcCisgICAgICAgZGVmaW5lZCAoX1NUTFBfVVNFX0RZTkFNSUNfTElCKSAmJiAhZGVmaW5lZCAoX19CVUlMRElOR19TVExQT1JUKQorLyoKKyAqIFVuZGVyIGN5Z3dpbiwgd2hlbiBTVExwb3J0IGlzIHVzZWQgYXMgYSBzaGFyZWQgbGlicmFyeSwgdGhlIGlkIG5lZWRzCisgKiB0byBiZSBzcGVjaWZpZWQgYXMgaW1wb3J0ZWQgb3RoZXJ3aXNlIHRoZXkgd2lsbCBiZSBkdXBsaWNhdGVkIGluIHRoZQorICogY2FsbGluZyBleGVjdXRhYmxlLgorICovCit0ZW1wbGF0ZSA8PgorX1NUTFBfREVDTFNQRUMgbG9jYWxlOjppZCBudW1fcHV0PGNoYXIsIG9zdHJlYW1idWZfaXRlcmF0b3I8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiA+OjppZDsKKy8qCit0ZW1wbGF0ZSA8PgorX1NUTFBfREVDTFNQRUMgbG9jYWxlOjppZCBudW1fcHV0PGNoYXIsIGNoYXIqPjo6aWQ7CisqLworCisjICAgIGlmICFkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQordGVtcGxhdGUgPD4KK19TVExQX0RFQ0xTUEVDIGxvY2FsZTo6aWQgbnVtX3B1dDx3Y2hhcl90LCBvc3RyZWFtYnVmX2l0ZXJhdG9yPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4gPjo6aWQ7CisvKgordGVtcGxhdGUgPD4KK19TVExQX0RFQ0xTUEVDIGxvY2FsZTo6aWQgbnVtX3B1dDx3Y2hhcl90LCB3Y2hhcl90Kj46OmlkOworKi8KKyMgICAgZW5kaWYKKworIyAgZW5kaWYgLyogX19DWUdXSU5fXyAmJiBfU1RMUF9VU0VfRFlOQU1JQ19MSUIgKi8KKworI2Vsc2UgLyogKCBfU1RMUF9TVEFUSUNfVEVNUExBVEVfREFUQSA+IDAgKSAqLworCisvL3R5cGVkZWYgbnVtX3B1dDxjaGFyLCBjaGFyKj4gbnVtX3B1dF9jaGFyOwordHlwZWRlZiBudW1fcHV0PGNoYXIsIG9zdHJlYW1idWZfaXRlcmF0b3I8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiA+IG51bV9wdXRfY2hhcl8yOworCisvL19fREVDTEFSRV9JTlNUQU5DRShsb2NhbGU6OmlkLCBudW1fcHV0X2NoYXI6OmlkLCApOworX19ERUNMQVJFX0lOU1RBTkNFKGxvY2FsZTo6aWQsIG51bV9wdXRfY2hhcl8yOjppZCwgKTsKKworIyAgaWYgIWRlZmluZWQgKF9TVExQX05PX1dDSEFSX1QpCisKKy8vdHlwZWRlZiBudW1fcHV0PHdjaGFyX3QsIHdjaGFyX3QqPiBudW1fcHV0X3djaGFyX3Q7Cit0eXBlZGVmIG51bV9wdXQ8d2NoYXJfdCwgb3N0cmVhbWJ1Zl9pdGVyYXRvcjx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+ID4gbnVtX3B1dF93Y2hhcl90XzI7CisKKy8vX19ERUNMQVJFX0lOU1RBTkNFKGxvY2FsZTo6aWQsIG51bV9wdXRfd2NoYXJfdDo6aWQsICk7CitfX0RFQ0xBUkVfSU5TVEFOQ0UobG9jYWxlOjppZCwgbnVtX3B1dF93Y2hhcl90XzI6OmlkLCApOworCisjICBlbmRpZgorCisjZW5kaWYgLyogKCBfU1RMUF9TVEFUSUNfVEVNUExBVEVfREFUQSA+IDAgKSAqLworCisvLyBpc3N1ZSAxMTgKKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19CT09MKQordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX091dHB1dEl0ZXI+CitfT3V0cHV0SXRlcgorbnVtX3B1dDxfQ2hhclQsIF9PdXRwdXRJdGVyPjo6ZG9fcHV0KF9PdXRwdXRJdGVyIF9fcywgaW9zX2Jhc2UmIF9fZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX3R5cGUgX19maWxsLCAgYm9vbCBfX3ZhbCkgY29uc3QgeworICBpZiAoIShfX2YuZmxhZ3MoKSAmIGlvc19iYXNlOjpib29sYWxwaGEpKQorICAgIHJldHVybiB0aGlzLT5kb19wdXQoX19zLCBfX2YsIF9fZmlsbCwgX19TVEFUSUNfQ0FTVChsb25nLF9fdmFsKSk7CisKKyAgbG9jYWxlIF9fbG9jID0gX19mLmdldGxvYygpOworICAvLyAgdHlwZWRlZiBudW1wdW5jdDxfQ2hhclQ+IF9QdW5jdDsKKyAgLy8gIGNvbnN0IF9QdW5jdCYgX19ucCA9IHVzZV9mYWNldDxfUHVuY3Q+KF9fbG9jKTsKKworICBjb25zdCBudW1wdW5jdDxfQ2hhclQ+JiBfX25wID0gKl9fU1RBVElDX0NBU1QoY29uc3QgbnVtcHVuY3Q8X0NoYXJUPiosIF9fZi5fTV9udW1wdW5jdF9mYWNldCgpKTsKKworICBiYXNpY19zdHJpbmc8X0NoYXJUPiBfX3N0ciA9IF9fdmFsID8gX19ucC50cnVlbmFtZSgpIDogX19ucC5mYWxzZW5hbWUoKTsKKworICAvLyBSZXVzZSBfX2NvcHlfaW50ZWdlcl9hbmRfZmlsbC4gIFNpbmNlIGludGVybmFsIHBhZGRpbmcgbWFrZXMgbm8KKyAgLy8gc2Vuc2UgZm9yIGJvb2wsIHRob3VnaCwgbWFrZSBzdXJlIHdlIHVzZSBzb21ldGhpbmcgZWxzZSBpbnN0ZWFkLgorICAvLyBUaGUgbGFzdCB0d28gYXJndW1lbnQgdG8gX19jb3B5X2ludGVnZXJfYW5kX2ZpbGwgYXJlIGR1bW1pZXMuCisgIGlvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19mLmZsYWdzKCk7CisgIGlmICgoX19mbGFncyAmIGlvc19iYXNlOjphZGp1c3RmaWVsZCkgPT0gaW9zX2Jhc2U6OmludGVybmFsKQorICAgIF9fZmxhZ3MgPSAoX19mbGFncyAmIH5pb3NfYmFzZTo6YWRqdXN0ZmllbGQpIHwgaW9zX2Jhc2U6OnJpZ2h0OworCisgIHJldHVybiBfU1RMUF9QUklWIF9fY29weV9pbnRlZ2VyX2FuZF9maWxsKF9fc3RyLmNfc3RyKCksIF9fc3RyLnNpemUoKSwgX19zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ZsYWdzLCBfX2Yud2lkdGgoMCksIF9fZmlsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9DaGFyVCkgMCwgKF9DaGFyVCkgMCk7Cit9CisKKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfT3V0cHV0SXRlcj4KK19PdXRwdXRJdGVyCitudW1fcHV0PF9DaGFyVCwgX091dHB1dEl0ZXI+Ojpkb19wdXQoX091dHB1dEl0ZXIgX19zLCBpb3NfYmFzZSYgX19mLCBfQ2hhclQgX19maWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgX192YWwpIGNvbnN0Cit7IHJldHVybiBfU1RMUF9QUklWIF9fZG9fcHV0X2ludGVnZXIoX19zLCBfX2YsIF9fZmlsbCwgX192YWwpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9PdXRwdXRJdGVyPgorX091dHB1dEl0ZXIKK251bV9wdXQ8X0NoYXJULCBfT3V0cHV0SXRlcj46OmRvX3B1dChfT3V0cHV0SXRlciBfX3MsIGlvc19iYXNlJiBfX2YsIF9DaGFyVCBfX2ZpbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBfX3ZhbCkgY29uc3QKK3sgcmV0dXJuIF9TVExQX1BSSVYgX19kb19wdXRfaW50ZWdlcihfX3MsIF9fZiwgX19maWxsLCBfX3ZhbCk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX091dHB1dEl0ZXI+CitfT3V0cHV0SXRlcgorbnVtX3B1dDxfQ2hhclQsIF9PdXRwdXRJdGVyPjo6ZG9fcHV0KF9PdXRwdXRJdGVyIF9fcywgaW9zX2Jhc2UmIF9fZiwgX0NoYXJUIF9fZmlsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgX192YWwpIGNvbnN0Cit7IHJldHVybiBfU1RMUF9QUklWIF9fZG9fcHV0X2Zsb2F0KF9fcywgX19mLCBfX2ZpbGwsIF9fdmFsKTsgfQorCisjaWYgIWRlZmluZWQgKF9TVExQX05PX0xPTkdfRE9VQkxFKQordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX091dHB1dEl0ZXI+CitfT3V0cHV0SXRlcgorbnVtX3B1dDxfQ2hhclQsIF9PdXRwdXRJdGVyPjo6ZG9fcHV0KF9PdXRwdXRJdGVyIF9fcywgaW9zX2Jhc2UmIF9fZiwgX0NoYXJUIF9fZmlsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGRvdWJsZSBfX3ZhbCkgY29uc3QKK3sgcmV0dXJuIF9TVExQX1BSSVYgX19kb19wdXRfZmxvYXQoX19zLCBfX2YsIF9fZmlsbCwgX192YWwpOyB9CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX0xPTkdfTE9ORykKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9PdXRwdXRJdGVyPgorX091dHB1dEl0ZXIKK251bV9wdXQ8X0NoYXJULCBfT3V0cHV0SXRlcj46OmRvX3B1dChfT3V0cHV0SXRlciBfX3MsIGlvc19iYXNlJiBfX2YsIF9DaGFyVCBfX2ZpbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfTE9OR19MT05HIF9fdmFsKSBjb25zdAoreyByZXR1cm4gX1NUTFBfUFJJViBfX2RvX3B1dF9pbnRlZ2VyKF9fcywgX19mLCBfX2ZpbGwsIF9fdmFsKTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfT3V0cHV0SXRlcj4KK19PdXRwdXRJdGVyCitudW1fcHV0PF9DaGFyVCwgX091dHB1dEl0ZXI+Ojpkb19wdXQoX091dHB1dEl0ZXIgX19zLCBpb3NfYmFzZSYgX19mLCBfQ2hhclQgX19maWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIF9TVExQX0xPTkdfTE9ORyBfX3ZhbCkgY29uc3QKK3sgcmV0dXJuIF9TVExQX1BSSVYgX19kb19wdXRfaW50ZWdlcihfX3MsIF9fZiwgX19maWxsLCBfX3ZhbCk7IH0KKyNlbmRpZiAvKiBfU1RMUF9MT05HX0xPTkcgKi8KKworCisvLyBsaWIuZmFjZXQubnVtLnB1dC52aXJ0dWFscyAiMTIgRm9yIGNvbnZlcnNpb24gZnJvbSB2b2lkKiB0aGUgc3BlY2lmaWVyIGlzICVwLiIKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9PdXRwdXRJdGVyPgorX091dHB1dEl0ZXIKK251bV9wdXQ8X0NoYXJULCBfT3V0cHV0SXRlcj46OmRvX3B1dChfT3V0cHV0SXRlciBfX3MsIGlvc19iYXNlJiBfX2YsIF9DaGFyVCAvKl9fZmlsbCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIF9fdmFsKSBjb25zdCB7CisgIGNvbnN0IGN0eXBlPF9DaGFyVD4mIF9fY190eXBlID0gKl9fU1RBVElDX0NBU1QoY29uc3QgY3R5cGU8X0NoYXJUPiosIF9fZi5fTV9jdHlwZV9mYWNldCgpKTsKKyAgaW9zX2Jhc2U6OmZtdGZsYWdzIF9fc2F2ZV9mbGFncyA9IF9fZi5mbGFncygpOworCisgIF9fZi5zZXRmKGlvc19iYXNlOjpoZXgsIGlvc19iYXNlOjpiYXNlZmllbGQpOworICBfX2Yuc2V0Zihpb3NfYmFzZTo6c2hvd2Jhc2UpOworICBfX2Yuc2V0Zihpb3NfYmFzZTo6aW50ZXJuYWwsIGlvc19iYXNlOjphZGp1c3RmaWVsZCk7CisgIF9fZi53aWR0aCgoc2l6ZW9mKHZvaWQqKSAqIDIpICsgMik7IC8vIGRpZ2l0cyBpbiBwb2ludGVyIHR5cGUgcGx1cyAnMHgnIHByZWZpeAorIyBpZiBkZWZpbmVkKF9TVExQX0xPTkdfTE9ORykgJiYgIWRlZmluZWQoX19NUkNfXykgLy8qdHkgMTEvMjQvMjAwMSAtIE1yQ3BwIGNhbiBub3QgY2FzdCBmcm9tIHZvaWQqIHRvIGxvbmcgbG9uZworICBfT3V0cHV0SXRlciByZXN1bHQgPSB0aGlzLT5kb19wdXQoX19zLCBfX2YsIF9fY190eXBlLndpZGVuKCcwJyksIF9fUkVJTlRFUlBSRVRfQ0FTVCh1bnNpZ25lZCBfU1RMUF9MT05HX0xPTkcsX192YWwpKTsKKyMgZWxzZQorICBfT3V0cHV0SXRlciByZXN1bHQgPSB0aGlzLT5kb19wdXQoX19zLCBfX2YsIF9fY190eXBlLndpZGVuKCcwJyksIF9fUkVJTlRFUlBSRVRfQ0FTVCh1bnNpZ25lZCBsb25nLF9fdmFsKSk7CisjIGVuZGlmCisgIF9fZi5mbGFncyhfX3NhdmVfZmxhZ3MpOworICByZXR1cm4gcmVzdWx0OworfQorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNlbmRpZiAvKiBfU1RMUF9OVU1fUFVUX0MgKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9fbnVtX3B1dC5oIGIvc3RsL19udW1fcHV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc3Y2Q5MwotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9fbnVtX3B1dC5oCkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworLy8gV0FSTklORzogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgQysrCisvLyBzdGFuZGFyZCBsaWJyYXJ5IGhlYWRlcnMuICBZb3Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHVzZSB0aGlzIGhlYWRlcgorLy8gZmlsZSBkaXJlY3RseS4KKworCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX05VTV9QVVRfSAorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9OVU1fUFVUX0gKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9OVU1QVU5DVF9ICisjIGluY2x1ZGUgPHN0bC9fbnVtcHVuY3QuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NUWVBFX0gKKyMgaW5jbHVkZSA8c3RsL19jdHlwZS5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfT1NUUkVBTUJVRl9JVEVSQVRPUl9ICisjIGluY2x1ZGUgPHN0bC9fb3N0cmVhbWJ1Zl9pdGVyYXRvci5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfSU9TVFJFQU1fU1RSSU5HX0gKKyMgaW5jbHVkZSA8c3RsL19pb3N0cmVhbV9zdHJpbmcuaD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBudW1fcHV0IGZhY2V0CisKKyNpZiBkZWZpbmVkIChfU1RMUF9MSU1JVEVEX0RFRkFVTFRfVEVNUExBVEVTKQordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX091dHB1dEl0ZXI+CisjZWxzZQordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX091dHB1dEl0ZXIgPSBvc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVCwgY2hhcl90cmFpdHM8X0NoYXJUPiA+ID4KKyNlbmRpZgorY2xhc3MgbnVtX3B1dDogcHVibGljIGxvY2FsZTo6ZmFjZXQgeworICBmcmllbmQgY2xhc3MgX0xvY2FsZV9pbXBsOworcHVibGljOgorICB0eXBlZGVmIF9DaGFyVCAgICAgIGNoYXJfdHlwZTsKKyAgdHlwZWRlZiBfT3V0cHV0SXRlciBpdGVyX3R5cGU7CisKKyAgZXhwbGljaXQgbnVtX3B1dChzaXplX3QgX19yZWZzID0gMCkgOiBsb2NhbGU6OmZhY2V0KF9fcmVmcykge30KKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19CT09MKQorICBpdGVyX3R5cGUgcHV0KGl0ZXJfdHlwZSBfX3MsIGlvc19iYXNlJiBfX2YsIGNoYXJfdHlwZSBfX2ZpbGwsCisgICAgICAgICAgICAgICAgYm9vbCBfX3ZhbCkgY29uc3QgeworICAgIHJldHVybiBkb19wdXQoX19zLCBfX2YsIF9fZmlsbCwgX192YWwpOworICB9CisjZW5kaWYKKyAgaXRlcl90eXBlIHB1dChpdGVyX3R5cGUgX19zLCBpb3NfYmFzZSYgX19mLCBjaGFyX3R5cGUgX19maWxsLAorICAgICAgICAgICAgICAgbG9uZyBfX3ZhbCkgY29uc3QgeworICAgIHJldHVybiBkb19wdXQoX19zLCBfX2YsIF9fZmlsbCwgX192YWwpOworICB9CisKKyAgaXRlcl90eXBlIHB1dChpdGVyX3R5cGUgX19zLCBpb3NfYmFzZSYgX19mLCBjaGFyX3R5cGUgX19maWxsLAorICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgX192YWwpIGNvbnN0IHsKKyAgICByZXR1cm4gZG9fcHV0KF9fcywgX19mLCBfX2ZpbGwsIF9fdmFsKTsKKyAgfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfTE9OR19MT05HKQorICBpdGVyX3R5cGUgcHV0KGl0ZXJfdHlwZSBfX3MsIGlvc19iYXNlJiBfX2YsIGNoYXJfdHlwZSBfX2ZpbGwsCisgICAgICAgICAgICAgICAgX1NUTFBfTE9OR19MT05HIF9fdmFsKSBjb25zdCB7CisgICAgcmV0dXJuIGRvX3B1dChfX3MsIF9fZiwgX19maWxsLCBfX3ZhbCk7CisgIH0KKworICBpdGVyX3R5cGUgcHV0KGl0ZXJfdHlwZSBfX3MsIGlvc19iYXNlJiBfX2YsIGNoYXJfdHlwZSBfX2ZpbGwsCisgICAgICAgICAgICAgICAgdW5zaWduZWQgX1NUTFBfTE9OR19MT05HIF9fdmFsKSBjb25zdCB7CisgICAgcmV0dXJuIGRvX3B1dChfX3MsIF9fZiwgX19maWxsLCBfX3ZhbCk7CisgIH0KKyNlbmRpZgorCisgIGl0ZXJfdHlwZSBwdXQoaXRlcl90eXBlIF9fcywgaW9zX2Jhc2UmIF9fZiwgY2hhcl90eXBlIF9fZmlsbCwKKyAgICAgICAgICAgICAgICBkb3VibGUgX192YWwpIGNvbnN0IHsKKyAgICByZXR1cm4gZG9fcHV0KF9fcywgX19mLCBfX2ZpbGwsIChkb3VibGUpX192YWwpOworICB9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTE9OR19ET1VCTEUpCisgIGl0ZXJfdHlwZSBwdXQoaXRlcl90eXBlIF9fcywgaW9zX2Jhc2UmIF9fZiwgY2hhcl90eXBlIF9fZmlsbCwKKyAgICAgICAgICAgICAgICBsb25nIGRvdWJsZSBfX3ZhbCkgY29uc3QgeworICAgIHJldHVybiBkb19wdXQoX19zLCBfX2YsIF9fZmlsbCwgX192YWwpOworICB9CisjZW5kaWYKKworICBpdGVyX3R5cGUgcHV0KGl0ZXJfdHlwZSBfX3MsIGlvc19iYXNlJiBfX2YsIGNoYXJfdHlwZSBfX2ZpbGwsCisgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqIF9fdmFsKSBjb25zdCB7CisgICAgcmV0dXJuIGRvX3B1dChfX3MsIF9fZiwgX19maWxsLCBfX3ZhbCk7CisgIH0KKworICBzdGF0aWMgX1NUTFBfU1RBVElDX01FTUJFUl9ERUNMU1BFQyBsb2NhbGU6OmlkIGlkOworCitwcm90ZWN0ZWQ6CisgIH5udW1fcHV0KCkge30KKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fQk9PTCkKKyAgdmlydHVhbCBfT3V0cHV0SXRlciBkb19wdXQoX091dHB1dEl0ZXIgX19zLCBpb3NfYmFzZSYgX19mLCBfQ2hhclQgX19maWxsLCBib29sIF9fdmFsKSBjb25zdDsKKyNlbmRpZgorICB2aXJ0dWFsIF9PdXRwdXRJdGVyIGRvX3B1dChfT3V0cHV0SXRlciBfX3MsIGlvc19iYXNlJiBfX2YsIF9DaGFyVCBfX2ZpbGwsIGxvbmcgX192YWwpIGNvbnN0OworICB2aXJ0dWFsIF9PdXRwdXRJdGVyIGRvX3B1dChfT3V0cHV0SXRlciBfX3MsIGlvc19iYXNlJiBfX2YsIF9DaGFyVCBfX2ZpbGwsIHVuc2lnbmVkIGxvbmcgX192YWwpIGNvbnN0OworICB2aXJ0dWFsIF9PdXRwdXRJdGVyIGRvX3B1dChfT3V0cHV0SXRlciBfX3MsIGlvc19iYXNlJiBfX2YsIF9DaGFyVCBfX2ZpbGwsIGRvdWJsZSBfX3ZhbCkgY29uc3Q7CisjaWYgIWRlZmluZWQgKF9TVExQX05PX0xPTkdfRE9VQkxFKQorICB2aXJ0dWFsIF9PdXRwdXRJdGVyIGRvX3B1dChfT3V0cHV0SXRlciBfX3MsIGlvc19iYXNlJiBfX2YsIF9DaGFyVCBfX2ZpbGwsIGxvbmcgZG91YmxlIF9fdmFsKSBjb25zdDsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfTE9OR19MT05HKQorICB2aXJ0dWFsIF9PdXRwdXRJdGVyIGRvX3B1dChfT3V0cHV0SXRlciBfX3MsIGlvc19iYXNlJiBfX2YsIF9DaGFyVCBfX2ZpbGwsIF9TVExQX0xPTkdfTE9ORyBfX3ZhbCkgY29uc3Q7CisgIHZpcnR1YWwgX091dHB1dEl0ZXIgZG9fcHV0KF9PdXRwdXRJdGVyIF9fcywgaW9zX2Jhc2UmIF9fZiwgX0NoYXJUIF9fZmlsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIF9TVExQX0xPTkdfTE9ORyBfX3ZhbCkgY29uc3QgOworI2VuZGlmCisgIHZpcnR1YWwgX091dHB1dEl0ZXIgZG9fcHV0KF9PdXRwdXRJdGVyIF9fcywgaW9zX2Jhc2UmIF9fZiwgX0NoYXJUIF9fZmlsbCwgY29uc3Qgdm9pZCogX192YWwpIGNvbnN0OworfTsKKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9URU1QTEFURV9FWFBPUlQpCitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgbnVtX3B1dDxjaGFyLCBvc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4gPjsKKy8vIF9TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBudW1fcHV0PGNoYXIsIGNoYXIqPjsKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQorX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIG51bV9wdXQ8d2NoYXJfdCwgb3N0cmVhbWJ1Zl9pdGVyYXRvcjx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+ID47CisvLyBfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgbnVtX3B1dDx3Y2hhcl90LCB3Y2hhcl90Kj47CisjICBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9FWFBPU0VfU1RSRUFNX0lNUExFTUVOVEFUSU9OKQorCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfSW50ZWdlcj4KK2NoYXIqIF9TVExQX0NBTEwKK19fd3JpdGVfaW50ZWdlcl9iYWNrd2FyZChjaGFyKiBfX2J1ZiwgaW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MsIF9JbnRlZ2VyIF9feCk7CisKKy8qCisgKiBSZXR1cm5zIHRoZSBwb3NpdGlvbiBvbiB0aGUgcmlnaHQgb2YgdGhlIGRpZ2l0cyB0aGF0IGhhcyB0byBiZSBjb25zaWRlcmVkCisgKiBmb3IgdGhlIGFwcGxpY2F0aW9uIG9mIHRoZSBncm91cGluZyBwb2xpY3kuCisgKi8KK2V4dGVybiBzaXplX3QgX1NUTFBfQ0FMTCBfX3dyaXRlX2Zsb2F0KF9faW9zdHJpbmcmLCBpb3NfYmFzZTo6Zm10ZmxhZ3MsIGludCwgZG91YmxlKTsKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9OT19MT05HX0RPVUJMRSkKK2V4dGVybiBzaXplX3QgX1NUTFBfQ0FMTCBfX3dyaXRlX2Zsb2F0KF9faW9zdHJpbmcmLCBpb3NfYmFzZTo6Zm10ZmxhZ3MsIGludCwgbG9uZyBkb3VibGUpOworIyAgZW5kaWYKKworLyoKKyAqIEdldHMgdGhlIGRpZ2l0cyBvZiB0aGUgaW50ZWdlciBwYXJ0LgorICovCit2b2lkIF9TVExQX0NBTEwgX19nZXRfZmxvb3JfZGlnaXRzKF9faW9zdHJpbmcmLCBfU1RMUF9MT05HRVNUX0ZMT0FUX1RZUEUpOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgordm9pZCBfU1RMUF9DQUxMIF9fZ2V0X21vbmV5X2RpZ2l0cyhfU1RMUF9CQVNJQ19JT1NUUklORyhfQ2hhclQpJiwgaW9zX2Jhc2UmLCBfU1RMUF9MT05HRVNUX0ZMT0FUX1RZUEUpOworCisjICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkKK2V4dGVybiB2b2lkIF9TVExQX0NBTEwgX19jb252ZXJ0X2Zsb2F0X2J1ZmZlcihfX2lvc3RyaW5nIGNvbnN0JiwgX19pb3dzdHJpbmcmLCBjb25zdCBjdHlwZTx3Y2hhcl90PiYsIHdjaGFyX3QsIGJvb2wgPSB0cnVlKTsKKyMgIGVuZGlmCitleHRlcm4gdm9pZCBfU1RMUF9DQUxMIF9fYWRqdXN0X2Zsb2F0X2J1ZmZlcihfX2lvc3RyaW5nJiwgY2hhcik7CisKK2V4dGVybiBjaGFyKiBfU1RMUF9DQUxMCitfX3dyaXRlX2ludGVnZXIoY2hhciogYnVmLCBpb3NfYmFzZTo6Zm10ZmxhZ3MgZmxhZ3MsIGxvbmcgeCk7CisKK2V4dGVybiBwdHJkaWZmX3QgX1NUTFBfQ0FMTCBfX2luc2VydF9ncm91cGluZyhjaGFyKiBmaXJzdCwgY2hhciogbGFzdCwgY29uc3Qgc3RyaW5nJiwgY2hhciwgY2hhciwgY2hhciwgaW50KTsKK2V4dGVybiB2b2lkIF9TVExQX0NBTEwgX19pbnNlcnRfZ3JvdXBpbmcoX19pb3N0cmluZyYsIHNpemVfdCwgY29uc3Qgc3RyaW5nJiwgY2hhciwgY2hhciwgY2hhciwgaW50KTsKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQorZXh0ZXJuIHB0cmRpZmZfdCBfU1RMUF9DQUxMIF9faW5zZXJ0X2dyb3VwaW5nKHdjaGFyX3QqLCB3Y2hhcl90KiwgY29uc3Qgc3RyaW5nJiwgd2NoYXJfdCwgd2NoYXJfdCwgd2NoYXJfdCwgaW50KTsKK2V4dGVybiB2b2lkIF9TVExQX0NBTEwgX19pbnNlcnRfZ3JvdXBpbmcoX19pb3dzdHJpbmcmLCBzaXplX3QsIGNvbnN0IHN0cmluZyYsIHdjaGFyX3QsIHdjaGFyX3QsIHdjaGFyX3QsIGludCk7CisjICBlbmRpZgorCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKworI2VuZGlmIC8qIF9TVExQX0VYUE9TRV9TVFJFQU1fSU1QTEVNRU5UQVRJT04gKi8KKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjaWYgZGVmaW5lZCAoX1NUTFBfRVhQT1NFX1NUUkVBTV9JTVBMRU1FTlRBVElPTikgJiYgIWRlZmluZWQgKF9TVExQX0xJTktfVElNRV9JTlNUQU5USUFUSU9OKQorIyAgaW5jbHVkZSA8c3RsL19udW1fcHV0LmM+CisjZW5kaWYKKworI2VuZGlmIC8qIF9TVExQX0lOVEVSTkFMX05VTUVSSUNfRkFDRVRTX0ggKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9fbnVtZXJpYy5jIGIvc3RsL19udW1lcmljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJkMDdmZgotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9fbnVtZXJpYy5jCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisjaWZuZGVmIF9TVExQX05VTUVSSUNfQworI2RlZmluZSBfU1RMUF9OVU1FUklDX0MKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9OVU1FUklDX0gKKyMgaW5jbHVkZSA8c3RsL19udW1lcmljLmg+CisjZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yLCBjbGFzcyBfT3V0cHV0SXRlcmF0b3IsIGNsYXNzIF9UcCwKKyAgICAgICAgICBjbGFzcyBfQmluYXJ5T3BlcmF0aW9uPgorX091dHB1dEl0ZXJhdG9yCitfX3BhcnRpYWxfc3VtKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LCBfVHAqLCBfQmluYXJ5T3BlcmF0aW9uIF9fYmluYXJ5X29wKSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKKyAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KSByZXR1cm4gX19yZXN1bHQ7CisgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0OworCisgIF9UcCBfX3ZhbCA9ICpfX2ZpcnN0OworICB3aGlsZSAoKytfX2ZpcnN0ICE9IF9fbGFzdCkgeworICAgIF9fdmFsID0gX19iaW5hcnlfb3AoX192YWwsICpfX2ZpcnN0KTsKKyAgICAqKytfX3Jlc3VsdCA9IF9fdmFsOworICB9CisgIHJldHVybiArK19fcmVzdWx0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3IsIGNsYXNzIF9PdXRwdXRJdGVyYXRvciwgY2xhc3MgX1RwLAorICAgICAgICAgIGNsYXNzIF9CaW5hcnlPcGVyYXRpb24+CitfT3V0cHV0SXRlcmF0b3IKK19fYWRqYWNlbnRfZGlmZmVyZW5jZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LCBfVHAqLAorICAgICAgICAgICAgICAgICAgICAgIF9CaW5hcnlPcGVyYXRpb24gX19iaW5hcnlfb3ApIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICBpZiAoX19maXJzdCA9PSBfX2xhc3QpIHJldHVybiBfX3Jlc3VsdDsKKyAgKl9fcmVzdWx0ID0gKl9fZmlyc3Q7CisgIF9UcCBfX3ZhbCA9ICpfX2ZpcnN0OworICB3aGlsZSAoKytfX2ZpcnN0ICE9IF9fbGFzdCkgeworICAgIF9UcCBfX3RtcCA9ICpfX2ZpcnN0OworICAgICorK19fcmVzdWx0ID0gX19iaW5hcnlfb3AoX190bXAsIF9fdmFsKTsKKyAgICBfX3ZhbCA9IF9fdG1wOworICB9CisgIHJldHVybiArK19fcmVzdWx0OworfQorCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9JbnRlZ2VyLCBjbGFzcyBfTW9ub2lkT3BlcmF0aW9uPgorX1RwIF9fcG93ZXIoX1RwIF9feCwgX0ludGVnZXIgX19uLCBfTW9ub2lkT3BlcmF0aW9uIF9fb3ByKSB7CisgIF9TVExQX01QV0ZJWF9UUlkKKyAgaWYgKF9fbiA9PSAwKQorICAgIHJldHVybiBfX2lkZW50aXR5X2VsZW1lbnQoX19vcHIpOworICBlbHNlIHsKKyAgICB3aGlsZSAoKF9fbiAmIDEpID09IDApIHsKKyAgICAgIF9fbiA+Pj0gMTsKKyAgICAgIF9feCA9IF9fb3ByKF9feCwgX194KTsKKyAgICB9CisgICAgX1RwIF9fcmVzdWx0ID0gX194OworICBfU1RMUF9NUFdGSVhfVFJZCisgICAgX19uID4+PSAxOworICAgIHdoaWxlIChfX24gIT0gMCkgeworICAgICAgX194ID0gX19vcHIoX194LCBfX3gpOworICAgICAgaWYgKChfX24gJiAxKSAhPSAwKQorICAgICAgICBfX3Jlc3VsdCA9IF9fb3ByKF9fcmVzdWx0LCBfX3gpOworICAgICAgX19uID4+PSAxOworICAgIH0KKyAgICByZXR1cm4gX19yZXN1bHQ7CisgIF9TVExQX01QV0ZJWF9DQVRDSAorICB9CisgIF9TVExQX01QV0ZJWF9DQVRDSF9BQ1RJT04oX194ID0gX1RwKCkpCit9CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNlbmRpZiAvKiAgX1NUTFBfTlVNRVJJQ19DICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvX251bWVyaWMuaCBiL3N0bC9fbnVtZXJpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NDRkYTEKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvX251bWVyaWMuaApAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKy8qIE5PVEU6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIFNUTCBoZWFkZXJzLgorICogICBZb3Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4KKyAqLworCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX05VTUVSSUNfSAorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9OVU1FUklDX0gKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9GVU5DVElPTl9CQVNFX0gKKyMgaW5jbHVkZSA8c3RsL19mdW5jdGlvbl9iYXNlLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9JVEVSQVRPUl9CQVNFX0gKKyMgIGluY2x1ZGUgPHN0bC9faXRlcmF0b3JfYmFzZS5oPgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3IsIGNsYXNzIF9UcD4KK19TVExQX0lOTElORV9MT09QCitfVHAgYWNjdW11bGF0ZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsIF9UcCBfSW5pdCkgeworICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKKyAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorICAgIF9Jbml0ID0gX0luaXQgKyAqX19maXJzdDsKKyAgcmV0dXJuIF9Jbml0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3IsIGNsYXNzIF9UcCwgY2xhc3MgX0JpbmFyeU9wZXJhdGlvbj4KK19TVExQX0lOTElORV9MT09QCitfVHAgYWNjdW11bGF0ZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsIF9UcCBfSW5pdCwKKyAgICAgICAgICAgICAgIF9CaW5hcnlPcGVyYXRpb24gX19iaW5hcnlfb3ApIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKyAgICBfSW5pdCA9IF9fYmluYXJ5X29wKF9Jbml0LCAqX19maXJzdCk7CisgIHJldHVybiBfSW5pdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yMSwgY2xhc3MgX0lucHV0SXRlcmF0b3IyLCBjbGFzcyBfVHA+CitfU1RMUF9JTkxJTkVfTE9PUAorX1RwIGlubmVyX3Byb2R1Y3QoX0lucHV0SXRlcmF0b3IxIF9fZmlyc3QxLCBfSW5wdXRJdGVyYXRvcjEgX19sYXN0MSwKKyAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXJhdG9yMiBfX2ZpcnN0MiwgX1RwIF9Jbml0KSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0MSwgX19sYXN0MSkpCisgIGZvciAoIDsgX19maXJzdDEgIT0gX19sYXN0MTsgKytfX2ZpcnN0MSwgKytfX2ZpcnN0MikKKyAgICBfSW5pdCA9IF9Jbml0ICsgKCpfX2ZpcnN0MSAqICpfX2ZpcnN0Mik7CisgIHJldHVybiBfSW5pdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yMSwgY2xhc3MgX0lucHV0SXRlcmF0b3IyLCBjbGFzcyBfVHAsCisgICAgICAgICAgY2xhc3MgX0JpbmFyeU9wZXJhdGlvbjEsIGNsYXNzIF9CaW5hcnlPcGVyYXRpb24yPgorX1NUTFBfSU5MSU5FX0xPT1AKK19UcCBpbm5lcl9wcm9kdWN0KF9JbnB1dEl0ZXJhdG9yMSBfX2ZpcnN0MSwgX0lucHV0SXRlcmF0b3IxIF9fbGFzdDEsCisgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyYXRvcjIgX19maXJzdDIsIF9UcCBfSW5pdCwKKyAgICAgICAgICAgICAgICAgIF9CaW5hcnlPcGVyYXRpb24xIF9fYmluYXJ5X29wMSwKKyAgICAgICAgICAgICAgICAgIF9CaW5hcnlPcGVyYXRpb24yIF9fYmluYXJ5X29wMikgeworICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdDEsIF9fbGFzdDEpKQorICBmb3IgKCA7IF9fZmlyc3QxICE9IF9fbGFzdDE7ICsrX19maXJzdDEsICsrX19maXJzdDIpCisgICAgX0luaXQgPSBfX2JpbmFyeV9vcDEoX0luaXQsIF9fYmluYXJ5X29wMigqX19maXJzdDEsICpfX2ZpcnN0MikpOworICByZXR1cm4gX0luaXQ7Cit9CisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yLCBjbGFzcyBfT3V0cHV0SXRlcmF0b3IsIGNsYXNzIF9UcCwKKyAgICAgICAgICBjbGFzcyBfQmluYXJ5T3BlcmF0aW9uPgorX091dHB1dEl0ZXJhdG9yCitfX3BhcnRpYWxfc3VtKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LCBfVHAqLCBfQmluYXJ5T3BlcmF0aW9uIF9fYmluYXJ5X29wKTsKKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvciwgY2xhc3MgX091dHB1dEl0ZXJhdG9yPgoraW5saW5lIF9PdXRwdXRJdGVyYXRvcgorcGFydGlhbF9zdW0oX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0KSB7CisgIHJldHVybiBfU1RMUF9QUklWIF9fcGFydGlhbF9zdW0oX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdCwgX1NUTFBfVkFMVUVfVFlQRShfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfX3BsdXMoX1NUTFBfVkFMVUVfVFlQRShfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvcikpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yLCBjbGFzcyBfT3V0cHV0SXRlcmF0b3IsIGNsYXNzIF9CaW5hcnlPcGVyYXRpb24+CitpbmxpbmUgX091dHB1dEl0ZXJhdG9yCitwYXJ0aWFsX3N1bShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsIF9CaW5hcnlPcGVyYXRpb24gX19iaW5hcnlfb3ApIHsKKyAgcmV0dXJuIF9TVExQX1BSSVYgX19wYXJ0aWFsX3N1bShfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0LCBfU1RMUF9WQUxVRV9UWVBFKF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2JpbmFyeV9vcCk7Cit9CisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yLCBjbGFzcyBfT3V0cHV0SXRlcmF0b3IsIGNsYXNzIF9UcCwKKyAgICAgICAgICBjbGFzcyBfQmluYXJ5T3BlcmF0aW9uPgorX091dHB1dEl0ZXJhdG9yCitfX2FkamFjZW50X2RpZmZlcmVuY2UoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwgX1RwKiwKKyAgICAgICAgICAgICAgICAgICAgICBfQmluYXJ5T3BlcmF0aW9uIF9fYmluYXJ5X29wKTsKKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvciwgY2xhc3MgX091dHB1dEl0ZXJhdG9yPgoraW5saW5lIF9PdXRwdXRJdGVyYXRvcgorYWRqYWNlbnRfZGlmZmVyZW5jZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyYXRvciBfX2xhc3QsIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCkgeworICByZXR1cm4gX1NUTFBfUFJJViBfX2FkamFjZW50X2RpZmZlcmVuY2UoX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1ZBTFVFX1RZUEUoX19maXJzdCwgX0lucHV0SXRlcmF0b3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfX21pbnVzKF9TVExQX1ZBTFVFX1RZUEUoX19maXJzdCwgX0lucHV0SXRlcmF0b3IpKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvciwgY2xhc3MgX091dHB1dEl0ZXJhdG9yLCBjbGFzcyBfQmluYXJ5T3BlcmF0aW9uPgorX091dHB1dEl0ZXJhdG9yCithZGphY2VudF9kaWZmZXJlbmNlKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LCBfQmluYXJ5T3BlcmF0aW9uIF9fYmluYXJ5X29wKSB7CisgIHJldHVybiBfU1RMUF9QUklWIF9fYWRqYWNlbnRfZGlmZmVyZW5jZShfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfVkFMVUVfVFlQRShfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2JpbmFyeV9vcCk7Cit9CisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0ludGVnZXIsIGNsYXNzIF9Nb25vaWRPcGVyYXRpb24+CitfVHAgX19wb3dlcihfVHAgX194LCBfSW50ZWdlciBfX24sIF9Nb25vaWRPcGVyYXRpb24gX19vcHIpOworCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKQorCisvLyBSZXR1cm5zIF9feCAqKiBfX24sIHdoZXJlIF9fbiA+PSAwLiAgX05vdGUgdGhhdCAibXVsdGlwbGljYXRpb24iCisvLyBpcyByZXF1aXJlZCB0byBiZSBhc3NvY2lhdGl2ZSwgYnV0IG5vdCBuZWNlc3NhcmlseSBjb21tdXRhdGl2ZS4KKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfSW50ZWdlcj4KK2lubGluZSBfVHAgX19wb3dlcihfVHAgX194LCBfSW50ZWdlciBfX24pIHsKKyAgcmV0dXJuIF9fcG93ZXIoX194LCBfX24sIG11bHRpcGxpZXM8X1RwPigpKTsKK30KKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKKy8vIEFsaWFzIGZvciB0aGUgaW50ZXJuYWwgbmFtZSBfX3Bvd2VyLiAgTm90ZSB0aGF0IHBvd2VyIGlzIGFuIGV4dGVuc2lvbiwKKy8vIG5vdCBwYXJ0IG9mIHRoZSBDKysgc3RhbmRhcmQuCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfSW50ZWdlciwgY2xhc3MgX01vbm9pZE9wZXJhdGlvbj4KK2lubGluZSBfVHAgcG93ZXIoX1RwIF9feCwgX0ludGVnZXIgX19uLCBfTW9ub2lkT3BlcmF0aW9uIF9fb3ByKSB7CisgIHJldHVybiBfU1RMUF9QUklWIF9fcG93ZXIoX194LCBfX24sIF9fb3ByKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0ludGVnZXI+CitpbmxpbmUgX1RwIHBvd2VyKF9UcCBfX3gsIF9JbnRlZ2VyIF9fbikgeworICByZXR1cm4gX1NUTFBfUFJJViBfX3Bvd2VyKF9feCwgX19uLCBtdWx0aXBsaWVzPF9UcD4oKSk7Cit9CisKKy8vIGlvdGEgaXMgbm90IHBhcnQgb2YgdGhlIEMrKyBzdGFuZGFyZC4gIEl0IGlzIGFuIGV4dGVuc2lvbi4KKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3IsIGNsYXNzIF9UcD4KK19TVExQX0lOTElORV9MT09QCit2b2lkIGlvdGEoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwgX1RwIF9fdmFsKSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QpCisgICAgKl9fZmlyc3QrKyA9IF9fdmFsKys7Cit9CisjZW5kaWYKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjaWYgIWRlZmluZWQgKF9TVExQX0xJTktfVElNRV9JTlNUQU5USUFUSU9OKQorIyAgaW5jbHVkZSA8c3RsL19udW1lcmljLmM+CisjZW5kaWYKKworI2VuZGlmIC8qIF9TVExQX0lOVEVSTkFMX05VTUVSSUNfSCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RsL19udW1wdW5jdC5oIGIvc3RsL19udW1wdW5jdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNGQ5NzkKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvX251bXB1bmN0LmgKQEAgLTAsMCArMSwxODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisvLyBXQVJOSU5HOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBDKysKKy8vIHN0YW5kYXJkIGxpYnJhcnkgaGVhZGVycy4gIFlvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gdXNlIHRoaXMgaGVhZGVyCisvLyBmaWxlIGRpcmVjdGx5LgorCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfTlVNUFVOQ1RfSAorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9OVU1QVU5DVF9ICisKKyNpZm5kZWYgX1NUTFBfSU9TX0JBU0VfSAorIyBpbmNsdWRlIDxzdGwvX2lvc19iYXNlLmg+CisjZW5kaWYKKworIyBpZm5kZWYgX1NUTFBfQ19MT0NBTEVfSAorIyAgaW5jbHVkZSA8c3RsL2NfbG9jYWxlLmg+CisjIGVuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfU1RSSU5HX0gKKyMgaW5jbHVkZSA8c3RsL19zdHJpbmcuaD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBudW1wdW5jdCBmYWNldHMKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4gY2xhc3MgbnVtcHVuY3Qge307Cit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPiBjbGFzcyBudW1wdW5jdF9ieW5hbWUge307Cit0ZW1wbGF0ZSA8Y2xhc3MgX0NoLCBjbGFzcyBfSW5JdD4gY2xhc3MgbnVtX2dldDsKKworX1NUTFBfVEVNUExBVEVfTlVMTAorY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgbnVtcHVuY3Q8Y2hhcj4gOiBwdWJsaWMgbG9jYWxlOjpmYWNldAoreworICBmcmllbmQgY2xhc3MgX0xvY2FsZV9pbXBsOworCisjaWZuZGVmIF9TVExQX05PX0ZSSUVORF9URU1QTEFURVMKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaCwgY2xhc3MgX0luSXQ+IGZyaWVuZCBjbGFzcyBudW1fZ2V0OworI2VuZGlmCitwdWJsaWM6CisgIHR5cGVkZWYgY2hhciAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKKyAgdHlwZWRlZiBzdHJpbmcgICAgICAgICAgICAgc3RyaW5nX3R5cGU7CisKKyAgZXhwbGljaXQgbnVtcHVuY3Qoc2l6ZV90IF9fcmVmcyA9IDApCisgICAgOiBsb2NhbGU6OmZhY2V0KF9fcmVmcyksIF9NX3RydWVuYW1lKCJ0cnVlIiksIF9NX2ZhbHNlbmFtZSgiZmFsc2UiKSB7fQorCisgIGNoYXIgZGVjaW1hbF9wb2ludCgpIGNvbnN0IHsgcmV0dXJuIGRvX2RlY2ltYWxfcG9pbnQoKTsgfQorICBjaGFyIHRob3VzYW5kc19zZXAoKSBjb25zdCB7IHJldHVybiBkb190aG91c2FuZHNfc2VwKCk7IH0KKyAgc3RyaW5nIGdyb3VwaW5nKCkgY29uc3QgeyByZXR1cm4gZG9fZ3JvdXBpbmcoKTsgfQorICBzdHJpbmcgdHJ1ZW5hbWUoKSBjb25zdCB7IHJldHVybiBkb190cnVlbmFtZSgpOyB9CisgIHN0cmluZyBmYWxzZW5hbWUoKSBjb25zdCB7IHJldHVybiBkb19mYWxzZW5hbWUoKTsgfQorCisgIHN0YXRpYyBfU1RMUF9TVEFUSUNfTUVNQkVSX0RFQ0xTUEVDIGxvY2FsZTo6aWQgaWQ7CisKKyNpZm5kZWYgX1NUTFBfTk9fRlJJRU5EX1RFTVBMQVRFUworcHJvdGVjdGVkOgorI2VuZGlmCisgIH5udW1wdW5jdCgpOworCisgIHN0cmluZyAgX01fdHJ1ZW5hbWU7CisgIHN0cmluZyAgX01fZmFsc2VuYW1lOworICBzdHJpbmcgIF9NX2dyb3VwaW5nOworCisgIHZpcnR1YWwgY2hhciBkb19kZWNpbWFsX3BvaW50KCkgY29uc3Q7CisgIHZpcnR1YWwgY2hhciBkb190aG91c2FuZHNfc2VwKCkgY29uc3Q7CisgIHZpcnR1YWwgc3RyaW5nIGRvX2dyb3VwaW5nKCkgY29uc3Q7CisgIHZpcnR1YWwgc3RyaW5nIGRvX3RydWVuYW1lKCkgY29uc3Q7CisgIHZpcnR1YWwgc3RyaW5nIGRvX2ZhbHNlbmFtZSgpICBjb25zdDsKK307CisKKyMgaWYgISBkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQorCitfU1RMUF9URU1QTEFURV9OVUxMCitjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBudW1wdW5jdDx3Y2hhcl90PiA6IHB1YmxpYyBsb2NhbGU6OmZhY2V0Cit7CisgIGZyaWVuZCBjbGFzcyBfTG9jYWxlX2ltcGw7CitwdWJsaWM6CisgIHR5cGVkZWYgd2NoYXJfdCAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKKyAgdHlwZWRlZiB3c3RyaW5nICAgICAgICAgICAgICAgc3RyaW5nX3R5cGU7CisKKyAgZXhwbGljaXQgbnVtcHVuY3Qoc2l6ZV90IF9fcmVmcyA9IDApCisgICAgOiBsb2NhbGU6OmZhY2V0KF9fcmVmcyksIF9NX3RydWVuYW1lKEwidHJ1ZSIpLCBfTV9mYWxzZW5hbWUoTCJmYWxzZSIpIHt9CisKKyAgd2NoYXJfdCBkZWNpbWFsX3BvaW50KCkgY29uc3QgeyByZXR1cm4gZG9fZGVjaW1hbF9wb2ludCgpOyB9CisgIHdjaGFyX3QgdGhvdXNhbmRzX3NlcCgpIGNvbnN0IHsgcmV0dXJuIGRvX3Rob3VzYW5kc19zZXAoKTsgfQorICBzdHJpbmcgZ3JvdXBpbmcoKSBjb25zdCB7IHJldHVybiBkb19ncm91cGluZygpOyB9CisgIHdzdHJpbmcgdHJ1ZW5hbWUoKSBjb25zdCB7IHJldHVybiBkb190cnVlbmFtZSgpOyB9CisgIHdzdHJpbmcgZmFsc2VuYW1lKCkgY29uc3QgeyByZXR1cm4gZG9fZmFsc2VuYW1lKCk7IH0KKworICBzdGF0aWMgX1NUTFBfU1RBVElDX01FTUJFUl9ERUNMU1BFQyBsb2NhbGU6OmlkIGlkOworCitwcm90ZWN0ZWQ6CisgIHdzdHJpbmcgX01fdHJ1ZW5hbWU7CisgIHdzdHJpbmcgX01fZmFsc2VuYW1lOworICBzdHJpbmcgX01fZ3JvdXBpbmc7CisKKyAgfm51bXB1bmN0KCk7CisKKyAgdmlydHVhbCB3Y2hhcl90IGRvX2RlY2ltYWxfcG9pbnQoKSBjb25zdDsKKyAgdmlydHVhbCB3Y2hhcl90IGRvX3Rob3VzYW5kc19zZXAoKSBjb25zdDsKKyAgdmlydHVhbCBzdHJpbmcgZG9fZ3JvdXBpbmcoKSBjb25zdDsKKyAgdmlydHVhbCB3c3RyaW5nIGRvX3RydWVuYW1lKCkgY29uc3Q7CisgIHZpcnR1YWwgd3N0cmluZyBkb19mYWxzZW5hbWUoKSAgY29uc3Q7Cit9OworCisjIGVuZGlmIC8qIFdDSEFSX1QgKi8KKworX1NUTFBfVEVNUExBVEVfTlVMTAorY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgbnVtcHVuY3RfYnluYW1lPGNoYXI+IDogcHVibGljIG51bXB1bmN0PGNoYXI+IHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBjaGFyICAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKKyAgdHlwZWRlZiBzdHJpbmcgICAgICAgICAgICAgIHN0cmluZ190eXBlOworCisgIGV4cGxpY2l0IG51bXB1bmN0X2J5bmFtZShjb25zdCBjaGFyKiBfX25hbWUsIHNpemVfdCBfX3JlZnMgPSAwLCBfTG9jYWxlX25hbWVfaGludCogX19oaW50ID0gMCk7CisKK3Byb3RlY3RlZDoKKworICB+bnVtcHVuY3RfYnluYW1lKCk7CisKKyAgdmlydHVhbCBjaGFyICAgZG9fZGVjaW1hbF9wb2ludCgpIGNvbnN0OworICB2aXJ0dWFsIGNoYXIgICBkb190aG91c2FuZHNfc2VwKCkgY29uc3Q7CisgIHZpcnR1YWwgc3RyaW5nIGRvX2dyb3VwaW5nKCkgICAgICBjb25zdDsKKworcHJpdmF0ZToKKyAgX0xvY2FsZV9udW1lcmljKiBfTV9udW1lcmljOworCisgIC8vZXhwbGljaXRlbHkgZGVmaW5lZCBhcyBwcml2YXRlIHRvIGF2b2lkIHdhcm5pbmdzOgorICB0eXBlZGVmIG51bXB1bmN0X2J5bmFtZTxjaGFyPiBfU2VsZjsKKyAgbnVtcHVuY3RfYnluYW1lKF9TZWxmIGNvbnN0Jik7CisgIF9TZWxmJiBvcGVyYXRvciA9IChfU2VsZiBjb25zdCYpOworICBmcmllbmQgX0xvY2FsZV9uYW1lX2hpbnQqIF9Mb2NhbGVfZXh0cmFjdF9oaW50KG51bXB1bmN0X2J5bmFtZTxjaGFyPiopOworfTsKKworIyBpZm5kZWYgX1NUTFBfTk9fV0NIQVJfVAorX1NUTFBfVEVNUExBVEVfTlVMTAorY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgbnVtcHVuY3RfYnluYW1lPHdjaGFyX3Q+OiBwdWJsaWMgbnVtcHVuY3Q8d2NoYXJfdD4geworcHVibGljOgorICB0eXBlZGVmIHdjaGFyX3QgICAgICAgICAgICAgICBjaGFyX3R5cGU7CisgIHR5cGVkZWYgd3N0cmluZyAgICAgICAgICAgICAgIHN0cmluZ190eXBlOworCisgIGV4cGxpY2l0IG51bXB1bmN0X2J5bmFtZShjb25zdCBjaGFyKiBfX25hbWUsIHNpemVfdCBfX3JlZnMgPSAwLCBfTG9jYWxlX25hbWVfaGludCogX19oaW50ID0gMCk7CisKK3Byb3RlY3RlZDoKKworICB+bnVtcHVuY3RfYnluYW1lKCk7CisKKyAgdmlydHVhbCB3Y2hhcl90ICAgZG9fZGVjaW1hbF9wb2ludCgpIGNvbnN0OworICB2aXJ0dWFsIHdjaGFyX3QgICBkb190aG91c2FuZHNfc2VwKCkgY29uc3Q7CisgIHZpcnR1YWwgc3RyaW5nIGRvX2dyb3VwaW5nKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgIF9Mb2NhbGVfbnVtZXJpYyogX01fbnVtZXJpYzsKKworICAvL2V4cGxpY2l0ZWx5IGRlZmluZWQgYXMgcHJpdmF0ZSB0byBhdm9pZCB3YXJuaW5nczoKKyAgdHlwZWRlZiBudW1wdW5jdF9ieW5hbWU8d2NoYXJfdD4gX1NlbGY7CisgIG51bXB1bmN0X2J5bmFtZShfU2VsZiBjb25zdCYpOworICBfU2VsZiYgb3BlcmF0b3IgPSAoX1NlbGYgY29uc3QmKTsKK307CisKKyMgZW5kaWYgLyogV0NIQVJfVCAqLworCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNlbmRpZiAvKiBfU1RMUF9OVU1QVU5DVF9IICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CisKZGlmZiAtLWdpdCBhL3N0bC9fb3N0cmVhbS5jIGIvc3RsL19vc3RyZWFtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJhZjRhYgotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9fb3N0cmVhbS5jCkBAIC0wLDAgKzEsNDQ2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworI2lmbmRlZiBfU1RMUF9PU1RSRUFNX0MKKyNkZWZpbmUgX1NUTFBfT1NUUkVBTV9DCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfT1NUUkVBTV9ICisjICBpbmNsdWRlIDxzdGwvX29zdHJlYW0uaD4KKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKF9TVExQX0lOVEVSTkFMX05VTV9QVVRfSCkKKyMgIGluY2x1ZGUgPHN0bC9fbnVtX3B1dC5oPiAgICAgICAgICAgIC8vIEZvciBiYXNpY19zdHJlYW1idWYgYW5kIGl0ZXJhdG9ycworI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERlZmluaXRpb25zIG9mIG5vbi1pbmxpbmUgbWVtYmVyIGZ1bmN0aW9ucy4KKworLy8gQ29uc3RydWN0b3IsIGRlc3RydWN0b3IKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6YmFzaWNfb3N0cmVhbShiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19idWYpCisgICAgOiBiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPigpIHsKKyAgdGhpcy0+aW5pdChfX2J1Zik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46On5iYXNpY19vc3RyZWFtKCkKK3t9CisKKy8vIE91dHB1dCBkaXJlY3RseSBmcm9tIGEgc3RyZWFtYnVmLgordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6b3BlcmF0b3I8PChiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19mcm9tKSB7CisgIHNlbnRyeSBfX3NlbnRyeSgqdGhpcyk7CisgIGlmIChfX3NlbnRyeSkgeworICAgIGlmIChfX2Zyb20pIHsKKyAgICAgIGJvb2wgX19hbnlfaW5zZXJ0ZWQgPSBfX2Zyb20tPmdwdHIoKSAhPSBfX2Zyb20tPmVncHRyKCkKKyAgICAgICAgPyB0aGlzLT5fTV9jb3B5X2J1ZmZlcmVkKF9fZnJvbSwgdGhpcy0+cmRidWYoKSkKKyAgICAgICAgOiB0aGlzLT5fTV9jb3B5X3VuYnVmZmVyZWQoX19mcm9tLCB0aGlzLT5yZGJ1ZigpKTsKKyAgICAgIGlmICghX19hbnlfaW5zZXJ0ZWQpCisgICAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKKyAgICB9CisgICAgZWxzZQorICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CisgIH0KKworICByZXR1cm4gKnRoaXM7Cit9CisKKy8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIHRoZSBzdHJlYW1idWYgdmVyc2lvbiBvZiBvcGVyYXRvcjw8LiAgVGhlCisvLyBleGNlcHRpb24taGFuZGxpbmcgY29kZSBpcyBjb21wbGljYXRlZCBiZWNhdXNlIGV4Y2VwdGlvbnMgdGhyb3duCisvLyB3aGlsZSBleHRyYWN0aW5nIGNoYXJhY3RlcnMgYXJlIHRyZWF0ZWQgZGlmZmVyZW50bHkgdGhhbiBleGNlcHRpb25zCisvLyB0aHJvd24gd2hpbGUgaW5zZXJ0aW5nIGNoYXJhY3RlcnMuCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Citib29sIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPgorICA6Ol9NX2NvcHlfYnVmZmVyZWQoYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fZnJvbSwKKyAgICAgICAgICAgICAgICAgICAgIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX3RvKSB7CisgIGJvb2wgX19hbnlfaW5zZXJ0ZWQgPSBmYWxzZTsKKworICB3aGlsZSAoX19mcm9tLT5lZ3B0cigpICE9IF9fZnJvbS0+Z3B0cigpKSB7CisgICAgY29uc3QgcHRyZGlmZl90IF9fYXZhaWwgPSBfX2Zyb20tPmVncHRyKCkgLSBfX2Zyb20tPmdwdHIoKTsKKworICAgIHN0cmVhbXNpemUgX19ud3JpdHRlbjsKKyAgICBfU1RMUF9UUlkgeworICAgICAgX19ud3JpdHRlbiA9IF9fdG8tPnNwdXRuKF9fZnJvbS0+Z3B0cigpLCBfX2F2YWlsKTsKKyAgICAgIF9fZnJvbS0+Z2J1bXAoKGludClfX253cml0dGVuKTsKKyAgICB9CisgICAgX1NUTFBfQ0FUQ0hfQUxMIHsKKyAgICAgIHRoaXMtPl9NX2hhbmRsZV9leGNlcHRpb24oaW9zX2Jhc2U6OmJhZGJpdCk7CisgICAgICByZXR1cm4gX19hbnlfaW5zZXJ0ZWQ7CisgICAgfQorCisgICAgaWYgKF9fbndyaXR0ZW4gPT0gX19hdmFpbCkgeworICAgICAgX1NUTFBfVFJZIHsKKyAgICAgICAgaWYgKHRoaXMtPl9TX2VvZihfX2Zyb20tPnNnZXRjKCkpKQorICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBlbHNlCisgICAgICAgICAgX19hbnlfaW5zZXJ0ZWQgPSB0cnVlOworICAgICAgfQorICAgICAgX1NUTFBfQ0FUQ0hfQUxMIHsKKyAgICAgICAgdGhpcy0+X01faGFuZGxlX2V4Y2VwdGlvbihpb3NfYmFzZTo6ZmFpbGJpdCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoX19ud3JpdHRlbiAhPSAwKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgZWxzZQorICAgICAgcmV0dXJuIF9fYW55X2luc2VydGVkOworICB9CisKKyAgLy8gTm8gY2hhcmFjdGVycyBhcmUgaW4gdGhlIGJ1ZmZlciwgYnV0IHdlIGFyZW4ndCBhdCBFT0YuICBTd2l0Y2ggdG8KKyAgLy8gdW5idWZmZXJlZCBtb2RlLgorICByZXR1cm4gX19hbnlfaW5zZXJ0ZWQgfHwgdGhpcy0+X01fY29weV91bmJ1ZmZlcmVkKF9fZnJvbSwgX190byk7Cit9CisKKy8qCisgKiBIZWxwZXIgc3RydWN0IChndWFyZCkgdG8gcHV0IGJhY2sgYSBjaGFyYWN0ZXIgaW4gYSBzdHJlYW1idWYKKyAqIHdoZW5ldmVyIGFuIGV4Y2VwdGlvbiBvciBhbiBlb2Ygb2NjdXIuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitzdHJ1Y3QgX1NQdXRCYWNrQyB7CisgIHR5cGVkZWYgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4gX1N0cmVhbUJ1ZjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfU3RyZWFtQnVmOjppbnRfdHlwZSBpbnRfdHlwZTsKKyAgX1NQdXRCYWNrQyhfU3RyZWFtQnVmICpwZnJvbSkKKyAgICA6IF9fcGZyb20ocGZyb20pLCBfX2MoMCksIF9fZG9fZ3VhcmQoZmFsc2UpIHt9CisgIH5fU1B1dEJhY2tDKCkgeworICAgIGlmIChfX2RvX2d1YXJkKSB7CisgICAgICBfX3Bmcm9tLT5zcHV0YmFja2MoX1RyYWl0czo6dG9fY2hhcl90eXBlKF9fYykpOworICAgIH0KKyAgfQorCisgIHZvaWQgZ3VhcmQoaW50X3R5cGUgYykgeworICAgIF9fYyA9IGM7CisgICAgX19kb19ndWFyZCA9IHRydWU7CisgIH0KKyAgdm9pZCByZWxlYXNlKCkgeworICAgIF9fZG9fZ3VhcmQgPSBmYWxzZTsKKyAgfQorCitwcml2YXRlOgorICBfU3RyZWFtQnVmICpfX3Bmcm9tOworICBpbnRfdHlwZSBfX2M7CisgIGJvb2wgX19kb19ndWFyZDsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Citib29sIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPgorICA6Ol9NX2NvcHlfdW5idWZmZXJlZChiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19mcm9tLAorICAgICAgICAgICAgICAgICAgICAgICBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX190bykgeworICB0eXBlZGVmIF9TUHV0QmFja0M8X0NoYXJULCBfVHJhaXRzPiBfU1B1dEJhY2tDR3VhcmQ7CisgIGJvb2wgX19hbnlfaW5zZXJ0ZWQgPSBmYWxzZTsKKyAgaW50X3R5cGUgX19jOworCisgIF9TVExQX1RSWSB7CisgICAgX1NQdXRCYWNrQ0d1YXJkIF9fY2d1YXJkKF9fZnJvbSk7CisgICAgZm9yICg7OykgeworICAgICAgX1NUTFBfVFJZIHsKKyAgICAgICAgX19jID0gX19mcm9tLT5zYnVtcGMoKTsKKyAgICAgIH0KKyAgICAgIF9TVExQX0NBVENIX0FMTCB7CisgICAgICAgIHRoaXMtPl9NX2hhbmRsZV9leGNlcHRpb24oaW9zX2Jhc2U6OmZhaWxiaXQpOworICAgICAgICByZXR1cm4gX19hbnlfaW5zZXJ0ZWQ7CisgICAgICB9CisKKyAgICAgIGlmICggdGhpcy0+X1NfZW9mKF9fYykgKQorICAgICAgICByZXR1cm4gX19hbnlfaW5zZXJ0ZWQ7CisKKyAgICAgIF9fY2d1YXJkLmd1YXJkKF9fYyk7CisgICAgICBpZiAoIHRoaXMtPl9TX2VvZiggX190by0+c3B1dGMoX1RyYWl0czo6dG9fY2hhcl90eXBlKF9fYykpICkgKSB7CisgICAgICAgIHJldHVybiBfX2FueV9pbnNlcnRlZDsKKyAgICAgIH0KKworICAgICAgX19jZ3VhcmQucmVsZWFzZSgpOworICAgICAgX19hbnlfaW5zZXJ0ZWQgPSB0cnVlOworICAgIH0KKyAgfQorICBfU1RMUF9DQVRDSF9BTEwgeworICAgIHRoaXMtPl9NX2hhbmRsZV9leGNlcHRpb24oaW9zX2Jhc2U6OmJhZGJpdCk7CisgICAgcmV0dXJuIF9fYW55X2luc2VydGVkOworICB9Cit9CisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKworLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBudW1lcmljIG91dHB1dC4KK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9OdW1iZXI+CitiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mICBfU1RMUF9DQUxMCitfX3B1dF9udW0oYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLCBfTnVtYmVyIF9feCkgeworICB0eXBlZGVmIHR5cGVuYW1lIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6c2VudHJ5IF9TZW50cnk7CisgIF9TZW50cnkgX19zZW50cnkoX19vcyk7CisgIGJvb2wgX19mYWlsZWQgPSB0cnVlOworCisgIGlmIChfX3NlbnRyeSkgeworICAgIF9TVExQX1RSWSB7CisgICAgICB0eXBlZGVmIG51bV9wdXQ8X0NoYXJULCBvc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVCwgX1RyYWl0cz4gPiBfTnVtUHV0OworICAgICAgX19mYWlsZWQgPSAodXNlX2ZhY2V0PF9OdW1QdXQ+KF9fb3MuZ2V0bG9jKCkpKS5wdXQob3N0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQsIF9UcmFpdHM+KF9fb3MucmRidWYoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX29zLCBfX29zLmZpbGwoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9feCkuZmFpbGVkKCk7CisgICAgfQorICAgIF9TVExQX0NBVENIX0FMTCB7CisgICAgICBfX29zLl9NX2hhbmRsZV9leGNlcHRpb24oaW9zX2Jhc2U6OmJhZGJpdCk7CisgICAgfQorICB9CisgIGlmIChfX2ZhaWxlZCkKKyAgICBfX29zLnNldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOworICByZXR1cm4gX19vczsKK30KKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKKy8qCisgKiBJbiB0aGUgZm9sbG93aW5nIG9wZXJhdG9ycyB3ZSB0cnkgdG8gbGltaXQgY29kZSBibG9hdCBieSBsaW1pdGluZyB0aGUKKyAqIG51bWJlciBvZiBfX3B1dF9udW0gaW5zdGFuY2lhdGlvbnMuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6b3BlcmF0b3I8PChzaG9ydCBfX3gpIHsKKyAgX1NUTFBfU1RBVElDX0FTU0VSVCggc2l6ZW9mKHNob3J0KSA8PSBzaXplb2YobG9uZykgKQorICBsb25nIF9fdG1wID0gKCh0aGlzLT5mbGFncygpICYgX0Jhc2ljX2lvczo6YmFzZWZpZWxkKSAhPSBpb3NfYmFzZTo6ZGVjKSA/CisgICAgICAgICAgICAgICAgICBfX1NUQVRJQ19DQVNUKGxvbmcsIF9fU1RBVElDX0NBU1QodW5zaWduZWQgc2hvcnQsIF9feCkpOiBfX3g7CisgIHJldHVybiBfU1RMUF9QUklWIF9fcHV0X251bSgqdGhpcywgX190bXApOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Om9wZXJhdG9yPDwodW5zaWduZWQgc2hvcnQgX194KSB7CisgIF9TVExQX1NUQVRJQ19BU1NFUlQoIHNpemVvZih1bnNpZ25lZCBzaG9ydCkgPD0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICkKKyAgcmV0dXJuIF9TVExQX1BSSVYgX19wdXRfbnVtKCp0aGlzLCBfX1NUQVRJQ19DQVNUKHVuc2lnbmVkIGxvbmcsX194KSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6b3BlcmF0b3I8PChpbnQgX194KSB7CisgIF9TVExQX1NUQVRJQ19BU1NFUlQoIHNpemVvZihpbnQpIDw9IHNpemVvZihsb25nKSApCisgIGxvbmcgX190bXAgPSAoKHRoaXMtPmZsYWdzKCkgJiBfQmFzaWNfaW9zOjpiYXNlZmllbGQpICE9IGlvc19iYXNlOjpkZWMpID8KKyAgICAgICAgICAgICAgICAgIF9fU1RBVElDX0NBU1QobG9uZywgX19TVEFUSUNfQ0FTVCh1bnNpZ25lZCBpbnQsIF9feCkpOiBfX3g7CisgIHJldHVybiBfU1RMUF9QUklWIF9fcHV0X251bSgqdGhpcywgX190bXApOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorI2lmIGRlZmluZWQgKF9XSU42NCkgfHwgIWRlZmluZWQgKF9TVExQX01TVkMpIHx8IChfU1RMUF9NU1ZDIDwgMTMwMCkKK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpvcGVyYXRvcjw8KHVuc2lnbmVkIGludCBfX3gpIHsKKyAgX1NUTFBfU1RBVElDX0FTU0VSVCggc2l6ZW9mKHVuc2lnbmVkIGludCkgPD0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICkKKyNlbHNlCisvKiBXZSBkZWZpbmUgdGhpcyBvcGVyYXRvciB3aXRoIHNpemVfdCByYXRoZXIgdGhhbiB1bnNpZ25lZCBpbnQgdG8gYXZvaWQKKyAqIDY0IGJpdHMgd2FybmluZy4KKyAqLworYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Om9wZXJhdG9yPDwoc2l6ZV90IF9feCkgeworICBfU1RMUF9TVEFUSUNfQVNTRVJUKCBzaXplb2Yoc2l6ZV90KSA8PSBzaXplb2YodW5zaWduZWQgbG9uZykgKQorI2VuZGlmCisgIHJldHVybiBfU1RMUF9QUklWIF9fcHV0X251bSgqdGhpcywgIF9fU1RBVElDX0NBU1QodW5zaWduZWQgbG9uZyxfX3gpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpvcGVyYXRvcjw8KGxvbmcgX194KQoreyByZXR1cm4gX1NUTFBfUFJJViBfX3B1dF9udW0oKnRoaXMsICBfX3gpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6b3BlcmF0b3I8PCh1bnNpZ25lZCBsb25nIF9feCkKK3sgcmV0dXJuIF9TVExQX1BSSVYgX19wdXRfbnVtKCp0aGlzLCAgX194KTsgfQorCisjaWZkZWYgX1NUTFBfTE9OR19MT05HCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Om9wZXJhdG9yPDwgKF9TVExQX0xPTkdfTE9ORyBfX3gpCit7IHJldHVybiBfU1RMUF9QUklWIF9fcHV0X251bSgqdGhpcywgIF9feCk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpvcGVyYXRvcjw8ICh1bnNpZ25lZCBfU1RMUF9MT05HX0xPTkcgX194KQoreyByZXR1cm4gX1NUTFBfUFJJViBfX3B1dF9udW0oKnRoaXMsICBfX3gpOyB9CisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpvcGVyYXRvcjw8KGZsb2F0IF9feCkKK3sgcmV0dXJuIF9TVExQX1BSSVYgX19wdXRfbnVtKCp0aGlzLCAgX19TVEFUSUNfQ0FTVChkb3VibGUsX194KSk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpvcGVyYXRvcjw8KGRvdWJsZSBfX3gpCit7IHJldHVybiBfU1RMUF9QUklWIF9fcHV0X251bSgqdGhpcywgIF9feCk7IH0KKworI2lmbmRlZiBfU1RMUF9OT19MT05HX0RPVUJMRQordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpvcGVyYXRvcjw8KGxvbmcgZG91YmxlIF9feCkKK3sgcmV0dXJuIF9TVExQX1BSSVYgX19wdXRfbnVtKCp0aGlzLCAgX194KTsgfQorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6b3BlcmF0b3I8PChjb25zdCB2b2lkKiBfX3gpCit7IHJldHVybiBfU1RMUF9QUklWIF9fcHV0X251bSgqdGhpcywgIF9feCk7IH0KKworI2lmbmRlZiBfU1RMUF9OT19CT09MCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Om9wZXJhdG9yPDwoYm9vbCBfX3gpCit7IHJldHVybiBfU1RMUF9QUklWIF9fcHV0X251bSgqdGhpcywgIF9feCk7IH0KKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgordm9pZCBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Ol9NX3B1dF9jaGFyKF9DaGFyVCBfX2MpIHsKKyAgc2VudHJ5IF9fc2VudHJ5KCp0aGlzKTsKKyAgaWYgKF9fc2VudHJ5KSB7CisgICAgYm9vbCBfX2ZhaWxlZCA9IHRydWU7CisgICAgX1NUTFBfVFJZIHsKKyAgICAgIHN0cmVhbXNpemUgX19ucGFkID0gdGhpcy0+d2lkdGgoKSA+IDAgPyB0aGlzLT53aWR0aCgpIC0gMSA6IDA7CisgICAgICAvLyAgICAgIGlmIChfX25wYWQgPD0gMSkKKyAgICAgIGlmIChfX25wYWQgPT0gMCkKKyAgICAgICAgX19mYWlsZWQgPSB0aGlzLT5fU19lb2YodGhpcy0+cmRidWYoKS0+c3B1dGMoX19jKSk7CisgICAgICBlbHNlIGlmICgodGhpcy0+ZmxhZ3MoKSAmIGlvc19iYXNlOjphZGp1c3RmaWVsZCkgPT0gaW9zX2Jhc2U6OmxlZnQpIHsKKyAgICAgICAgX19mYWlsZWQgPSB0aGlzLT5fU19lb2YodGhpcy0+cmRidWYoKS0+c3B1dGMoX19jKSk7CisgICAgICAgIF9fZmFpbGVkID0gX19mYWlsZWQgfHwKKyAgICAgICAgICAgICAgICAgICB0aGlzLT5yZGJ1ZigpLT5fTV9zcHV0bmModGhpcy0+ZmlsbCgpLCBfX25wYWQpICE9IF9fbnBhZDsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBfX2ZhaWxlZCA9IHRoaXMtPnJkYnVmKCktPl9NX3NwdXRuYyh0aGlzLT5maWxsKCksIF9fbnBhZCkgIT0gX19ucGFkOworICAgICAgICBfX2ZhaWxlZCA9IF9fZmFpbGVkIHx8IHRoaXMtPl9TX2VvZih0aGlzLT5yZGJ1ZigpLT5zcHV0YyhfX2MpKTsKKyAgICAgIH0KKworICAgICAgdGhpcy0+d2lkdGgoMCk7CisgICAgfQorICAgIF9TVExQX0NBVENIX0FMTCB7CisgICAgICB0aGlzLT5fTV9oYW5kbGVfZXhjZXB0aW9uKGlvc19iYXNlOjpiYWRiaXQpOworICAgIH0KKworICAgIGlmIChfX2ZhaWxlZCkKKyAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOworICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Cit2b2lkIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6X01fcHV0X25vd2lkZW4oY29uc3QgX0NoYXJUKiBfX3MpIHsKKyAgc2VudHJ5IF9fc2VudHJ5KCp0aGlzKTsKKyAgaWYgKF9fc2VudHJ5KSB7CisgICAgYm9vbCBfX2ZhaWxlZCA9IHRydWU7CisgICAgc3RyZWFtc2l6ZSBfX24gPSBfVHJhaXRzOjpsZW5ndGgoX19zKTsKKyAgICBzdHJlYW1zaXplIF9fbnBhZCA9IHRoaXMtPndpZHRoKCkgPiBfX24gPyB0aGlzLT53aWR0aCgpIC0gX19uIDogMDsKKworICAgIF9TVExQX1RSWSB7CisgICAgICBpZiAoX19ucGFkID09IDApCisgICAgICAgIF9fZmFpbGVkID0gdGhpcy0+cmRidWYoKS0+c3B1dG4oX19zLCBfX24pICE9IF9fbjsKKyAgICAgIGVsc2UgaWYgKCh0aGlzLT5mbGFncygpICYgaW9zX2Jhc2U6OmFkanVzdGZpZWxkKSA9PSBpb3NfYmFzZTo6bGVmdCkgeworICAgICAgICBfX2ZhaWxlZCA9IHRoaXMtPnJkYnVmKCktPnNwdXRuKF9fcywgX19uKSAhPSBfX247CisgICAgICAgIF9fZmFpbGVkID0gX19mYWlsZWQgfHwKKyAgICAgICAgICAgICAgICAgICB0aGlzLT5yZGJ1ZigpLT5fTV9zcHV0bmModGhpcy0+ZmlsbCgpLCBfX25wYWQpICE9IF9fbnBhZDsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBfX2ZhaWxlZCA9IHRoaXMtPnJkYnVmKCktPl9NX3NwdXRuYyh0aGlzLT5maWxsKCksIF9fbnBhZCkgIT0gX19ucGFkOworICAgICAgICBfX2ZhaWxlZCA9IF9fZmFpbGVkIHx8IHRoaXMtPnJkYnVmKCktPnNwdXRuKF9fcywgX19uKSAhPSBfX247CisgICAgICB9CisKKyAgICAgIHRoaXMtPndpZHRoKDApOworICAgIH0KKyAgICBfU1RMUF9DQVRDSF9BTEwgeworICAgICAgdGhpcy0+X01faGFuZGxlX2V4Y2VwdGlvbihpb3NfYmFzZTo6YmFkYml0KTsKKyAgICB9CisKKyAgICBpZiAoX19mYWlsZWQpCisgICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7CisgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK3ZvaWQgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpfTV9wdXRfd2lkZW4oY29uc3QgY2hhciogX19zKSB7CisgIHNlbnRyeSBfX3NlbnRyeSgqdGhpcyk7CisgIGlmIChfX3NlbnRyeSkgeworICAgIGJvb2wgX19mYWlsZWQgPSB0cnVlOworICAgIHN0cmVhbXNpemUgX19uID0gY2hhcl90cmFpdHM8Y2hhcj46Omxlbmd0aChfX3MpOworICAgIHN0cmVhbXNpemUgX19ucGFkID0gdGhpcy0+d2lkdGgoKSA+IF9fbiA/IHRoaXMtPndpZHRoKCkgLSBfX24gOiAwOworCisgICAgX1NUTFBfVFJZIHsKKyAgICAgIGlmIChfX25wYWQgPT0gMCkKKyAgICAgICAgX19mYWlsZWQgPSAhdGhpcy0+X01fcHV0X3dpZGVuX2F1eChfX3MsIF9fbik7CisgICAgICBlbHNlIGlmICgodGhpcy0+ZmxhZ3MoKSAmIGlvc19iYXNlOjphZGp1c3RmaWVsZCkgPT0gaW9zX2Jhc2U6OmxlZnQpIHsKKyAgICAgICAgX19mYWlsZWQgPSAhdGhpcy0+X01fcHV0X3dpZGVuX2F1eChfX3MsIF9fbik7CisgICAgICAgIF9fZmFpbGVkID0gX19mYWlsZWQgfHwKKyAgICAgICAgICAgICAgICAgICB0aGlzLT5yZGJ1ZigpLT5fTV9zcHV0bmModGhpcy0+ZmlsbCgpLCBfX25wYWQpICE9IF9fbnBhZDsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBfX2ZhaWxlZCA9IHRoaXMtPnJkYnVmKCktPl9NX3NwdXRuYyh0aGlzLT5maWxsKCksIF9fbnBhZCkgIT0gX19ucGFkOworICAgICAgICBfX2ZhaWxlZCA9IF9fZmFpbGVkIHx8ICF0aGlzLT5fTV9wdXRfd2lkZW5fYXV4KF9fcywgX19uKTsKKyAgICAgIH0KKworICAgICAgdGhpcy0+d2lkdGgoMCk7CisgICAgfQorICAgIF9TVExQX0NBVENIX0FMTCB7CisgICAgICB0aGlzLT5fTV9oYW5kbGVfZXhjZXB0aW9uKGlvc19iYXNlOjpiYWRiaXQpOworICAgIH0KKworICAgIGlmIChfX2ZhaWxlZCkKKyAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKKyAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYm9vbCBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Ol9NX3B1dF93aWRlbl9hdXgoY29uc3QgY2hhciogX19zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtc2l6ZSBfX24pIHsKKyAgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fYnVmID0gdGhpcy0+cmRidWYoKTsKKworICBmb3IgKCA7IF9fbiA+IDAgOyAtLV9fbikKKyAgICBpZiAodGhpcy0+X1NfZW9mKF9fYnVmLT5zcHV0Yyh0aGlzLT53aWRlbigqX19zKyspKSkpCisgICAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCisvLyBVbmZvcm1hdHRlZCBvdXRwdXQgb2YgYSBzaW5nbGUgY2hhcmFjdGVyLgordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6cHV0KGNoYXJfdHlwZSBfX2MpIHsKKyAgc2VudHJ5IF9fc2VudHJ5KCp0aGlzKTsKKyAgYm9vbCBfX2ZhaWxlZCA9IHRydWU7CisKKyAgaWYgKF9fc2VudHJ5KSB7CisgICAgX1NUTFBfVFJZIHsKKyAgICAgIF9fZmFpbGVkID0gdGhpcy0+X1NfZW9mKHRoaXMtPnJkYnVmKCktPnNwdXRjKF9fYykpOworICAgIH0KKyAgICBfU1RMUF9DQVRDSF9BTEwgeworICAgICAgdGhpcy0+X01faGFuZGxlX2V4Y2VwdGlvbihpb3NfYmFzZTo6YmFkYml0KTsKKyAgICB9CisgIH0KKworICBpZiAoX19mYWlsZWQpCisgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CisKKyAgcmV0dXJuICp0aGlzOworfQorCisvLyBVbmZvcm1hdHRlZCBvdXRwdXQgb2YgYSBzaW5nbGUgY2hhcmFjdGVyLgordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6d3JpdGUoY29uc3QgY2hhcl90eXBlKiBfX3MsIHN0cmVhbXNpemUgX19uKSB7CisgIHNlbnRyeSBfX3NlbnRyeSgqdGhpcyk7CisgIGJvb2wgX19mYWlsZWQgPSB0cnVlOworCisgIGlmIChfX3NlbnRyeSkgeworICAgIF9TVExQX1RSWSB7CisgICAgICBfX2ZhaWxlZCA9IHRoaXMtPnJkYnVmKCktPnNwdXRuKF9fcywgX19uKSAhPSBfX247CisgICAgfQorICAgIF9TVExQX0NBVENIX0FMTCB7CisgICAgICB0aGlzLT5fTV9oYW5kbGVfZXhjZXB0aW9uKGlvc19iYXNlOjpiYWRiaXQpOworICAgIH0KKyAgfQorCisgIGlmIChfX2ZhaWxlZCkKKyAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKKworICByZXR1cm4gKnRoaXM7Cit9CisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2VuZGlmIC8qIF9TVExQX09TVFJFQU1fQyAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RsL19vc3RyZWFtLmggYi9zdGwvX29zdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTRjMzY0Ci0tLSAvZGV2L251bGwKKysrIGIvc3RsL19vc3RyZWFtLmgKQEAgLTAsMCArMSwzODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9PU1RSRUFNX0gKKyNkZWZpbmUgX1NUTFBfSU5URVJOQUxfT1NUUkVBTV9ICisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfSU9TX0gKKyMgIGluY2x1ZGUgPHN0bC9faW9zLmg+ICAgICAgICAgICAgICAgICAgLy8gRm9yIGJhc2ljX2lvczw+LiAgSW5jbHVkZXMgPGlvc2Z3ZD4uCisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9PU1RSRUFNQlVGX0lURVJBVE9SX0gKKyMgIGluY2x1ZGUgPHN0bC9fb3N0cmVhbWJ1Zl9pdGVyYXRvci5oPgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fVU5DQVVHSFRfRVhDRVBUX1NVUFBPUlQpICYmICFkZWZpbmVkIChfU1RMUF9JTlRFUk5BTF9FWENFUFRJT04pCisjICBpbmNsdWRlIDxzdGwvX2V4Y2VwdGlvbi5oPgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCkKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitjbGFzcyBfT3NlbnRyeTsKKyNlbmRpZgorCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Citib29sIF9faW5pdF9ib3N0cihiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fc3RyKTsKKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY2xhc3MgYmFzaWNfb3N0cmVhbTw+CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitjbGFzcyBiYXNpY19vc3RyZWFtIDogdmlydHVhbCBwdWJsaWMgYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz4geworICB0eXBlZGVmIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiBfU2VsZjsKKworI2lmIGRlZmluZWQgKF9TVExQX01TVkMpICYmIChfU1RMUF9NU1ZDID49IDEzMDAgJiYgX1NUTFBfTVNWQyA8PSAxMzEwKQorICAvL2V4cGxpY2l0ZWx5IGRlZmluZWQgYXMgcHJpdmF0ZSB0byBhdm9pZCB3YXJuaW5nczoKKyAgYmFzaWNfb3N0cmVhbShfU2VsZiBjb25zdCYpOworICBfU2VsZiYgb3BlcmF0b3IgPSAoX1NlbGYgY29uc3QmKTsKKyNlbmRpZgorCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR5cGVzCisgIHR5cGVkZWYgX0NoYXJUICAgICAgICAgICAgICAgICAgICAgY2hhcl90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OmludF90eXBlIGludF90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OnBvc190eXBlIHBvc190eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6Om9mZl90eXBlIG9mZl90eXBlOworICB0eXBlZGVmIF9UcmFpdHMgICAgICAgICAgICAgICAgICAgIHRyYWl0c190eXBlOworICB0eXBlZGVmIGJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+IF9CYXNpY19pb3M7CisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IuCisgIGV4cGxpY2l0IGJhc2ljX29zdHJlYW0oYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fYnVmKTsKKyAgfmJhc2ljX29zdHJlYW0oKTsKKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIb29rcyBmb3IgbWFuaXB1bGF0b3JzLgorICB0eXBlZGVmIGJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+JiAoX1NUTFBfQ0FMTCAqX19pb3NfZm4pKGJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+Jik7CisgIHR5cGVkZWYgaW9zX2Jhc2UmIChfU1RMUF9DQUxMICpfX2lvc19iYXNlX2ZuKShpb3NfYmFzZSYpOworICB0eXBlZGVmIF9TZWxmJiAoX1NUTFBfQ0FMTCAqX19vc3RyZWFtX2ZuKShfU2VsZiYpOworICBfU2VsZiYgb3BlcmF0b3I8PCAoX19vc3RyZWFtX2ZuIF9fZikgeyByZXR1cm4gX19mKCp0aGlzKTsgfQorICBfU2VsZiAmIG9wZXJhdG9yPDwgKF9faW9zX2Jhc2VfZm4gX19mKSB7IF9fZigqdGhpcyk7IHJldHVybiAqdGhpczsgfQorICBfU2VsZiYgb3BlcmF0b3I8PCAoX19pb3NfZm4gX19mZikgeyBfX2ZmKCp0aGlzKTsgcmV0dXJuICp0aGlzOyB9CisKK3ByaXZhdGU6CisgIGJvb2wgX01fY29weV9idWZmZXJlZChiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19mcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fdG8pOworICBib29sIF9NX2NvcHlfdW5idWZmZXJlZChiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19mcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX190byk7CisKK3B1YmxpYzoKKyAgdm9pZCBfTV9wdXRfY2hhcihfQ2hhclQgX19jKTsKKworICB2b2lkIF9NX3B1dF9ub3dpZGVuKGNvbnN0IF9DaGFyVCogX19zKTsKKyAgdm9pZCBfTV9wdXRfd2lkZW4oY29uc3QgY2hhciogX19zKTsKKyAgYm9vbCBfTV9wdXRfd2lkZW5fYXV4KGNvbnN0IGNoYXIqIF9fcywgc3RyZWFtc2l6ZSBfX24pOworCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVuZm9ybWF0dGVkIG91dHB1dC4KKyAgX1NlbGYmIHB1dChjaGFyX3R5cGUgX19jKTsKKyAgX1NlbGYmIHdyaXRlKGNvbnN0IGNoYXJfdHlwZSogX19zLCBzdHJlYW1zaXplIF9fbik7CisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9ybWF0dGVkIG91dHB1dC4KKyAgLy8gRm9ybWF0dGVkIG91dHB1dCBmcm9tIGEgc3RyZWFtYnVmLgorICBfU2VsZiYgb3BlcmF0b3I8PChiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19idWYpOworIyBpZm5kZWYgX1NUTFBfTk9fRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSCisgIC8vIHRoaXMgaXMgbmVlZGVkIGZvciBjb21waWxpbmcgd2l0aCBvcHRpb24gY2hhciA9IHVuc2lnbmVkCisgIF9TZWxmJiBvcGVyYXRvcjw8KHVuc2lnbmVkIGNoYXIgX194KSB7IF9NX3B1dF9jaGFyKF9feCk7IHJldHVybiAqdGhpczsgfQorIyBlbmRpZgorICBfU2VsZiYgb3BlcmF0b3I8PChzaG9ydCBfX3gpOworICBfU2VsZiYgb3BlcmF0b3I8PCh1bnNpZ25lZCBzaG9ydCBfX3gpOworICBfU2VsZiYgb3BlcmF0b3I8PChpbnQgX194KTsKKyNpZiBkZWZpbmVkIChfV0lONjQpIHx8ICFkZWZpbmVkIChfU1RMUF9NU1ZDKSB8fCAoX1NUTFBfTVNWQyA8IDEzMDApCisgIF9TZWxmJiBvcGVyYXRvcjw8KHVuc2lnbmVkIGludCBfX3gpOworI2Vsc2UKKy8qIFdlIGRlZmluZSB0aGlzIG9wZXJhdG9yIHdpdGggc2l6ZV90IHJhdGhlciB0aGFuIHVuc2lnbmVkIGludCB0byBhdm9pZAorICogNjQgYml0cyB3YXJuaW5nLgorICovCisgIF9TZWxmJiBvcGVyYXRvcjw8KHNpemVfdCBfX3gpOworI2VuZGlmCisgIF9TZWxmJiBvcGVyYXRvcjw8KGxvbmcgX194KTsKKyAgX1NlbGYmIG9wZXJhdG9yPDwodW5zaWduZWQgbG9uZyBfX3gpOworI2lmZGVmIF9TVExQX0xPTkdfTE9ORworICBfU2VsZiYgb3BlcmF0b3I8PCAoX1NUTFBfTE9OR19MT05HIF9feCk7CisgIF9TZWxmJiBvcGVyYXRvcjw8ICh1bnNpZ25lZCBfU1RMUF9MT05HX0xPTkcgX194KTsKKyNlbmRpZgorICBfU2VsZiYgb3BlcmF0b3I8PChmbG9hdCBfX3gpOworICBfU2VsZiYgb3BlcmF0b3I8PChkb3VibGUgX194KTsKKyMgaWZuZGVmIF9TVExQX05PX0xPTkdfRE9VQkxFCisgIF9TZWxmJiBvcGVyYXRvcjw8KGxvbmcgZG91YmxlIF9feCk7CisjIGVuZGlmCisgIF9TZWxmJiBvcGVyYXRvcjw8KGNvbnN0IHZvaWQqIF9feCk7CisjIGlmbmRlZiBfU1RMUF9OT19CT09MCisgIF9TZWxmJiBvcGVyYXRvcjw8KGJvb2wgX194KTsKKyMgZW5kaWYKKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCdWZmZXIgcG9zaXRpb25pbmcgYW5kIG1hbmlwdWxhdGlvbi4KKyAgX1NlbGYmIGZsdXNoKCkgeworICAgIGlmICh0aGlzLT5yZGJ1ZigpKQorICAgICAgaWYgKHRoaXMtPnJkYnVmKCktPnB1YnN5bmMoKSA9PSAtMSkKKyAgICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgcG9zX3R5cGUgdGVsbHAoKSB7CisgICAgcmV0dXJuIHRoaXMtPnJkYnVmKCkgJiYgIXRoaXMtPmZhaWwoKQorICAgICAgPyB0aGlzLT5yZGJ1ZigpLT5wdWJzZWVrb2ZmKDAsIGlvc19iYXNlOjpjdXIsIGlvc19iYXNlOjpvdXQpCisgICAgICA6IHBvc190eXBlKC0xKTsKKyAgfQorCisgIF9TZWxmJiBzZWVrcChwb3NfdHlwZSBfX3BvcykgeworICAgIGlmICh0aGlzLT5yZGJ1ZigpICYmICF0aGlzLT5mYWlsKCkpIHsKKyAgICAgIGlmICh0aGlzLT5yZGJ1ZigpLT5wdWJzZWVrcG9zKF9fcG9zKSA9PSBwb3NfdHlwZSgtMSkpIHsKKyAgICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBfU2VsZiYgc2Vla3Aob2ZmX3R5cGUgX19vZmYsIGlvc19iYXNlOjpzZWVrZGlyIF9fZGlyKSB7CisgICAgaWYgKHRoaXMtPnJkYnVmKCkgJiYgIXRoaXMtPmZhaWwoKSkKKyAgICAgIHRoaXMtPnJkYnVmKCktPnB1YnNlZWtvZmYoX19vZmYsIF9fZGlyKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9URU1QTEFURV9FWFBPUlQpCisgIC8vIElmIHdlIGFyZSB1c2luZyBETEwgc3BlY3MsIHdlIGhhdmUgbm90IHRvIHVzZSBpbm5lciBjbGFzc2VzCisgIC8vIGVuZCBjbGFzcyBkZWNsYXJhdGlvbiBoZXJlCisgIHR5cGVkZWYgX09zZW50cnk8X0NoYXJULCBfVHJhaXRzPiAgc2VudHJ5OworfTsKKyMgIGRlZmluZSBzZW50cnkgX09zZW50cnkKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KKyAgY2xhc3MgX09zZW50cnkgeworICAgIHR5cGVkZWYgX09zZW50cnk8X0NoYXJULCBfVHJhaXRzPiBfU2VsZjsKKyNlbHNlCisgICAgY2xhc3Mgc2VudHJ5IHsKKyAgICAgIHR5cGVkZWYgc2VudHJ5IF9TZWxmOworI2VuZGlmCisgICAgcHJpdmF0ZToKKyAgICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX01fc3RyOworICAgICAgLy8gICAgICBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX01fYnVmOworICAgICAgYm9vbCBfTV9vazsKKyAgICBwdWJsaWM6CisgICAgICBleHBsaWNpdCBzZW50cnkoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX3N0cikKKyAgICAgICAgOiBfTV9zdHIoX19zdHIpLCAvKiBfTV9idWYoX19zdHIucmRidWYoKSksICovIF9NX29rKF9TVExQX1BSSVYgX19pbml0X2Jvc3RyKF9fc3RyKSkKKyAgICAgIHt9CisKKyAgICAgIH5zZW50cnkoKSB7CisgICAgICAgIGlmIChfTV9zdHIuZmxhZ3MoKSAmIGlvc19iYXNlOjp1bml0YnVmKQorI2lmICFkZWZpbmVkIChfU1RMUF9OT19VTkNBVUdIVF9FWENFUFRfU1VQUE9SVCkKKyAgICAgICAgICBpZiAoIXVuY2F1Z2h0X2V4Y2VwdGlvbigpKQorI2VuZGlmCisgICAgICAgICAgICBfTV9zdHIuZmx1c2goKTsKKyAgICAgIH0KKworICAgICAgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIF9NX29rOyB9CisgICAgcHJpdmF0ZTogICAgICAgICAgICAgICAgICAgICAgICAvLyBEaXNhYmxlIGFzc2lnbm1lbnQgYW5kIGNvcHkgY29uc3RydWN0b3IuCisgICAgICAvL0ltcGxlbWVudGF0aW9uIGlzIGhlcmUgb25seSB0byBhdm9pZCB3YXJuaW5nIHdpdGggc29tZSBjb21waWxlcnMuCisgICAgICBzZW50cnkoY29uc3QgX1NlbGYmIF9fcykgOiBfTV9zdHIoX19zLl9NX3N0cikge30KKyAgICAgIF9TZWxmJiBvcGVyYXRvcj0oY29uc3QgX1NlbGYmKSB7IHJldHVybiAqdGhpczsgfQorICAgIH07CisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCkKKyMgIHVuZGVmIHNlbnRyeQorI2Vsc2UKKyAgLy8gY2xvc2UgYmFzaWNfb3N0cmVhbSBjbGFzcyBkZWZpbml0aW9uIGhlcmUKK307CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9URU1QTEFURV9FWFBPUlQpCitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgYmFzaWNfb3N0cmVhbTxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+OworX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIF9Pc2VudHJ5PGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID47CisjICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBiYXNpY19vc3RyZWFtPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID47CitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgX09zZW50cnk8d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPjsKKyMgIGVuZGlmCisjZW5kaWYgLyogX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCAqLworCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKKy8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIGlzdHJlYW08Pjo6c2VudHJ5IGNvbnN0cnVjdG9yLgordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jvb2wgX19pbml0X2Jvc3RyKGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19zdHIpIHsKKyAgaWYgKF9fc3RyLmdvb2QoKSkgeworICAgIC8vIGJvcmlzIDogY2hlY2sgaWYgdGhpcyBpcyBuZWVkZWQgIQorICAgIGlmICghX19zdHIucmRidWYoKSkKKyAgICAgIF9fc3RyLnNldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOworICAgIGlmIChfX3N0ci50aWUoKSkKKyAgICAgIF9fc3RyLnRpZSgpLT5mbHVzaCgpOworICAgIHJldHVybiBfX3N0ci5nb29kKCk7CisgIH0KKyAgZWxzZQorICAgIHJldHVybiBmYWxzZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2lubGluZSBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX1NUTFBfQ0FMTAorX19nZXRfb3N0cmVhbWJ1ZihiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fU3QpCit7IHJldHVybiBfX1N0LnJkYnVmKCk7IH0KKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKKy8vIE5vbi1tZW1iZXIgZnVuY3Rpb25zLgordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2lubGluZSBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9TVExQX0NBTEwKK29wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLCBfQ2hhclQgX19jKXsKKyAgX19vcy5fTV9wdXRfY2hhcihfX2MpOworICByZXR1cm4gX19vczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2lubGluZSBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9TVExQX0NBTEwKK29wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLCBjb25zdCBfQ2hhclQqIF9fcykgeworICBfX29zLl9NX3B1dF9ub3dpZGVuKF9fcyk7CisgIHJldHVybiBfX29zOworfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfTk9fRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSKQorLy8gc29tZSBzcGVjaWFsaXphdGlvbnMKKworaW5saW5lIGJhc2ljX29zdHJlYW08Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiYgX1NUTFBfQ0FMTAorb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4mIF9fb3MsIGNoYXIgX19jKSB7CisgIF9fb3MuX01fcHV0X2NoYXIoX19jKTsKKyAgcmV0dXJuIF9fb3M7Cit9CisKK2lubGluZSBiYXNpY19vc3RyZWFtPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4mIF9TVExQX0NBTEwKK29wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+JiBfX29zLCBzaWduZWQgY2hhciBfX2MpIHsKKyAgX19vcy5fTV9wdXRfY2hhcihfX2MpOworICByZXR1cm4gX19vczsKK30KKworaW5saW5lIGJhc2ljX29zdHJlYW08Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiYgX1NUTFBfQ0FMTAorb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4mIF9fb3MsIHVuc2lnbmVkIGNoYXIgX19jKSB7CisgIF9fb3MuX01fcHV0X2NoYXIoX19jKTsKKyAgcmV0dXJuIF9fb3M7Cit9CisKK2lubGluZSBiYXNpY19vc3RyZWFtPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4mIF9TVExQX0NBTEwKK29wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+JiBfX29zLCBjb25zdCBjaGFyKiBfX3MpIHsKKyAgX19vcy5fTV9wdXRfbm93aWRlbihfX3MpOworICByZXR1cm4gX19vczsKK30KKworaW5saW5lIGJhc2ljX29zdHJlYW08Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiYgX1NUTFBfQ0FMTAorb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4mIF9fb3MsIGNvbnN0IHNpZ25lZCBjaGFyKiBfX3MpIHsKKyAgX19vcy5fTV9wdXRfbm93aWRlbihfX1JFSU5URVJQUkVUX0NBU1QoY29uc3QgY2hhciosX19zKSk7CisgIHJldHVybiBfX29zOworfQorCitpbmxpbmUgYmFzaWNfb3N0cmVhbTxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+Jgorb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4mIF9fb3MsIGNvbnN0IHVuc2lnbmVkIGNoYXIqIF9fcykgeworICBfX29zLl9NX3B1dF9ub3dpZGVuKF9fUkVJTlRFUlBSRVRfQ0FTVChjb25zdCBjaGFyKixfX3MpKTsKKyAgcmV0dXJuIF9fb3M7Cit9CisKKyNlbHNlCisKKy8vIGFsc28gZm9yIGNvbXBpbGVycyB3aG8gbWlnaHQgdXNlIHRoYXQKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitpbmxpbmUgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfU1RMUF9DQUxMCitvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywgY2hhciBfX2MpIHsKKyAgX19vcy5fTV9wdXRfY2hhcihfX29zLndpZGVuKF9fYykpOworICByZXR1cm4gX19vczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcmFpdHM+CitpbmxpbmUgYmFzaWNfb3N0cmVhbTxjaGFyLCBfVHJhaXRzPiYgX1NUTFBfQ0FMTAorb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPGNoYXIsIF9UcmFpdHM+JiBfX29zLCBjaGFyIF9fYykgeworICBfX29zLl9NX3B1dF9jaGFyKF9fYyk7CisgIHJldHVybiBfX29zOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RyYWl0cz4KK2lubGluZSBiYXNpY19vc3RyZWFtPGNoYXIsIF9UcmFpdHM+JiBfU1RMUF9DQUxMCitvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08Y2hhciwgX1RyYWl0cz4mIF9fb3MsIHNpZ25lZCBjaGFyIF9fYykgeworICBfX29zLl9NX3B1dF9jaGFyKF9fYyk7CisgIHJldHVybiBfX29zOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RyYWl0cz4KK2lubGluZSBiYXNpY19vc3RyZWFtPGNoYXIsIF9UcmFpdHM+JiBfU1RMUF9DQUxMCitvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08Y2hhciwgX1RyYWl0cz4mIF9fb3MsIHVuc2lnbmVkIGNoYXIgX19jKSB7CisgIF9fb3MuX01fcHV0X2NoYXIoX19jKTsKKyAgcmV0dXJuIF9fb3M7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitpbmxpbmUgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfU1RMUF9DQUxMCitvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywgY29uc3QgY2hhciogX19zKSB7CisgIF9fb3MuX01fcHV0X3dpZGVuKF9fcyk7CisgIHJldHVybiBfX29zOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RyYWl0cz4KK2lubGluZSBiYXNpY19vc3RyZWFtPGNoYXIsIF9UcmFpdHM+JiBfU1RMUF9DQUxMCitvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08Y2hhciwgX1RyYWl0cz4mIF9fb3MsIGNvbnN0IGNoYXIqIF9fcykgeworICBfX29zLl9NX3B1dF9ub3dpZGVuKF9fcyk7CisgIHJldHVybiBfX29zOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RyYWl0cz4KK2lubGluZSBiYXNpY19vc3RyZWFtPGNoYXIsIF9UcmFpdHM+JiBfU1RMUF9DQUxMCitvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08Y2hhciwgX1RyYWl0cz4mIF9fb3MsIGNvbnN0IHNpZ25lZCBjaGFyKiBfX3MpIHsKKyAgX19vcy5fTV9wdXRfbm93aWRlbihfX1JFSU5URVJQUkVUX0NBU1QoY29uc3QgY2hhciosX19zKSk7CisgIHJldHVybiBfX29zOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RyYWl0cz4KK2lubGluZSBiYXNpY19vc3RyZWFtPGNoYXIsIF9UcmFpdHM+Jgorb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPGNoYXIsIF9UcmFpdHM+JiBfX29zLCBjb25zdCB1bnNpZ25lZCBjaGFyKiBfX3MpIHsKKyAgX19vcy5fTV9wdXRfbm93aWRlbihfX1JFSU5URVJQUkVUX0NBU1QoY29uc3QgY2hhciosX19zKSk7CisgIHJldHVybiBfX29zOworfQorI2VuZGlmIC8qIF9TVExQX05PX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUiAqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGJhc2ljX29zdHJlYW0gbWFuaXB1bGF0b3JzLgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgoraW5saW5lIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX1NUTFBfQ0FMTAorZW5kbChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MpIHsKKyAgX19vcy5wdXQoX19vcy53aWRlbignXG4nKSk7CisgIF9fb3MuZmx1c2goKTsKKyAgcmV0dXJuIF9fb3M7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitpbmxpbmUgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfU1RMUF9DQUxMCitlbmRzKGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcykgeworICBfX29zLnB1dChfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKF9DaGFyVCkpOworICByZXR1cm4gX19vczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2lubGluZSBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9TVExQX0NBTEwKK2ZsdXNoKGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcykgeworICBfX29zLmZsdXNoKCk7CisgIHJldHVybiBfX29zOworfQorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNpZiBkZWZpbmVkIChfU1RMUF9FWFBPU0VfU1RSRUFNX0lNUExFTUVOVEFUSU9OKSAmJiAhZGVmaW5lZCAoX1NUTFBfTElOS19USU1FX0lOU1RBTlRJQVRJT04pCisjICBpbmNsdWRlIDxzdGwvX29zdHJlYW0uYz4KKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfT1NUUkVBTV9IICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvX29zdHJlYW1idWZfaXRlcmF0b3IuaCBiL3N0bC9fb3N0cmVhbWJ1Zl9pdGVyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4ODY1NDkKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvX29zdHJlYW1idWZfaXRlcmF0b3IuaApAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKy8vIFdBUk5JTkc6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIEMrKworLy8gc3RhbmRhcmQgbGlicmFyeSBoZWFkZXJzLiAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgdGhpcyBoZWFkZXIKKy8vIGZpbGUgZGlyZWN0bHkuCisKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9PU1RSRUFNQlVGX0lURVJBVE9SX0gKKyNkZWZpbmUgX1NUTFBfSU5URVJOQUxfT1NUUkVBTUJVRl9JVEVSQVRPUl9ICisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfU1RSRUFNQlVGCisjIGluY2x1ZGUgPHN0bC9fc3RyZWFtYnVmLmg+CisjZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorZXh0ZXJuIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfU1RMUF9DQUxMIF9fZ2V0X29zdHJlYW1idWYoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Jik7CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCisvLyBUaGUgZGVmYXVsdCB0ZW1wbGF0ZSBhcmd1bWVudCBpcyBkZWNsYXJlZCBpbiBpb3Nmd2QKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitjbGFzcyBvc3RyZWFtYnVmX2l0ZXJhdG9yIDoKKyAgcHVibGljIGl0ZXJhdG9yPG91dHB1dF9pdGVyYXRvcl90YWcsIHZvaWQsIHZvaWQsIHZvaWQsIHZvaWQ+IHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBfQ2hhclQgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX3R5cGU7CisgIHR5cGVkZWYgX1RyYWl0cyAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6aW50X3R5cGUgICAgICAgaW50X3R5cGU7CisgIHR5cGVkZWYgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4gc3RyZWFtYnVmX3R5cGU7CisgIHR5cGVkZWYgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICAgb3N0cmVhbV90eXBlOworCisgIHR5cGVkZWYgb3V0cHV0X2l0ZXJhdG9yX3RhZyAgICAgICAgICAgICAgaXRlcmF0b3JfY2F0ZWdvcnk7CisgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisKK3B1YmxpYzoKKyAgb3N0cmVhbWJ1Zl9pdGVyYXRvcihzdHJlYW1idWZfdHlwZSogX19idWYpIF9TVExQX05PVEhST1cgOiBfTV9idWYoX19idWYpLCBfTV9vayhfX2J1ZiE9MCkge30KKyAgLy8gIG9zdHJlYW1idWZfaXRlcmF0b3Iob3N0cmVhbV90eXBlJiBfX28pIF9TVExQX05PVEhST1cgOiBfTV9idWYoX19nZXRfb3N0cmVhbWJ1ZihfX28pKSwgX01fb2soX01fYnVmICE9IDApIHt9CisgIGlubGluZSBvc3RyZWFtYnVmX2l0ZXJhdG9yKG9zdHJlYW1fdHlwZSYgX19vKSBfU1RMUF9OT1RIUk9XOworCisgIG9zdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJULCBfVHJhaXRzPiYgb3BlcmF0b3I9KGNoYXJfdHlwZSBfX2MpIHsKKyAgICBfTV9vayA9IF9NX29rICYmICF0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX01fYnVmLT5zcHV0YyhfX2MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdHlwZTo6ZW9mKCkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIG9zdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJULCBfVHJhaXRzPiYgb3BlcmF0b3IqKCkgICAgIHsgcmV0dXJuICp0aGlzOyB9CisgIG9zdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJULCBfVHJhaXRzPiYgb3BlcmF0b3IrKygpICAgIHsgcmV0dXJuICp0aGlzOyB9CisgIG9zdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJULCBfVHJhaXRzPiYgb3BlcmF0b3IrKyhpbnQpIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgYm9vbCBmYWlsZWQoKSBjb25zdCB7IHJldHVybiAhX01fb2s7IH0KKworcHJpdmF0ZToKKyAgc3RyZWFtYnVmX3R5cGUqIF9NX2J1ZjsKKyAgYm9vbCBfTV9vazsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitpbmxpbmUgb3N0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQsIF9UcmFpdHM+Ojpvc3RyZWFtYnVmX2l0ZXJhdG9yKGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vKSBfU1RMUF9OT1RIUk9XCisgIDogX01fYnVmKF9TVExQX1BSSVYgX19nZXRfb3N0cmVhbWJ1ZihfX28pKSwgX01fb2soX01fYnVmICE9IDApIHt9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUKQorX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIG9zdHJlYW1idWZfaXRlcmF0b3I8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPjsKKyMgIGlmIGRlZmluZWQgKElOU1RBTlRJQVRFX1dJREVfU1RSRUFNUykKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBvc3RyZWFtYnVmX2l0ZXJhdG9yPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID47CisjICBlbmRpZgorI2VuZGlmIC8qIF9TVExQX1VTRV9URU1QTEFURV9FWFBPUlQgKi8KKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9PTERfSFBfSVRFUkFUT1JfUVVFUklFUykKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitpbmxpbmUgb3V0cHV0X2l0ZXJhdG9yX3RhZyBfU1RMUF9DQUxMCitpdGVyYXRvcl9jYXRlZ29yeShjb25zdCBvc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVCwgX1RyYWl0cz4mKSB7IHJldHVybiBvdXRwdXRfaXRlcmF0b3JfdGFnKCk7IH0KKyNlbmRpZgorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9PU1RSRUFNQlVGX0lURVJBVE9SX0ggKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKKwpkaWZmIC0tZ2l0IGEvc3RsL19wYWlyLmggYi9zdGwvX3BhaXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDMxZmUwCi0tLSAvZGV2L251bGwKKysrIGIvc3RsL19wYWlyLmgKQEAgLTAsMCArMSwxODEgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisKKy8qIE5PVEU6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIFNUTCBoZWFkZXJzLgorICogICBZb3Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4KKyAqLworCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX1BBSVJfSAorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9QQUlSX0gKKworI2lmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pCisjICBpbmNsdWRlIDxzdGwvdHlwZV90cmFpdHMuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX01PVkVfQ09OU1RSVUNUX0ZXS19ICisjICBpbmNsdWRlIDxzdGwvX21vdmVfY29uc3RydWN0X2Z3ay5oPgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+CitzdHJ1Y3QgcGFpciB7CisgIHR5cGVkZWYgX1QxIGZpcnN0X3R5cGU7CisgIHR5cGVkZWYgX1QyIHNlY29uZF90eXBlOworCisgIF9UMSBmaXJzdDsKKyAgX1QyIHNlY29uZDsKKyNpZiBkZWZpbmVkIChfU1RMUF9DT05TVF9DT05TVFJVQ1RPUl9CVUcpCisgIHBhaXIoKSB7fQorI2Vsc2UKKyAgcGFpcigpIDogZmlyc3QoX1QxKCkpLCBzZWNvbmQoX1QyKCkpIHt9CisjZW5kaWYKKyAgcGFpcihjb25zdCBfVDEmIF9fYSwgY29uc3QgX1QyJiBfX2IpIDogZmlyc3QoX19hKSwgc2Vjb25kKF9fYikge30KKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpICYmICEoZGVmaW5lZCAoX1NUTFBfTVNWQykgJiYgKF9TVExQX01TVkMgPCAxMjAwKSkKKyAgdGVtcGxhdGUgPGNsYXNzIF9VMSwgY2xhc3MgX1UyPgorICBwYWlyKGNvbnN0IHBhaXI8X1UxLCBfVTI+JiBfX3ApIDogZmlyc3QoX19wLmZpcnN0KSwgc2Vjb25kKF9fcC5zZWNvbmQpIHt9CisKKyAgcGFpcihjb25zdCBwYWlyPF9UMSxfVDI+JiBfX28pIDogZmlyc3QoX19vLmZpcnN0KSwgc2Vjb25kKF9fby5zZWNvbmQpIHt9CisjZW5kaWYKKworICBwYWlyKF9fbW92ZV9zb3VyY2U8cGFpcjxfVDEsIF9UMj4gPiBzcmMpIDogZmlyc3QoX1NUTFBfUFJJViBfQXNNb3ZlU291cmNlKHNyYy5nZXQoKS5maXJzdCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kKF9TVExQX1BSSVYgX0FzTW92ZVNvdXJjZShzcmMuZ2V0KCkuc2Vjb25kKSkKKyAge30KKworICBfX1RSSVZJQUxfREVTVFJVQ1RPUihwYWlyKQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgoraW5saW5lIGJvb2wgX1NUTFBfQ0FMTCBvcGVyYXRvcj09KGNvbnN0IHBhaXI8X1QxLCBfVDI+JiBfX3gsIGNvbnN0IHBhaXI8X1QxLCBfVDI+JiBfX3kpCit7IHJldHVybiBfX3guZmlyc3QgPT0gX195LmZpcnN0ICYmIF9feC5zZWNvbmQgPT0gX195LnNlY29uZDsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+CitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yPChjb25zdCBwYWlyPF9UMSwgX1QyPiYgX194LCBjb25zdCBwYWlyPF9UMSwgX1QyPiYgX195KSB7CisgIHJldHVybiBfX3guZmlyc3QgPCBfX3kuZmlyc3QgfHwKKyAgICAgICAgICghKF9feS5maXJzdCA8IF9feC5maXJzdCkgJiYgX194LnNlY29uZCA8IF9feS5zZWNvbmQpOworfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1NFUEFSQVRFX1JFTE9QU19OQU1FU1BBQ0UpCit0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+CitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yIT0oY29uc3QgcGFpcjxfVDEsIF9UMj4mIF9feCwgY29uc3QgcGFpcjxfVDEsIF9UMj4mIF9feSkKK3sgcmV0dXJuICEoX194ID09IF9feSk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgoraW5saW5lIGJvb2wgX1NUTFBfQ0FMTCBvcGVyYXRvcj4oY29uc3QgcGFpcjxfVDEsIF9UMj4mIF9feCwgY29uc3QgcGFpcjxfVDEsIF9UMj4mIF9feSkKK3sgcmV0dXJuIF9feSA8IF9feDsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+CitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yPD0oY29uc3QgcGFpcjxfVDEsIF9UMj4mIF9feCwgY29uc3QgcGFpcjxfVDEsIF9UMj4mIF9feSkKK3sgcmV0dXJuICEoX195IDwgX194KTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+CitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yPj0oY29uc3QgcGFpcjxfVDEsIF9UMj4mIF9feCwgY29uc3QgcGFpcjxfVDEsIF9UMj4mIF9feSkKK3sgcmV0dXJuICEoX194IDwgX195KTsgfQorI2VuZGlmIC8qIF9TVExQX1VTRV9TRVBBUkFURV9SRUxPUFNfTkFNRVNQQUNFICovCisKKyNpZiBkZWZpbmVkIChfU1RMUF9GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIpICYmICFkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKQordGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyLCBpbnQgX1N6PgoraW5saW5lIHBhaXI8X1QxLCBfVDIgY29uc3QqPiBtYWtlX3BhaXIoX1QxIGNvbnN0JiBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVDIgY29uc3QgKCZfX3kpW19Tel0pCit7IHJldHVybiBwYWlyPF9UMSwgX1QyIGNvbnN0Kj4oX194LCBzdGF0aWNfY2FzdDxfVDIgY29uc3QqPihfX3kpKTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDIsIGludCBfU3o+CitpbmxpbmUgcGFpcjxfVDEgY29uc3QqLCBfVDI+IG1ha2VfcGFpcihfVDEgY29uc3QgKCZfX3gpW19Tel0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVDIgY29uc3QmIF9feSkKK3sgcmV0dXJuIHBhaXI8X1QxIGNvbnN0KiwgX1QyPihzdGF0aWNfY2FzdDxfVDEgY29uc3QqPihfX3gpLCBfX3kpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMiwgaW50IF9TejEsIGludCBfU3oyPgoraW5saW5lIHBhaXI8X1QxIGNvbnN0KiwgX1QyIGNvbnN0Kj4gbWFrZV9wYWlyKF9UMSBjb25zdCAoJl9feClbX1N6MV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1QyIGNvbnN0ICgmX195KVtfU3oyXSkgeworICByZXR1cm4gcGFpcjxfVDEgY29uc3QqLCBfVDIgY29uc3QqPihzdGF0aWNfY2FzdDxfVDEgY29uc3QqPihfX3gpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxfVDIgY29uc3QqPihfX3kpKTsKK30KKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+CitpbmxpbmUgcGFpcjxfVDEsIF9UMj4gX1NUTFBfQ0FMTCBtYWtlX3BhaXIoX1QxIF9feCwgX1QyIF9feSkKK3sgcmV0dXJuIHBhaXI8X1QxLCBfVDI+KF9feCwgX195KTsgfQorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfTkFNRVNQQUNFUykgfHwgIWRlZmluZWQgKF9TVExQX1VTRV9TRVBBUkFURV9SRUxPUFNfTkFNRVNQQUNFKQorX1NUTFBfQkVHSU5fUkVMT1BTX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIGJvb2wgX1NUTFBfQ0FMTCBvcGVyYXRvciE9KGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkKK3sgcmV0dXJuICEoX194ID09IF9feSk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBib29sIF9TVExQX0NBTEwgb3BlcmF0b3I+KGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkKK3sgcmV0dXJuIF9feSA8IF9feDsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIGJvb2wgX1NUTFBfQ0FMTCBvcGVyYXRvcjw9KGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkKK3sgcmV0dXJuICEoX195IDwgX194KTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIGJvb2wgX1NUTFBfQ0FMTCAgb3BlcmF0b3I+PShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpCit7IHJldHVybiAhKF9feCA8IF9feSk7IH0KKworX1NUTFBfRU5EX1JFTE9QU19OQU1FU1BBQ0UKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+CitzdHJ1Y3QgX190eXBlX3RyYWl0czxwYWlyPF9UMSwgX1QyPiA+IHsKKyAgdHlwZWRlZiBfX3R5cGVfdHJhaXRzPF9UMT4gX1QxVHJhaXRzOworICB0eXBlZGVmIF9fdHlwZV90cmFpdHM8X1QyPiBfVDJUcmFpdHM7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0xhbmQyPHR5cGVuYW1lIF9UMVRyYWl0czo6aGFzX3RyaXZpYWxfZGVmYXVsdF9jb25zdHJ1Y3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX1QyVHJhaXRzOjpoYXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yPjo6X1JldCBoYXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yOworICB0eXBlZGVmIHR5cGVuYW1lIF9MYW5kMjx0eXBlbmFtZSBfVDFUcmFpdHM6Omhhc190cml2aWFsX2NvcHlfY29uc3RydWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9UMlRyYWl0czo6aGFzX3RyaXZpYWxfY29weV9jb25zdHJ1Y3Rvcj46Ol9SZXQgaGFzX3RyaXZpYWxfY29weV9jb25zdHJ1Y3RvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfTGFuZDI8dHlwZW5hbWUgX1QxVHJhaXRzOjpoYXNfdHJpdmlhbF9hc3NpZ25tZW50X29wZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfVDJUcmFpdHM6Omhhc190cml2aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3I+OjpfUmV0IGhhc190cml2aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3I7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0xhbmQyPHR5cGVuYW1lIF9UMVRyYWl0czo6aGFzX3RyaXZpYWxfZGVzdHJ1Y3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX1QyVHJhaXRzOjpoYXNfdHJpdmlhbF9kZXN0cnVjdG9yPjo6X1JldCBoYXNfdHJpdmlhbF9kZXN0cnVjdG9yOworICB0eXBlZGVmIF9fZmFsc2VfdHlwZSBpc19QT0RfdHlwZTsKKworI2lmIGRlZmluZWQgKF9fQk9STEFORENfXykgJiYgKF9fQk9STEFORENfXyA8IDB4NTYwKQorICAvLyBkaXNhYmxlIGluY29ycmVjdCAiZGVwZW5kZW50IHR5cGUgcXVhbGlmaWVyIiBlcnJvcgorICB0eXBlZGVmIF9fZmFsc2VfdHlwZSBpbXBsZW1lbnRlZDsKKyNlbmRpZgorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgorc3RydWN0IF9fbW92ZV90cmFpdHM8cGFpcjxfVDEsIF9UMj4gPgorICA6IF9TVExQX1BSSVYgX19tb3ZlX3RyYWl0c19oZWxwMTxfVDEsIF9UMj4ge307CisKK19TVExQX0VORF9OQU1FU1BBQ0UKKyNlbmRpZiAvKiBfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OICovCisKKyNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9QQUlSX0ggKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9fcHJvbG9nLmggYi9zdGwvX3Byb2xvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMjc2NTYKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvX3Byb2xvZy5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qIE5PVEUgOiB0aGlzIGhlYWRlciBoYXMgbm8gZ3VhcmRzIGFuZCBpcyBNRUFOVCBmb3IgbXVsdGlwbGUgaW5jbHVzaW9uIQorICogSWYgeW91IGFyZSB1c2luZyAiaGVhZGVyIHByb3RlY3Rpb24iIG9wdGlvbiB3aXRoIHlvdXIgY29tcGlsZXIsCisgKiBwbGVhc2UgYWxzbyBmaW5kICNwcmFnbWEgd2hpY2ggZGlzYWJsZXMgaXQgYW5kIHB1dCBpdCBoZXJlLCB0bworICogYWxsb3cgcmVlbnRyYW5jeSBvZiB0aGlzIGhlYWRlci4KKyAqLworCisjaWZkZWYgc3RkCisjICB1bmRlZiBzdGQgLyogV2UgdW5kZWYgInN0ZCIgb24gZW50cnkgLCBhcyBTVExwb3J0IGhlYWRlcnMgbWF5IGluY2x1ZGUgbmF0aXZlIG9uZXMuICovCisjZW5kaWYKKworI2lmZGVmIF9TVExQX1BST0xPR19IRUFERVJfSU5DTFVERUQKKyMgIGVycm9yIFNUbHBvcnQgcHJvbG9nIGhlYWRlciBjYW4gbm90IGJlIHJlaW5jbHVkZWQgYXMgbG9uZyBhcyBlcGlsb2cgaGFzIG5vdCBiZSBpbmNsdWRlZC4KKyNlbmRpZgorCisjZGVmaW5lIF9TVExQX1BST0xPR19IRUFERVJfSU5DTFVERUQKKworI2lmbmRlZiBfU1RMUF9GRUFUVVJFU19ICisjICBpbmNsdWRlIDxzdGwvY29uZmlnL2ZlYXR1cmVzLmg+CisjZW5kaWYKKworLyogSWYgdGhlIHBsYXRmb3JtIHByb3ZpZGVzIGFueSBzcGVjaWZpYyBwcm9sb2cgYWN0aW9ucywKKyAqIGxpa2UgI3ByYWdtYXMsIGRvIGluY2x1ZGUgcGxhdGZvcm0tc3BlY2lmaWMgcHJvbG9nIGZpbGUgKi8KKyNpZiBkZWZpbmVkIChfU1RMUF9IQVNfU1BFQ0lGSUNfUFJPTE9HX0VQSUxPRykKKyMgIGluY2x1ZGUgPHN0bC9jb25maWcvX3Byb2xvZy5oPgorI2VuZGlmCmRpZmYgLS1naXQgYS9zdGwvX3B0aHJlYWRfYWxsb2MuaCBiL3N0bC9fcHRocmVhZF9hbGxvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MjYxODUKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvX3B0aHJlYWRfYWxsb2MuaApAQCAtMCwwICsxLDQ3MiBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfUFRIUkVBRF9BTExPQ19ICisjZGVmaW5lIF9TVExQX1BUSFJFQURfQUxMT0NfSAorCisvKgorICogUHRocmVhZC1zcGVjaWZpYyBub2RlIGFsbG9jYXRvci4KKyAqIFRoaXMgaXMgc2ltaWxhciB0byB0aGUgZGVmYXVsdCBhbGxvY2F0b3IsIGV4Y2VwdCB0aGF0IGZyZWUtbGlzdAorICogaW5mb3JtYXRpb24gaXMga2VwdCBzZXBhcmF0ZWx5IGZvciBlYWNoIHRocmVhZCwgYXZvaWRpbmcgbG9ja2luZy4KKyAqIFRoaXMgc2hvdWxkIGJlIHJlYXNvbmFibHkgZmFzdCBldmVuIGluIHRoZSBwcmVzZW5jZSBvZiB0aHJlYWRzLgorICogVGhlIGRvd24gc2lkZSBpcyB0aGF0IHN0b3JhZ2UgbWF5IG5vdCBiZSB3ZWxsLXV0aWxpemVkLgorICogSXQgaXMgbm90IGFuIGVycm9yIHRvIGFsbG9jYXRlIG1lbW9yeSBpbiB0aHJlYWQgQSBhbmQgZGVhbGxvY2F0ZQorICogaXQgaW4gdGhyZWFkIEIuICBCdXQgdGhpcyBlZmZlY3RpdmVseSB0cmFuc2ZlcnMgb3duZXJzaGlwIG9mIHRoZSBtZW1vcnksCisgKiBzbyB0aGF0IGl0IGNhbiBvbmx5IGJlIHJlYWxsb2NhdGVkIGJ5IHRocmVhZCBCLiAgVGh1cyB0aGlzIGNhbiBlZmZlY3RpdmVseQorICogcmVzdWx0IGluIGEgc3RvcmFnZSBsZWFrIGlmIGl0J3MgZG9uZSBvbiBhIHJlZ3VsYXIgYmFzaXMuCisgKiBJdCBjYW4gYWxzbyByZXN1bHQgaW4gZnJlcXVlbnQgc2hhcmluZyBvZgorICogY2FjaGUgbGluZXMgYW1vbmcgcHJvY2Vzc29ycywgd2l0aCBwb3RlbnRpYWxseSBzZXJpb3VzIHBlcmZvcm1hbmNlCisgKiBjb25zZXF1ZW5jZXMuCisgKi8KKworI2lmICFkZWZpbmVkIChfU1RMUF9QVEhSRUFEUykKKyMgIGVycm9yIFBPU0lYIHNwZWNpZmljIGFsbG9jYXRvciBpbXBsZW1lbnRhdGlvbi4gWW91ciBzeXN0ZW0gZG8gbm90IHNlZW1zIHRvIFwKK2hhdmUgdGhpcyBpbnRlcmZhY2Ugc28gcGxlYXNlIGNvbW1lbnQgdGhlIF9TVExQX1VTRV9QRVJUSFJFQURfQUxMT0MgbWFjcm8gXAorb3IgcmVwb3J0IHRvIHRoZSBTVExwb3J0IGZvcnVtLgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfTk9fSU9TVFJFQU1TKQorIyAgZXJyb3IgWW91IGNhbm5vdCB1c2UgcGVyIHRocmVhZCBhbGxvY2F0b3IgaW1wbGVtZW50YXRpb24gd2l0aG91dCBidWlsZGluZyBcCitTVExwb3J0IGxpYnJhcmllcy4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0FMTE9DX0gKKyMgIGluY2x1ZGUgPHN0bC9fYWxsb2MuaD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCitzdHJ1Y3QgX1B0aHJlYWRfYWxsb2NfcGVyX3RocmVhZF9zdGF0ZTsKKworLy8gUHRocmVhZC1zcGVjaWZpYyBhbGxvY2F0b3IuCitjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBfUHRocmVhZF9hbGxvYyB7CitwdWJsaWM6IC8vIGJ1dCBvbmx5IGZvciBpbnRlcm5hbCB1c2U6CisgIHR5cGVkZWYgX1B0aHJlYWRfYWxsb2NfcGVyX3RocmVhZF9zdGF0ZSBfX3N0YXRlX3R5cGU7CisgIHR5cGVkZWYgY2hhciB2YWx1ZV90eXBlOworCitwdWJsaWM6CisgIC8vIFJldHVybiBhIHJlY3ljbGVkIG9yIG5ldyBwZXIgdGhyZWFkIHN0YXRlLgorICBzdGF0aWMgX19zdGF0ZV90eXBlICogX1NUTFBfQ0FMTCBfU19nZXRfcGVyX3RocmVhZF9zdGF0ZSgpOworCisgIC8qIG4gbXVzdCBiZSA+IDAgICAgICAqLworICBzdGF0aWMgdm9pZCAqIF9TVExQX0NBTEwgYWxsb2NhdGUoc2l6ZV90JiBfX24pOworCisgIC8qIHAgbWF5IG5vdCBiZSAwICovCisgIHN0YXRpYyB2b2lkIF9TVExQX0NBTEwgZGVhbGxvY2F0ZSh2b2lkICpfX3AsIHNpemVfdCBfX24pOworCisgIC8vIGJvcmlzIDogdmVyc2lvbnMgZm9yIHBlcl90aHJlYWRfYWxsb2NhdG9yCisgIC8qIG4gbXVzdCBiZSA+IDAgICAgICAqLworICBzdGF0aWMgdm9pZCAqIF9TVExQX0NBTEwgYWxsb2NhdGUoc2l6ZV90JiBfX24sIF9fc3RhdGVfdHlwZSogX19hKTsKKworICAvKiBwIG1heSBub3QgYmUgMCAqLworICBzdGF0aWMgdm9pZCBfU1RMUF9DQUxMIGRlYWxsb2NhdGUodm9pZCAqX19wLCBzaXplX3QgX19uLCBfX3N0YXRlX3R5cGUqIF9fYSk7CisKKyAgc3RhdGljIHZvaWQgKiBfU1RMUF9DQUxMIHJlYWxsb2NhdGUodm9pZCAqX19wLCBzaXplX3QgX19vbGRfc3osIHNpemVfdCYgX19uZXdfc3opOworfTsKKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK3R5cGVkZWYgX1NUTFBfUFJJViBfUHRocmVhZF9hbGxvYyBfX3B0aHJlYWRfYWxsb2M7Cit0eXBlZGVmIF9fcHRocmVhZF9hbGxvYyBwdGhyZWFkX2FsbG9jOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorY2xhc3MgcHRocmVhZF9hbGxvY2F0b3IgOiBwdWJsaWMgX19zdGxwb3J0X2NsYXNzPHB0aHJlYWRfYWxsb2NhdG9yPF9UcD4gPiB7CisgIHR5cGVkZWYgcHRocmVhZF9hbGxvYyBfU19BbGxvYzsgICAgICAgICAgLy8gVGhlIHVuZGVybHlpbmcgYWxsb2NhdG9yLgorcHVibGljOgorICB0eXBlZGVmIHNpemVfdCAgICAgc2l6ZV90eXBlOworICB0eXBlZGVmIHB0cmRpZmZfdCAgZGlmZmVyZW5jZV90eXBlOworICB0eXBlZGVmIF9UcCogICAgICAgcG9pbnRlcjsKKyAgdHlwZWRlZiBjb25zdCBfVHAqIGNvbnN0X3BvaW50ZXI7CisgIHR5cGVkZWYgX1RwJiAgICAgICByZWZlcmVuY2U7CisgIHR5cGVkZWYgY29uc3QgX1RwJiBjb25zdF9yZWZlcmVuY2U7CisgIHR5cGVkZWYgX1RwICAgICAgICB2YWx1ZV90eXBlOworCisjaWZkZWYgX1NUTFBfTUVNQkVSX1RFTVBMQVRFX0NMQVNTRVMKKyAgdGVtcGxhdGUgPGNsYXNzIF9OZXdUeXBlPiBzdHJ1Y3QgcmViaW5kIHsKKyAgICB0eXBlZGVmIHB0aHJlYWRfYWxsb2NhdG9yPF9OZXdUeXBlPiBvdGhlcjsKKyAgfTsKKyNlbmRpZgorCisgIHB0aHJlYWRfYWxsb2NhdG9yKCkgX1NUTFBfTk9USFJPVyB7fQorICBwdGhyZWFkX2FsbG9jYXRvcihjb25zdCBwdGhyZWFkX2FsbG9jYXRvcjxfVHA+JiBhKSBfU1RMUF9OT1RIUk9XIHt9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKSAvKiAmJiBkZWZpbmVkIChfU1RMUF9GVU5DVElPTl9QQVJUSUFMX09SREVSKSAqLworICB0ZW1wbGF0ZSA8Y2xhc3MgX090aGVyVHlwZT4gcHRocmVhZF9hbGxvY2F0b3IoY29uc3QgcHRocmVhZF9hbGxvY2F0b3I8X090aGVyVHlwZT4mKQorICAgIF9TVExQX05PVEhST1cge30KKyNlbmRpZgorCisgIH5wdGhyZWFkX2FsbG9jYXRvcigpIF9TVExQX05PVEhST1cge30KKworICBwb2ludGVyIGFkZHJlc3MocmVmZXJlbmNlIF9feCkgY29uc3QgeyByZXR1cm4gJl9feDsgfQorICBjb25zdF9wb2ludGVyIGFkZHJlc3MoY29uc3RfcmVmZXJlbmNlIF9feCkgY29uc3QgeyByZXR1cm4gJl9feDsgfQorCisgIC8vIF9fbiBpcyBwZXJtaXR0ZWQgdG8gYmUgMC4gIFRoZSBDKysgc3RhbmRhcmQgc2F5cyBub3RoaW5nIGFib3V0IHdoYXQKKyAgLy8gdGhlIHJldHVybiB2YWx1ZSBpcyB3aGVuIF9fbiA9PSAwLgorICBfVHAqIGFsbG9jYXRlKHNpemVfdHlwZSBfX24sIGNvbnN0IHZvaWQqID0gMCkgeworICAgIGlmIChfX24gPiBtYXhfc2l6ZSgpKSB7CisgICAgICBfX1RIUk9XX0JBRF9BTExPQzsKKyAgICB9CisgICAgaWYgKF9fbiAhPSAwKSB7CisgICAgICBzaXplX3R5cGUgX19idWZfc2l6ZSA9IF9fbiAqIHNpemVvZih2YWx1ZV90eXBlKTsKKyAgICAgIF9UcCogX19yZXQgPSBfX1JFSU5URVJQUkVUX0NBU1QodmFsdWVfdHlwZSosIF9TX0FsbG9jOjphbGxvY2F0ZShfX2J1Zl9zaXplKSk7CisjaWYgZGVmaW5lZCAoX1NUTFBfREVCVUdfVU5JTklUSUFMSVpFRCkgJiYgIWRlZmluZWQgKF9TVExQX0RFQlVHX0FMTE9DKQorICAgICAgaWYgKF9fcmV0ICE9IDApIHsKKyAgICAgICAgbWVtc2V0KChjaGFyKilfX3JldCwgX1NUTFBfU0hSRURfQllURSwgX19idWZfc2l6ZSk7CisgICAgICB9CisjZW5kaWYKKyAgICAgIHJldHVybiBfX3JldDsKKyAgICB9CisgICAgZWxzZQorICAgICAgcmV0dXJuIDA7CisgIH0KKworICB2b2lkIGRlYWxsb2NhdGUocG9pbnRlciBfX3AsIHNpemVfdHlwZSBfX24pIHsKKyAgICBfU1RMUF9BU1NFUlQoIChfX3AgPT0gMCkgPT0gKF9fbiA9PSAwKSApCisgICAgaWYgKF9fcCAhPSAwKSB7CisjaWYgZGVmaW5lZCAoX1NUTFBfREVCVUdfVU5JTklUSUFMSVpFRCkgJiYgIWRlZmluZWQgKF9TVExQX0RFQlVHX0FMTE9DKQorICAgICAgbWVtc2V0KChjaGFyKilfX3AsIF9TVExQX1NIUkVEX0JZVEUsIF9fbiAqIHNpemVvZih2YWx1ZV90eXBlKSk7CisjZW5kaWYKKyAgICAgIF9TX0FsbG9jOjpkZWFsbG9jYXRlKF9fcCwgX19uICogc2l6ZW9mKHZhbHVlX3R5cGUpKTsKKyAgICB9CisgIH0KKworICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCBfU1RMUF9OT1RIUk9XCisgIHsgcmV0dXJuIHNpemVfdCgtMSkgLyBzaXplb2YoX1RwKTsgfQorCisgIHZvaWQgY29uc3RydWN0KHBvaW50ZXIgX19wLCBjb25zdCBfVHAmIF9fdmFsKSB7IF9TVExQX1BMQUNFTUVOVF9ORVcgKF9fcCkgX1RwKF9fdmFsKTsgfQorICB2b2lkIGRlc3Ryb3kocG9pbnRlciBfcCkgeyBfcC0+fl9UcCgpOyB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKQorICAvKiBTVExwb3J0IGV4dGVuc2lvbiBnaXZpbmcgcm91bmRlZCBzaXplIG9mIGFuIGFsbG9jYXRlZCBtZW1vcnkgYnVmZmVyCisgICAqIFRoaXMgbWV0aG9kIGRvIG5vdCBoYXZlIHRvIGJlIHBhcnQgb2YgYSB1c2VyIGRlZmluZWQgYWxsb2NhdG9yIGltcGxlbWVudGF0aW9uCisgICAqIGFuZCB3b24ndCBldmVuIGJlIGNhbGxlZCBpZiBzdWNoIGEgZnVuY3Rpb24gd2FzIGdyYW50ZWQuCisgICAqLworcHJvdGVjdGVkOgorI2VuZGlmCisgIF9UcCogYWxsb2NhdGUoc2l6ZV90eXBlIF9fbiwgc2l6ZV90eXBlJiBfX2FsbG9jYXRlZF9uKSB7CisgICAgaWYgKF9fbiA+IG1heF9zaXplKCkpIHsKKyAgICAgIF9fVEhST1dfQkFEX0FMTE9DOworICAgIH0KKyAgICBpZiAoX19uICE9IDApIHsKKyAgICAgIHNpemVfdHlwZSBfX2J1Zl9zaXplID0gX19uICogc2l6ZW9mKHZhbHVlX3R5cGUpOworICAgICAgX1RwKiBfX3JldCA9IF9fUkVJTlRFUlBSRVRfQ0FTVCh2YWx1ZV90eXBlKiwgX1NfQWxsb2M6OmFsbG9jYXRlKF9fYnVmX3NpemUpKTsKKyNpZiBkZWZpbmVkIChfU1RMUF9ERUJVR19VTklOSVRJQUxJWkVEKSAmJiAhZGVmaW5lZCAoX1NUTFBfREVCVUdfQUxMT0MpCisgICAgICBpZiAoX19yZXQgIT0gMCkgeworICAgICAgICBtZW1zZXQoKGNoYXIqKV9fcmV0LCBfU1RMUF9TSFJFRF9CWVRFLCBfX2J1Zl9zaXplKTsKKyAgICAgIH0KKyNlbmRpZgorICAgICAgX19hbGxvY2F0ZWRfbiA9IF9fYnVmX3NpemUgLyBzaXplb2YodmFsdWVfdHlwZSk7CisgICAgICByZXR1cm4gX19yZXQ7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHJldHVybiAwOworICB9Cit9OworCitfU1RMUF9URU1QTEFURV9OVUxMCitjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBwdGhyZWFkX2FsbG9jYXRvcjx2b2lkPiB7CitwdWJsaWM6CisgIHR5cGVkZWYgc2l6ZV90ICAgICAgc2l6ZV90eXBlOworICB0eXBlZGVmIHB0cmRpZmZfdCAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgdHlwZWRlZiB2b2lkKiAgICAgICBwb2ludGVyOworICB0eXBlZGVmIGNvbnN0IHZvaWQqIGNvbnN0X3BvaW50ZXI7CisgIHR5cGVkZWYgdm9pZCAgICAgICAgdmFsdWVfdHlwZTsKKyNpZmRlZiBfU1RMUF9NRU1CRVJfVEVNUExBVEVfQ0xBU1NFUworICB0ZW1wbGF0ZSA8Y2xhc3MgX05ld1R5cGU+IHN0cnVjdCByZWJpbmQgeworICAgIHR5cGVkZWYgcHRocmVhZF9hbGxvY2F0b3I8X05ld1R5cGU+IG90aGVyOworICB9OworI2VuZGlmCit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+CitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHB0aHJlYWRfYWxsb2NhdG9yPF9UMT4mLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwdGhyZWFkX2FsbG9jYXRvcjxfVDI+JiBhMikKK3sgcmV0dXJuIHRydWU7IH0KKworI2lmZGVmIF9TVExQX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUgordGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgoraW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBwdGhyZWFkX2FsbG9jYXRvcjxfVDE+JiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHRocmVhZF9hbGxvY2F0b3I8X1QyPiYpCit7IHJldHVybiBmYWxzZTsgfQorI2VuZGlmCisKKworI2lmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pCisKKyMgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9SQVdfU0dJX0FMTE9DQVRPUlMpCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9BbGxvY190cmFpdHM8X1RwLCBfUHRocmVhZF9hbGxvYz4KK3sgdHlwZWRlZiBfX2FsbG9jYXRvcjxfVHAsIF9QdGhyZWFkX2FsbG9jPiBhbGxvY2F0b3JfdHlwZTsgfTsKKyMgIGVuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BdHlwZT4KK3N0cnVjdCBfQWxsb2NfdHJhaXRzPF9UcCwgcHRocmVhZF9hbGxvY2F0b3I8X0F0eXBlPiA+Cit7IHR5cGVkZWYgcHRocmVhZF9hbGxvY2F0b3I8X1RwPiBhbGxvY2F0b3JfdHlwZTsgfTsKKworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9ET05UX1NVUFBPUlRfUkVCSU5EX01FTUJFUl9URU1QTEFURSkKKwordGVtcGxhdGUgPGNsYXNzIF9UcDEsIGNsYXNzIF9UcDI+CitpbmxpbmUgcHRocmVhZF9hbGxvY2F0b3I8X1RwMj4mCitfX3N0bF9hbGxvY19yZWJpbmQocHRocmVhZF9hbGxvY2F0b3I8X1RwMT4mIF9feCwgY29uc3QgX1RwMiopCit7IHJldHVybiAocHRocmVhZF9hbGxvY2F0b3I8X1RwMj4mKV9feDsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwMSwgY2xhc3MgX1RwMj4KK2lubGluZSBwdGhyZWFkX2FsbG9jYXRvcjxfVHAyPgorX19zdGxfYWxsb2NfY3JlYXRlKHB0aHJlYWRfYWxsb2NhdG9yPF9UcDE+JiwgY29uc3QgX1RwMiopCit7IHJldHVybiBwdGhyZWFkX2FsbG9jYXRvcjxfVHAyPigpOyB9CisKKyNlbmRpZgorCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX19wdGhyZWFkX2FsbG9jX3R5cGVfdHJhaXRzIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSXNTVExwb3J0Q2xhc3M8cHRocmVhZF9hbGxvY2F0b3I8X1RwPiA+OjpfUmV0IF9TVExwb3J0QWxsb2M7CisgIC8vVGhlIGRlZmF1bHQgYWxsb2NhdG9yIGltcGxlbWVudGF0aW9uIHdoaWNoIGlzIHJlY29nbml6ZSB0aGFua3MgdG8gdGhlCisgIC8vX19zdGxwb3J0X2NsYXNzIGluaGVyaXRhbmNlIGlzIGEgc3RhdGVsZXNzIG9iamVjdCBzbzoKKyAgdHlwZWRlZiBfU1RMcG9ydEFsbG9jIGhhc190cml2aWFsX2RlZmF1bHRfY29uc3RydWN0b3I7CisgIHR5cGVkZWYgX1NUTHBvcnRBbGxvYyBoYXNfdHJpdmlhbF9jb3B5X2NvbnN0cnVjdG9yOworICB0eXBlZGVmIF9TVExwb3J0QWxsb2MgaGFzX3RyaXZpYWxfYXNzaWdubWVudF9vcGVyYXRvcjsKKyAgdHlwZWRlZiBfU1RMcG9ydEFsbG9jIGhhc190cml2aWFsX2Rlc3RydWN0b3I7CisgIHR5cGVkZWYgX1NUTHBvcnRBbGxvYyBpc19QT0RfdHlwZTsKK307CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCisjaWYgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX190eXBlX3RyYWl0czxwdGhyZWFkX2FsbG9jYXRvcjxfVHA+ID4gOiBfU1RMUF9QUklWIF9fcHRocmVhZF9hbGxvY190eXBlX3RyYWl0czxfVHA+IHt9OworI2Vsc2UKK19TVExQX1RFTVBMQVRFX05VTEwKK3N0cnVjdCBfX3R5cGVfdHJhaXRzPHB0aHJlYWRfYWxsb2NhdG9yPGNoYXI+ID4gOiBfU1RMUF9QUklWIF9fcHRocmVhZF9hbGxvY190eXBlX3RyYWl0czxjaGFyPiB7fTsKKyMgIGlmIGRlZmluZWQgKF9TVExQX0hBU19XQ0hBUl9UKQorX1NUTFBfVEVNUExBVEVfTlVMTAorc3RydWN0IF9fdHlwZV90cmFpdHM8cHRocmVhZF9hbGxvY2F0b3I8d2NoYXJfdD4gPiA6IF9TVExQX1BSSVYgX19wdGhyZWFkX2FsbG9jX3R5cGVfdHJhaXRzPHdjaGFyX3Q+IHt9OworIyAgZW5kaWYKKyMgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9QVFJfU1BFQ0lBTElaQVRJT05TKQorX1NUTFBfVEVNUExBVEVfTlVMTAorc3RydWN0IF9fdHlwZV90cmFpdHM8cHRocmVhZF9hbGxvY2F0b3I8dm9pZCo+ID4gOiBfU1RMUF9QUklWIF9fcHRocmVhZF9hbGxvY190eXBlX3RyYWl0czx2b2lkKj4ge307CisjICBlbmRpZgorI2VuZGlmCisKKy8vCisvLyBwZXJfdGhyZWFkX2FsbG9jYXRvcjw+IDogdGhpcyBhbGxvY2F0b3IgYWx3YXlzIHJldHVybiBtZW1vcnkgdG8gdGhlIHNhbWUgdGhyZWFkCisvLyBpdCB3YXMgYWxsb2NhdGVkIGZyb20uCisvLworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorY2xhc3MgcGVyX3RocmVhZF9hbGxvY2F0b3IgeworICB0eXBlZGVmIHB0aHJlYWRfYWxsb2MgX1NfQWxsb2M7ICAgICAgICAgIC8vIFRoZSB1bmRlcmx5aW5nIGFsbG9jYXRvci4KKyAgdHlwZWRlZiBwdGhyZWFkX2FsbG9jOjpfX3N0YXRlX3R5cGUgX19zdGF0ZV90eXBlOworcHVibGljOgorICB0eXBlZGVmIHNpemVfdCAgICAgc2l6ZV90eXBlOworICB0eXBlZGVmIHB0cmRpZmZfdCAgZGlmZmVyZW5jZV90eXBlOworICB0eXBlZGVmIF9UcCogICAgICAgcG9pbnRlcjsKKyAgdHlwZWRlZiBjb25zdCBfVHAqIGNvbnN0X3BvaW50ZXI7CisgIHR5cGVkZWYgX1RwJiAgICAgICByZWZlcmVuY2U7CisgIHR5cGVkZWYgY29uc3QgX1RwJiBjb25zdF9yZWZlcmVuY2U7CisgIHR5cGVkZWYgX1RwICAgICAgICB2YWx1ZV90eXBlOworCisjaWZkZWYgX1NUTFBfTUVNQkVSX1RFTVBMQVRFX0NMQVNTRVMKKyAgdGVtcGxhdGUgPGNsYXNzIF9OZXdUeXBlPiBzdHJ1Y3QgcmViaW5kIHsKKyAgICB0eXBlZGVmIHBlcl90aHJlYWRfYWxsb2NhdG9yPF9OZXdUeXBlPiBvdGhlcjsKKyAgfTsKKyNlbmRpZgorCisgIHBlcl90aHJlYWRfYWxsb2NhdG9yKCkgX1NUTFBfTk9USFJPVyB7CisgICAgX01fc3RhdGUgPSBfU19BbGxvYzo6X1NfZ2V0X3Blcl90aHJlYWRfc3RhdGUoKTsKKyAgfQorICBwZXJfdGhyZWFkX2FsbG9jYXRvcihjb25zdCBwZXJfdGhyZWFkX2FsbG9jYXRvcjxfVHA+JiBfX2EpIF9TVExQX05PVEhST1cgOiBfTV9zdGF0ZShfX2EuX01fc3RhdGUpe30KKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpIC8qICYmIGRlZmluZWQgKF9TVExQX0ZVTkNUSU9OX1BBUlRJQUxfT1JERVIpICovCisgIHRlbXBsYXRlIDxjbGFzcyBfT3RoZXJUeXBlPiBwZXJfdGhyZWFkX2FsbG9jYXRvcihjb25zdCBwZXJfdGhyZWFkX2FsbG9jYXRvcjxfT3RoZXJUeXBlPiYgX19hKQorICAgIF9TVExQX05PVEhST1cgOiBfTV9zdGF0ZShfX2EuX01fc3RhdGUpIHt9CisjZW5kaWYKKworICB+cGVyX3RocmVhZF9hbGxvY2F0b3IoKSBfU1RMUF9OT1RIUk9XIHt9CisKKyAgcG9pbnRlciBhZGRyZXNzKHJlZmVyZW5jZSBfX3gpIGNvbnN0IHsgcmV0dXJuICZfX3g7IH0KKyAgY29uc3RfcG9pbnRlciBhZGRyZXNzKGNvbnN0X3JlZmVyZW5jZSBfX3gpIGNvbnN0IHsgcmV0dXJuICZfX3g7IH0KKworICAvLyBfX24gaXMgcGVybWl0dGVkIHRvIGJlIDAuICBUaGUgQysrIHN0YW5kYXJkIHNheXMgbm90aGluZyBhYm91dCB3aGF0CisgIC8vIHRoZSByZXR1cm4gdmFsdWUgaXMgd2hlbiBfX24gPT0gMC4KKyAgX1RwKiBhbGxvY2F0ZShzaXplX3R5cGUgX19uLCBjb25zdCB2b2lkKiA9IDApIHsKKyAgICBpZiAoX19uID4gbWF4X3NpemUoKSkgeworICAgICAgX19USFJPV19CQURfQUxMT0M7CisgICAgfQorICAgIGlmIChfX24gIT0gMCkgeworICAgICAgc2l6ZV90eXBlIF9fYnVmX3NpemUgPSBfX24gKiBzaXplb2YodmFsdWVfdHlwZSk7CisgICAgICBfVHAqIF9fcmV0ID0gX19SRUlOVEVSUFJFVF9DQVNUKF9UcCosIF9TX0FsbG9jOjphbGxvY2F0ZShfX2J1Zl9zaXplLCBfTV9zdGF0ZSkpOworI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHX1VOSU5JVElBTElaRUQpICYmICFkZWZpbmVkIChfU1RMUF9ERUJVR19BTExPQykKKyAgICAgIGlmIChfX3JldCAhPSAwKSB7CisgICAgICAgIG1lbXNldCgoY2hhciopX19yZXQsIF9TVExQX1NIUkVEX0JZVEUsIF9fYnVmX3NpemUpOworICAgICAgfQorI2VuZGlmCisgICAgICByZXR1cm4gX19yZXQ7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHJldHVybiAwOworICB9CisKKyAgdm9pZCBkZWFsbG9jYXRlKHBvaW50ZXIgX19wLCBzaXplX3R5cGUgX19uKSB7CisgICAgX1NUTFBfQVNTRVJUKCAoX19wID09IDApID09IChfX24gPT0gMCkgKQorICAgIGlmIChfX3AgIT0gMCkgeworI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHX1VOSU5JVElBTElaRUQpICYmICFkZWZpbmVkIChfU1RMUF9ERUJVR19BTExPQykKKyAgICAgIG1lbXNldCgoY2hhciopX19wLCBfU1RMUF9TSFJFRF9CWVRFLCBfX24gKiBzaXplb2YodmFsdWVfdHlwZSkpOworI2VuZGlmCisgICAgICBfU19BbGxvYzo6ZGVhbGxvY2F0ZShfX3AsIF9fbiAqIHNpemVvZih2YWx1ZV90eXBlKSwgX01fc3RhdGUpOworICAgIH0KKyAgfQorCisgIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IF9TVExQX05PVEhST1cKKyAgeyByZXR1cm4gc2l6ZV90KC0xKSAvIHNpemVvZihfVHApOyB9CisKKyAgdm9pZCBjb25zdHJ1Y3QocG9pbnRlciBfX3AsIGNvbnN0IF9UcCYgX192YWwpIHsgX1NUTFBfUExBQ0VNRU5UX05FVyAoX19wKSBfVHAoX192YWwpOyB9CisgIHZvaWQgZGVzdHJveShwb2ludGVyIF9wKSB7IF9wLT5+X1RwKCk7IH0KKworICAvLyBzdGF0ZSBpcyBiZWluZyBrZXB0IGhlcmUKKyAgX19zdGF0ZV90eXBlKiBfTV9zdGF0ZTsKKworI2lmIGRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpCisgIC8qIFNUTHBvcnQgZXh0ZW5zaW9uIGdpdmluZyByb3VuZGVkIHNpemUgb2YgYW4gYWxsb2NhdGVkIG1lbW9yeSBidWZmZXIKKyAgICogVGhpcyBtZXRob2QgZG8gbm90IGhhdmUgdG8gYmUgcGFydCBvZiBhIHVzZXIgZGVmaW5lZCBhbGxvY2F0b3IgaW1wbGVtZW50YXRpb24KKyAgICogYW5kIHdvbid0IGV2ZW4gYmUgY2FsbGVkIGlmIHN1Y2ggYSBmdW5jdGlvbiB3YXMgZ3JhbnRlZC4KKyAgICovCitwcm90ZWN0ZWQ6CisjZW5kaWYKKyAgX1RwKiBhbGxvY2F0ZShzaXplX3R5cGUgX19uLCBzaXplX3R5cGUmIF9fYWxsb2NhdGVkX24pIHsKKyAgICBpZiAoX19uID4gbWF4X3NpemUoKSkgeworICAgICAgX19USFJPV19CQURfQUxMT0M7CisgICAgfQorICAgIGlmIChfX24gIT0gMCkgeworICAgICAgc2l6ZV90eXBlIF9fYnVmX3NpemUgPSBfX24gKiBzaXplb2YodmFsdWVfdHlwZSk7CisgICAgICBfVHAqIF9fcmV0ID0gX19SRUlOVEVSUFJFVF9DQVNUKHZhbHVlX3R5cGUqLCBfU19BbGxvYzo6YWxsb2NhdGUoX19idWZfc2l6ZSwgX01fc3RhdGUpKTsKKyNpZiBkZWZpbmVkIChfU1RMUF9ERUJVR19VTklOSVRJQUxJWkVEKSAmJiAhZGVmaW5lZCAoX1NUTFBfREVCVUdfQUxMT0MpCisgICAgICBpZiAoX19yZXQgIT0gMCkgeworICAgICAgICBtZW1zZXQoKGNoYXIqKV9fcmV0LCBfU1RMUF9TSFJFRF9CWVRFLCBfX2J1Zl9zaXplKTsKKyAgICAgIH0KKyNlbmRpZgorICAgICAgX19hbGxvY2F0ZWRfbiA9IF9fYnVmX3NpemUgLyBzaXplb2YodmFsdWVfdHlwZSk7CisgICAgICByZXR1cm4gX19yZXQ7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHJldHVybiAwOworICB9Cit9OworCitfU1RMUF9URU1QTEFURV9OVUxMCitjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBwZXJfdGhyZWFkX2FsbG9jYXRvcjx2b2lkPiB7CitwdWJsaWM6CisgIHR5cGVkZWYgc2l6ZV90ICAgICAgc2l6ZV90eXBlOworICB0eXBlZGVmIHB0cmRpZmZfdCAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgdHlwZWRlZiB2b2lkKiAgICAgICBwb2ludGVyOworICB0eXBlZGVmIGNvbnN0IHZvaWQqIGNvbnN0X3BvaW50ZXI7CisgIHR5cGVkZWYgdm9pZCAgICAgICAgdmFsdWVfdHlwZTsKKyNpZmRlZiBfU1RMUF9NRU1CRVJfVEVNUExBVEVfQ0xBU1NFUworICB0ZW1wbGF0ZSA8Y2xhc3MgX05ld1R5cGU+IHN0cnVjdCByZWJpbmQgeworICAgIHR5cGVkZWYgcGVyX3RocmVhZF9hbGxvY2F0b3I8X05ld1R5cGU+IG90aGVyOworICB9OworI2VuZGlmCit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+CitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHBlcl90aHJlYWRfYWxsb2NhdG9yPF9UMT4mIF9fYTEsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBlcl90aHJlYWRfYWxsb2NhdG9yPF9UMj4mIF9fYTIpCit7IHJldHVybiBfX2ExLl9NX3N0YXRlID09IF9fYTIuX01fc3RhdGU7IH0KKworI2lmZGVmIF9TVExQX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUgordGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgoraW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBwZXJfdGhyZWFkX2FsbG9jYXRvcjxfVDE+JiBfX2ExLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwZXJfdGhyZWFkX2FsbG9jYXRvcjxfVDI+JiBfX2EyKQoreyByZXR1cm4gX19hMS5fTV9zdGF0ZSAhPSBfX2EyLl9NX3N0YXRlOyB9CisjZW5kaWYKKworCisjaWYgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0F0eXBlPgorc3RydWN0IF9BbGxvY190cmFpdHM8X1RwLCBwZXJfdGhyZWFkX2FsbG9jYXRvcjxfQXR5cGU+ID4KK3sgdHlwZWRlZiBwZXJfdGhyZWFkX2FsbG9jYXRvcjxfVHA+IGFsbG9jYXRvcl90eXBlOyB9OworCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX0RPTlRfU1VQUE9SVF9SRUJJTkRfTUVNQkVSX1RFTVBMQVRFKQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwMSwgY2xhc3MgX1RwMj4KK2lubGluZSBwZXJfdGhyZWFkX2FsbG9jYXRvcjxfVHAyPiYKK19fc3RsX2FsbG9jX3JlYmluZChwZXJfdGhyZWFkX2FsbG9jYXRvcjxfVHAxPiYgX194LCBjb25zdCBfVHAyKikKK3sgcmV0dXJuIChwZXJfdGhyZWFkX2FsbG9jYXRvcjxfVHAyPiYpX194OyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAxLCBjbGFzcyBfVHAyPgoraW5saW5lIHBlcl90aHJlYWRfYWxsb2NhdG9yPF9UcDI+CitfX3N0bF9hbGxvY19jcmVhdGUocGVyX3RocmVhZF9hbGxvY2F0b3I8X1RwMT4mLCBjb25zdCBfVHAyKikKK3sgcmV0dXJuIHBlcl90aHJlYWRfYWxsb2NhdG9yPF9UcDI+KCk7IH0KKworI2VuZGlmIC8qIF9TVExQX0RPTlRfU1VQUE9SVF9SRUJJTkRfTUVNQkVSX1RFTVBMQVRFICovCisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfX3BlcnRocmVhZF9hbGxvY190eXBlX3RyYWl0cyB7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0lzU1RMcG9ydENsYXNzPHBlcl90aHJlYWRfYWxsb2NhdG9yPF9UcD4gPjo6X1JldCBfU1RMcG9ydEFsbG9jOworICAvL1RoZSBkZWZhdWx0IGFsbG9jYXRvciBpbXBsZW1lbnRhdGlvbiB3aGljaCBpcyByZWNvZ25pemUgdGhhbmtzIHRvIHRoZQorICAvL19fc3RscG9ydF9jbGFzcyBpbmhlcml0YW5jZSBpcyBhIHN0YXRlbGVzcyBvYmplY3Qgc286CisgIHR5cGVkZWYgX19mYWxzZV90eXBlIGhhc190cml2aWFsX2RlZmF1bHRfY29uc3RydWN0b3I7CisgIHR5cGVkZWYgX1NUTHBvcnRBbGxvYyBoYXNfdHJpdmlhbF9jb3B5X2NvbnN0cnVjdG9yOworICB0eXBlZGVmIF9TVExwb3J0QWxsb2MgaGFzX3RyaXZpYWxfYXNzaWdubWVudF9vcGVyYXRvcjsKKyAgdHlwZWRlZiBfU1RMcG9ydEFsbG9jIGhhc190cml2aWFsX2Rlc3RydWN0b3I7CisgIHR5cGVkZWYgX19mYWxzZV90eXBlIGlzX1BPRF90eXBlOworfTsKKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKKyNpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfX3R5cGVfdHJhaXRzPHBlcl90aHJlYWRfYWxsb2NhdG9yPF9UcD4gPiA6IF9TVExQX1BSSVYgX19wZXJ0aHJlYWRfYWxsb2NfdHlwZV90cmFpdHM8X1RwPiB7fTsKKyNlbHNlCitfU1RMUF9URU1QTEFURV9OVUxMCitzdHJ1Y3QgX190eXBlX3RyYWl0czxwZXJfdGhyZWFkX2FsbG9jYXRvcjxjaGFyPiA+IDogX1NUTFBfUFJJViBfX3BlcnRocmVhZF9hbGxvY190eXBlX3RyYWl0czxjaGFyPiB7fTsKKyMgIGlmIGRlZmluZWQgKF9TVExQX0hBU19XQ0hBUl9UKQorX1NUTFBfVEVNUExBVEVfTlVMTAorc3RydWN0IF9fdHlwZV90cmFpdHM8cGVyX3RocmVhZF9hbGxvY2F0b3I8d2NoYXJfdD4gPiA6IF9TVExQX1BSSVYgX19wZXJ0aHJlYWRfYWxsb2NfdHlwZV90cmFpdHM8d2NoYXJfdD4ge307CisjICBlbmRpZgorIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BUUl9TUEVDSUFMSVpBVElPTlMpCitfU1RMUF9URU1QTEFURV9OVUxMCitzdHJ1Y3QgX190eXBlX3RyYWl0czxwZXJfdGhyZWFkX2FsbG9jYXRvcjx2b2lkKj4gPiA6IF9TVExQX1BSSVYgX19wZXJ0aHJlYWRfYWxsb2NfdHlwZV90cmFpdHM8dm9pZCo+IHt9OworIyAgZW5kaWYKKyNlbmRpZgorCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2VuZGlmIC8qIF9TVExQX1BUSFJFQURfQUxMT0MgKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9fcHRyc19zcGVjaWFsaXplLmggYi9zdGwvX3B0cnNfc3BlY2lhbGl6ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMzQwZGIKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvX3B0cnNfc3BlY2lhbGl6ZS5oCkBAIC0wLDAgKzEsODAgQEAKKyNpZm5kZWYgX1NUTFBfUFRSU19TUEVDSUFMSVpFX0gKKyNkZWZpbmUgX1NUTFBfUFRSU19TUEVDSUFMSVpFX0gKKworI2lmbmRlZiBfU1RMUF9UWVBFX1RSQUlUU19ICisjICBpbmNsdWRlIDxzdGwvdHlwZV90cmFpdHMuaD4KKyNlbmRpZgorCisvLyB0aGUgZm9sbG93aW5nIGlzIGEgd29ya2Fyb3VuZCBmb3IgYXJyb3cgb3BlcmF0b3IgcHJvYmxlbXMKKyNpZiBkZWZpbmVkICAoIF9TVExQX05PX0FSUk9XX09QRVJBVE9SICkKKy8vIFVzZXIgd2FudHMgdG8gZGlzYWJsZSBwcm94eSAtPiBvcGVyYXRvcnMKKyMgIGRlZmluZSBfU1RMUF9ERUZJTkVfQVJST1dfT1BFUkFUT1IKKyMgIGRlZmluZSBfU1RMUF9BUlJPV19TUEVDSUFMSVpFX1dJVEhfUFRSUyhfVHApCisjZWxzZQorLy8gQ29tcGlsZXIgY2FuIGhhbmRsZSBnZW5lcmljIC0+IG9wZXJhdG9yLgorIyAgZGVmaW5lIF9TVExQX0FSUk9XX1NQRUNJQUxJWkVfV0lUSF9QVFJTKF9UcCkKKyMgIGlmIGRlZmluZWQgKF9fQk9STEFORENfXykKKyMgICAgZGVmaW5lIF9TVExQX0RFRklORV9BUlJPV19PUEVSQVRPUiAgcG9pbnRlciBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gJigqKCp0aGlzKSk7IH0KKyMgIGVsaWYgZGVmaW5lZChfX1dBVENPTUNfXykKKyMgICAgZGVmaW5lIF9TVExQX0RFRklORV9BUlJPV19PUEVSQVRPUiBwb2ludGVyIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJlZmVyZW5jZSB4ID0gb3BlcmF0b3IqKCk7IHJldHVybiAmeDsgfQorIyAgZWxzZQorIyAgICBkZWZpbmUgX1NUTFBfREVGSU5FX0FSUk9XX09QRVJBVE9SICBwb2ludGVyIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiAmKG9wZXJhdG9yKigpKTsgfQorIyAgZW5kaWYKKyNlbmRpZiAvKiBfU1RMUF9OT19BUlJPV19PUEVSQVRPUiAqLworCisvLyBJbXBvcnRhbnQgcG9pbnRlcnMgc3BlY2lhbGl6YXRpb25zCisKKyNpZmRlZiBfU1RMUF9TSU1VTEFURV9QQVJUSUFMX1NQRUNfRk9SX1RZUEVfVFJBSVRTCisjICBkZWZpbmUgX1NUTFBfVFlQRV9UUkFJVFNfUE9EX1NQRUNJQUxJWkVfVihfVHlwZSkKKyMgIGRlZmluZSBfU1RMUF9UWVBFX1RSQUlUU19QT0RfU1BFQ0lBTElaRShfVHlwZSkKKyNlbHNlCisjICBkZWZpbmUgX1NUTFBfVFlQRV9UUkFJVFNfUE9EX1NQRUNJQUxJWkUoX1R5cGUpIF9TVExQX1RFTVBMQVRFX05VTEwgc3RydWN0IF9fdHlwZV90cmFpdHM8X1R5cGU+IDogX190eXBlX3RyYWl0c19hdXg8MT4ge307CisjICBkZWZpbmUgX1NUTFBfVFlQRV9UUkFJVFNfUE9EX1NQRUNJQUxJWkVfVihfVHlwZSkgXAorX1NUTFBfVFlQRV9UUkFJVFNfUE9EX1NQRUNJQUxJWkUoX1R5cGUqKSBcCitfU1RMUF9UWVBFX1RSQUlUU19QT0RfU1BFQ0lBTElaRShjb25zdCBfVHlwZSopIFwKK19TVExQX1RZUEVfVFJBSVRTX1BPRF9TUEVDSUFMSVpFKF9UeXBlKiopIFwKK19TVExQX1RZUEVfVFJBSVRTX1BPRF9TUEVDSUFMSVpFKF9UeXBlKiBjb25zdCAqKSBcCitfU1RMUF9UWVBFX1RSQUlUU19QT0RfU1BFQ0lBTElaRShjb25zdCBfVHlwZSoqKSBcCitfU1RMUF9UWVBFX1RSQUlUU19QT0RfU1BFQ0lBTElaRShfVHlwZSoqKikgXAorX1NUTFBfVFlQRV9UUkFJVFNfUE9EX1NQRUNJQUxJWkUoY29uc3QgX1R5cGUqKiopCisjZW5kaWYKKworIyBkZWZpbmUgX1NUTFBfUE9JTlRFUlNfU1BFQ0lBTElaRShfVHlwZSkgX1NUTFBfVFlQRV9UUkFJVFNfUE9EX1NQRUNJQUxJWkVfVihfVHlwZSkgX1NUTFBfQVJST1dfU1BFQ0lBTElaRV9XSVRIX1BUUlMoX1R5cGUpCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisjICBpZiAhZGVmaW5lZCAoIF9TVExQX05PX0JPT0wgKQorX1NUTFBfUE9JTlRFUlNfU1BFQ0lBTElaRSggYm9vbCApCisjICBlbmRpZgorX1NUTFBfVFlQRV9UUkFJVFNfUE9EX1NQRUNJQUxJWkVfVih2b2lkKQorIyBpZm5kZWYgX1NUTFBfTk9fU0lHTkVEX0JVSUxUSU5TCisgIF9TVExQX1BPSU5URVJTX1NQRUNJQUxJWkUoIHNpZ25lZCBjaGFyICkKKyMgZW5kaWYKKyAgX1NUTFBfUE9JTlRFUlNfU1BFQ0lBTElaRSggY2hhciApCisgIF9TVExQX1BPSU5URVJTX1NQRUNJQUxJWkUoIHVuc2lnbmVkIGNoYXIgKQorICBfU1RMUF9QT0lOVEVSU19TUEVDSUFMSVpFKCBzaG9ydCApCisgIF9TVExQX1BPSU5URVJTX1NQRUNJQUxJWkUoIHVuc2lnbmVkIHNob3J0ICkKKyAgX1NUTFBfUE9JTlRFUlNfU1BFQ0lBTElaRSggaW50ICkKKyAgX1NUTFBfUE9JTlRFUlNfU1BFQ0lBTElaRSggdW5zaWduZWQgaW50ICkKKyAgX1NUTFBfUE9JTlRFUlNfU1BFQ0lBTElaRSggbG9uZyApCisgIF9TVExQX1BPSU5URVJTX1NQRUNJQUxJWkUoIHVuc2lnbmVkIGxvbmcgKQorICBfU1RMUF9QT0lOVEVSU19TUEVDSUFMSVpFKCBmbG9hdCApCisgIF9TVExQX1BPSU5URVJTX1NQRUNJQUxJWkUoIGRvdWJsZSApCisjICBpZiAhZGVmaW5lZCAoIF9TVExQX05PX0xPTkdfRE9VQkxFICkKKyAgX1NUTFBfUE9JTlRFUlNfU1BFQ0lBTElaRSggbG9uZyBkb3VibGUgKQorIyAgZW5kaWYKKyMgIGlmIGRlZmluZWQgKCBfU1RMUF9MT05HX0xPTkcpCisgIF9TVExQX1BPSU5URVJTX1NQRUNJQUxJWkUoIF9TVExQX0xPTkdfTE9ORyApCisgIF9TVExQX1BPSU5URVJTX1NQRUNJQUxJWkUoIHVuc2lnbmVkIF9TVExQX0xPTkdfTE9ORyApCisjICBlbmRpZgorI2lmIGRlZmluZWQgKCBfU1RMUF9IQVNfV0NIQVJfVCApICYmICEgZGVmaW5lZCAoX1NUTFBfV0NIQVJfVF9JU19VU0hPUlQpCisgIF9TVExQX1BPSU5URVJTX1NQRUNJQUxJWkUoIHdjaGFyX3QgKQorIyAgZW5kaWYKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjIHVuZGVmIF9TVExQX0FSUk9XX1NQRUNJQUxJWkUKKyMgdW5kZWYgX1NUTFBfQVJST1dfU1BFQ0lBTElaRV9XSVRIX1BUUlMKKyMgdW5kZWYgX1NUTFBfVFlQRV9UUkFJVFNfUE9EX1NQRUNJQUxJWkVfVgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N0bC9fcXVldWUuaCBiL3N0bC9fcXVldWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTIwNjE1Ci0tLSAvZGV2L251bGwKKysrIGIvc3RsL19xdWV1ZS5oCkBAIC0wLDAgKzEsMjUzIEBACisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBNb3Njb3cgQ2VudGVyIGZvciBTUEFSQyBUZWNobm9sb2d5CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworLyogTk9URTogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgU1RMIGhlYWRlcnMuCisgKiAgIFlvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LgorICovCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfUVVFVUVfSAorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9RVUVVRV9ICisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfREVRVUVfSAorIyAgaW5jbHVkZSA8c3RsL19kZXF1ZS5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfVkVDVE9SX0gKKyMgaW5jbHVkZSA8c3RsL192ZWN0b3IuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0hFQVBfSAorIyAgaW5jbHVkZSA8c3RsL19oZWFwLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9GVU5DVElPTl9CQVNFX0gKKyMgIGluY2x1ZGUgPHN0bC9fZnVuY3Rpb25fYmFzZS5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fU0NfXykgJiYgIWRlZmluZWQoX19ETUNfXykgICAgLy8qdHkgMTIvMDcvMjAwMSAtIHNpbmNlICJjb21wIiBpcyBhIGJ1aWx0LWluIHR5cGUgYW5kIHJlc2VydmVkIHVuZGVyIFNDcHAKKyMgIGRlZmluZSBjb21wIF9Db21wCisjZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKKyMgaWYgISBkZWZpbmVkICggX1NUTFBfTElNSVRFRF9ERUZBVUxUX1RFTVBMQVRFUyApCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfU2VxdWVuY2UgPSBkZXF1ZTxfVHA+ID4KKyMgZWxpZiBkZWZpbmVkICggX1NUTFBfTUlOSU1VTV9ERUZBVUxUX1RFTVBMQVRFX1BBUkFNUyApCisjICBkZWZpbmUgX1NUTFBfUVVFVUVfQVJHUyBfVHAKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CisjIGVsc2UKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9TZXF1ZW5jZT4KKyMgZW5kaWYKK2NsYXNzIHF1ZXVlCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EKQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfUVVFVUVfQVJHUykKKyAgICAgICAgICAgIDogcHVibGljIF9fc3RscG9ydF9jbGFzczxxdWV1ZTxfVHA+ID4KKyMgIGVsc2UKKyAgICAgICAgICAgIDogcHVibGljIF9fc3RscG9ydF9jbGFzczxxdWV1ZTxfVHAsIF9TZXF1ZW5jZT4gPgorIyAgZW5kaWYKKyNlbmRpZgoreworIyBpZiBkZWZpbmVkICggX1NUTFBfUVVFVUVfQVJHUyApCisgIHR5cGVkZWYgZGVxdWU8X1RwPiBfU2VxdWVuY2U7CisgIHR5cGVkZWYgcXVldWU8X1RwPiBfU2VsZjsKKyMgZWxzZQorICB0eXBlZGVmIHF1ZXVlPF9UcCwgX1NlcXVlbmNlPiBfU2VsZjsKKyMgZW5kaWYKK3B1YmxpYzoKKyAgdHlwZWRlZiB0eXBlbmFtZSBfU2VxdWVuY2U6OnZhbHVlX3R5cGUgICAgICB2YWx1ZV90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9TZXF1ZW5jZTo6c2l6ZV90eXBlICAgICAgIHNpemVfdHlwZTsKKyAgdHlwZWRlZiAgICAgICAgICBfU2VxdWVuY2UgICAgICAgICAgICAgICAgICBjb250YWluZXJfdHlwZTsKKworICB0eXBlZGVmIHR5cGVuYW1lIF9TZXF1ZW5jZTo6cmVmZXJlbmNlICAgICAgIHJlZmVyZW5jZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfU2VxdWVuY2U6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9yZWZlcmVuY2U7CisKK3Byb3RlY3RlZDoKKyAgLy9jIGlzIGEgU3RhbmRhcmQgbmFtZSAoMjMuMi4zLjEpLCBkbyBubyBtYWtlIGl0IFNUTHBvcnQgbmFtaW5nIGNvbnZlbnRpb24gY29tcGxpYW50LgorICBfU2VxdWVuY2UgYzsKK3B1YmxpYzoKKyAgcXVldWUoKSA6IGMoKSB7fQorICBleHBsaWNpdCBxdWV1ZShjb25zdCBfU2VxdWVuY2UmIF9fYykgOiBjKF9fYykge30KKworICBxdWV1ZShfX21vdmVfc291cmNlPF9TZWxmPiBzcmMpCisgICAgOiBjKF9TVExQX1BSSVYgX0FzTW92ZVNvdXJjZShzcmMuZ2V0KCkuYykpIHt9CisKKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIGMuZW1wdHkoKTsgfQorICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGMuc2l6ZSgpOyB9CisgIHJlZmVyZW5jZSBmcm9udCgpIHsgcmV0dXJuIGMuZnJvbnQoKTsgfQorICBjb25zdF9yZWZlcmVuY2UgZnJvbnQoKSBjb25zdCB7IHJldHVybiBjLmZyb250KCk7IH0KKyAgcmVmZXJlbmNlIGJhY2soKSB7IHJldHVybiBjLmJhY2soKTsgfQorICBjb25zdF9yZWZlcmVuY2UgYmFjaygpIGNvbnN0IHsgcmV0dXJuIGMuYmFjaygpOyB9CisgIHZvaWQgcHVzaChjb25zdCB2YWx1ZV90eXBlJiBfX3gpIHsgYy5wdXNoX2JhY2soX194KTsgfQorICB2b2lkIHBvcCgpIHsgYy5wb3BfZnJvbnQoKTsgfQorICBjb25zdCBfU2VxdWVuY2UmIF9HZXRfcygpIGNvbnN0IHsgcmV0dXJuIGM7IH0KK307CisKKyNpZm5kZWYgX1NUTFBfUVVFVUVfQVJHUworIyAgZGVmaW5lIF9TVExQX1FVRVVFX0FSR1MgX1RwLCBfU2VxdWVuY2UKKyMgIGRlZmluZSBfU1RMUF9RVUVVRV9IRUFERVJfQVJHUyBjbGFzcyBfVHAsIGNsYXNzIF9TZXF1ZW5jZQorI2Vsc2UKKyMgIGRlZmluZSBfU1RMUF9RVUVVRV9IRUFERVJfQVJHUyBjbGFzcyBfVHAKKyNlbmRpZgorCit0ZW1wbGF0ZSA8IF9TVExQX1FVRVVFX0hFQURFUl9BUkdTID4KK2lubGluZSBib29sIF9TVExQX0NBTEwKK29wZXJhdG9yPT0oY29uc3QgcXVldWU8X1NUTFBfUVVFVUVfQVJHUyA+JiBfX3gsIGNvbnN0IHF1ZXVlPF9TVExQX1FVRVVFX0FSR1MgPiYgX195KSB7CisgIHJldHVybiBfX3guX0dldF9zKCkgPT0gX195Ll9HZXRfcygpOworfQorCit0ZW1wbGF0ZSA8IF9TVExQX1FVRVVFX0hFQURFUl9BUkdTID4KK2lubGluZSBib29sIF9TVExQX0NBTEwKK29wZXJhdG9yPChjb25zdCBxdWV1ZTxfU1RMUF9RVUVVRV9BUkdTID4mIF9feCwgY29uc3QgcXVldWU8X1NUTFBfUVVFVUVfQVJHUyA+JiBfX3kpIHsKKyAgcmV0dXJuIF9feC5fR2V0X3MoKSA8IF9feS5fR2V0X3MoKTsKK30KKworX1NUTFBfUkVMT1BTX09QRVJBVE9SUyggdGVtcGxhdGUgPCBfU1RMUF9RVUVVRV9IRUFERVJfQVJHUyA+LCBxdWV1ZTxfU1RMUF9RVUVVRV9BUkdTID4gKQorCisjIGlmICEoZGVmaW5lZCAoIF9TVExQX0xJTUlURURfREVGQVVMVF9URU1QTEFURVMgKSB8fCBkZWZpbmVkICggX1NUTFBfVEVNUExBVEVfUEFSQU1fU1VCVFlQRV9CVUcgKSkKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9TZXF1ZW5jZSA9IHZlY3RvcjxfVHA+LAorICAgICAgICAgIGNsYXNzIF9Db21wYXJlID0gbGVzczxfU1RMUF9IRUFERVJfVFlQRU5BTUUgX1NlcXVlbmNlOjp2YWx1ZV90eXBlPiA+CisjIGVsaWYgZGVmaW5lZCAoIF9TVExQX01JTklNVU1fREVGQVVMVF9URU1QTEFURV9QQVJBTVMgKQordGVtcGxhdGUgPGNsYXNzIF9UcD4KKyMgZWxzZQordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1NlcXVlbmNlLCBjbGFzcyBfQ29tcGFyZT4KKyMgZW5kaWYKK2NsYXNzIHByaW9yaXR5X3F1ZXVlCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EKQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfTUlOSU1VTV9ERUZBVUxUX1RFTVBMQVRFX1BBUkFNUykKKyAgICAgICAgICAgIDogcHVibGljIF9fc3RscG9ydF9jbGFzczxwcmlvcml0eV9xdWV1ZTxfVHA+ID4KKyMgIGVsc2UKKyAgICAgICAgICAgIDogcHVibGljIF9fc3RscG9ydF9jbGFzczxwcmlvcml0eV9xdWV1ZTxfVHAsIF9TZXF1ZW5jZT4gPgorIyAgZW5kaWYKKyNlbmRpZgoreworIyBpZmRlZiBfU1RMUF9NSU5JTVVNX0RFRkFVTFRfVEVNUExBVEVfUEFSQU1TCisgIHR5cGVkZWYgdmVjdG9yPF9UcD4gX1NlcXVlbmNlOworICB0eXBlZGVmIGxlc3M8IHR5cGVuYW1lIHZlY3RvcjxfVHA+Ojp2YWx1ZV90eXBlPiBfQ29tcGFyZTsKKyAgdHlwZWRlZiBwcmlvcml0eV9xdWV1ZTxfVHA+IF9TZWxmOworIyBlbHNlCisgIHR5cGVkZWYgcHJpb3JpdHlfcXVldWU8X1RwLCBfU2VxdWVuY2UsIF9Db21wYXJlPiBfU2VsZjsKKyMgZW5kaWYKK3B1YmxpYzoKKyAgdHlwZWRlZiB0eXBlbmFtZSBfU2VxdWVuY2U6OnZhbHVlX3R5cGUgICAgICB2YWx1ZV90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9TZXF1ZW5jZTo6c2l6ZV90eXBlICAgICAgIHNpemVfdHlwZTsKKyAgdHlwZWRlZiAgICAgICAgICBfU2VxdWVuY2UgICAgICAgICAgICAgICAgICBjb250YWluZXJfdHlwZTsKKworICB0eXBlZGVmIHR5cGVuYW1lIF9TZXF1ZW5jZTo6cmVmZXJlbmNlICAgICAgIHJlZmVyZW5jZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfU2VxdWVuY2U6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9yZWZlcmVuY2U7Citwcm90ZWN0ZWQ6CisgIC8vYyBpcyBhIFN0YW5kYXJkIG5hbWUgKDIzLjIuMy4yKSwgZG8gbm8gbWFrZSBpdCBTVExwb3J0IG5hbWluZyBjb252ZW50aW9uIGNvbXBsaWFudC4KKyAgX1NlcXVlbmNlIGM7CisgIF9Db21wYXJlIGNvbXA7CitwdWJsaWM6CisgIHByaW9yaXR5X3F1ZXVlKCkgOiBjKCkge30KKyAgZXhwbGljaXQgcHJpb3JpdHlfcXVldWUoY29uc3QgX0NvbXBhcmUmIF9feCkgOiAgYygpLCBjb21wKF9feCkge30KKyAgcHJpb3JpdHlfcXVldWUoY29uc3QgX0NvbXBhcmUmIF9feCwgY29uc3QgX1NlcXVlbmNlJiBfX3MpCisgICAgOiBjKF9fcyksIGNvbXAoX194KQorICAgIHsgbWFrZV9oZWFwKGMuYmVnaW4oKSwgYy5lbmQoKSwgY29tcCk7IH0KKworICBwcmlvcml0eV9xdWV1ZShfX21vdmVfc291cmNlPF9TZWxmPiBzcmMpCisgICAgOiBjKF9TVExQX1BSSVYgX0FzTW92ZVNvdXJjZShzcmMuZ2V0KCkuYykpLAorICAgICAgY29tcChfU1RMUF9QUklWIF9Bc01vdmVTb3VyY2Uoc3JjLmdldCgpLmNvbXApKSB7fQorCisjaWZkZWYgX1NUTFBfTUVNQkVSX1RFTVBMQVRFUworICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHByaW9yaXR5X3F1ZXVlKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgICA6IGMoX19maXJzdCwgX19sYXN0KSB7IG1ha2VfaGVhcChjLmJlZ2luKCksIGMuZW5kKCksIGNvbXApOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICBwcmlvcml0eV9xdWV1ZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyYXRvciBfX2xhc3QsIGNvbnN0IF9Db21wYXJlJiBfX3gpCisgICAgOiBjKF9fZmlyc3QsIF9fbGFzdCksIGNvbXAoX194KQorICAgIHsgbWFrZV9oZWFwKGMuYmVnaW4oKSwgYy5lbmQoKSwgY29tcCk7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHByaW9yaXR5X3F1ZXVlKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgY29uc3QgX0NvbXBhcmUmIF9feCwgY29uc3QgX1NlcXVlbmNlJiBfX3MpCisgIDogYyhfX3MpLCBjb21wKF9feCkKKyAgeworICAgIGMuaW5zZXJ0KGMuZW5kKCksIF9fZmlyc3QsIF9fbGFzdCk7CisgICAgbWFrZV9oZWFwKGMuYmVnaW4oKSwgYy5lbmQoKSwgY29tcCk7CisgIH0KKworI2Vsc2UgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworICBwcmlvcml0eV9xdWV1ZShjb25zdCB2YWx1ZV90eXBlKiBfX2ZpcnN0LCBjb25zdCB2YWx1ZV90eXBlKiBfX2xhc3QpCisgICAgOiBjKF9fZmlyc3QsIF9fbGFzdCkgeyBtYWtlX2hlYXAoYy5iZWdpbigpLCBjLmVuZCgpLCBjb21wKTsgfQorCisgIHByaW9yaXR5X3F1ZXVlKGNvbnN0IHZhbHVlX3R5cGUqIF9fZmlyc3QsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgY29uc3QgX0NvbXBhcmUmIF9feCkKKyAgICA6IGMoX19maXJzdCwgX19sYXN0KSwgY29tcChfX3gpCisgICAgeyBtYWtlX2hlYXAoYy5iZWdpbigpLCBjLmVuZCgpLCBjb21wKTsgfQorCisgIHByaW9yaXR5X3F1ZXVlKGNvbnN0IHZhbHVlX3R5cGUqIF9fZmlyc3QsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgY29uc3QgX0NvbXBhcmUmIF9feCwgY29uc3QgX1NlcXVlbmNlJiBfX2MpCisgICAgOiBjKF9fYyksIGNvbXAoX194KQorICB7CisgICAgYy5pbnNlcnQoYy5lbmQoKSwgX19maXJzdCwgX19sYXN0KTsKKyAgICBtYWtlX2hlYXAoYy5iZWdpbigpLCBjLmVuZCgpLCBjb21wKTsKKyAgfQorI2VuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKworICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gYy5lbXB0eSgpOyB9CisgIHNpemVfdHlwZSBzaXplKCkgY29uc3QgeyByZXR1cm4gYy5zaXplKCk7IH0KKyAgY29uc3RfcmVmZXJlbmNlIHRvcCgpIGNvbnN0IHsgcmV0dXJuIGMuZnJvbnQoKTsgfQorICB2b2lkIHB1c2goY29uc3QgdmFsdWVfdHlwZSYgX194KSB7CisgICAgX1NUTFBfVFJZIHsKKyAgICAgIGMucHVzaF9iYWNrKF9feCk7CisgICAgICBwdXNoX2hlYXAoYy5iZWdpbigpLCBjLmVuZCgpLCBjb21wKTsKKyAgICB9CisgICAgX1NUTFBfVU5XSU5EKGMuY2xlYXIoKSkKKyAgfQorICB2b2lkIHBvcCgpIHsKKyAgICBfU1RMUF9UUlkgeworICAgICAgcG9wX2hlYXAoYy5iZWdpbigpLCBjLmVuZCgpLCBjb21wKTsKKyAgICAgIGMucG9wX2JhY2soKTsKKyAgICB9CisgICAgX1NUTFBfVU5XSU5EKGMuY2xlYXIoKSkKKyAgfQorfTsKKworI2lmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfU2VxdWVuY2U+CitzdHJ1Y3QgX19tb3ZlX3RyYWl0czxxdWV1ZTxfVHAsIF9TZXF1ZW5jZT4gPiA6CisgIF9TVExQX1BSSVYgX19tb3ZlX3RyYWl0c19hdXg8X1NlcXVlbmNlPgore307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9TZXF1ZW5jZSwgY2xhc3MgX0NvbXBhcmU+CitzdHJ1Y3QgX19tb3ZlX3RyYWl0czxwcmlvcml0eV9xdWV1ZTxfVHAsIF9TZXF1ZW5jZSwgX0NvbXBhcmU+ID4gOgorICBfU1RMUF9QUklWIF9fbW92ZV90cmFpdHNfYXV4MjxfU2VxdWVuY2UsIF9Db21wYXJlPgore307CisjZW5kaWYgLyogX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTiAqLworCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyN1bmRlZiBfU1RMUF9RVUVVRV9BUkdTCisjdW5kZWYgX1NUTFBfUVVFVUVfSEVBREVSX0FSR1MKKyN1bmRlZiBjb21wCisKKyNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9RVUVVRV9IICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvX3JhbmdlX2Vycm9ycy5oIGIvc3RsL19yYW5nZV9lcnJvcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODNkMjY1Ci0tLSAvZGV2L251bGwKKysrIGIvc3RsL19yYW5nZV9lcnJvcnMuaApAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogU2lsaWNvbiBHcmFwaGljcworICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX1JBTkdFX0VSUk9SU19ICisjZGVmaW5lIF9TVExQX1JBTkdFX0VSUk9SU19ICisKKy8vIEEgZmV3IHBsYWNlcyBpbiB0aGUgU1RMIHRocm93IHJhbmdlIGVycm9ycywgdXNpbmcgc3RhbmRhcmQgZXhjZXB0aW9uCisvLyBjbGFzc2VzIGRlZmluZWQgaW4gPHN0ZGV4Y2VwdD4uICBUaGlzIGhlYWRlciBmaWxlIHByb3ZpZGVzIGZ1bmN0aW9ucworLy8gdG8gdGhyb3cgdGhvc2UgZXhjZXB0aW9uIG9iamVjdHMuCisKKy8vIF9TVExQX0RPTlRfVEhST1dfUkFOR0VfRVJST1JTIGlzIGEgaG9vayBzbyB0aGF0IHVzZXJzIGNhbiBkaXNhYmxlCisvLyB0aGlzIGV4Y2VwdGlvbiB0aHJvd2luZy4KKyNpZiBkZWZpbmVkIChfU1RMUF9DQU5fVEhST1dfUkFOR0VfRVJST1JTKSAmJiBkZWZpbmVkIChfU1RMUF9VU0VfRVhDRVBUSU9OUykgJiYgXAorICAgIWRlZmluZWQgKF9TVExQX0RPTlRfVEhST1dfUkFOR0VfRVJST1JTKQorIyAgZGVmaW5lIF9TVExQX1RIUk9XX1JBTkdFX0VSUk9SUworI2VuZGlmCisKKy8vIEZvciB0aGUgU1RMcG9ydCBpb3N0cmVhbXMsIG9ubHkgZGVjbGFyYXRpb24gaGVyZSwgZGVmaW5pdGlvbiBpcyBpbiB0aGUgbGliCisjaWYgIWRlZmluZWQgKF9TVExQX1VTRV9OT19JT1NUUkVBTVMpICYmIFwKKyAgICAhZGVmaW5lZCAoX1NUTFBfVVNFX05PX0VYVEVSTl9SQU5HRV9FUlJPUlMpICYmIFwKKyAgICAhZGVmaW5lZCAoX1NUTFBfRVhURVJOX1JBTkdFX0VSUk9SUykKKyMgIGRlZmluZSBfU1RMUF9FWFRFUk5fUkFOR0VfRVJST1JTCisjZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCit2b2lkIF9TVExQX0ZVTkNUSU9OX1RIUk9XUyBfU1RMUF9ERUNMU1BFQyBfU1RMUF9DQUxMIF9fc3RsX3Rocm93X3J1bnRpbWVfZXJyb3IoY29uc3QgY2hhciogX19tc2cpOwordm9pZCBfU1RMUF9GVU5DVElPTl9USFJPV1MgX1NUTFBfREVDTFNQRUMgX1NUTFBfQ0FMTCBfX3N0bF90aHJvd19yYW5nZV9lcnJvcihjb25zdCBjaGFyKiBfX21zZyk7Cit2b2lkIF9TVExQX0ZVTkNUSU9OX1RIUk9XUyBfU1RMUF9ERUNMU1BFQyBfU1RMUF9DQUxMIF9fc3RsX3Rocm93X291dF9vZl9yYW5nZShjb25zdCBjaGFyKiBfX21zZyk7Cit2b2lkIF9TVExQX0ZVTkNUSU9OX1RIUk9XUyBfU1RMUF9ERUNMU1BFQyBfU1RMUF9DQUxMIF9fc3RsX3Rocm93X2xlbmd0aF9lcnJvcihjb25zdCBjaGFyKiBfX21zZyk7Cit2b2lkIF9TVExQX0ZVTkNUSU9OX1RIUk9XUyBfU1RMUF9ERUNMU1BFQyBfU1RMUF9DQUxMIF9fc3RsX3Rocm93X2ludmFsaWRfYXJndW1lbnQoY29uc3QgY2hhciogX19tc2cpOwordm9pZCBfU1RMUF9GVU5DVElPTl9USFJPV1MgX1NUTFBfREVDTFNQRUMgX1NUTFBfQ0FMTCBfX3N0bF90aHJvd19vdmVyZmxvd19lcnJvcihjb25zdCBjaGFyKiBfX21zZyk7CitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfRVhURVJOX1JBTkdFX0VSUk9SUykKKworIyAgaWYgZGVmaW5lZChfU1RMUF9USFJPV19SQU5HRV9FUlJPUlMpCisjICAgIGlmbmRlZiBfU1RMUF9JTlRFUk5BTF9TVERFWENFUFQKKyMgICAgICBpbmNsdWRlIDxzdGwvX3N0ZGV4Y2VwdC5oPgorIyAgICBlbmRpZgorIyAgICBpZm5kZWYgX1NUTFBfU1RSSU5HCisjICAgICAgaW5jbHVkZSA8c3RyaW5nPgorIyAgICBlbmRpZgorIyAgICBkZWZpbmUgX1NUTFBfVEhST1dfTVNHKGV4LG1zZykgIHRocm93IGV4KHN0cmluZyhtc2cpKQorIyAgZWxzZQorIyAgICBpZiBkZWZpbmVkIChfU1RMUF9SVFRJX0JVRykKKyMgICAgICBkZWZpbmUgX1NUTFBfVEhST1dfTVNHKGV4LG1zZykgIFRlcm1pbmF0ZVByb2Nlc3MoR2V0Q3VycmVudFByb2Nlc3MoKSwgMCkKKyMgICAgZWxzZQorIyAgICAgIGlmbmRlZiBfU1RMUF9JTlRFUk5BTF9DU1RETElCCisjICAgICAgICBpbmNsdWRlIDxzdGwvX2NzdGRsaWIuaD4KKyMgICAgICBlbmRpZgorIyAgICAgIGlmbmRlZiBfU1RMUF9JTlRFUk5BTF9DU1RESU8KKyMgICAgICAgIGluY2x1ZGUgPHN0bC9fY3N0ZGlvLmg+CisjICAgICAgZW5kaWYKKyMgICAgICBkZWZpbmUgX1NUTFBfVEhST1dfTVNHKGV4LG1zZykgIHB1dHMobXNnKSxfU1RMUF9BQk9SVCgpCisjICAgIGVuZGlmCisjICBlbmRpZgorCisvLyBGb3IgbW9kZSB3aXRob3V0IGxpYnJhcnkgYW5kIHRocm93aW5nIHJhbmdlIGVycm9ycywgaW5jbHVkZSB0aGUKKy8vIHN0ZGV4Y2VwdCBoZWFkZXIgYW5kIHRocm93IHRoZSBhcHByb3ByaWF0ZSBleGNlcHRpb25zIGRpcmVjdGx5LgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworaW5saW5lIHZvaWQgX1NUTFBfREVDTFNQRUMgX1NUTFBfQ0FMTCBfX3N0bF90aHJvd19ydW50aW1lX2Vycm9yKGNvbnN0IGNoYXIqIF9fbXNnKQoreyBfU1RMUF9USFJPV19NU0cocnVudGltZV9lcnJvciwgX19tc2cpOyB9CisKK2lubGluZSB2b2lkIF9TVExQX0RFQ0xTUEVDIF9TVExQX0NBTEwgX19zdGxfdGhyb3dfcmFuZ2VfZXJyb3IoY29uc3QgY2hhciogX19tc2cpCit7IF9TVExQX1RIUk9XX01TRyhyYW5nZV9lcnJvciwgX19tc2cpOyB9CisKK2lubGluZSB2b2lkIF9TVExQX0RFQ0xTUEVDIF9TVExQX0NBTEwgX19zdGxfdGhyb3dfb3V0X29mX3JhbmdlKGNvbnN0IGNoYXIqIF9fbXNnKQoreyBfU1RMUF9USFJPV19NU0cob3V0X29mX3JhbmdlLCBfX21zZyk7IH0KKworaW5saW5lIHZvaWQgX1NUTFBfREVDTFNQRUMgX1NUTFBfQ0FMTCBfX3N0bF90aHJvd19sZW5ndGhfZXJyb3IoY29uc3QgY2hhciogX19tc2cpCit7IF9TVExQX1RIUk9XX01TRyhsZW5ndGhfZXJyb3IsIF9fbXNnKTsgfQorCitpbmxpbmUgdm9pZCBfU1RMUF9ERUNMU1BFQyBfU1RMUF9DQUxMIF9fc3RsX3Rocm93X2ludmFsaWRfYXJndW1lbnQoY29uc3QgY2hhciogX19tc2cpCit7IF9TVExQX1RIUk9XX01TRyhpbnZhbGlkX2FyZ3VtZW50LCBfX21zZyk7IH0KKworaW5saW5lIHZvaWQgX1NUTFBfREVDTFNQRUMgX1NUTFBfQ0FMTCBfX3N0bF90aHJvd19vdmVyZmxvd19lcnJvcihjb25zdCBjaGFyKiBfX21zZykKK3sgX1NUTFBfVEhST1dfTVNHKG92ZXJmbG93X2Vycm9yLCBfX21zZyk7IH0KKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjICB1bmRlZiBfU1RMUF9USFJPV19NU0cKKworI2VuZGlmIC8qIEVYVEVSTl9SQU5HRV9FUlJPUlMgKi8KKworI2VuZGlmIC8qIF9TVExQX1JBTkdFX0VSUk9SU19IICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvX3Jhd19zdG9yYWdlX2l0ZXIuaCBiL3N0bC9fcmF3X3N0b3JhZ2VfaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNGJjMmUKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvX3Jhd19zdG9yYWdlX2l0ZXIuaApAQCAtMCwwICsxLDgwIEBACisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBNb3Njb3cgQ2VudGVyIGZvciBTUEFSQyBUZWNobm9sb2d5CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworLyogTk9URTogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgU1RMIGhlYWRlcnMuCisgKiBZb3Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4KKyAqLworCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX1JBV19TVE9SQUdFX0lURVJBVE9SX0gKKyNkZWZpbmUgX1NUTFBfSU5URVJOQUxfUkFXX1NUT1JBR0VfSVRFUkFUT1JfSAorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0lURVJBVE9SX0JBU0VfSAorIyAgaW5jbHVkZSA8c3RsL19pdGVyYXRvcl9iYXNlLmg+CisjZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yLCBjbGFzcyBfVHA+CitjbGFzcyByYXdfc3RvcmFnZV9pdGVyYXRvcgorICAgICAgOiBwdWJsaWMgaXRlcmF0b3I8b3V0cHV0X2l0ZXJhdG9yX3RhZyx2b2lkLHZvaWQsdm9pZCx2b2lkPgoreworcHJvdGVjdGVkOgorICBfRm9yd2FyZEl0ZXJhdG9yIF9NX2l0ZXI7CitwdWJsaWM6CisgIHR5cGVkZWYgb3V0cHV0X2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKKyMgaWZkZWYgX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTgorICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisjIGVuZGlmCisgIGV4cGxpY2l0IHJhd19zdG9yYWdlX2l0ZXJhdG9yKF9Gb3J3YXJkSXRlcmF0b3IgX194KSA6IF9NX2l0ZXIoX194KSB7fQorICByYXdfc3RvcmFnZV9pdGVyYXRvcjxfRm9yd2FyZEl0ZXJhdG9yLCBfVHA+JiBvcGVyYXRvciooKSB7IHJldHVybiAqdGhpczsgfQorICByYXdfc3RvcmFnZV9pdGVyYXRvcjxfRm9yd2FyZEl0ZXJhdG9yLCBfVHA+JiBvcGVyYXRvcj0oY29uc3QgX1RwJiBfX2VsZW1lbnQpIHsKKyAgICBfUGFyYW1fQ29uc3RydWN0KCYqX01faXRlciwgX19lbGVtZW50KTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgcmF3X3N0b3JhZ2VfaXRlcmF0b3I8X0ZvcndhcmRJdGVyYXRvciwgX1RwPiYgb3BlcmF0b3IrKygpIHsKKyAgICArK19NX2l0ZXI7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIHJhd19zdG9yYWdlX2l0ZXJhdG9yPF9Gb3J3YXJkSXRlcmF0b3IsIF9UcD4gb3BlcmF0b3IrKyhpbnQpIHsKKyAgICByYXdfc3RvcmFnZV9pdGVyYXRvcjxfRm9yd2FyZEl0ZXJhdG9yLCBfVHA+IF9fdG1wID0gKnRoaXM7CisgICAgKytfTV9pdGVyOworICAgIHJldHVybiBfX3RtcDsKKyAgfQorfTsKKworIyBpZmRlZiBfU1RMUF9VU0VfT0xEX0hQX0lURVJBVE9SX1FVRVJJRVMKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yLCBjbGFzcyBfVHA+CitpbmxpbmUgb3V0cHV0X2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeShjb25zdCByYXdfc3RvcmFnZV9pdGVyYXRvcjxfRm9yd2FyZEl0ZXJhdG9yLCBfVHA+JikgeyByZXR1cm4gb3V0cHV0X2l0ZXJhdG9yX3RhZygpOyB9CisjZW5kaWYKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2VuZGlmIC8qIF9TVExQX0lOVEVSTkFMX1JBV19TVE9SQUdFX0lURVJBVE9SX0ggKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9fcmVsb3BzX2NvbnQuaCBiL3N0bC9fcmVsb3BzX2NvbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDhlYzA1Ci0tLSAvZGV2L251bGwKKysrIGIvc3RsL19yZWxvcHNfY29udC5oCkBAIC0wLDAgKzEsMjkgQEAKKy8vIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gZmlsZSB3aGljaAorLy8gaXMgaW50ZW5kZWQgdG8gYmUgaW5jbHVkZWQgbXVsdGlwbGUgdGltZXMgd2l0aCBkaWZmZXJlbnQgX1NUTFBfQVNTT0NJQVRJVkVfQ09OVEFJTkVSCisvLyBzZXR0aW5nCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfRVFVQUxfT1BFUkFUT1JfU1BFQ0lBTElaRUQpCitfU1RMUF9URU1QTEFURV9IRUFERVIKK2lubGluZSBib29sIF9TVExQX0NBTEwgb3BlcmF0b3I9PShjb25zdCBfU1RMUF9URU1QTEFURV9DT05UQUlORVImIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfU1RMUF9URU1QTEFURV9DT05UQUlORVImIF9feSkgeworICByZXR1cm4gX194LnNpemUoKSA9PSBfX3kuc2l6ZSgpICYmCisgICAgICAgICBlcXVhbChfX3guYmVnaW4oKSwgX194LmVuZCgpLCBfX3kuYmVnaW4oKSk7Cit9CisjZW5kaWYgLyogX1NUTFBfRVFVQUxfT1BFUkFUT1JfU1BFQ0lBTElaRUQgKi8KKworX1NUTFBfVEVNUExBVEVfSEVBREVSCitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yPChjb25zdCBfU1RMUF9URU1QTEFURV9DT05UQUlORVImIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9TVExQX1RFTVBMQVRFX0NPTlRBSU5FUiYgX195KSB7CisgIHJldHVybiBsZXhpY29ncmFwaGljYWxfY29tcGFyZShfX3guYmVnaW4oKSwgX194LmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX195LmJlZ2luKCksIF9feS5lbmQoKSk7Cit9CisKK19TVExQX1JFTE9QU19PUEVSQVRPUlMoIF9TVExQX1RFTVBMQVRFX0hFQURFUiAsIF9TVExQX1RFTVBMQVRFX0NPTlRBSU5FUiApCisKKyNpZiBkZWZpbmVkIChfU1RMUF9GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIpCitfU1RMUF9URU1QTEFURV9IRUFERVIKK2lubGluZSB2b2lkIF9TVExQX0NBTEwgc3dhcChfU1RMUF9URU1QTEFURV9DT05UQUlORVImIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9URU1QTEFURV9DT05UQUlORVImIF9feSkgeworICBfX3guc3dhcChfX3kpOworfQorI2VuZGlmIC8qIF9TVExQX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUiAqLwpkaWZmIC0tZ2l0IGEvc3RsL19yZWxvcHNfaGFzaF9jb250LmggYi9zdGwvX3JlbG9wc19oYXNoX2NvbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjFjODA1Ci0tLSAvZGV2L251bGwKKysrIGIvc3RsL19yZWxvcHNfaGFzaF9jb250LmgKQEAgLTAsMCArMSwxMyBAQAorLyogVGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBmaWxlIHdoaWNoIGlzIGludGVuZGVkIHRvIGJlIGluY2x1ZGVkCisgKiBtdWx0aXBsZSB0aW1lcyB3aXRoIGRpZmZlcmVudCBfU1RMUF9URU1QTEFURV9DT05UQUlORVIgc2V0dGluZ3MuCisgKi8KKworI2lmIGRlZmluZWQgKF9TVExQX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUikKKworX1NUTFBfVEVNUExBVEVfSEVBREVSCitpbmxpbmUgdm9pZCBfU1RMUF9DQUxMCitzd2FwKF9TVExQX1RFTVBMQVRFX0NPTlRBSU5FUiYgX19obTEsIF9TVExQX1RFTVBMQVRFX0NPTlRBSU5FUiYgX19obTIpIHsKKyAgX19obTEuc3dhcChfX2htMik7Cit9CisKKyNlbmRpZiAvKiBfU1RMUF9GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIgKi8KZGlmZiAtLWdpdCBhL3N0bC9fcm9wZS5jIGIvc3RsL19yb3BlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFhOGZkYQotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9fcm9wZS5jCkBAIC0wLDAgKzEsMTQzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisvKiBOT1RFOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBTVEwgaGVhZGVycy4KKyAqICAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuCisgKi8KKworLy8gU2V0IGJ1Zl9zdGFydCwgYnVmX2VuZCwgYW5kIGJ1Zl9wdHIgYXBwcm9wcmlhdGVseSwgZmlsbGluZyB0bXBfYnVmCisvLyBpZiBuZWNlc3NhcnkuICBBc3N1bWVzIHBhdGhfZW5kW2xlYWZfaW5kZXhdIGFuZCBsZWFmX3BvcyBhcmUgY29ycmVjdC4KKy8vIFJlc3VsdHMgaW4gYSB2YWxpZCBidWZfcHRyIGlmIHRoZSBpdGVyYXRvciBjYW4gYmUgbGVnaXRpbWF0ZWx5CisvLyBkZXJlZmVyZW5jZWQuCisjaWZuZGVmIF9TVExQX1JPUEVJTVBMX0gKKyNkZWZpbmUgX1NUTFBfUk9QRUlNUExfSAorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX1JPUEVfSAorIyAgaW5jbHVkZSA8c3RsL19yb3BlLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DU1RESU8KKyMgIGluY2x1ZGUgPHN0bC9fY3N0ZGlvLmg+CisjZW5kaWYKKworI2lmICFkZWZpbmVkIChfU1RMUF9VU0VfTk9fSU9TVFJFQU1TKQorIyAgaWZuZGVmIF9TVExQX0lPU1RSRUFNCisjICAgIGluY2x1ZGUgPGlvc3RyZWFtPgorIyAgZW5kaWYKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RsL19yYW5nZV9lcnJvcnMuaD4KKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKKyMgaWYgZGVmaW5lZCAoIF9TVExQX05FU1RFRF9UWVBFX1BBUkFNX0JVRyApCisjIGRlZmluZSBfX2FsbG9jYXRvcl9fIF9BbGxvYworIyBlbHNlCisjIGRlZmluZSBfX2FsbG9jYXRvcl9fIGFsbG9jYXRvcl90eXBlCisjIGVuZGlmCisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorX1JvcGVfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+OjpfUm9wZV9pdGVyYXRvcihyb3BlPF9DaGFyVCxfQWxsb2M+KiBfX3IsIHNpemVfdCBfX3BvcykKKyAgOiBfUm9wZV9pdGVyYXRvcl9iYXNlPF9DaGFyVCxfQWxsb2M+KF9fci0+X01fdHJlZV9wdHIuX01fZGF0YSwgX19wb3MpLAorICBfTV9yb290X3JvcGUoX19yKSB7IF9Sb3BlUmVwOjpfU19yZWYodGhpcy0+X01fcm9vdCk7IH0KKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CitfUm9wZV9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz46Ol9Sb3BlX2l0ZXJhdG9yKHJvcGU8X0NoYXJULF9BbGxvYz4mIF9fciwgc2l6ZV90IF9fcG9zKToKKyAgX1JvcGVfaXRlcmF0b3JfYmFzZTxfQ2hhclQsX0FsbG9jPihfX3IuX01fdHJlZV9wdHIuX01fZGF0YSwgX19wb3MpLAorICBfTV9yb290X3JvcGUoJl9fcikgeworI2lmICFkZWZpbmVkIChfX0RNQ19fKQorICBfUm9wZVJlcDo6X1NfcmVmKHRoaXMtPl9NX3Jvb3QpOyBpZiAoIShfX3IuZW1wdHkoKSkpX1Nfc2V0Y2FjaGUoKnRoaXMpOworI2Vsc2UKKyAgX1JvcGVfaXRlcmF0b3JfYmFzZTxfQ2hhclQsIF9BbGxvYz4qIF9feCA9IHRoaXM7CisgIF9Sb3BlUmVwOjpfU19yZWYodGhpcy0+X01fcm9vdCk7IGlmICghKF9fci5lbXB0eSgpKSlfU19zZXRjYWNoZSgqX194KTsKKyNlbmRpZgorfQorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KK3ZvaWQgX1JvcGVfUm9wZVJlcDxfQ2hhclQsIF9BbGxvYz46Ol9NX2ZyZWVfY19zdHJpbmcoKSB7CisgIF9DaGFyVCogX19jc3RyID0gX01fY19zdHJpbmc7CisgIGlmICgwICE9IF9fY3N0cikgeworICAgIHNpemVfdCBfcF9zaXplID0gX01fc2l6ZS5fTV9kYXRhICsgMTsKKyAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95X1JhbmdlKF9fY3N0ciwgX19jc3RyICsgX3Bfc2l6ZSk7CisgICAgX01fc2l6ZS5kZWFsbG9jYXRlKF9fY3N0ciwgX3Bfc2l6ZSk7CisgIH0KK30KKworLy8gU2V0IGJ1Zl9zdGFydCwgYnVmX2VuZCwgYW5kIGJ1Zl9wdHIgYXBwcm9wcmlhdGVseSwgZmlsbGluZyB0bXBfYnVmCisvLyBpZiBuZWNlc3NhcnkuICBBc3N1bWVzIF9NX3BhdGhfZW5kW2xlYWZfaW5kZXhdIGFuZCBsZWFmX3BvcyBhcmUgY29ycmVjdC4KKy8vIFJlc3VsdHMgaW4gYSB2YWxpZCBidWZfcHRyIGlmIHRoZSBpdGVyYXRvciBjYW4gYmUgbGVnaXRpbWF0ZWx5CisvLyBkZXJlZmVyZW5jZWQuCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+Cit2b2lkIF9Sb3BlX2l0ZXJhdG9yX2Jhc2U8X0NoYXJULF9BbGxvYz46Ol9TX3NldGJ1ZigKKyAgX1JvcGVfaXRlcmF0b3JfYmFzZTxfQ2hhclQsX0FsbG9jPiYgX194KSB7CisgIGNvbnN0IF9Sb3BlUmVwKiBfX2xlYWYgPSBfX3guX01fcGF0aF9lbmQuX01fZGF0YVtfX3guX01fbGVhZl9pbmRleF07CisgIHNpemVfdCBfX2xlYWZfcG9zID0gX194Ll9NX2xlYWZfcG9zOworICBzaXplX3QgX19wb3MgPSBfX3guX01fY3VycmVudF9wb3M7CisKKyAgc3dpdGNoKF9fbGVhZi0+X01fdGFnKSB7CisgIGNhc2UgX1JvcGVSZXA6Ol9TX2xlYWY6CisgICAgdHlwZWRlZiBfUm9wZV9Sb3BlTGVhZjxfQ2hhclQsIF9BbGxvYz4gX1JvcGVMZWFmOworICAgIF9feC5fTV9idWZfc3RhcnQgPSBfX1NUQVRJQ19DQVNUKGNvbnN0IF9Sb3BlTGVhZiosIF9fbGVhZiktPl9NX2RhdGE7CisgICAgX194Ll9NX2J1Zl9wdHIgPSBfX3guX01fYnVmX3N0YXJ0ICsgKF9fcG9zIC0gX19sZWFmX3Bvcyk7CisgICAgX194Ll9NX2J1Zl9lbmQgPSBfX3guX01fYnVmX3N0YXJ0ICsgX19sZWFmLT5fTV9zaXplLl9NX2RhdGE7CisgICAgYnJlYWs7CisgIGNhc2UgX1JvcGVSZXA6Ol9TX2Z1bmN0aW9uOgorICBjYXNlIF9Sb3BlUmVwOjpfU19zdWJzdHJpbmdmbjoKKyAgICB7CisgICAgICBzaXplX3QgX19sZW4gPSBfU19pdGVyYXRvcl9idWZfbGVuOworICAgICAgc2l6ZV90IF9fYnVmX3N0YXJ0X3BvcyA9IF9fbGVhZl9wb3M7CisgICAgICBzaXplX3QgX19sZWFmX2VuZCA9IF9fbGVhZl9wb3MgKyBfX2xlYWYtPl9NX3NpemUuX01fZGF0YTsKKyAgICAgIHR5cGVkZWYgX1JvcGVfUm9wZUZ1bmN0aW9uPF9DaGFyVCwgX0FsbG9jPiBfUm9wZUZ1bmN0aW9uOworICAgICAgY2hhcl9wcm9kdWNlcjxfQ2hhclQ+KiBfX2ZuID0gX19TVEFUSUNfQ0FTVChjb25zdCBfUm9wZUZ1bmN0aW9uKiwgX19sZWFmKS0+X01fZm47CisKKyAgICAgIGlmIChfX2J1Zl9zdGFydF9wb3MgKyBfX2xlbiA8PSBfX3BvcykgeworICAgICAgICBfX2J1Zl9zdGFydF9wb3MgPSBfX3BvcyAtIF9fbGVuLzQ7CisgICAgICAgIGlmIChfX2J1Zl9zdGFydF9wb3MgKyBfX2xlbiA+IF9fbGVhZl9lbmQpIHsKKyAgICAgICAgICBfX2J1Zl9zdGFydF9wb3MgPSBfX2xlYWZfZW5kIC0gX19sZW47CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChfX2J1Zl9zdGFydF9wb3MgKyBfX2xlbiA+IF9fbGVhZl9lbmQpIHsKKyAgICAgICAgX19sZW4gPSBfX2xlYWZfZW5kIC0gX19idWZfc3RhcnRfcG9zOworICAgICAgfQorICAgICAgKCpfX2ZuKShfX2J1Zl9zdGFydF9wb3MgLSBfX2xlYWZfcG9zLCBfX2xlbiwgX194Ll9NX3RtcF9idWYuX01fZGF0YSk7CisgICAgICBfX3guX01fYnVmX3B0ciA9IF9feC5fTV90bXBfYnVmLl9NX2RhdGEgKyAoX19wb3MgLSBfX2J1Zl9zdGFydF9wb3MpOworICAgICAgX194Ll9NX2J1Zl9zdGFydCA9IF9feC5fTV90bXBfYnVmLl9NX2RhdGE7CisgICAgICBfX3guX01fYnVmX2VuZCA9IF9feC5fTV90bXBfYnVmLl9NX2RhdGEgKyBfX2xlbjsKKyAgICB9CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgICBfU1RMUF9BU1NFUlQoMCkKKyAgICAgIDsKKyAgfQorfQorCisvLyBTZXQgcGF0aCBhbmQgYnVmZmVyIGluc2lkZSBhIHJvcGUgaXRlcmF0b3IuICBXZSBhc3N1bWUgdGhhdAorLy8gcG9zIGFuZCByb290IGFyZSBhbHJlYWR5IHNldC4KK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KK3ZvaWQgX1JvcGVfaXRlcmF0b3JfYmFzZTxfQ2hhclQsX0FsbG9jPjo6X1Nfc2V0Y2FjaGUoCisgIF9Sb3BlX2l0ZXJhdG9yX2Jhc2U8X0NoYXJULF9BbGxvYz4mIF9feCkgeworICBjb25zdCBfUm9wZVJlcCogX19wYXRoW19Sb3BlUmVwOjpfU19tYXhfcm9wZV9kZXB0aCsxXTsKKyAgY29uc3QgX1JvcGVSZXAqIF9fY3Vycl9yb3BlOworICBpbnQgX19jdXJyX2RlcHRoID0gLTE7ICAvKiBpbmRleCBpbnRvIHBhdGggICAgKi8KKyAgc2l6ZV90IF9fY3Vycl9zdGFydF9wb3MgPSAwOworICBzaXplX3QgX19wb3MgPSBfX3guX01fY3VycmVudF9wb3M7CisgIHVuc2lnbmVkIGNoYXIgX19kaXJucyA9IDA7IC8vIEJpdCB2ZWN0b3IgbWFya2luZyByaWdodCB0dXJucyBpbiB0aGUgcGF0aAorCisgIF9TVExQX0FTU0VSVChfX3BvcyA8PSBfX3guX01fcm9vdC0+X01fc2l6ZS5fTV9kYXRhKQorICBpZiAoX19wb3MgPj0gX194Ll9NX3Jvb3QtPl9NX3NpemUuX01fZGF0YSkgeworICAgIF9feC5fTV9idWZfcHRyID0gMDsKKyAgICByZXR1cm47CisgIH0KKyAgX19jdXJyX3JvcGUgPSBfX3guX01fcm9vdDsKKyAgaWYgKDAgIT0gX19jdXJyX3JvcGUtPl9NX2Nfc3RyaW5nKSB7CisgICAgLyogVHJlYXQgdGhlIHJvb3QgYXMgYSBsZWFmLiAqLworICAgIF9feC5fTV9idWZfc3RhcnQgPSBfX2N1cnJfcm9wZS0+X01fY19zdHJpbmc7CisgICAgX194Ll9NX2J1Zl9lbmQgPSBfX2N1cnJfcm9wZS0+X01fY19zdHJpbmcgKyBfX2N1cnJfcm9wZS0+X01fc2l6ZS5fTV9kYXRhOworICAgIF9feC5fTV9idWZfcHRyID0gX19jdXJyX3JvcGUtPl9NX2Nfc3RyaW5nICsgX19wb3M7CisgICAgX194Ll9NX3BhdGhfZW5kLl9NX2RhdGFbMF0gPSBfX2N1cnJfcm9wZTsKKyAgICBfX3guX01fbGVhZl9pbmRleCA9IDA7CisgICAgX194Ll9NX2xlYWZfcG9zID0gMDsKKyAgICByZXR1cm47CisgIH0KKyAgZm9yKDs7KSB7CisgICAgKytfX2N1cnJfZGVwdGg7CisgICAgX1NUTFBfQVNTRVJUKF9fY3Vycl9kZXB0aCA8PSBfUm9wZVJlcDo6X1NfbWF4X3JvcGVfZGVwdGgpCisgICAgX19wYXRoW19fY3Vycl9kZXB0aF0gPSBfX2N1cnJfcm9wZTsKKyAgICBzd2l0Y2goX19jdXJyX3JvcGUtPl9NX3RhZykgeworICAgIGNhc2UgX1JvcGVSZXA6Ol9TX2xlYWY6CisgICAgY2FzZSBfUm9wZVJlcDo6X1NfZnVuY3Rpb246CisgICAgY2FzZSBfUm9wZVJlcDo6X1Nfc3Vic3RyaW5nZm46CisgICAgICBfX3guX01fbGVhZl9wb3MgPSBfX2N1cnJfc3RhcnRfcG9zOworICAgICAgZ290byBkb25lOworICAgIGNhc2UgX1JvcGVSZXA6Ol9TX2NvbmNhdDoKKyAgICAgIHsKKyAgICAgICAgY29uc3QgX1JvcGVDb25jYXQqIF9fYyA9IF9fU1RBVElDX0NBU1QoY29uc3QgX1JvcGVDb25jYXQqLCBfX2N1cnJfcm9wZSk7CisgICAgICAgIF9Sb3BlUmVwKiBfX2xlZnQgPSBfX2MtPl9NX2xlZnQ7CisgICAgICAgIHNpemVfdCBfX2xlZnRfbGVuID0gX19sZWZ0LT5fTV9zaXplLl9NX2RhdGE7CisKKyAgICAgICAgX19kaXJucyA8PD0gMTsKKyAgICAgICAgaWYgKF9fcG9zID49IF9fY3Vycl9zdGFydF9wb3MgKyBfX2xlZnRfbGVuKSB7CisgICAgICAgICAgX19kaXJucyB8PSAxOworICAgICAgICAgIF9fY3Vycl9yb3BlID0gX19jLT5fTV9yaWdodDsKKyAgICAgICAgICBfX2N1cnJfc3RhcnRfcG9zICs9IF9fbGVmdF9sZW47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgX19jdXJyX3JvcGUgPSBfX2xlZnQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorZG9uZToKKyAgICAvLyBDb3B5IGxhc3Qgc2VjdGlvbiBvZiBwYXRoIGludG8gX01fcGF0aF9lbmQuCisgIHsKKyAgICBpbnQgX19pID0gLTE7CisgICAgaW50IF9faiA9IF9fY3Vycl9kZXB0aCArIDEgLSBfU19wYXRoX2NhY2hlX2xlbjsKKworICAgIGlmIChfX2ogPCAwKSBfX2ogPSAwOworICAgIHdoaWxlIChfX2ogPD0gX19jdXJyX2RlcHRoKSB7CisgICAgICBfX3guX01fcGF0aF9lbmQuX01fZGF0YVsrK19faV0gPSBfX3BhdGhbX19qKytdOworICAgIH0KKyAgICBfX3guX01fbGVhZl9pbmRleCA9IF9faTsKKyAgfQorICBfX3guX01fcGF0aF9kaXJlY3Rpb25zID0gX19kaXJuczsKKyAgX1Nfc2V0YnVmKF9feCk7Cit9CisKKy8vIFNwZWNpYWxpemVkIHZlcnNpb24gb2YgdGhlIGFib3ZlLiAgQXNzdW1lcyB0aGF0CisvLyB0aGUgcGF0aCBjYWNoZSBpcyB2YWxpZCBmb3IgdGhlIHByZXZpb3VzIHBvc2l0aW9uLgordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgordm9pZCBfUm9wZV9pdGVyYXRvcl9iYXNlPF9DaGFyVCxfQWxsb2M+OjpfU19zZXRjYWNoZV9mb3JfaW5jcigKK19Sb3BlX2l0ZXJhdG9yX2Jhc2U8X0NoYXJULF9BbGxvYz4mIF9feCkgeworICBpbnQgX19jdXJyZW50X2luZGV4ID0gX194Ll9NX2xlYWZfaW5kZXg7CisgIGNvbnN0IF9Sb3BlUmVwKiBfX2N1cnJlbnRfbm9kZSA9IF9feC5fTV9wYXRoX2VuZC5fTV9kYXRhW19fY3VycmVudF9pbmRleF07CisgIHNpemVfdCBfX2xlbiA9IF9fY3VycmVudF9ub2RlLT5fTV9zaXplLl9NX2RhdGE7CisgIHNpemVfdCBfX25vZGVfc3RhcnRfcG9zID0gX194Ll9NX2xlYWZfcG9zOworICB1bnNpZ25lZCBjaGFyIF9fZGlybnMgPSBfX3guX01fcGF0aF9kaXJlY3Rpb25zOworICBjb25zdCBfUm9wZUNvbmNhdCogX19jOworCisgIF9TVExQX0FTU0VSVChfX3guX01fY3VycmVudF9wb3MgPD0gX194Ll9NX3Jvb3QtPl9NX3NpemUuX01fZGF0YSkKKyAgaWYgKF9feC5fTV9jdXJyZW50X3BvcyAtIF9fbm9kZV9zdGFydF9wb3MgPCBfX2xlbikgeworICAgIC8qIE1vcmUgc3R1ZmYgaW4gdGhpcyBsZWFmLCB3ZSBqdXN0IGRpZG4ndCBjYWNoZSBpdC4gKi8KKyAgICBfU19zZXRidWYoX194KTsKKyAgICByZXR1cm47CisgIH0KKyAgX1NUTFBfQVNTRVJUKF9fbm9kZV9zdGFydF9wb3MgKyBfX2xlbiA9PSBfX3guX01fY3VycmVudF9wb3MpCisgICAgLy8gIG5vZGVfc3RhcnRfcG9zIGlzIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIGxhc3Rfbm9kZS4KKyAgd2hpbGUgKC0tX19jdXJyZW50X2luZGV4ID49IDApIHsKKyAgICBpZiAoIShfX2Rpcm5zICYgMSkgLyogUGF0aCB0dXJuZWQgbGVmdCAqLykKKyAgICAgIGJyZWFrOworICAgIF9fY3VycmVudF9ub2RlID0gX194Ll9NX3BhdGhfZW5kLl9NX2RhdGFbX19jdXJyZW50X2luZGV4XTsKKyAgICBfX2MgPSBfX1NUQVRJQ19DQVNUKGNvbnN0IF9Sb3BlQ29uY2F0KiwgX19jdXJyZW50X25vZGUpOworICAgIC8vIE90aGVyd2lzZSB3ZSB3ZXJlIGluIHRoZSByaWdodCBjaGlsZC4gIFRodXMgd2Ugc2hvdWxkIHBvcAorICAgIC8vIHRoZSBjb25jYXRlbmF0aW9uIG5vZGUuCisgICAgX19ub2RlX3N0YXJ0X3BvcyAtPSBfX2MtPl9NX2xlZnQtPl9NX3NpemUuX01fZGF0YTsKKyAgICBfX2Rpcm5zID4+PSAxOworICB9CisgIGlmIChfX2N1cnJlbnRfaW5kZXggPCAwKSB7CisgICAgLy8gV2UgdW5kZXJmbG93ZWQgdGhlIGNhY2hlLiBQdW50LgorICAgIF9TX3NldGNhY2hlKF9feCk7CisgICAgcmV0dXJuOworICB9CisgIF9fY3VycmVudF9ub2RlID0gX194Ll9NX3BhdGhfZW5kLl9NX2RhdGFbX19jdXJyZW50X2luZGV4XTsKKyAgX19jID0gX19TVEFUSUNfQ0FTVChjb25zdCBfUm9wZUNvbmNhdCosIF9fY3VycmVudF9ub2RlKTsKKyAgLy8gY3VycmVudF9ub2RlIGlzIGEgY29uY2F0ZW5hdGlvbiBub2RlLiAgV2UgYXJlIHBvc2l0aW9uZWQgb24gdGhlIGZpcnN0CisgIC8vIGNoYXJhY3RlciBpbiBpdHMgcmlnaHQgY2hpbGQuCisgIC8vIG5vZGVfc3RhcnRfcG9zIGlzIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIGN1cnJlbnRfbm9kZS4KKyAgX19ub2RlX3N0YXJ0X3BvcyArPSBfX2MtPl9NX2xlZnQtPl9NX3NpemUuX01fZGF0YTsKKyAgX19jdXJyZW50X25vZGUgPSBfX2MtPl9NX3JpZ2h0OworICBfX3guX01fcGF0aF9lbmQuX01fZGF0YVsrK19fY3VycmVudF9pbmRleF0gPSBfX2N1cnJlbnRfbm9kZTsKKyAgX19kaXJucyB8PSAxOworICB3aGlsZSAoX1JvcGVSZXA6Ol9TX2NvbmNhdCA9PSBfX2N1cnJlbnRfbm9kZS0+X01fdGFnKSB7CisgICAgKytfX2N1cnJlbnRfaW5kZXg7CisgICAgaWYgKF9TX3BhdGhfY2FjaGVfbGVuID09IF9fY3VycmVudF9pbmRleCkgeworICAgICAgaW50IF9faTsKKyAgICAgIGZvciAoX19pID0gMDsgX19pIDwgX1NfcGF0aF9jYWNoZV9sZW4tMTsgKytfX2kpIHsKKyAgICAgICAgX194Ll9NX3BhdGhfZW5kLl9NX2RhdGFbX19pXSA9IF9feC5fTV9wYXRoX2VuZC5fTV9kYXRhW19faSsxXTsKKyAgICAgIH0KKyAgICAgIC0tX19jdXJyZW50X2luZGV4OworICAgIH0KKyAgICBfX2N1cnJlbnRfbm9kZSA9IF9fU1RBVElDX0NBU1QoY29uc3QgX1JvcGVDb25jYXQqLCBfX2N1cnJlbnRfbm9kZSktPl9NX2xlZnQ7CisgICAgX194Ll9NX3BhdGhfZW5kLl9NX2RhdGFbX19jdXJyZW50X2luZGV4XSA9IF9fY3VycmVudF9ub2RlOworICAgIF9fZGlybnMgPDw9IDE7CisgICAgLy8gbm9kZV9zdGFydF9wb3MgaXMgdW5jaGFuZ2VkLgorICB9CisgIF9feC5fTV9sZWFmX2luZGV4ID0gX19jdXJyZW50X2luZGV4OworICBfX3guX01fbGVhZl9wb3MgPSBfX25vZGVfc3RhcnRfcG9zOworICBfX3guX01fcGF0aF9kaXJlY3Rpb25zID0gX19kaXJuczsKKyAgX1Nfc2V0YnVmKF9feCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KK3ZvaWQgX1JvcGVfaXRlcmF0b3JfYmFzZTxfQ2hhclQsX0FsbG9jPjo6X01faW5jcihzaXplX3QgX19uKSB7CisgIF9NX2N1cnJlbnRfcG9zICs9IF9fbjsKKyAgaWYgKDAgIT0gX01fYnVmX3B0cikgeworICAgIHNpemVfdCBfX2NoYXJzX2xlZnQgPSBfTV9idWZfZW5kIC0gX01fYnVmX3B0cjsKKyAgICBpZiAoX19jaGFyc19sZWZ0ID4gX19uKSB7CisgICAgICBfTV9idWZfcHRyICs9IF9fbjsKKyAgICB9IGVsc2UgaWYgKF9fY2hhcnNfbGVmdCA9PSBfX24pIHsKKyAgICAgIF9NX2J1Zl9wdHIgKz0gX19uOworICAgICAgX1Nfc2V0Y2FjaGVfZm9yX2luY3IoKnRoaXMpOworICAgIH0gZWxzZSB7CisgICAgICBfTV9idWZfcHRyID0gMDsKKyAgICB9CisgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgordm9pZCBfUm9wZV9pdGVyYXRvcl9iYXNlPF9DaGFyVCxfQWxsb2M+OjpfTV9kZWNyKHNpemVfdCBfX24pIHsKKyAgaWYgKDAgIT0gX01fYnVmX3B0cikgeworICAgIHNpemVfdCBfX2NoYXJzX2xlZnQgPSBfTV9idWZfcHRyIC0gX01fYnVmX3N0YXJ0OworICAgIGlmIChfX2NoYXJzX2xlZnQgPj0gX19uKSB7CisgICAgICBfTV9idWZfcHRyIC09IF9fbjsKKyAgICB9IGVsc2UgeworICAgICAgX01fYnVmX3B0ciA9IDA7CisgICAgfQorICB9CisgIF9NX2N1cnJlbnRfcG9zIC09IF9fbjsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgordm9pZCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPjo6X01fY2hlY2soKSB7CisgIGlmIChfTV9yb290X3JvcGUtPl9NX3RyZWVfcHRyLl9NX2RhdGEgIT0gdGhpcy0+X01fcm9vdCkgeworICAgIC8vIF9Sb3BlIHdhcyBtb2RpZmllZC4gIEdldCB0aGluZ3MgZml4ZWQgdXAuCisgICAgX1JvcGVSZXA6Ol9TX3VucmVmKHRoaXMtPl9NX3Jvb3QpOworICAgIHRoaXMtPl9NX3Jvb3QgPSBfTV9yb290X3JvcGUtPl9NX3RyZWVfcHRyLl9NX2RhdGE7CisgICAgX1JvcGVSZXA6Ol9TX3JlZih0aGlzLT5fTV9yb290KTsKKyAgICB0aGlzLT5fTV9idWZfcHRyID0gMDsKKyAgfQorfQorCisvLyAgVGhlcmUgYXJlIHNldmVyYWwgcmVhc29ucyBmb3Igbm90IGRvaW5nIHRoaXMgd2l0aCB2aXJ0dWFsIGRlc3RydWN0b3JzCisvLyAgYW5kIGEgY2xhc3Mgc3BlY2lmaWMgZGVsZXRlIG9wZXJhdG9yOgorLy8gIC0gQSBjbGFzcyBzcGVjaWZpYyBkZWxldGUgb3BlcmF0b3IgY2FuJ3QgZWFzaWx5IGdldCBhY2Nlc3MgdG8KKy8vICAgIGFsbG9jYXRvciBpbnN0YW5jZXMgaWYgd2UgbmVlZCB0aGVtLgorLy8gIC0gQW55IHZpcnR1YWwgZnVuY3Rpb24gd291bGQgbmVlZCBhIDQgb3IgYnl0ZSB2dGFibGUgcG9pbnRlcjsKKy8vICAgIHRoaXMgb25seSByZXF1aXJlcyBhIG9uZSBieXRlIHRhZyBwZXIgb2JqZWN0LgordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgordm9pZCBfUm9wZV9Sb3BlUmVwPF9DaGFyVCxfQWxsb2M+OjpfTV9mcmVlX3RyZWUoKSB7CisgIHN3aXRjaCAoX01fdGFnKSB7CisgIGNhc2UgX1NfbGVhZjoKKyAgICB7CisgICAgICB0eXBlZGVmIF9Sb3BlX1JvcGVMZWFmPF9DaGFyVCwgX0FsbG9jPiBfUm9wZUxlYWY7CisgICAgICBfUm9wZUxlYWYqIF9fbCA9IF9fU1RBVElDX0NBU1QoX1JvcGVMZWFmKiwgdGhpcyk7CisgICAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95KF9fbCk7IC8vIC0+X1JvcGVfUm9wZUxlYWY8X0NoYXJULF9BbGxvYz46On5fUm9wZV9Sb3BlTGVhZigpOworICAgICAgX1NUTFBfQ1JFQVRFX0FMTE9DQVRPUihhbGxvY2F0b3JfdHlwZSwoY29uc3QgYWxsb2NhdG9yX3R5cGUmKV9NX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Sb3BlTGVhZikuZGVhbGxvY2F0ZShfX2wsIDEpOworICAgICAgYnJlYWs7CisgICAgfQorICBjYXNlIF9TX2NvbmNhdDoKKyAgICB7CisgICAgICB0eXBlZGVmIF9Sb3BlX1JvcGVDb25jYXRlbmF0aW9uPF9DaGFyVCwgX0FsbG9jPiBfUm9wZUNvbmNhdGVuYXRpb247CisgICAgICBfUm9wZUNvbmNhdGVuYXRpb24qIF9fYyAgPSBfX1NUQVRJQ19DQVNUKF9Sb3BlQ29uY2F0ZW5hdGlvbiosIHRoaXMpOworICAgICAgX1NUTFBfU1REOjpfRGVzdHJveShfX2MpOworICAgICAgX1NUTFBfQ1JFQVRFX0FMTE9DQVRPUihhbGxvY2F0b3JfdHlwZSwoY29uc3QgYWxsb2NhdG9yX3R5cGUmKV9NX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Sb3BlQ29uY2F0ZW5hdGlvbikuZGVhbGxvY2F0ZShfX2MsIDEpOworICAgICAgYnJlYWs7CisgICAgfQorICBjYXNlIF9TX2Z1bmN0aW9uOgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1JvcGVfUm9wZUZ1bmN0aW9uPF9DaGFyVCwgX0FsbG9jPiBfUm9wZUZ1bmN0aW9uOworICAgICAgX1JvcGVGdW5jdGlvbiogX19mID0gX19TVEFUSUNfQ0FTVChfUm9wZUZ1bmN0aW9uKiwgdGhpcyk7CisgICAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95KF9fZik7CisgICAgICBfU1RMUF9DUkVBVEVfQUxMT0NBVE9SKGFsbG9jYXRvcl90eXBlLCAoY29uc3QgYWxsb2NhdG9yX3R5cGUmKV9NX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Sb3BlRnVuY3Rpb24pLmRlYWxsb2NhdGUoX19mLCAxKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgY2FzZSBfU19zdWJzdHJpbmdmbjoKKyAgICB7CisgICAgICB0eXBlZGVmIF9Sb3BlX1JvcGVTdWJzdHJpbmc8X0NoYXJULCBfQWxsb2M+IF9Sb3BlU3Vic3RyaW5nOworICAgICAgX1JvcGVTdWJzdHJpbmcqIF9fcnNzID0gX19TVEFUSUNfQ0FTVChfUm9wZVN1YnN0cmluZyosIHRoaXMpOworICAgICAgX1NUTFBfU1REOjpfRGVzdHJveShfX3Jzcyk7CisgICAgICBfU1RMUF9DUkVBVEVfQUxMT0NBVE9SKGFsbG9jYXRvcl90eXBlLCAoY29uc3QgYWxsb2NhdG9yX3R5cGUmKV9NX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Sb3BlU3Vic3RyaW5nKS5kZWFsbG9jYXRlKF9fcnNzLCAxKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCisjIGlmIGRlZmluZWQgKCBfU1RMUF9ORVNURURfVFlQRV9QQVJBTV9CVUcgKQorIyAgIGRlZmluZSBfX1JvcGVMZWFmX18gX1JvcGVfUm9wZUxlYWY8X0NoYXJULF9BbGxvYz4KKyMgICBkZWZpbmUgX19Sb3BlUmVwX18gX1JvcGVfUm9wZVJlcDxfQ2hhclQsX0FsbG9jPgorIyAgIGRlZmluZSBfUm9wZUxlYWYgX1JvcGVfUm9wZUxlYWY8X0NoYXJULF9BbGxvYz4KKyMgICBkZWZpbmUgX1JvcGVSZXAgX1JvcGVfUm9wZVJlcDxfQ2hhclQsX0FsbG9jPgorIyAgIGRlZmluZSBzaXplX3R5cGUgc2l6ZV90CisjIGVsc2UKKyMgICBkZWZpbmUgX19Sb3BlTGVhZl9fIF9TVExQX1RZUEVOQU1FX09OX1JFVFVSTl9UWVBFIHJvcGU8X0NoYXJULF9BbGxvYz46Ol9Sb3BlTGVhZgorIyAgIGRlZmluZSBfX1JvcGVSZXBfXyBfU1RMUF9UWVBFTkFNRV9PTl9SRVRVUk5fVFlQRSByb3BlPF9DaGFyVCxfQWxsb2M+OjpfUm9wZVJlcAorIyBlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+Cit2b2lkIHJvcGU8X0NoYXJULCBfQWxsb2M+OjpfTV90aHJvd19vdXRfb2ZfcmFuZ2UoKSBjb25zdCB7CisgIF9fc3RsX3Rocm93X291dF9vZl9yYW5nZSgicm9wZSIpOworfQorCisvLyBDb25jYXRlbmF0ZSBhIEMgc3RyaW5nIG9udG8gYSBsZWFmIHJvcGUgYnkgY29weWluZyB0aGUgcm9wZSBkYXRhLgorLy8gVXNlZCBmb3Igc2hvcnQgcm9wZXMuCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CitfX1JvcGVMZWFmX18qCityb3BlPF9DaGFyVCxfQWxsb2M+OjpfU19sZWFmX2NvbmNhdF9jaGFyX2l0ZXIgKAorICBfUm9wZUxlYWYqIF9fciwgY29uc3QgX0NoYXJUKiBfX2l0ZXIsIHNpemVfdCBfX2xlbikgeworICBzaXplX3QgX19vbGRfbGVuID0gX19yLT5fTV9zaXplLl9NX2RhdGE7CisgIF9DaGFyVCogX19uZXdfZGF0YSA9IF9fci0+X01fc2l6ZS5hbGxvY2F0ZShfU19yb3VuZGVkX3VwX3NpemUoX19vbGRfbGVuICsgX19sZW4pKTsKKyAgX1JvcGVMZWFmKiBfX3Jlc3VsdDsKKworICBfU1RMUF9QUklWIF9fdWNvcHlfbihfX3ItPl9NX2RhdGEsIF9fb2xkX2xlbiwgX19uZXdfZGF0YSk7CisgIF9TVExQX1BSSVYgX191Y29weV9uKF9faXRlciwgX19sZW4sIF9fbmV3X2RhdGEgKyBfX29sZF9sZW4pOworICBfU19jb25zdHJ1Y3RfbnVsbChfX25ld19kYXRhICsgX19vbGRfbGVuICsgX19sZW4pOworICBfU1RMUF9UUlkgeworICAgIF9fcmVzdWx0ID0gX1NfbmV3X1JvcGVMZWFmKF9fbmV3X2RhdGEsIF9fb2xkX2xlbiArIF9fbGVuLCBfX3ItPmdldF9hbGxvY2F0b3IoKSk7CisgIH0KKyAgX1NUTFBfVU5XSU5EKF9Sb3BlUmVwOjpfU19mcmVlX3N0cmluZyhfX25ld19kYXRhLCBfX29sZF9sZW4gKyBfX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3ItPmdldF9hbGxvY2F0b3IoKSkpCisgIHJldHVybiBfX3Jlc3VsdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgordm9pZCBfVGVybWluYXRlX1JvcGVMZWFmKF9Sb3BlX1JvcGVMZWFmPF9DaGFyVCxfQWxsb2M+ICpfX3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IF9fc2l6ZSwgY29uc3QgX190cnVlX3R5cGUmIC8qYmFzaWMgY2hhciB0eXBlKi8pIHsKKyAgX1NfY29uc3RydWN0X251bGwoX19yLT5fTV9kYXRhICsgX19zaXplKTsKKyAgX1NUTFBfQVNTRVJUKF9fci0+X01fY19zdHJpbmcgPT0gX19yLT5fTV9kYXRhKQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+Cit2b2lkIF9UZXJtaW5hdGVfUm9wZUxlYWYoX1JvcGVfUm9wZUxlYWY8X0NoYXJULF9BbGxvYz4gKl9fciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QsIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypiYXNpYyBjaGFyIHR5cGUqLykgeworICBpZiAoX19yLT5fTV9jX3N0cmluZyAhPSBfX3ItPl9NX2RhdGEgJiYgMCAhPSBfX3ItPl9NX2Nfc3RyaW5nKSB7CisgICAgX19yLT5fTV9mcmVlX2Nfc3RyaW5nKCk7CisgICAgX19yLT5fTV9jX3N0cmluZyA9IDA7CisgIH0KK30KKworLy8gQXMgYWJvdmUsIGJ1dCBpdCdzIE9LIHRvIGNsb2JiZXIgb3JpZ2luYWwgaWYgcmVmY291bnQgaXMgMQordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorX19Sb3BlTGVhZl9fKgorcm9wZTxfQ2hhclQsX0FsbG9jPjo6X1NfZGVzdHJfbGVhZl9jb25jYXRfY2hhcl9pdGVyIChfUm9wZUxlYWYqIF9fciwgY29uc3QgX0NoYXJUKiBfX2l0ZXIsIHNpemVfdCBfX2xlbikgeworICAvL19TVExQX0FTU0VSVChfX3ItPl9NX3JlZl9jb3VudCA+PSAxKQorICBpZiAoIC8qIF9fci0+X01fcmVmX2NvdW50ID4gMSAqLyAgX19yLT5fTV9pbmNyKCkgPiAyICkgeyAvLyAtIHB0cgorICAgIF9fci0+X01fZGVjcigpOyAvLyAtIHB0cgorICAgIHJldHVybiBfU19sZWFmX2NvbmNhdF9jaGFyX2l0ZXIoX19yLCBfX2l0ZXIsIF9fbGVuKTsKKyAgfQorICBfX3ItPl9NX2RlY3IoKTsgLy8gLSBwdHIsIF9fci0+X01fcmVmX2NvdW50ID09IDEgb3IgMAorICBzaXplX3QgX19vbGRfbGVuID0gX19yLT5fTV9zaXplLl9NX2RhdGE7CisgIGlmIChfU19yb3VuZGVkX3VwX3NpemUoX19vbGRfbGVuKSA9PSBfU19yb3VuZGVkX3VwX3NpemUoX19vbGRfbGVuICsgX19sZW4pKSB7CisgICAgLy8gVGhlIHNwYWNlIGhhcyBiZWVuIHBhcnRpYWxseSBpbml0aWFsaXplZCBmb3IgdGhlIHN0YW5kYXJkCisgICAgLy8gY2hhcmFjdGVyIHR5cGVzLiAgQnV0IHRoYXQgZG9lc24ndCBtYXR0ZXIgZm9yIHRob3NlIHR5cGVzLgorICAgIF9TVExQX1BSSVYgX191Y29weV9uKF9faXRlciwgX19sZW4sIF9fci0+X01fZGF0YSArIF9fb2xkX2xlbik7CisgICAgX1Rlcm1pbmF0ZV9Sb3BlTGVhZihfX3IsIF9fb2xkX2xlbiArIF9fbGVuLCBfSXNCYXNpY0NoYXJUeXBlKCkpOworICAgIF9fci0+X01fc2l6ZS5fTV9kYXRhID0gX19vbGRfbGVuICsgX19sZW47CisgICAgLy8gX1NUTFBfQVNTRVJUKF9fci0+X01fcmVmX2NvdW50ID09IDEpCisgICAgLy8gX19yLT5fTV9yZWZfY291bnQgPSAyOworICAgIF9fci0+X01faW5jcigpOyAvLyBpLmUuICBfX3ItPl9NX3JlZl9jb3VudCA9IDIKKyAgICByZXR1cm4gX19yOworICB9IGVsc2UgeworICAgIF9Sb3BlTGVhZiogX19yZXN1bHQgPSBfU19sZWFmX2NvbmNhdF9jaGFyX2l0ZXIoX19yLCBfX2l0ZXIsIF9fbGVuKTsKKyAgICAvL19TVExQX0FTU0VSVChfX3Jlc3VsdC0+X01fcmVmX2NvdW50ID09IDEpCisgICAgcmV0dXJuIF9fcmVzdWx0OworICB9Cit9CisKKy8vIEFzc3VtZXMgbGVmdCBhbmQgcmlnaHQgYXJlIG5vdCAwLgorLy8gRG9lcyBub3QgaW5jcmVtZW50IChub3IgZGVjcmVtZW50IG9uIGV4Y2VwdGlvbikgY2hpbGQgcmVmZXJlbmNlIGNvdW50cy4KKy8vIFJlc3VsdCBoYXMgcmVmIGNvdW50IDEuCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CitfX1JvcGVSZXBfXyoKK3JvcGU8X0NoYXJULF9BbGxvYz46Ol9TX3RyZWVfY29uY2F0IChfUm9wZVJlcCogX19sZWZ0LCBfUm9wZVJlcCogX19yaWdodCkgeworICBfUm9wZUNvbmNhdGVuYXRpb24qIF9fcmVzdWx0ID0KKyAgICBfU19uZXdfUm9wZUNvbmNhdGVuYXRpb24oX19sZWZ0LCBfX3JpZ2h0LCBfX2xlZnQtPmdldF9hbGxvY2F0b3IoKSk7CisgIHNpemVfdCBfX2RlcHRoID0gX19yZXN1bHQtPl9NX2RlcHRoOworCisgIF9TVExQX0FTU0VSVChfX2xlZnQtPmdldF9hbGxvY2F0b3IoKSA9PSBfX3JpZ2h0LT5nZXRfYWxsb2NhdG9yKCkpCisgIGlmIChfX2RlcHRoID4gMjAgJiYgKF9fcmVzdWx0LT5fTV9zaXplLl9NX2RhdGEgPCAxMDAwIHx8CisgICAgICBfX2RlcHRoID4gX1JvcGVSZXA6Ol9TX21heF9yb3BlX2RlcHRoKSkgeworICAgIF9Sb3BlUmVwKiBfX2JhbGFuY2VkOworCisgICAgX1NUTFBfVFJZIHsKKyAgICAgIF9fYmFsYW5jZWQgPSBfU19iYWxhbmNlKF9fcmVzdWx0KTsKKyAgICAgLy8gX1NUTFBfQVNTRVJUKF9fcmVzdWx0ID09IF9fYmFsYW5jZWQgfHwKKyAgICAgLy8gICAgICAgICAgICAgIDEgPT0gX19yZXN1bHQtPl9NX3JlZl9jb3VudCAmJgorICAgICAvLyAgICAgICAgICAgICAgMSA9PSBfX2JhbGFuY2VkLT5fTV9yZWZfY291bnQpCisgICAgICBfX3Jlc3VsdC0+X01fdW5yZWZfbm9ubmlsKCk7CisgICAgfQorICAgIF9TVExQX1VOV0lORCgoX1NUTFBfQ1JFQVRFX0FMTE9DQVRPUihhbGxvY2F0b3JfdHlwZSwoYWxsb2NhdG9yX3R5cGUmKV9fbGVmdC0+X01fc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JvcGVDb25jYXRlbmF0aW9uKS5kZWFsbG9jYXRlKF9fcmVzdWx0LDEpKSkKKyAgICAvLyBJbiBjYXNlIG9mIGV4Y2VwdGlvbiwgd2UgbmVlZCB0byBkZWFsbG9jYXRlCisgICAgLy8gb3RoZXJ3aXNlIGRhbmdsaW5nIHJlc3VsdCBub2RlLiAgQnV0IGNhbGxlcgorICAgIC8vIHN0aWxsIG93bnMgaXRzIGNoaWxkcmVuLiAgVGh1cyB1bnJlZiBpcworICAgIC8vIGluYXBwcm9wcmlhdGUuCisgICAgcmV0dXJuIF9fYmFsYW5jZWQ7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIF9fcmVzdWx0OworICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KK19fUm9wZVJlcF9fKgorcm9wZTxfQ2hhclQsX0FsbG9jPjo6X1NfY29uY2F0X2NoYXJfaXRlciAoX1JvcGVSZXAqIF9fciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9DaGFyVCpfX3MsIHNpemVfdCBfX3NsZW4pIHsKKyAgX1JvcGVSZXAqIF9fcmVzdWx0OworICBpZiAoMCA9PSBfX3NsZW4pIHsKKyAgICBfU19yZWYoX19yKTsKKyAgICByZXR1cm4gX19yOworICB9CisgIGlmICgwID09IF9fcikKKyAgICByZXR1cm4gX1NfUm9wZUxlYWZfZnJvbV91bm93bmVkX2NoYXJfcHRyKF9fcywgX19zbGVuLCBfX3ItPmdldF9hbGxvY2F0b3IoKSk7CisgIGlmIChfUm9wZVJlcDo6X1NfbGVhZiA9PSBfX3ItPl9NX3RhZyAmJgorICAgICAgX19yLT5fTV9zaXplLl9NX2RhdGEgKyBfX3NsZW4gPD0gX1NfY29weV9tYXgpIHsKKyAgICBfX3Jlc3VsdCA9IF9TX2xlYWZfY29uY2F0X2NoYXJfaXRlcigoX1JvcGVMZWFmKilfX3IsIF9fcywgX19zbGVuKTsKKyAgICAvLyBfU1RMUF9BU1NFUlQoMSA9PSBfX3Jlc3VsdC0+X01fcmVmX2NvdW50KQorICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgfQorICBpZiAoX1JvcGVSZXA6Ol9TX2NvbmNhdCA9PSBfX3ItPl9NX3RhZyAmJgorICAgICAgX1JvcGVSZXA6Ol9TX2xlYWYgPT0gKChfUm9wZUNvbmNhdGVuYXRpb24qKV9fciktPl9NX3JpZ2h0LT5fTV90YWcpIHsKKyAgICBfUm9wZUxlYWYqIF9fcmlnaHQgPSAoX1JvcGVMZWFmKiApKCgoX1JvcGVDb25jYXRlbmF0aW9uKiApX19yKS0+X01fcmlnaHQpOworICAgIGlmIChfX3JpZ2h0LT5fTV9zaXplLl9NX2RhdGEgKyBfX3NsZW4gPD0gX1NfY29weV9tYXgpIHsKKyAgICAgIF9Sb3BlUmVwKiBfX2xlZnQgPSAoKF9Sb3BlQ29uY2F0ZW5hdGlvbiopX19yKS0+X01fbGVmdDsKKyAgICAgIF9Sb3BlUmVwKiBfX25yaWdodCA9IF9TX2xlYWZfY29uY2F0X2NoYXJfaXRlcigoX1JvcGVMZWFmKilfX3JpZ2h0LCBfX3MsIF9fc2xlbik7CisgICAgICBfX2xlZnQtPl9NX3JlZl9ub25uaWwoKTsKKyAgICAgIF9TVExQX1RSWSB7CisgICAgICAgIF9fcmVzdWx0ID0gX1NfdHJlZV9jb25jYXQoX19sZWZ0LCBfX25yaWdodCk7CisgICAgICB9CisgICAgICBfU1RMUF9VTldJTkQoX1NfdW5yZWYoX19sZWZ0KTsgX1NfdW5yZWYoX19ucmlnaHQpKQorICAgICAgLy8gX1NUTFBfQVNTRVJUKDEgPT0gX19yZXN1bHQtPl9NX3JlZl9jb3VudCkKKyAgICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgICB9CisgIH0KKyAgX1JvcGVSZXAqIF9fbnJpZ2h0ID0KKyAgICBfU19Sb3BlTGVhZl9mcm9tX3Vub3duZWRfY2hhcl9wdHIoX19zLCBfX3NsZW4sIF9fci0+Z2V0X2FsbG9jYXRvcigpKTsKKyAgX1NUTFBfVFJZIHsKKyAgICBfX3ItPl9NX3JlZl9ub25uaWwoKTsKKyAgICBfX3Jlc3VsdCA9IF9TX3RyZWVfY29uY2F0KF9fciwgX19ucmlnaHQpOworICB9CisgIF9TVExQX1VOV0lORChfU191bnJlZihfX3IpOyBfU191bnJlZihfX25yaWdodCkpCisgIC8vIF9TVExQX0FTU0VSVCgxID09IF9fcmVzdWx0LT5fTV9yZWZfY291bnQpCisgIHJldHVybiBfX3Jlc3VsdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorX19Sb3BlUmVwX18qCityb3BlPF9DaGFyVCxfQWxsb2M+OjpfU19kZXN0cl9jb25jYXRfY2hhcl9pdGVyKAorICBfUm9wZVJlcCogX19yLCBjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90IF9fc2xlbikgeworICBfUm9wZVJlcCogX19yZXN1bHQ7CisgIGlmICgwID09IF9fcikKKyAgICByZXR1cm4gX1NfUm9wZUxlYWZfZnJvbV91bm93bmVkX2NoYXJfcHRyKF9fcywgX19zbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19yLT5nZXRfYWxsb2NhdG9yKCkpOworICAvLyBzaXplX3QgX19jb3VudCA9IF9fci0+X01fcmVmX2NvdW50OworICBzaXplX3QgX19vcmlnX3NpemUgPSBfX3ItPl9NX3NpemUuX01fZGF0YTsKKyAgLy8gX1NUTFBfQVNTRVJUKF9fY291bnQgPj0gMSkKKyAgaWYgKCAvKiBfX2NvdW50ID4gMSAqLyBfX3ItPl9NX2luY3IoKSA+IDIgKSB7CisgICAgX19yLT5fTV9kZWNyKCk7CisgICAgcmV0dXJuIF9TX2NvbmNhdF9jaGFyX2l0ZXIoX19yLCBfX3MsIF9fc2xlbik7CisgIH0KKyAgaWYgKDAgPT0gX19zbGVuKSB7CisgICAgcmV0dXJuIF9fcjsKKyAgfQorICBfX3ItPl9NX2RlY3IoKTsKKyAgaWYgKF9fb3JpZ19zaXplICsgX19zbGVuIDw9IF9TX2NvcHlfbWF4ICYmIF9Sb3BlUmVwOjpfU19sZWFmID09IF9fci0+X01fdGFnKSB7CisgICAgcmV0dXJuIF9TX2Rlc3RyX2xlYWZfY29uY2F0X2NoYXJfaXRlcigoX1JvcGVMZWFmKilfX3IsIF9fcywgX19zbGVuKTsKKyAgfQorICBpZiAoX1JvcGVSZXA6Ol9TX2NvbmNhdCA9PSBfX3ItPl9NX3RhZykgeworICAgIF9Sb3BlTGVhZiogX19yaWdodCA9IF9fU1RBVElDX0NBU1QoX1JvcGVMZWFmKiwgX19TVEFUSUNfQ0FTVChfUm9wZUNvbmNhdGVuYXRpb24qLCBfX3IpLT5fTV9yaWdodCk7CisgICAgaWYgKF9Sb3BlUmVwOjpfU19sZWFmID09IF9fcmlnaHQtPl9NX3RhZyAmJgorICAgICAgICBfX3JpZ2h0LT5fTV9zaXplLl9NX2RhdGEgKyBfX3NsZW4gPD0gX1NfY29weV9tYXgpIHsKKyAgICAgIF9Sb3BlUmVwKiBfX25ld19yaWdodCA9IF9TX2Rlc3RyX2xlYWZfY29uY2F0X2NoYXJfaXRlcihfX3JpZ2h0LCBfX3MsIF9fc2xlbik7CisgICAgICBpZiAoX19yaWdodCA9PSBfX25ld19yaWdodCkgeworICAgICAgICAvLyBfU1RMUF9BU1NFUlQoX19uZXdfcmlnaHQtPl9NX3JlZl9jb3VudCA9PSAyKQorICAgICAgICAvLyBfX25ld19yaWdodC0+X01fcmVmX2NvdW50ID0gMTsKKyAgICAgICAgX19uZXdfcmlnaHQtPl9NX2RlY3IoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIF9TVExQX0FTU0VSVChfX25ld19yaWdodC0+X01fcmVmX2NvdW50ID49IDEpCisgICAgICAgIF9fcmlnaHQtPl9NX3VucmVmX25vbm5pbCgpOworICAgICAgfQorICAgICAgLy8gX1NUTFBfQVNTRVJUKF9fci0+X01fcmVmX2NvdW50ID09IDEpCisgICAgICAvLyBfX3ItPl9NX3JlZl9jb3VudCA9IDI7ICAgIC8vIE9uZSBtb3JlIHRoYW4gYmVmb3JlLgorICAgICAgX19yLT5fTV9pbmNyKCk7CisgICAgICBfX1NUQVRJQ19DQVNUKF9Sb3BlQ29uY2F0ZW5hdGlvbiosIF9fciktPl9NX3JpZ2h0ID0gX19uZXdfcmlnaHQ7CisgICAgICAvLyBFLk11c3NlciA6IG1vdmVkIGJlbG93CisgICAgICAvLyAgICBfX3ItPl9NX3NpemUuX01fZGF0YSA9IF9fb3JpZ19zaXplICsgX19zbGVuOworICAgICAgaWYgKDAgIT0gX19yLT5fTV9jX3N0cmluZykgeworICAgICAgICBfX3ItPl9NX2ZyZWVfY19zdHJpbmcoKTsKKyAgICAgICAgX19yLT5fTV9jX3N0cmluZyA9IDA7CisgICAgICB9CisgICAgICBfX3ItPl9NX3NpemUuX01fZGF0YSA9IF9fb3JpZ19zaXplICsgX19zbGVuOworICAgICAgcmV0dXJuIF9fcjsKKyAgICB9CisgIH0KKyAgX1JvcGVSZXAqIF9fcmlnaHQgPQorICAgIF9TX1JvcGVMZWFmX2Zyb21fdW5vd25lZF9jaGFyX3B0cihfX3MsIF9fc2xlbiwgX19yLT5nZXRfYWxsb2NhdG9yKCkpOworICBfX3ItPl9NX3JlZl9ub25uaWwoKTsKKyAgX1NUTFBfVFJZIHsKKyAgICBfX3Jlc3VsdCA9IF9TX3RyZWVfY29uY2F0KF9fciwgX19yaWdodCk7CisgIH0KKyAgX1NUTFBfVU5XSU5EKF9TX3VucmVmKF9fcik7IF9TX3VucmVmKF9fcmlnaHQpKQorICAgIC8vIF9TVExQX0FTU0VSVCgxID09IF9fcmVzdWx0LT5fTV9yZWZfY291bnQpCisgIHJldHVybiBfX3Jlc3VsdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorX19Sb3BlUmVwX18qCityb3BlPF9DaGFyVCxfQWxsb2M+OjpfU19jb25jYXRfcmVwKF9Sb3BlUmVwKiBfX2xlZnQsIF9Sb3BlUmVwKiBfX3JpZ2h0KSB7CisgIGlmICgwID09IF9fbGVmdCkgeworICAgIF9TX3JlZihfX3JpZ2h0KTsKKyAgICByZXR1cm4gX19yaWdodDsKKyAgfQorICBpZiAoMCA9PSBfX3JpZ2h0KSB7CisgICAgX19sZWZ0LT5fTV9yZWZfbm9ubmlsKCk7CisgICAgcmV0dXJuIF9fbGVmdDsKKyAgfQorICBpZiAoX1JvcGVSZXA6Ol9TX2xlYWYgPT0gX19yaWdodC0+X01fdGFnKSB7CisgICAgaWYgKF9Sb3BlUmVwOjpfU19sZWFmID09IF9fbGVmdC0+X01fdGFnKSB7CisgICAgICBpZiAoX19yaWdodC0+X01fc2l6ZS5fTV9kYXRhICsgX19sZWZ0LT5fTV9zaXplLl9NX2RhdGEgPD0gX1NfY29weV9tYXgpIHsKKyAgICAgICAgcmV0dXJuIF9TX2xlYWZfY29uY2F0X2NoYXJfaXRlcihfX1NUQVRJQ19DQVNUKF9Sb3BlTGVhZiosIF9fbGVmdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19TVEFUSUNfQ0FTVChfUm9wZUxlYWYqLCBfX3JpZ2h0KS0+X01fZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3JpZ2h0LT5fTV9zaXplLl9NX2RhdGEpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoX1JvcGVSZXA6Ol9TX2NvbmNhdCA9PSBfX2xlZnQtPl9NX3RhZyAmJgorICAgICAgICAgICAgICAgX1JvcGVSZXA6Ol9TX2xlYWYgPT0gX19TVEFUSUNfQ0FTVChfUm9wZUNvbmNhdGVuYXRpb24qLCBfX2xlZnQpLT5fTV9yaWdodC0+X01fdGFnKSB7CisgICAgICBfUm9wZUxlYWYqIF9fbGVmdHJpZ2h0ID0KKyAgICAgICAgX19TVEFUSUNfQ0FTVChfUm9wZUxlYWYqLCBfX1NUQVRJQ19DQVNUKF9Sb3BlQ29uY2F0ZW5hdGlvbiosIF9fbGVmdCktPl9NX3JpZ2h0KTsKKyAgICAgIGlmIChfX2xlZnRyaWdodC0+X01fc2l6ZS5fTV9kYXRhICsgX19yaWdodC0+X01fc2l6ZS5fTV9kYXRhIDw9IF9TX2NvcHlfbWF4KSB7CisgICAgICAgIF9Sb3BlUmVwKiBfX2xlZnRsZWZ0ID0gX19TVEFUSUNfQ0FTVChfUm9wZUNvbmNhdGVuYXRpb24qLCBfX2xlZnQpLT5fTV9sZWZ0OworICAgICAgICBfUm9wZVJlcCogX19yZXN0ID0gX1NfbGVhZl9jb25jYXRfY2hhcl9pdGVyKF9fbGVmdHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fU1RBVElDX0NBU1QoX1JvcGVMZWFmKiwgX19yaWdodCktPl9NX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19yaWdodC0+X01fc2l6ZS5fTV9kYXRhKTsKKyAgICAgICAgX19sZWZ0bGVmdC0+X01fcmVmX25vbm5pbCgpOworICAgICAgICBfU1RMUF9UUlkgeworICAgICAgICAgIHJldHVybiBfU190cmVlX2NvbmNhdChfX2xlZnRsZWZ0LCBfX3Jlc3QpOworICAgICAgICB9CisgICAgICAgIF9TVExQX1VOV0lORChfU191bnJlZihfX2xlZnRsZWZ0KTsgX1NfdW5yZWYoX19yZXN0KSkKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgX19sZWZ0LT5fTV9yZWZfbm9ubmlsKCk7CisgIF9fcmlnaHQtPl9NX3JlZl9ub25uaWwoKTsKKyAgX1NUTFBfVFJZIHsKKyAgICByZXR1cm4gX1NfdHJlZV9jb25jYXQoX19sZWZ0LCBfX3JpZ2h0KTsKKyAgfQorICBfU1RMUF9VTldJTkQoX1NfdW5yZWYoX19sZWZ0KTsgX1NfdW5yZWYoX19yaWdodCkpCisgIF9TVExQX1JFVF9BRlRFUl9USFJPVygwKQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CitfX1JvcGVSZXBfXyoKK3JvcGU8X0NoYXJULF9BbGxvYz46Ol9TX3N1YnN0cmluZyhfUm9wZVJlcCogX19iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBfX3N0YXJ0LCBzaXplX3QgX19lbmRwMSkgeworICBpZiAoMCA9PSBfX2Jhc2UpIHJldHVybiAwOworICBzaXplX3QgX19sZW4gPSBfX2Jhc2UtPl9NX3NpemUuX01fZGF0YTsKKyAgc2l6ZV90IF9fYWRqX2VuZHAxOworICBjb25zdCBzaXplX3QgX19sYXp5X3RocmVzaG9sZCA9IDEyODsKKworICBpZiAoX19lbmRwMSA+PSBfX2xlbikgeworICAgIGlmICgwID09IF9fc3RhcnQpIHsKKyAgICAgIF9fYmFzZS0+X01fcmVmX25vbm5pbCgpOworICAgICAgcmV0dXJuIF9fYmFzZTsKKyAgICB9IGVsc2UgeworICAgICAgX19hZGpfZW5kcDEgPSBfX2xlbjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgX19hZGpfZW5kcDEgPSBfX2VuZHAxOworICB9CisgIHN3aXRjaChfX2Jhc2UtPl9NX3RhZykgeworICBjYXNlIF9Sb3BlUmVwOjpfU19jb25jYXQ6CisgIHsKKyAgICBfUm9wZUNvbmNhdGVuYXRpb24qIF9fYyA9IF9fU1RBVElDX0NBU1QoX1JvcGVDb25jYXRlbmF0aW9uKiwgX19iYXNlKTsKKyAgICBfUm9wZVJlcCogX19sZWZ0ID0gX19jLT5fTV9sZWZ0OworICAgIF9Sb3BlUmVwKiBfX3JpZ2h0ID0gX19jLT5fTV9yaWdodDsKKyAgICBzaXplX3QgX19sZWZ0X2xlbiA9IF9fbGVmdC0+X01fc2l6ZS5fTV9kYXRhOworICAgIF9Sb3BlUmVwKiBfX3Jlc3VsdDsKKworICAgIGlmIChfX2Fkal9lbmRwMSA8PSBfX2xlZnRfbGVuKSB7CisgICAgICByZXR1cm4gX1Nfc3Vic3RyaW5nKF9fbGVmdCwgX19zdGFydCwgX19lbmRwMSk7CisgICAgfSBlbHNlIGlmIChfX3N0YXJ0ID49IF9fbGVmdF9sZW4pIHsKKyAgICAgIHJldHVybiBfU19zdWJzdHJpbmcoX19yaWdodCwgX19zdGFydCAtIF9fbGVmdF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYWRqX2VuZHAxIC0gX19sZWZ0X2xlbik7CisgICAgfQorICAgIF9TZWxmX2Rlc3RydWN0X3B0ciBfX2xlZnRfcmVzdWx0KF9TX3N1YnN0cmluZyhfX2xlZnQsIF9fc3RhcnQsIF9fbGVmdF9sZW4pKTsKKyAgICBfU2VsZl9kZXN0cnVjdF9wdHIgX19yaWdodF9yZXN1bHQoX1Nfc3Vic3RyaW5nKF9fcmlnaHQsIDAsIF9fZW5kcDEgLSBfX2xlZnRfbGVuKSk7CisgICAgX1NUTFBfTVBXRklYX1RSWSAgICAvLypUWSAwNi8wMS8yMDAwIC0gbXB3IGZvcmdldHMgdG8gY2FsbCBkdG9yIG9uIF9fbGVmdF9yZXN1bHQgYW5kIF9fcmlnaHRfcmVzdWx0IHdpdGhvdXQgdGhpcyB0cnkgYmxvY2sKKyAgICBfX3Jlc3VsdCA9IF9TX2NvbmNhdF9yZXAoX19sZWZ0X3Jlc3VsdCwgX19yaWdodF9yZXN1bHQpOworICAgIC8vIF9TVExQX0FTU0VSVCgxID09IF9fcmVzdWx0LT5fTV9yZWZfY291bnQpCisgICAgcmV0dXJuIF9fcmVzdWx0OworICAgIF9TVExQX01QV0ZJWF9DQVRDSCAgICAvLypUWSAwNi8wMS8yMDAwIC0KKyAgfQorICBjYXNlIF9Sb3BlUmVwOjpfU19sZWFmOgorICB7CisgICAgX1JvcGVMZWFmKiBfX2wgPSBfX1NUQVRJQ19DQVNUKF9Sb3BlTGVhZiosIF9fYmFzZSk7CisgICAgX1JvcGVMZWFmKiBfX3Jlc3VsdDsKKyAgICBzaXplX3QgX19yZXN1bHRfbGVuOworICAgIGlmIChfX3N0YXJ0ID49IF9fYWRqX2VuZHAxKSByZXR1cm4gMDsKKyAgICBfX3Jlc3VsdF9sZW4gPSBfX2Fkal9lbmRwMSAtIF9fc3RhcnQ7CisgICAgaWYgKF9fcmVzdWx0X2xlbiA+IF9fbGF6eV90aHJlc2hvbGQpIGdvdG8gbGF6eTsKKyAgICBjb25zdCBfQ2hhclQqIF9fc2VjdGlvbiA9IF9fbC0+X01fZGF0YSArIF9fc3RhcnQ7CisgICAgLy8gV2Ugc2hvdWxkIHNvbWV0aW1lcyBjcmVhdGUgc3Vic3RyaW5nIG5vZGUgaW5zdGVhZC4KKyAgICBfX3Jlc3VsdCA9IF9TX1JvcGVMZWFmX2Zyb21fdW5vd25lZF9jaGFyX3B0cihfX3NlY3Rpb24sIF9fcmVzdWx0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Jhc2UtPmdldF9hbGxvY2F0b3IoKSk7CisgICAgcmV0dXJuIF9fcmVzdWx0OworICB9CisgIGNhc2UgX1JvcGVSZXA6Ol9TX3N1YnN0cmluZ2ZuOgorICAvLyBBdm9pZCBpbnRyb2R1Y2luZyBtdWx0aXBsZSBsYXllcnMgb2Ygc3Vic3RyaW5nIG5vZGVzLgorICB7CisgICAgX1JvcGVTdWJzdHJpbmcqIF9fb2xkID0gX19TVEFUSUNfQ0FTVChfUm9wZVN1YnN0cmluZyosIF9fYmFzZSk7CisgICAgc2l6ZV90IF9fcmVzdWx0X2xlbjsKKyAgICBpZiAoX19zdGFydCA+PSBfX2Fkal9lbmRwMSkgcmV0dXJuIDA7CisgICAgX19yZXN1bHRfbGVuID0gX19hZGpfZW5kcDEgLSBfX3N0YXJ0OworICAgIGlmIChfX3Jlc3VsdF9sZW4gPiBfX2xhenlfdGhyZXNob2xkKSB7CisgICAgICBfUm9wZVN1YnN0cmluZyogX19yZXN1bHQgPSBfU19uZXdfUm9wZVN1YnN0cmluZyhfX29sZC0+X01fYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fc3RhcnQgKyBfX29sZC0+X01fc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Fkal9lbmRwMSAtIF9fc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Jhc2UtPmdldF9hbGxvY2F0b3IoKSk7CisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfSAvLyAqKiogZWxzZSBmYWxsIHRocm91Z2g6ICoqKgorICB9CisgIGNhc2UgX1JvcGVSZXA6Ol9TX2Z1bmN0aW9uOgorICB7CisgICAgX1JvcGVGdW5jdGlvbiogX19mID0gX19TVEFUSUNfQ0FTVChfUm9wZUZ1bmN0aW9uKiwgX19iYXNlKTsKKyAgICBpZiAoX19zdGFydCA+PSBfX2Fkal9lbmRwMSkgcmV0dXJuIDA7CisgICAgc2l6ZV90IF9fcmVzdWx0X2xlbiA9IF9fYWRqX2VuZHAxIC0gX19zdGFydDsKKworICAgIGlmIChfX3Jlc3VsdF9sZW4gPiBfX2xhenlfdGhyZXNob2xkKSBnb3RvIGxhenk7CisgICAgX0NoYXJUKiBfX3NlY3Rpb24gPSBfX2Jhc2UtPl9NX3NpemUuYWxsb2NhdGUoX1Nfcm91bmRlZF91cF9zaXplKF9fcmVzdWx0X2xlbikpOworICAgIF9TVExQX1RSWSB7CisgICAgICAoKihfX2YtPl9NX2ZuKSkoX19zdGFydCwgX19yZXN1bHRfbGVuLCBfX3NlY3Rpb24pOworICAgIH0KKyAgICBfU1RMUF9VTldJTkQoX1JvcGVSZXA6Ol9TX2ZyZWVfc3RyaW5nKF9fc2VjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcmVzdWx0X2xlbiwgX19iYXNlLT5nZXRfYWxsb2NhdG9yKCkpKQorICAgIF9TX2NvbnN0cnVjdF9udWxsKF9fc2VjdGlvbiArIF9fcmVzdWx0X2xlbik7CisgICAgcmV0dXJuIF9TX25ld19Sb3BlTGVhZihfX3NlY3Rpb24sIF9fcmVzdWx0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYmFzZS0+Z2V0X2FsbG9jYXRvcigpKTsKKyAgfQorICB9CisgIC8qTk9UUkVBQ0hFRCovCisgIF9TVExQX0FTU0VSVChmYWxzZSkKKyAgbGF6eToKKyAgeworICAgIC8vIENyZWF0ZSBzdWJzdHJpbmcgbm9kZS4KKyAgICByZXR1cm4gX1NfbmV3X1JvcGVTdWJzdHJpbmcoX19iYXNlLCBfX3N0YXJ0LCBfX2Fkal9lbmRwMSAtIF9fc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYmFzZS0+Z2V0X2FsbG9jYXRvcigpKTsKKyAgfQorfQorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQ+CitjbGFzcyBfUm9wZV9mbGF0dGVuX2NoYXJfY29uc3VtZXIgOiBwdWJsaWMgX1JvcGVfY2hhcl9jb25zdW1lcjxfQ2hhclQ+IHsKK3ByaXZhdGU6CisgIF9DaGFyVCogX01fYnVmX3B0cjsKK3B1YmxpYzoKKyAgX1JvcGVfZmxhdHRlbl9jaGFyX2NvbnN1bWVyKF9DaGFyVCogX19idWZmZXIpIHsKKyAgICBfTV9idWZfcHRyID0gX19idWZmZXI7CisgIH0KKyAgfl9Sb3BlX2ZsYXR0ZW5fY2hhcl9jb25zdW1lcigpIHt9CisgIGJvb2wgb3BlcmF0b3IoKSAoY29uc3QgX0NoYXJUKiBfX2xlYWYsIHNpemVfdCBfX24pIHsKKyAgICBfU1RMUF9QUklWIF9fdWNvcHlfbihfX2xlYWYsIF9fbiwgX01fYnVmX3B0cik7CisgICAgX01fYnVmX3B0ciArPSBfX247CisgICAgcmV0dXJuIHRydWU7CisgIH0KK307CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVD4KK2NsYXNzIF9Sb3BlX2ZpbmRfY2hhcl9jaGFyX2NvbnN1bWVyIDogcHVibGljIF9Sb3BlX2NoYXJfY29uc3VtZXI8X0NoYXJUPiB7Citwcml2YXRlOgorICBfQ2hhclQgX01fcGF0dGVybjsKK3B1YmxpYzoKKyAgc2l6ZV90IF9NX2NvdW50OyAgLy8gTnVtYmVyIG9mIG5vbm1hdGNoaW5nIGNoYXJhY3RlcnMKKyAgX1JvcGVfZmluZF9jaGFyX2NoYXJfY29uc3VtZXIoX0NoYXJUIF9fcCkKKyAgICA6IF9NX3BhdHRlcm4oX19wKSwgX01fY291bnQoMCkge30KKyAgfl9Sb3BlX2ZpbmRfY2hhcl9jaGFyX2NvbnN1bWVyKCkge30KKyAgYm9vbCBvcGVyYXRvcigpIChjb25zdCBfQ2hhclQqIF9fbGVhZiwgc2l6ZV90IF9fbikgeworICAgIHNpemVfdCBfX2k7CisgICAgZm9yIChfX2kgPSAwOyBfX2kgPCBfX247ICsrX19pKSB7CisgICAgICBpZiAoX19sZWFmW19faV0gPT0gX01fcGF0dGVybikgeworICAgICAgICBfTV9jb3VudCArPSBfX2k7IHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgX01fY291bnQgKz0gX19uOyByZXR1cm4gdHJ1ZTsKKyAgfQorfTsKKworI2lmICFkZWZpbmVkIChfU1RMUF9VU0VfTk9fSU9TVFJFQU1TKQordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorLy8gSGVyZSBfQ2hhclQgaXMgYm90aCB0aGUgc3RyZWFtIGFuZCByb3BlIGNoYXJhY3RlciB0eXBlLgorY2xhc3MgX1JvcGVfaW5zZXJ0X2NoYXJfY29uc3VtZXIgOiBwdWJsaWMgX1JvcGVfY2hhcl9jb25zdW1lcjxfQ2hhclQ+IHsKK3ByaXZhdGU6CisgIHR5cGVkZWYgYmFzaWNfb3N0cmVhbTxfQ2hhclQsX1RyYWl0cz4gX0luc2VydF9vc3RyZWFtOworICB0eXBlZGVmIF9Sb3BlX2luc2VydF9jaGFyX2NvbnN1bWVyPF9DaGFyVCxfVHJhaXRzPiBfU2VsZjsKKyAgX0luc2VydF9vc3RyZWFtJiBfTV9vOworCisgIC8vZXhwbGljaXRlbHkgZGVmaW5lZCBhcyBwcml2YXRlIHRvIGF2b2lkIHdhcm5pbmdzOgorICBfU2VsZiYgb3BlcmF0b3IgPSAoX1NlbGYgY29uc3QmKTsKK3B1YmxpYzoKKyAgX1JvcGVfaW5zZXJ0X2NoYXJfY29uc3VtZXIoX0luc2VydF9vc3RyZWFtJiBfX3dyaXRlcikKKyAgICA6IF9NX28oX193cml0ZXIpIHt9CisjICBpZiBkZWZpbmVkKF9fTVJDX18pIHx8IChkZWZpbmVkKF9fU0NfXykgJiYgIWRlZmluZWQoX19ETUNfXykpICAvLypUWSAwNS8yMy8yMDAwIC0gYWRkZWQgc3VwcG9ydCBmb3IgbXB3IGNvbXBpbGVyJ3MgdHJpZ2dlciBmdW5jdGlvbiBhcHByb2FjaCB0byBnZW5lcmF0ZSB2dGFibGUKKyAgfl9Sb3BlX2luc2VydF9jaGFyX2NvbnN1bWVyKCk7ICAgIC8vKlRZIDA1LzIzLzIwMDAgLQorIyAgZWxzZSAgICAvLypUWSAwNS8yMy8yMDAwIC0KKyAgfl9Sb3BlX2luc2VydF9jaGFyX2NvbnN1bWVyKCkge30KKyMgIGVuZGlmICAgIC8vKlRZIDA1LzIzLzIwMDAgLQorICAvLyBDYWxsZXIgaXMgcHJlc3VtZWQgdG8gb3duIHRoZSBvc3RyZWFtCisgIGJvb2wgb3BlcmF0b3IoKSAoY29uc3QgX0NoYXJUKiBfX2xlYWYsIHNpemVfdCBfX24pOworICAvLyBSZXR1cm5zIHRydWUgdG8gY29udGludWUgdHJhdmVyc2FsLgorfTsKKworIyAgaWYgZGVmaW5lZCAoX19NUkNfXykgfHwgKGRlZmluZWQgKF9fU0NfXykgJiYgIWRlZmluZWQgKF9fRE1DX18pKSAgICAvLypUWSAwNS8yMy8yMDAwIC0gYWRkZWQgc3VwcG9ydCBmb3IgbXB3IGNvbXBpbGVyJ3MgdHJpZ2dlciBmdW5jdGlvbiBhcHByb2FjaCB0byBnZW5lcmF0ZSB2dGFibGUKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK19Sb3BlX2luc2VydF9jaGFyX2NvbnN1bWVyPF9DaGFyVCwgX1RyYWl0cz46OiAgfl9Sb3BlX2luc2VydF9jaGFyX2NvbnN1bWVyKCkge30KKyMgIGVuZGlmICAgIC8vKlRZIDA1LzIzLzIwMDAgLQorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Citib29sIF9Sb3BlX2luc2VydF9jaGFyX2NvbnN1bWVyPF9DaGFyVCwgX1RyYWl0cz46Om9wZXJhdG9yKCkKKyAgKGNvbnN0IF9DaGFyVCogX19sZWFmLCBzaXplX3QgX19uKSB7CisgIHNpemVfdCBfX2k7CisgIC8vICBXZSBhc3N1bWUgdGhhdCBmb3JtYXR0aW5nIGlzIHNldCB1cCBjb3JyZWN0bHkgZm9yIGVhY2ggZWxlbWVudC4KKyAgZm9yIChfX2kgPSAwOyBfX2kgPCBfX247ICsrX19pKSBfTV9vLnB1dChfX2xlYWZbX19pXSk7CisgIHJldHVybiB0cnVlOworfQorI2VuZGlmIC8qICFfU1RMUF9VU0VfTk9fSU9TVFJFQU1TICovCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYywgY2xhc3MgX0NoYXJDb25zdW1lcj4KK2Jvb2wgX1NfYXBwbHlfdG9fcGllY2VzKF9DaGFyQ29uc3VtZXImIF9fYywKKyAgICAgICAgICAgICAgICAgICAgICAgIF9Sb3BlX1JvcGVSZXA8X0NoYXJULCBfQWxsb2M+ICogX19yLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IF9fYmVnaW4sIHNpemVfdCBfX2VuZCkgeworICB0eXBlZGVmIF9Sb3BlX1JvcGVSZXA8X0NoYXJULCBfQWxsb2M+IF9Sb3BlUmVwOworICB0eXBlZGVmIF9Sb3BlX1JvcGVDb25jYXRlbmF0aW9uPF9DaGFyVCxfQWxsb2M+IF9Sb3BlQ29uY2F0ZW5hdGlvbjsKKyAgdHlwZWRlZiBfUm9wZV9Sb3BlTGVhZjxfQ2hhclQsX0FsbG9jPiBfUm9wZUxlYWY7CisgIHR5cGVkZWYgX1JvcGVfUm9wZUZ1bmN0aW9uPF9DaGFyVCxfQWxsb2M+IF9Sb3BlRnVuY3Rpb247CisKKyAgaWYgKDAgPT0gX19yKSByZXR1cm4gdHJ1ZTsKKyAgc3dpdGNoKF9fci0+X01fdGFnKSB7CisgIGNhc2UgX1JvcGVSZXA6Ol9TX2NvbmNhdDoKKyAgeworICAgIF9Sb3BlQ29uY2F0ZW5hdGlvbiogX19jb25jID0gX19TVEFUSUNfQ0FTVChfUm9wZUNvbmNhdGVuYXRpb24qLCBfX3IpOworICAgIF9Sb3BlUmVwKiBfX2xlZnQgPSAgX19jb25jLT5fTV9sZWZ0OworICAgIHNpemVfdCBfX2xlZnRfbGVuID0gX19sZWZ0LT5fTV9zaXplLl9NX2RhdGE7CisgICAgaWYgKF9fYmVnaW4gPCBfX2xlZnRfbGVuKSB7CisgICAgICBzaXplX3QgX19sZWZ0X2VuZCA9IChtaW4pIChfX2xlZnRfbGVuLCBfX2VuZCk7CisgICAgICBpZiAoIV9TX2FwcGx5X3RvX3BpZWNlcyhfX2MsIF9fbGVmdCwgX19iZWdpbiwgX19sZWZ0X2VuZCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKF9fZW5kID4gX19sZWZ0X2xlbikgeworICAgICAgX1JvcGVSZXAqIF9fcmlnaHQgPSAgX19jb25jLT5fTV9yaWdodDsKKyAgICAgIHNpemVfdCBfX3JpZ2h0X3N0YXJ0ID0gKG1heCkoX19sZWZ0X2xlbiwgX19iZWdpbik7CisgICAgICBpZiAoIV9TX2FwcGx5X3RvX3BpZWNlcyhfX2MsIF9fcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3JpZ2h0X3N0YXJ0IC0gX19sZWZ0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZW5kIC0gX19sZWZ0X2xlbikpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKKyAgY2FzZSBfUm9wZVJlcDo6X1NfbGVhZjoKKyAgeworICAgIF9Sb3BlTGVhZiogX19sID0gX19TVEFUSUNfQ0FTVChfUm9wZUxlYWYqLCBfX3IpOworICAgIHJldHVybiBfX2MoX19sLT5fTV9kYXRhICsgX19iZWdpbiwgX19lbmQgLSBfX2JlZ2luKTsKKyAgfQorICBjYXNlIF9Sb3BlUmVwOjpfU19mdW5jdGlvbjoKKyAgY2FzZSBfUm9wZVJlcDo6X1Nfc3Vic3RyaW5nZm46CisgIHsKKyAgICBfUm9wZUZ1bmN0aW9uKiBfX2YgPSBfX1NUQVRJQ19DQVNUKF9Sb3BlRnVuY3Rpb24qLCBfX3IpOworICAgIHNpemVfdCBfX2xlbiA9IF9fZW5kIC0gX19iZWdpbjsKKyAgICBib29sIF9fcmVzdWx0OworICAgIF9DaGFyVCogX19idWZmZXIgPSBfX3ItPmdldF9hbGxvY2F0b3IoKS5hbGxvY2F0ZShfX2xlbik7CisgICAgX1NUTFBfVFJZIHsKKyAgICAgICgqKF9fZi0+X01fZm4pKShfX2JlZ2luLCBfX2xlbiwgX19idWZmZXIpOworICAgICAgX19yZXN1bHQgPSBfX2MoX19idWZmZXIsIF9fbGVuKTsKKyAgICAgIF9fci0+Z2V0X2FsbG9jYXRvcigpLmRlYWxsb2NhdGUoX19idWZmZXIsIF9fbGVuKTsKKyAgICB9CisgICAgX1NUTFBfVU5XSU5EKChfX3ItPmdldF9hbGxvY2F0b3IoKS5kZWFsbG9jYXRlKF9fYnVmZmVyLCBfX2xlbikpKQorICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgfQorICBkZWZhdWx0OgorICAgIF9TVExQX0FTU0VSVChmYWxzZSkKKyAgICAvKk5PVFJFQUNIRUQqLworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCisjaWYgIWRlZmluZWQgKF9TVExQX1VTRV9OT19JT1NUUkVBTVMpCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitpbmxpbmUgdm9pZCBfUm9wZV9maWxsKGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vLCBzdHJlYW1zaXplIF9fbikgeworICBjaGFyIF9fZiA9IF9fby5maWxsKCk7CisgIGZvciAoc3RyZWFtc2l6ZSBfX2kgPSAwOyBfX2kgPCBfX247ICsrX19pKSBfX28ucHV0KF9fZik7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfU19pb19nZXQoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX28sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByb3BlPF9DaGFyVCwgX0FsbG9jPiYgX19yLCBjb25zdCBfX3RydWVfdHlwZSYgLypfSXNCYXNpY0NoYXJUeXBlKi8pIHsKKyAgc3RyZWFtc2l6ZSBfX3cgPSBfX28ud2lkdGgoKTsKKyAgY29uc3QgYm9vbCBfX2xlZnQgPSAoX19vLmZsYWdzKCkgJiBpb3M6OmxlZnQpICE9IDA7CisgIHNpemVfdCBfX3JvcGVfbGVuID0gX19yLnNpemUoKTsKKyAgX1JvcGVfaW5zZXJ0X2NoYXJfY29uc3VtZXI8X0NoYXJULCBfVHJhaXRzPiBfX2MoX19vKTsKKworICBjb25zdCBib29sIF9fbmVlZF9wYWQgPSAoKChzaXplb2Yoc3RyZWFtc2l6ZSkgPiBzaXplb2Yoc2l6ZV90KSkgJiYgKF9fU1RBVElDX0NBU1Qoc3RyZWFtc2l6ZSwgX19yb3BlX2xlbikgPCBfX3cpKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKChzaXplb2Yoc3RyZWFtc2l6ZSkgPD0gc2l6ZW9mKHNpemVfdCkpICYmIChfX3JvcGVfbGVuIDwgX19TVEFUSUNfQ0FTVChzaXplX3QsIF9fdykpKSk7CisgIHN0cmVhbXNpemUgX19wYWRfbGVuID0gX19uZWVkX3BhZCA/IF9fdyAtIF9fcm9wZV9sZW4gOiAwOworCisgIGlmICghX19sZWZ0ICYmIF9fcGFkX2xlbiA+IDApIHsKKyAgICBfUm9wZV9maWxsKF9fbywgX19wYWRfbGVuKTsKKyAgfQorICBfX3IuYXBwbHlfdG9fcGllY2VzKDAsIF9fcm9wZV9sZW4sIF9fYyk7CisgIGlmIChfX2xlZnQgJiYgX19wYWRfbGVuID4gMCkgeworICAgIF9Sb3BlX2ZpbGwoX19vLCBfX3BhZF9sZW4pOworICB9CisgIHJldHVybiBfX287Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfU19pb19nZXQoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX28sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvcGU8X0NoYXJULCBfQWxsb2M+JiBfX3IsIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypfSXNCYXNpY0NoYXJUeXBlKi8pIHsKKyAgc3RyZWFtc2l6ZSBfX3cgPSBfX28ud2lkdGgoKTsKKyAgc2l6ZV90IF9fcm9wZV9sZW4gPSBfX3Iuc2l6ZSgpOworICBfUm9wZV9pbnNlcnRfY2hhcl9jb25zdW1lcjxfQ2hhclQsIF9UcmFpdHM+IF9fYyhfX28pOworCisgIF9fby53aWR0aChfX3cgL19fcm9wZV9sZW4pOworICBfU1RMUF9UUlkgeworICAgIF9fci5hcHBseV90b19waWVjZXMoMCwgX19yb3BlX2xlbiwgX19jKTsKKyAgICBfX28ud2lkdGgoX193KTsKKyAgfQorICBfU1RMUF9VTldJTkQoX19vLndpZHRoKF9fdykpCisgIHJldHVybiBfX287Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvcGU8X0NoYXJULCBfQWxsb2M+JiBfX3IpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSXNJbnRlZ3JhbDxfQ2hhclQ+OjpfUmV0IF9DaGFyX0lzX0ludGVncmFsOworICByZXR1cm4gX1NfaW9fZ2V0KF9fbywgX19yLCBfQ2hhcl9Jc19JbnRlZ3JhbCgpKTsKK30KKyNlbmRpZiAvKiBOT19JT1NUUkVBTVMgKi8KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorX0NoYXJUKiByb3BlPF9DaGFyVCxfQWxsb2M+OjpfU19mbGF0dGVuKF9Sb3BlUmVwKiBfX3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IF9fc3RhcnQsIHNpemVfdCBfX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ2hhclQqIF9fYnVmZmVyKSB7CisgIF9Sb3BlX2ZsYXR0ZW5fY2hhcl9jb25zdW1lcjxfQ2hhclQ+IF9fYyhfX2J1ZmZlcik7CisgIF9TX2FwcGx5X3RvX3BpZWNlcyhfX2MsIF9fciwgX19zdGFydCwgX19zdGFydCArIF9fbGVuKTsKKyAgcmV0dXJuKF9fYnVmZmVyICsgX19sZW4pOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CitzaXplX3Qgcm9wZTxfQ2hhclQsX0FsbG9jPjo6ZmluZChfQ2hhclQgX19wYXR0ZXJuLCBzaXplX3QgX19zdGFydCkgY29uc3QgeworICBfUm9wZV9maW5kX2NoYXJfY2hhcl9jb25zdW1lcjxfQ2hhclQ+IF9fYyhfX3BhdHRlcm4pOworICBfU19hcHBseV90b19waWVjZXMoX19jLCBfTV90cmVlX3B0ci5fTV9kYXRhLCBfX3N0YXJ0LCBzaXplKCkpOworICBzaXplX3R5cGUgX19yZXN1bHRfcG9zID0gX19zdGFydCArIF9fYy5fTV9jb3VudDsKKyNpZm5kZWYgX1NUTFBfT0xEX1JPUEVfU0VNQU5USUNTCisgIGlmIChfX3Jlc3VsdF9wb3MgPT0gc2l6ZSgpKSBfX3Jlc3VsdF9wb3MgPSBucG9zOworI2VuZGlmCisgIHJldHVybiBfX3Jlc3VsdF9wb3M7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KK19DaGFyVCoKK3JvcGU8X0NoYXJULF9BbGxvYz46Ol9TX2ZsYXR0ZW4oX1JvcGVfUm9wZVJlcDxfQ2hhclQsIF9BbGxvYz4qIF9fciwgX0NoYXJUKiBfX2J1ZmZlcikgeworICBpZiAoMCA9PSBfX3IpIHJldHVybiBfX2J1ZmZlcjsKKyAgc3dpdGNoKF9fci0+X01fdGFnKSB7CisgIGNhc2UgX1JvcGVSZXA6Ol9TX2NvbmNhdDoKKyAgeworICAgIF9Sb3BlQ29uY2F0ZW5hdGlvbiogX19jID0gX19TVEFUSUNfQ0FTVChfUm9wZUNvbmNhdGVuYXRpb24qLCBfX3IpOworICAgIF9Sb3BlUmVwKiBfX2xlZnQgPSBfX2MtPl9NX2xlZnQ7CisgICAgX1JvcGVSZXAqIF9fcmlnaHQgPSBfX2MtPl9NX3JpZ2h0OworICAgIF9DaGFyVCogX19yZXN0ID0gX1NfZmxhdHRlbihfX2xlZnQsIF9fYnVmZmVyKTsKKyAgICByZXR1cm4gX1NfZmxhdHRlbihfX3JpZ2h0LCBfX3Jlc3QpOworICB9CisgIGNhc2UgX1JvcGVSZXA6Ol9TX2xlYWY6CisgIHsKKyAgICBfUm9wZUxlYWYqIF9fbCA9IF9fU1RBVElDX0NBU1QoX1JvcGVMZWFmKiwgX19yKTsKKyAgICByZXR1cm4gX1NUTFBfUFJJViBfX3Vjb3B5X24oX19sLT5fTV9kYXRhLCBfX2wtPl9NX3NpemUuX01fZGF0YSwgX19idWZmZXIpLnNlY29uZDsKKyAgfQorICBjYXNlIF9Sb3BlUmVwOjpfU19mdW5jdGlvbjoKKyAgY2FzZSBfUm9wZVJlcDo6X1Nfc3Vic3RyaW5nZm46CisgIC8vIFdlIGRvbnQgeWV0IGRvIGFueXRoaW5nIHdpdGggc3Vic3RyaW5nIG5vZGVzLgorICAvLyBUaGlzIG5lZWRzIHRvIGJlIGZpeGVkIGJlZm9yZSByb3BlZmlsZXMgd2lsbCB3b3JrIHdlbGwuCisgIHsKKyAgICBfUm9wZUZ1bmN0aW9uKiBfX2YgPSBfX1NUQVRJQ19DQVNUKF9Sb3BlRnVuY3Rpb24qLCBfX3IpOworICAgICgqKF9fZi0+X01fZm4pKSgwLCBfX2YtPl9NX3NpemUuX01fZGF0YSwgX19idWZmZXIpOworICAgIHJldHVybiBfX2J1ZmZlciArIF9fZi0+X01fc2l6ZS5fTV9kYXRhOworICB9CisgIGRlZmF1bHQ6CisgICAgX1NUTFBfQVNTRVJUKGZhbHNlKQorICAgIC8qTk9UUkVBQ0hFRCovCisgICAgcmV0dXJuIDA7CisgIH0KK30KKworI2lmZGVmIF9TVExQX0RFQlVHCisvLyBUaGlzIG5lZWRzIHdvcmsgZm9yIF9DaGFyVCAhPSBjaGFyCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+Cit2b2lkIHJvcGU8X0NoYXJULF9BbGxvYz46Ol9TX2R1bXAoX1JvcGVSZXAqIF9fciwgaW50IF9faW5kZW50KSB7CisgIGZvciAoaW50IF9faSA9IDA7IF9faSA8IF9faW5kZW50OyArK19faSkgcHV0Y2hhcignICcpOworICBpZiAoMCA9PSBfX3IpIHsKKyAgICBwcmludGYoIk5VTExcbiIpOyByZXR1cm47CisgIH0KKyAgaWYgKF9Sb3BlUmVwOjpfU19jb25jYXQgPT0gX19yLT5fTV90YWcpIHsKKyAgICBfUm9wZUNvbmNhdGVuYXRpb24qIF9fYyA9IF9fU1RBVElDX0NBU1QoX1JvcGVDb25jYXRlbmF0aW9uKiwgX19yKTsKKyAgICBfUm9wZVJlcCogX19sZWZ0ID0gX19jLT5fTV9sZWZ0OworICAgIF9Sb3BlUmVwKiBfX3JpZ2h0ID0gX19jLT5fTV9yaWdodDsKKyAgICBwcmludGYoIkNvbmNhdGVuYXRpb24gJXAgKHJjID0gJWxkLCBkZXB0aCA9ICVkLCBsZW4gPSAlbGQsICVzIGJhbGFuY2VkKVxuIiwKKyAgICAgIF9fciwgX19yLT5fTV9yZWZfY291bnQsIF9fci0+X01fZGVwdGgsIF9fci0+X01fc2l6ZS5fTV9kYXRhLAorICAgICAgX19yLT5fTV9pc19iYWxhbmNlZD8gIiIgOiAibm90Iik7CisgICAgX1NfZHVtcChfX2xlZnQsIF9faW5kZW50ICsgMik7CisgICAgX1NfZHVtcChfX3JpZ2h0LCBfX2luZGVudCArIDIpOworICAgIHJldHVybjsKKyAgfQorICBlbHNlIHsKKyAgICBjb25zdCBjaGFyKiBfX2tpbmQ7CisKKyAgICBzd2l0Y2ggKF9fci0+X01fdGFnKSB7CisgICAgICBjYXNlIF9Sb3BlUmVwOjpfU19sZWFmOgorICAgICAgICBfX2tpbmQgPSAiTGVhZiI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBfUm9wZVJlcDo6X1NfZnVuY3Rpb246CisgICAgICAgIF9fa2luZCA9ICJGdW5jdGlvbiI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBfUm9wZVJlcDo6X1Nfc3Vic3RyaW5nZm46CisgICAgICAgIF9fa2luZCA9ICJGdW5jdGlvbiByZXByZXNlbnRpbmcgc3Vic3RyaW5nIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBfX2tpbmQgPSAiKGNvcnJ1cHRlZCBraW5kIGZpZWxkISkiOworICAgIH0KKyAgICBwcmludGYoIiVzICVwIChyYyA9ICVsZCwgZGVwdGggPSAlZCwgbGVuID0gJWxkKSAiLAorICAgICBfX2tpbmQsIF9fciwgX19yLT5fTV9yZWZfY291bnQsIF9fci0+X01fZGVwdGgsIF9fci0+X01fc2l6ZS5fTV9kYXRhKTsKKyAgICBpZiAoc2l6ZW9mKF9DaGFyVCkgPT0gMSkgeworICAgICAgY29uc3QgaW50IF9fbWF4X2xlbiA9IDQwOworICAgICAgX1NlbGZfZGVzdHJ1Y3RfcHRyIF9fcHJlZml4KF9TX3N1YnN0cmluZyhfX3IsIDAsIF9fbWF4X2xlbikpOworICAgICAgX0NoYXJUIF9fYnVmZmVyW19fbWF4X2xlbiArIDFdOworICAgICAgYm9vbCBfX3Rvb19iaWcgPSBfX3ItPl9NX3NpemUuX01fZGF0YSA+IF9fcHJlZml4LT5fTV9zaXplLl9NX2RhdGE7CisKKyAgICAgIF9TX2ZsYXR0ZW4oX19wcmVmaXgsIF9fYnVmZmVyKTsKKyAgICAgIF9fYnVmZmVyW19fcHJlZml4LT5fTV9zaXplLl9NX2RhdGFdID0gX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRChfQ2hhclQpOworICAgICAgcHJpbnRmKCIlcyVzXG4iLCAoY2hhciopX19idWZmZXIsIF9fdG9vX2JpZz8gIi4uLlxuIiA6ICJcbiIpOworICAgIH0gZWxzZSB7CisgICAgICBwcmludGYoIlxuIik7CisgICAgfQorICB9Cit9CisjZW5kaWYgLyogX1NUTFBfREVCVUcgKi8KKworIyBkZWZpbmUgX19ST1BFX1RBQkxFX0JPRFkgID0geyBcCisvKiAwICovMSwgLyogMSAqLzIsIC8qIDIgKi8zLCAvKiAzICovNSwgLyogNCAqLzgsIC8qIDUgKi8xMywgLyogNiAqLzIxLCAgICAgICAgIFwKKy8qIDcgKi8zNCwgLyogOCAqLzU1LCAvKiA5ICovODksIC8qIDEwICovMTQ0LCAvKiAxMSAqLzIzMywgLyogMTIgKi8zNzcsICAgICAgICAgXAorLyogMTMgKi82MTAsIC8qIDE0ICovOTg3LCAvKiAxNSAqLzE1OTcsIC8qIDE2ICovMjU4NCwgLyogMTcgKi80MTgxLCAgICAgICAgICAgICBcCisvKiAxOCAqLzY3NjV1bCwgLyogMTkgKi8xMDk0NnVsLCAvKiAyMCAqLzE3NzExdWwsIC8qIDIxICovMjg2NTd1bCwgLyogMjIgKi80NjM2OHVsLCAgIFwKKy8qIDIzICovNzUwMjV1bCwgLyogMjQgKi8xMjEzOTN1bCwgLyogMjUgKi8xOTY0MTh1bCwgLyogMjYgKi8zMTc4MTF1bCwgICAgICAgICAgICAgICAgXAorLyogMjcgKi81MTQyMjl1bCwgLyogMjggKi84MzIwNDB1bCwgLyogMjkgKi8xMzQ2MjY5dWwsIC8qIDMwICovMjE3ODMwOXVsLCAgICAgICAgICAgICBcCisvKiAzMSAqLzM1MjQ1Nzh1bCwgLyogMzIgKi81NzAyODg3dWwsIC8qIDMzICovOTIyNzQ2NXVsLCAvKiAzNCAqLzE0OTMwMzUydWwsICAgICAgICAgIFwKKy8qIDM1ICovMjQxNTc4MTd1bCwgLyogMzYgKi8zOTA4ODE2OXVsLCAvKiAzNyAqLzYzMjQ1OTg2dWwsIC8qIDM4ICovMTAyMzM0MTU1dWwsICAgICAgXAorLyogMzkgKi8xNjU1ODAxNDF1bCwgLyogNDAgKi8yNjc5MTQyOTZ1bCwgLyogNDEgKi80MzM0OTQ0Mzd1bCwgICAgICAgICAgICAgICAgICAgICAgICBcCisvKiA0MiAqLzcwMTQwODczM3VsLCAvKiA0MyAqLzExMzQ5MDMxNzB1bCwgLyogNDQgKi8xODM2MzExOTAzdWwsICAgICAgICAgICAgICAgICAgICAgIFwKKy8qIDQ1ICovMjk3MTIxNTA3M3VsIH0KKworIyBpZiAoIF9TVExQX1NUQVRJQ19URU1QTEFURV9EQVRBID4gMCApCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+Citjb25zdCB1bnNpZ25lZCBsb25nCityb3BlPF9DaGFyVCxfQWxsb2M+OjpfU19taW5fbGVuW19fUk9QRV9ERVBUSF9TSVpFXSBfX1JPUEVfVEFCTEVfQk9EWTsKKyMgZWxzZQorX19ERUNMQVJFX0lOU1RBTkNFKGNvbnN0IHVuc2lnbmVkIGxvbmcsCisgICAgICAgICAgICAgICAgICAgY3JvcGU6Ol9TX21pbl9sZW5bX19ST1BFX0RFUFRIX1NJWkVdLAorICAgICAgICAgICAgICAgICAgIF9fUk9QRV9UQUJMRV9CT0RZKTsKKyMgIGlmbmRlZiBfU1RMUF9OT19XQ0hBUl9UCitfX0RFQ0xBUkVfSU5TVEFOQ0UoY29uc3QgdW5zaWduZWQgbG9uZywKKyAgICAgICAgICAgICAgICAgICB3cm9wZTo6X1NfbWluX2xlbltfX1JPUEVfREVQVEhfU0laRV0sCisgICAgICAgICAgICAgICAgICAgX19ST1BFX1RBQkxFX0JPRFkpOworIyAgZW5kaWYKKyMgZW5kaWYKKyMgdW5kZWYgX19ST1BFX0RFUFRIX1NJWkUKKyMgdW5kZWYgX19ST1BFX01BWF9ERVBUSAorIyB1bmRlZiBfX1JPUEVfVEFCTEVfQk9EWQorCisvLyBUaGVzZSBhcmUgRmlib25hY2NpIG51bWJlcnMgPCAyKiozMi4KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorX19Sb3BlUmVwX18qIHJvcGU8X0NoYXJULF9BbGxvYz46Ol9TX2JhbGFuY2UoX1JvcGVSZXAqIF9fcikgeworICBfUm9wZVJlcCogX19mb3Jlc3RbX1JvcGVSZXA6Ol9TX21heF9yb3BlX2RlcHRoICsgMV0gPSB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwwLDAsMCwwLDB9OworICBfUm9wZVJlcCogX19yZXN1bHQgPSAwOworICBpbnQgX19pOworICAvLyBJbnZhcmlhbnQ6CisgIC8vIFRoZSBjb25jYXRlbmF0aW9uIG9mIGZvcmVzdCBpbiBkZXNjZW5kaW5nIG9yZGVyIGlzIGVxdWFsIHRvIF9fci4KKyAgLy8gX19mb3Jlc3RbX19pXS5fTV9zaXplLl9NX2RhdGEgPj0gX1NfbWluX2xlbltfX2ldCisgIC8vIF9fZm9yZXN0W19faV0uX01fZGVwdGggPSBfX2kKKyAgLy8gUmVmZXJlbmNlcyBmcm9tIGZvcmVzdCBhcmUgaW5jbHVkZWQgaW4gcmVmY291bnQuCisKKyAgX1NUTFBfVFJZIHsKKyAgICBfU19hZGRfdG9fZm9yZXN0KF9fciwgX19mb3Jlc3QpOworICAgIGZvciAoX19pID0gMDsgX19pIDw9IF9Sb3BlUmVwOjpfU19tYXhfcm9wZV9kZXB0aDsgKytfX2kpCisgICAgICBpZiAoMCAhPSBfX2ZvcmVzdFtfX2ldKSB7CisgICAgICAgIF9TZWxmX2Rlc3RydWN0X3B0ciBfX29sZChfX3Jlc3VsdCk7CisgICAgICAgIF9fcmVzdWx0ID0gX1NfY29uY2F0X3JlcChfX2ZvcmVzdFtfX2ldLCBfX3Jlc3VsdCk7CisgICAgICAgIF9fZm9yZXN0W19faV0tPl9NX3VucmVmX25vbm5pbCgpOworIyBpZmRlZiBfU1RMUF9VU0VfRVhDRVBUSU9OUworICAgICAgICBfX2ZvcmVzdFtfX2ldID0gMDsKKyMgZW5kaWYKKyAgICAgIH0KKyAgICB9CisgICAgX1NUTFBfVU5XSU5EKGZvcihfX2kgPSAwOyBfX2kgPD0gX1JvcGVSZXA6Ol9TX21heF9yb3BlX2RlcHRoOyArK19faSkKKyAgICBfU191bnJlZihfX2ZvcmVzdFtfX2ldKSkKKyAgICBpZiAoX19yZXN1bHQtPl9NX2RlcHRoID4gX1JvcGVSZXA6Ol9TX21heF9yb3BlX2RlcHRoKSB7CisgICAgICBfX3N0bF90aHJvd19yYW5nZV9lcnJvcigicm9wZSB0b28gbG9uZyIpOworICAgIH0KKyAgICByZXR1cm4oX19yZXN1bHQpOworfQorCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KK3ZvaWQKK3JvcGU8X0NoYXJULF9BbGxvYz46Ol9TX2FkZF90b19mb3Jlc3QoX1JvcGVSZXAqIF9fciwgX1JvcGVSZXAqKiBfX2ZvcmVzdCkKK3sKKyAgICBpZiAoX19yIC0+IF9NX2lzX2JhbGFuY2VkKSB7CisgICAgICBfU19hZGRfbGVhZl90b19mb3Jlc3QoX19yLCBfX2ZvcmVzdCk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIF9TVExQX0FTU0VSVChfX3ItPl9NX3RhZyA9PSBfUm9wZVJlcDo6X1NfY29uY2F0KQorICAgIHsKKyAgICAgIF9Sb3BlQ29uY2F0ZW5hdGlvbiogX19jID0gKF9Sb3BlQ29uY2F0ZW5hdGlvbiopX19yOworCisgICAgICBfU19hZGRfdG9fZm9yZXN0KF9fYy0+X01fbGVmdCwgX19mb3Jlc3QpOworICAgICAgX1NfYWRkX3RvX2ZvcmVzdChfX2MtPl9NX3JpZ2h0LCBfX2ZvcmVzdCk7CisgICAgfQorfQorCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KK3ZvaWQKK3JvcGU8X0NoYXJULF9BbGxvYz46Ol9TX2FkZF9sZWFmX3RvX2ZvcmVzdChfUm9wZVJlcCogX19yLCBfUm9wZVJlcCoqIF9fZm9yZXN0KQoreworICAgIF9Sb3BlUmVwKiBfX2luc2VydGVlOyAgICAgICAvLyBpbmNsdWRlZCBpbiByZWZjb3VudAorICAgIF9Sb3BlUmVwKiBfX3Rvb190aW55ID0gMDsgICAgICAvLyBpbmNsdWRlZCBpbiByZWZjb3VudAorICAgIGludCBfX2k7ICAgICAgICAgIC8vIGZvcmVzdFswLi5fX2ktMV0gaXMgZW1wdHkKKyAgICBzaXplX3QgX19zID0gX19yLT5fTV9zaXplLl9NX2RhdGE7CisKKyAgICBmb3IgKF9faSA9IDA7IF9fcyA+PSBfU19taW5fbGVuW19faSsxXS8qIG5vdCB0aGlzIGJ1Y2tldCAqLzsgKytfX2kpIHsKKyAgaWYgKDAgIT0gX19mb3Jlc3RbX19pXSkgeworICAgICAgICBfU2VsZl9kZXN0cnVjdF9wdHIgX19vbGQoX190b29fdGlueSk7CisgICAgICBfX3Rvb190aW55ID0gX1NfY29uY2F0X2FuZF9zZXRfYmFsYW5jZWQoX19mb3Jlc3RbX19pXSwgX190b29fdGlueSk7CisgICAgICBfX2ZvcmVzdFtfX2ldLT5fTV91bnJlZl9ub25uaWwoKTsKKyAgICAgIF9fZm9yZXN0W19faV0gPSAwOworICB9CisgICAgfQorICAgIHsKKyAgICBfU2VsZl9kZXN0cnVjdF9wdHIgX19vbGQoX190b29fdGlueSk7CisgIF9faW5zZXJ0ZWUgPSBfU19jb25jYXRfYW5kX3NldF9iYWxhbmNlZChfX3Rvb190aW55LCBfX3IpOworICAgIH0KKyAgICAvLyBUb29fdGlueSBkZWFkLCBhbmQgbm8gbG9uZ2VyIGluY2x1ZGVkIGluIHJlZmNvdW50LgorICAgIC8vIEluc2VydGVlIGlzIGxpdmUgYW5kIGluY2x1ZGVkLgorICAgIF9TVExQX0FTU0VSVChfU19pc19hbG1vc3RfYmFsYW5jZWQoX19pbnNlcnRlZSkpCisgICAgX1NUTFBfQVNTRVJUKF9faW5zZXJ0ZWUtPl9NX2RlcHRoIDw9IF9fci0+X01fZGVwdGggKyAxKQorICAgIGZvciAoOzsgKytfX2kpIHsKKyAgICAgIGlmICgwICE9IF9fZm9yZXN0W19faV0pIHsKKyAgICAgICAgX1NlbGZfZGVzdHJ1Y3RfcHRyIF9fb2xkKF9faW5zZXJ0ZWUpOworICAgICAgX19pbnNlcnRlZSA9IF9TX2NvbmNhdF9hbmRfc2V0X2JhbGFuY2VkKF9fZm9yZXN0W19faV0sIF9faW5zZXJ0ZWUpOworICAgICAgX19mb3Jlc3RbX19pXS0+X01fdW5yZWZfbm9ubmlsKCk7CisgICAgICBfX2ZvcmVzdFtfX2ldID0gMDsKKyAgICAgIF9TVExQX0FTU0VSVChfU19pc19hbG1vc3RfYmFsYW5jZWQoX19pbnNlcnRlZSkpCisgIH0KKyAgX1NUTFBfQVNTRVJUKF9TX21pbl9sZW5bX19pXSA8PSBfX2luc2VydGVlLT5fTV9zaXplLl9NX2RhdGEpCisgIF9TVExQX0FTU0VSVChfX2ZvcmVzdFtfX2ldID09IDApCisgIGlmIChfX2kgPT0gX1JvcGVSZXA6Ol9TX21heF9yb3BlX2RlcHRoIHx8CisgICAgICAgIF9faW5zZXJ0ZWUtPl9NX3NpemUuX01fZGF0YSA8IF9TX21pbl9sZW5bX19pKzFdKSB7CisgICAgICBfX2ZvcmVzdFtfX2ldID0gX19pbnNlcnRlZTsKKyAgICAgIC8vIHJlZmNvdW50IGlzIE9LIHNpbmNlIF9faW5zZXJ0ZWUgaXMgbm93IGRlYWQuCisgICAgICByZXR1cm47CisgIH0KKyAgICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KK19DaGFyVAorcm9wZTxfQ2hhclQsX0FsbG9jPjo6X1NfZmV0Y2goX1JvcGVSZXAqIF9fciwgc2l6ZV90eXBlIF9faSkKK3sKKyAgICBfQ2hhclQqIF9fY3N0ciA9IF9fci0+X01fY19zdHJpbmc7CisKKyAgICBfU1RMUF9BU1NFUlQoX19pIDwgX19yLT5fTV9zaXplLl9NX2RhdGEpCisgICAgaWYgKDAgIT0gX19jc3RyKSByZXR1cm4gX19jc3RyW19faV07CisgICAgZm9yKDs7KSB7CisgICAgICBzd2l0Y2goX19yLT5fTV90YWcpIHsKKyAgY2FzZSBfUm9wZVJlcDo6X1NfY29uY2F0OgorICAgICAgeworICAgIF9Sb3BlQ29uY2F0ZW5hdGlvbiogX19jID0gKF9Sb3BlQ29uY2F0ZW5hdGlvbiopX19yOworICAgIF9Sb3BlUmVwKiBfX2xlZnQgPSBfX2MtPl9NX2xlZnQ7CisgICAgc2l6ZV90IF9fbGVmdF9sZW4gPSBfX2xlZnQtPl9NX3NpemUuX01fZGF0YTsKKworICAgIGlmIChfX2kgPj0gX19sZWZ0X2xlbikgeworICAgICAgICBfX2kgLT0gX19sZWZ0X2xlbjsKKyAgICAgICAgX19yID0gX19jLT5fTV9yaWdodDsKKyAgICB9IGVsc2UgeworICAgICAgICBfX3IgPSBfX2xlZnQ7CisgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgIGNhc2UgX1JvcGVSZXA6Ol9TX2xlYWY6CisgICAgICB7CisgICAgX1JvcGVMZWFmKiBfX2wgPSAoX1JvcGVMZWFmKilfX3I7CisgICAgcmV0dXJuIF9fbC0+X01fZGF0YVtfX2ldOworICAgICAgfQorICBjYXNlIF9Sb3BlUmVwOjpfU19mdW5jdGlvbjoKKyAgY2FzZSBfUm9wZVJlcDo6X1Nfc3Vic3RyaW5nZm46CisgICAgICB7CisgICAgX1JvcGVGdW5jdGlvbiogX19mID0gKF9Sb3BlRnVuY3Rpb24qKV9fcjsKKyAgICBfQ2hhclQgX19yZXN1bHQ7CisKKyAgICAoKihfX2YtPl9NX2ZuKSkoX19pLCAxLCAmX19yZXN1bHQpOworICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgICAgIH0KKyAgICAgIH0KKyAgICB9CisjaWYgZGVmaW5lZChfU1RMUF9ORUVEX1VOUkVBQ0hBQkxFX1JFVFVSTikKKyAgICByZXR1cm4gMDsKKyNlbmRpZgorfQorCisvLyBSZXR1cm4gYSB1bmlxdWVseSByZWZlcmVuY2VkIGNoYXJhY3RlciBzbG90IGZvciB0aGUgZ2l2ZW4KKy8vIHBvc2l0aW9uLCBvciAwIGlmIHRoYXQncyBub3QgcG9zc2libGUuCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CitfQ2hhclQqCityb3BlPF9DaGFyVCxfQWxsb2M+OjpfU19mZXRjaF9wdHIoX1JvcGVSZXAqIF9fciwgc2l6ZV90eXBlIF9faSkKK3sKKyAgICBfUm9wZVJlcCogX19jbHJzdGFja1tfUm9wZVJlcDo6X1NfbWF4X3JvcGVfZGVwdGhdOworICAgIHNpemVfdCBfX2NzcHRyID0gMDsKKworICAgIGZvcig7OykgeworICAgICAgLy8gaWYgKF9fci0+X01fcmVmX2NvdW50ID4gMSkgcmV0dXJuIDA7CisgICAgICBpZiAoIF9fci0+X01faW5jcigpID4gMiApIHsKKyAgICAgICAgX19yLT5fTV9kZWNyKCk7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgc3dpdGNoKF9fci0+X01fdGFnKSB7CisgIGNhc2UgX1JvcGVSZXA6Ol9TX2NvbmNhdDoKKyAgICAgIHsKKyAgICBfUm9wZUNvbmNhdGVuYXRpb24qIF9fYyA9IChfUm9wZUNvbmNhdGVuYXRpb24qKV9fcjsKKyAgICBfUm9wZVJlcCogX19sZWZ0ID0gX19jLT5fTV9sZWZ0OworICAgIHNpemVfdCBfX2xlZnRfbGVuID0gX19sZWZ0LT5fTV9zaXplLl9NX2RhdGE7CisKKyAgICBpZiAoX19jLT5fTV9jX3N0cmluZyAhPSAwKSBfX2NscnN0YWNrW19fY3NwdHIrK10gPSBfX2M7CisgICAgaWYgKF9faSA+PSBfX2xlZnRfbGVuKSB7CisgICAgICAgIF9faSAtPSBfX2xlZnRfbGVuOworICAgICAgICBfX3IgPSBfX2MtPl9NX3JpZ2h0OworICAgIH0gZWxzZSB7CisgICAgICAgIF9fciA9IF9fbGVmdDsKKyAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgY2FzZSBfUm9wZVJlcDo6X1NfbGVhZjoKKyAgICAgIHsKKyAgICBfUm9wZUxlYWYqIF9fbCA9IChfUm9wZUxlYWYqKV9fcjsKKyAgICBpZiAoX19sLT5fTV9jX3N0cmluZyAhPSBfX2wtPl9NX2RhdGEgJiYgX19sLT5fTV9jX3N0cmluZyAhPSAwKQorICAgICAgICBfX2NscnN0YWNrW19fY3NwdHIrK10gPSBfX2w7CisgICAgd2hpbGUgKF9fY3NwdHIgPiAwKSB7CisgICAgICAgIC0tIF9fY3NwdHI7CisgICAgICAgIF9Sb3BlUmVwKiBfX2QgPSBfX2NscnN0YWNrW19fY3NwdHJdOworICAgICAgICBfX2QtPl9NX2ZyZWVfY19zdHJpbmcoKTsKKyAgICAgICAgX19kLT5fTV9jX3N0cmluZyA9IDA7CisgICAgfQorICAgIHJldHVybiBfX2wtPl9NX2RhdGEgKyBfX2k7CisgICAgICB9CisgIGNhc2UgX1JvcGVSZXA6Ol9TX2Z1bmN0aW9uOgorICBjYXNlIF9Sb3BlUmVwOjpfU19zdWJzdHJpbmdmbjoKKyAgICAgIHJldHVybiAwOworICAgICAgfQorICAgIH0KKyNpZiBkZWZpbmVkKF9TVExQX05FRURfVU5SRUFDSEFCTEVfUkVUVVJOKQorICAgIHJldHVybiAwOworI2VuZGlmCisKK30KKworLy8gVGhlIGZvbGxvd2luZyBjb3VsZCBiZSBpbXBsZW1lbnRlZCB0cml2aWFsbHkgdXNpbmcKKy8vIGxleGljb2dyYXBoaWNhbF9jb21wYXJlXzN3YXkuCisvLyBXZSBkbyBhIGxpdHRsZSBtb3JlIHdvcmsgdG8gYXZvaWQgZGVhbGluZyB3aXRoIHJvcGUgaXRlcmF0b3JzIGZvcgorLy8gZmxhdCBzdHJpbmdzLgordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgoraW50Cityb3BlPF9DaGFyVCxfQWxsb2M+OjpfU19jb21wYXJlIChjb25zdCBfUm9wZVJlcCogX19sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1JvcGVSZXAqIF9fcmlnaHQpIHsKKyAgc2l6ZV90IF9fbGVmdF9sZW47CisgIHNpemVfdCBfX3JpZ2h0X2xlbjsKKworICBpZiAoMCA9PSBfX3JpZ2h0KSByZXR1cm4gMCAhPSBfX2xlZnQ7CisgIGlmICgwID09IF9fbGVmdCkgcmV0dXJuIC0xOworICBfX2xlZnRfbGVuID0gX19sZWZ0LT5fTV9zaXplLl9NX2RhdGE7CisgIF9fcmlnaHRfbGVuID0gX19yaWdodC0+X01fc2l6ZS5fTV9kYXRhOworICBpZiAoX1JvcGVSZXA6Ol9TX2xlYWYgPT0gX19sZWZ0LT5fTV90YWcpIHsKKyAgICBjb25zdCBfUm9wZUxlYWYqIF9fbCA9IF9fU1RBVElDX0NBU1QoY29uc3QgX1JvcGVMZWFmKiwgX19sZWZ0KTsKKyAgICBpZiAoX1JvcGVSZXA6Ol9TX2xlYWYgPT0gX19yaWdodC0+X01fdGFnKSB7CisgICAgICBjb25zdCBfUm9wZUxlYWYqIF9fciA9IF9fU1RBVElDX0NBU1QoY29uc3QgX1JvcGVMZWFmKiwgX19yaWdodCk7CisgICAgICByZXR1cm4gX1NUTFBfUFJJViBfX2xleGljb2dyYXBoaWNhbF9jb21wYXJlXzN3YXkoX19sLT5fTV9kYXRhLCBfX2wtPl9NX2RhdGEgKyBfX2xlZnRfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fci0+X01fZGF0YSwgX19yLT5fTV9kYXRhICsgX19yaWdodF9sZW4pOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fcnN0YXJ0KF9fcmlnaHQsIDApOworICAgICAgY29uc3RfaXRlcmF0b3IgX19yZW5kKF9fcmlnaHQsIF9fcmlnaHRfbGVuKTsKKyAgICAgIHJldHVybiBfU1RMUF9QUklWIF9fbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmVfM3dheShfX2wtPl9NX2RhdGEsIF9fbC0+X01fZGF0YSArIF9fbGVmdF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19yc3RhcnQsIF9fcmVuZCk7CisgICAgfQorICB9CisgIGVsc2UgeworICAgIGNvbnN0X2l0ZXJhdG9yIF9fbHN0YXJ0KF9fbGVmdCwgMCk7CisgICAgY29uc3RfaXRlcmF0b3IgX19sZW5kKF9fbGVmdCwgX19sZWZ0X2xlbik7CisgICAgaWYgKF9Sb3BlUmVwOjpfU19sZWFmID09IF9fcmlnaHQtPl9NX3RhZykgeworICAgICAgY29uc3QgX1JvcGVMZWFmKiBfX3IgPSBfX1NUQVRJQ19DQVNUKGNvbnN0IF9Sb3BlTGVhZiosIF9fcmlnaHQpOworICAgICAgcmV0dXJuIF9TVExQX1BSSVYgX19sZXhpY29ncmFwaGljYWxfY29tcGFyZV8zd2F5KF9fbHN0YXJ0LCBfX2xlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19yLT5fTV9kYXRhLCBfX3ItPl9NX2RhdGEgKyBfX3JpZ2h0X2xlbik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgY29uc3RfaXRlcmF0b3IgX19yc3RhcnQoX19yaWdodCwgMCk7CisgICAgICBjb25zdF9pdGVyYXRvciBfX3JlbmQoX19yaWdodCwgX19yaWdodF9sZW4pOworICAgICAgcmV0dXJuIF9TVExQX1BSSVYgX19sZXhpY29ncmFwaGljYWxfY29tcGFyZV8zd2F5KF9fbHN0YXJ0LCBfX2xlbmQsIF9fcnN0YXJ0LCBfX3JlbmQpOworICAgIH0KKyAgfQorfQorCisvLyBBc3NpZ25tZW50IHRvIHJlZmVyZW5jZSBwcm94aWVzLgordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorX1JvcGVfY2hhcl9yZWZfcHJveHk8X0NoYXJULCBfQWxsb2M+JgorX1JvcGVfY2hhcl9yZWZfcHJveHk8X0NoYXJULCBfQWxsb2M+OjpvcGVyYXRvcj0gKF9DaGFyVCBfX2MpIHsKKyAgICBfUm9wZVJlcCogX19vbGQgPSBfTV9yb290LT5fTV90cmVlX3B0ci5fTV9kYXRhOworICAvLyBGaXJzdCBjaGVjayBmb3IgdGhlIGNhc2UgaW4gd2hpY2ggZXZlcnl0aGluZyBpcyB1bmlxdWVseQorICAvLyByZWZlcmVuY2VkLiAgSW4gdGhhdCBjYXNlIHdlIGNhbiBkbyB0aGlzIGRlc3RydWN0aXZlbHkuCisgIF9DaGFyVCogX19wdHIgPSBfTXlfcm9wZTo6X1NfZmV0Y2hfcHRyKF9fb2xkLCBfTV9wb3MpOworICBpZiAoMCAhPSBfX3B0cikgeworICAgICAgKl9fcHRyID0gX19jOworICAgICAgcmV0dXJuICp0aGlzOworICB9CisgICAgX1NlbGZfZGVzdHJ1Y3RfcHRyIF9fbGVmdCgKKyAgICAgIF9NeV9yb3BlOjpfU19zdWJzdHJpbmcoX19vbGQsIDAsIF9NX3BvcykpOworICAgIF9TZWxmX2Rlc3RydWN0X3B0ciBfX3JpZ2h0KAorICAgICAgX015X3JvcGU6Ol9TX3N1YnN0cmluZyhfX29sZCwgX01fcG9zKzEsIF9fb2xkLT5fTV9zaXplLl9NX2RhdGEpKTsKKyAgICBfU2VsZl9kZXN0cnVjdF9wdHIgX19yZXN1bHRfbGVmdCgKKyAgICAgIF9NeV9yb3BlOjpfU19kZXN0cl9jb25jYXRfY2hhcl9pdGVyKF9fbGVmdCwgJl9fYywgMSkpOworCisgICAgLy8gX1NUTFBfQVNTRVJUKF9fbGVmdCA9PSBfX3Jlc3VsdF9sZWZ0IHx8IDEgPT0gX19yZXN1bHRfbGVmdC0+X01fcmVmX2NvdW50KQorICAgIF9Sb3BlUmVwKiBfX3Jlc3VsdCA9CisgICAgICBfTXlfcm9wZTo6X1NfY29uY2F0X3JlcChfX3Jlc3VsdF9sZWZ0LCBfX3JpZ2h0KTsKKyAgICAvLyBfU1RMUF9BU1NFUlQoMSA8PSBfX3Jlc3VsdC0+X01fcmVmX2NvdW50KQorICAgIF9Sb3BlUmVwOjpfU191bnJlZihfX29sZCk7CisgICAgX01fcm9vdC0+X01fdHJlZV9wdHIuX01fZGF0YSA9IF9fcmVzdWx0OworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorX1JvcGVfY2hhcl9wdHJfcHJveHk8X0NoYXJULCBfQWxsb2M+CitfUm9wZV9jaGFyX3JlZl9wcm94eTxfQ2hhclQsIF9BbGxvYz46Om9wZXJhdG9yJiAoKSBjb25zdCB7CisgICAgcmV0dXJuIF9Sb3BlX2NoYXJfcHRyX3Byb3h5PF9DaGFyVCwgX0FsbG9jPigqdGhpcyk7Cit9CisKKyMgaWYgKCBfU1RMUF9TVEFUSUNfVEVNUExBVEVfREFUQSA+IDAgKQordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CitfQ2hhclQgcm9wZTxfQ2hhclQsX0FsbG9jPjo6X1NfZW1wdHlfY19zdHJbMV0gPSB7IF9DaGFyVCgpIH07CisjIGVsc2UKK19fREVDTEFSRV9JTlNUQU5DRShjaGFyLCBjcm9wZTo6X1NfZW1wdHlfY19zdHJbMV0sID17MH0pOworIyBpZmRlZiBfU1RMUF9IQVNfV0NIQVJfVAorX19ERUNMQVJFX0lOU1RBTkNFKHdjaGFyX3QsIHdyb3BlOjpfU19lbXB0eV9jX3N0clsxXSwgPXswfSk7CisjIGVuZGlmIC8qIF9TVExQX0hBU19XQ0hBUl9UICovCisjIGVuZGlmIC8qIF9TVExQX1NUQVRJQ19URU1QTEFURV9EQVRBICovCisvLyAjIGVuZGlmCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfU1RBVElDX0NPTlNUX0lOSVRfQlVHKQorIyAgaWYgIWRlZmluZWQgKF9fR05VQ19fKSB8fCAoX19HTlVDX18gIT0gMikgfHwgKF9fR05VQ19NSU5PUl9fICE9IDk2KQordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorY29uc3Qgc2l6ZV90IHJvcGU8X0NoYXJULCBfQWxsb2M+OjpucG9zOworIyAgZW5kaWYKKyNlbmRpZgorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KK2NvbnN0IF9DaGFyVCogcm9wZTxfQ2hhclQsX0FsbG9jPjo6Y19zdHIoKSBjb25zdCB7CisgIGlmICgwID09IF9NX3RyZWVfcHRyLl9NX2RhdGEpIHsKKyAgICAvLyBQb3NzaWJseSByZWR1bmRhbnQsIGJ1dCBwcm9iYWJseSBmYXN0LgorICAgIF9TX2VtcHR5X2Nfc3RyWzBdID0gX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRChfQ2hhclQpOworICAgIHJldHVybiBfU19lbXB0eV9jX3N0cjsKKyAgfQorICBfQ2hhclQqIF9fb2xkX2Nfc3RyaW5nID0gX01fdHJlZV9wdHIuX01fZGF0YS0+X01fY19zdHJpbmc7CisgIGlmICgwICE9IF9fb2xkX2Nfc3RyaW5nKSByZXR1cm4gX19vbGRfY19zdHJpbmc7CisgIHNpemVfdCBfX3MgPSBzaXplKCk7CisgIF9DaGFyVCogX19yZXN1bHQgPSBfU1RMUF9DUkVBVEVfQUxMT0NBVE9SKGFsbG9jYXRvcl90eXBlLChjb25zdCBhbGxvY2F0b3JfdHlwZSYpX01fdHJlZV9wdHIsIF9DaGFyVCkuYWxsb2NhdGUoX19zICsgMSk7CisgIF9TX2ZsYXR0ZW4oX01fdHJlZV9wdHIuX01fZGF0YSwgX19yZXN1bHQpOworICBfU19jb25zdHJ1Y3RfbnVsbChfX3Jlc3VsdCArIF9fcyk7CisgIF9fb2xkX2Nfc3RyaW5nID0gX19TVEFUSUNfQ0FTVChfQ2hhclQqLCBfQXRvbWljX3N3YXBfcHRyKF9fUkVJTlRFUlBSRVRfQ0FTVCh2b2lkKiBfU1RMUF9WT0xBVElMRSosICYoX01fdHJlZV9wdHIuX01fZGF0YS0+X01fY19zdHJpbmcpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19yZXN1bHQpKTsKKyAgaWYgKDAgIT0gX19vbGRfY19zdHJpbmcpIHsKKyAgICAvLyBJdCBtdXN0IGhhdmUgYmVlbiBhZGRlZCBpbiB0aGUgaW50ZXJpbS4gIEhlbmNlIGl0IGhhZCB0byBoYXZlIGJlZW4KKyAgICAvLyBzZXBhcmF0ZWx5IGFsbG9jYXRlZC4gIERlYWxsb2NhdGUgdGhlIG9sZCBjb3B5LCBzaW5jZSB3ZSBqdXN0CisgICAgLy8gcmVwbGFjZWQgaXQuCisgICAgX1NUTFBfU1REOjpfRGVzdHJveV9SYW5nZShfX29sZF9jX3N0cmluZywgX19vbGRfY19zdHJpbmcgKyBfX3MgKyAxKTsKKyAgICBfU1RMUF9DUkVBVEVfQUxMT0NBVE9SKGFsbG9jYXRvcl90eXBlLChjb25zdCBhbGxvY2F0b3JfdHlwZSYpX01fdHJlZV9wdHIsIF9DaGFyVCkuZGVhbGxvY2F0ZShfX29sZF9jX3N0cmluZywgX19zICsgMSk7CisgIH0KKyAgcmV0dXJuIF9fcmVzdWx0OworfQorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KK2NvbnN0IF9DaGFyVCogcm9wZTxfQ2hhclQsX0FsbG9jPjo6cmVwbGFjZV93aXRoX2Nfc3RyKCkgeworICBpZiAoMCA9PSBfTV90cmVlX3B0ci5fTV9kYXRhKSB7CisgICAgX1NfZW1wdHlfY19zdHJbMF0gPSBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKF9DaGFyVCk7CisgICAgcmV0dXJuIF9TX2VtcHR5X2Nfc3RyOworICB9CisgIF9DaGFyVCogX19vbGRfY19zdHJpbmcgPSBfTV90cmVlX3B0ci5fTV9kYXRhLT5fTV9jX3N0cmluZzsKKyAgaWYgKF9Sb3BlUmVwOjpfU19sZWFmID09IF9NX3RyZWVfcHRyLl9NX2RhdGEtPl9NX3RhZyAmJiAwICE9IF9fb2xkX2Nfc3RyaW5nKSB7CisgICAgcmV0dXJuIF9fb2xkX2Nfc3RyaW5nOworICB9CisgIHNpemVfdCBfX3MgPSBzaXplKCk7CisgIF9DaGFyVCogX19yZXN1bHQgPSBfTV90cmVlX3B0ci5hbGxvY2F0ZShfU19yb3VuZGVkX3VwX3NpemUoX19zKSk7CisgIF9TX2ZsYXR0ZW4oX01fdHJlZV9wdHIuX01fZGF0YSwgX19yZXN1bHQpOworICBfU19jb25zdHJ1Y3RfbnVsbChfX3Jlc3VsdCArIF9fcyk7CisgIF9NX3RyZWVfcHRyLl9NX2RhdGEtPl9NX3VucmVmX25vbm5pbCgpOworICBfTV90cmVlX3B0ci5fTV9kYXRhID0gX1NfbmV3X1JvcGVMZWFmKF9fcmVzdWx0LCBfX3MsIF9NX3RyZWVfcHRyKTsKKyAgcmV0dXJuIF9fcmVzdWx0OworfQorCisvLyBBbGdvcml0aG0gc3BlY2lhbGl6YXRpb25zLiAgTW9yZSBzaG91bGQgYmUgYWRkZWQuCisKKyNpZiAoIWRlZmluZWQgKF9TVExQX01TVkMpIHx8IChfU1RMUF9NU1ZDID49IDEzMTApKSAmJiBcCisgICAgKCFkZWZpbmVkIChfX0RNQ19fKSB8fCBkZWZpbmVkIChfX1BVVF9TVEFUSUNfREFUQV9NRU1CRVJTX0hFUkUpKQorLy8gSSBjb3VsZG4ndCBnZXQgdGhpcyB0byB3b3JrIHdpdGggVkMrKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULGNsYXNzIF9BbGxvYz4KK3ZvaWQgX1JvcGVfcm90YXRlKF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+IF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPiBfX21pZGRsZSwKKyAgICAgICAgICAgICAgICAgIF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+IF9fbGFzdCkgeworICBfU1RMUF9BU1NFUlQoX19maXJzdC5jb250YWluZXIoKSA9PSBfX21pZGRsZS5jb250YWluZXIoKSAmJgorICAgICAgICAgICAgICAgX19taWRkbGUuY29udGFpbmVyKCkgPT0gX19sYXN0LmNvbnRhaW5lcigpKQorICByb3BlPF9DaGFyVCxfQWxsb2M+JiBfX3IoX19maXJzdC5jb250YWluZXIoKSk7CisgIHJvcGU8X0NoYXJULF9BbGxvYz4gX19wcmVmaXggPSBfX3Iuc3Vic3RyKDAsIF9fZmlyc3QuaW5kZXgoKSk7CisgIHJvcGU8X0NoYXJULF9BbGxvYz4gX19zdWZmaXggPQorICAgIF9fci5zdWJzdHIoX19sYXN0LmluZGV4KCksIF9fci5zaXplKCkgLSBfX2xhc3QuaW5kZXgoKSk7CisgIHJvcGU8X0NoYXJULF9BbGxvYz4gX19wYXJ0MSA9CisgICAgX19yLnN1YnN0cihfX21pZGRsZS5pbmRleCgpLCBfX2xhc3QuaW5kZXgoKSAtIF9fbWlkZGxlLmluZGV4KCkpOworICByb3BlPF9DaGFyVCxfQWxsb2M+IF9fcGFydDIgPQorICAgIF9fci5zdWJzdHIoX19maXJzdC5pbmRleCgpLCBfX21pZGRsZS5pbmRleCgpIC0gX19maXJzdC5pbmRleCgpKTsKKyAgX19yID0gX19wcmVmaXg7CisgIF9fciArPSBfX3BhcnQxOworICBfX3IgKz0gX19wYXJ0MjsKKyAgX19yICs9IF9fc3VmZml4OworfQorCisKKyMgaWYgMAorLy8gUHJvYmFibHkgbm90IHVzZWZ1bCBmb3Igc2V2ZXJhbCByZWFzb25zOgorLy8gLSBmb3IgU0dJcyA3LjEgY29tcGlsZXIgYW5kIHByb2JhYmx5IHNvbWUgb3RoZXJzLAorLy8gICB0aGlzIGZvcmNlcyBsb3RzIG9mIHJvcGU8d2NoYXJfdCwgLi4uPiBpbnN0YW50aWF0aW9ucywgY3JlYXRpbmcgYQorLy8gICBjb2RlIGJsb2F0IGFuZCBjb21waWxlIHRpbWUgcHJvYmxlbS4gIChGaXhlZCBpbiA3LjIuKQorLy8gLSB3Y2hhcl90IGlzIDQgYnl0ZXMgd2lkZSBvbiBtb3N0IFVOSVggcGxhdGZvcm1zLCBtYWtpbmcgaXQgdW5hdHRyYWN0aXZlCisvLyAgIGZvciB1bmljb2RlIHN0cmluZ3MuICBVbnNpZ25lZCBzaG9ydCBtYXkgYmUgYSBiZXR0ZXIgY2hhcmFjdGVyCisvLyAgIHR5cGUuCitpbmxpbmUgdm9pZCByb3RhdGUoCisgICAgX1JvcGVfaXRlcmF0b3I8d2NoYXJfdCxfU1RMUF9ERUZBVUxUX0FMTE9DQVRPUihjaGFyKSA+IF9fZmlyc3QsCisgICAgICAgICAgICAgICAgX1JvcGVfaXRlcmF0b3I8d2NoYXJfdCxfU1RMUF9ERUZBVUxUX0FMTE9DQVRPUihjaGFyKSA+IF9fbWlkZGxlLAorICAgICAgICAgICAgICAgIF9Sb3BlX2l0ZXJhdG9yPHdjaGFyX3QsX1NUTFBfREVGQVVMVF9BTExPQ0FUT1IoY2hhcikgPiBfX2xhc3QpIHsKKyAgICBfUm9wZV9yb3RhdGUoX19maXJzdCwgX19taWRkbGUsIF9fbGFzdCk7Cit9CisjIGVuZGlmCisjZW5kaWYgLyogX1NUTFBfTVNWQyAqLworCisjICAgdW5kZWYgX19Sb3BlTGVhZl9fCisjICAgdW5kZWYgX19Sb3BlUmVwX18KKyMgICB1bmRlZiBfX1JvcGVMZWFmCisjICAgdW5kZWYgX19Sb3BlUmVwCisjICAgdW5kZWYgc2l6ZV90eXBlCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworIyBlbmRpZiAvKiBST1BFSU1QTF9IICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvX3JvcGUuaCBiL3N0bC9fcm9wZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZmM4NGUKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvX3JvcGUuaApAQCAtMCwwICsxLDIzNzQgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKy8qIE5PVEU6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIFNUTCBoZWFkZXJzLgorICogICBZb3Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4KKyAqLworCisvLyByb3BlPF9DaGFyVCxfQWxsb2M+IGlzIGEgc2VxdWVuY2Ugb2YgX0NoYXJULgorLy8gUm9wZXMgYXBwZWFyIHRvIGJlIG11dGFibGUsIGJ1dCB1cGRhdGUgb3BlcmF0aW9ucworLy8gcmVhbGx5IGNvcHkgZW5vdWdoIG9mIHRoZSBkYXRhIHN0cnVjdHVyZSB0byBsZWF2ZSB0aGUgb3JpZ2luYWwKKy8vIHZhbGlkLiAgVGh1cyByb3BlcyBjYW4gYmUgbG9naWNhbGx5IGNvcGllZCBieSBqdXN0IGNvcHlpbmcKKy8vIGEgcG9pbnRlciB2YWx1ZS4KKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9ST1BFX0gKKyNkZWZpbmUgX1NUTFBfSU5URVJOQUxfUk9QRV9ICisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQUxHT0JBU0VfSAorIyAgaW5jbHVkZSA8c3RsL19hbGdvYmFzZS5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU9TRldECisjICBpbmNsdWRlIDxpb3Nmd2Q+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9BTExPQ19ICisjICBpbmNsdWRlIDxzdGwvX2FsbG9jLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9JVEVSQVRPUl9ICisjICBpbmNsdWRlIDxzdGwvX2l0ZXJhdG9yLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9BTEdPX0gKKyMgIGluY2x1ZGUgPHN0bC9fYWxnby5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfRlVOQ1RJT05fQkFTRV9ICisjICBpbmNsdWRlIDxzdGwvX2Z1bmN0aW9uX2Jhc2UuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX05VTUVSSUNfSAorIyAgaW5jbHVkZSA8c3RsL19udW1lcmljLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9IQVNIX0ZVTl9ICisjICBpbmNsdWRlIDxzdGwvX2hhc2hfZnVuLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9DSEFSX1RSQUlUU19ICisjICBpbmNsdWRlIDxzdGwvY2hhcl90cmFpdHMuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX1RIUkVBRFNfSAorIyAgaW5jbHVkZSA8c3RsL190aHJlYWRzLmg+CisjZW5kaWYKKworI2lmZGVmIF9TVExQX1NHSV9USFJFQURTCisjICBpbmNsdWRlIDxtdXRleC5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfRE9OVF9TVVBQT1JUX1JFQklORF9NRU1CRVJfVEVNUExBVEUKKyMgIGRlZmluZSBfU1RMUF9DUkVBVEVfQUxMT0NBVE9SKF9fYXR5cGUsX19hLCBfVHApIChfQWxsb2NfdHJhaXRzPF9UcCxfX2F0eXBlPjo6Y3JlYXRlX2FsbG9jYXRvcihfX2EpKQorI2VsaWYgZGVmaW5lZChfX01SQ19fKXx8ZGVmaW5lZChfX1NDX18pCisjICBkZWZpbmUgX1NUTFBfQ1JFQVRFX0FMTE9DQVRPUihfX2F0eXBlLF9fYSwgX1RwKSBfX3N0bF9hbGxvY19jcmVhdGU8X1RwLF9fYXR5cGU+KF9fYSwoX1RwKikwKQorI2Vsc2UKKyMgIGRlZmluZSBfU1RMUF9DUkVBVEVfQUxMT0NBVE9SKF9fYXR5cGUsX19hLCBfVHApIF9fc3RsX2FsbG9jX2NyZWF0ZShfX2EsKF9UcCopMCkKKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworLy8gRmlyc3QgYSBsb3Qgb2YgZm9yd2FyZCBkZWNsYXJhdGlvbnMuICBUaGUgc3RhbmRhcmQgc2VlbXMgdG8gcmVxdWlyZQorLy8gbXVjaCBzdHJpY3RlciAiZGVjbGFyYXRpb24gYmVmb3JlIHVzZSIgdGhhbiBtYW55IG9mIHRoZSBpbXBsZW1lbnRhdGlvbnMKKy8vIHRoYXQgcHJlY2VkZWQgaXQuCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIF9TVExQX0RFRkFVTFRfQUxMT0NBVE9SX1NFTEVDVChfQ2hhclQpID4gY2xhc3Mgcm9wZTsKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPiBzdHJ1Y3QgX1JvcGVfUm9wZUNvbmNhdGVuYXRpb247Cit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4gc3RydWN0IF9Sb3BlX1JvcGVSZXA7Cit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4gc3RydWN0IF9Sb3BlX1JvcGVMZWFmOwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+IHN0cnVjdCBfUm9wZV9Sb3BlRnVuY3Rpb247Cit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4gc3RydWN0IF9Sb3BlX1JvcGVTdWJzdHJpbmc7Cit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4gY2xhc3MgX1JvcGVfaXRlcmF0b3I7Cit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4gY2xhc3MgX1JvcGVfY29uc3RfaXRlcmF0b3I7Cit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4gY2xhc3MgX1JvcGVfY2hhcl9yZWZfcHJveHk7Cit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4gY2xhc3MgX1JvcGVfY2hhcl9wdHJfcHJveHk7CisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKworLy8gU29tZSBoZWxwZXJzLCBzbyB3ZSBjYW4gdXNlIHRoZSBwb3dlciBhbGdvcml0aG0gb24gcm9wZXMuCisvLyBTZWUgYmVsb3cgZm9yIHdoeSB0aGlzIGlzbid0IGxvY2FsIHRvIHRoZSBpbXBsZW1lbnRhdGlvbi4KKworLy8gVGhpcyB1c2VzIGEgbm9uc3RhbmRhcmQgcmVmY291bnQgY29udmVudGlvbi4KKy8vIFRoZSByZXN1bHQgaGFzIHJlZmNvdW50IDAuCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KK3N0cnVjdCBfUm9wZV9Db25jYXRfZm4KKyAgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPHJvcGU8X0NoYXJULF9BbGxvYz4sIHJvcGU8X0NoYXJULF9BbGxvYz4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICByb3BlPF9DaGFyVCxfQWxsb2M+ID4geworICByb3BlPF9DaGFyVCxfQWxsb2M+IG9wZXJhdG9yKCkgKGNvbnN0IHJvcGU8X0NoYXJULF9BbGxvYz4mIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByb3BlPF9DaGFyVCxfQWxsb2M+JiBfX3kpIHsKKyAgICByZXR1cm4gX194ICsgX195OworICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CitpbmxpbmUKK3JvcGU8X0NoYXJULF9BbGxvYz4KK19faWRlbnRpdHlfZWxlbWVudChfUm9wZV9Db25jYXRfZm48X0NoYXJULCBfQWxsb2M+KQoreyByZXR1cm4gcm9wZTxfQ2hhclQsX0FsbG9jPigpOyB9CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCisvLyBTdG9yZSBhbiBlb3MKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+CitpbmxpbmUgdm9pZCBfU19jb25zdHJ1Y3RfbnVsbF9hdXgoX0NoYXJUICpfX3AsIGNvbnN0IF9fdHJ1ZV90eXBlJikKK3sgKl9fcCA9IDA7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KK2lubGluZSB2b2lkIF9TX2NvbnN0cnVjdF9udWxsX2F1eChfQ2hhclQgKl9fcCwgY29uc3QgX19mYWxzZV90eXBlJikKK3sgX1NUTFBfU1REOjpfQ29uc3RydWN0KF9fcCk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KK2lubGluZSB2b2lkIF9TX2NvbnN0cnVjdF9udWxsKF9DaGFyVCAqX19wKSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0lzSW50ZWdyYWw8X0NoYXJUPjo6X1JldCBfQ2hhcl9Jc19JbnRlZ3JhbDsKKyAgX1NfY29uc3RydWN0X251bGxfYXV4KF9fcCwgX0NoYXJfSXNfSW50ZWdyYWwoKSk7Cit9CisKKy8vIGNoYXJfcHJvZHVjZXJzIGFyZSBsb2dpY2FsbHkgZnVuY3Rpb25zIHRoYXQgZ2VuZXJhdGUgYSBzZWN0aW9uIG9mCisvLyBhIHN0cmluZy4gIFRoZXNlIGNhbiBiZSBjb252ZXJ0ZWQgdG8gcm9wZXMuICBUaGUgcmVzdWx0aW5nIHJvcGUKKy8vIGludm9rZXMgdGhlIGNoYXJfcHJvZHVjZXIgb24gZGVtYW5kLiAgVGhpcyBhbGxvd3MsIGZvciBleGFtcGxlLAorLy8gZmlsZXMgdG8gYmUgdmlld2VkIGFzIHJvcGVzIHdpdGhvdXQgcmVhZGluZyB0aGUgZW50aXJlIGZpbGUuCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgorY2xhc3MgY2hhcl9wcm9kdWNlciB7CitwdWJsaWM6CisgIHZpcnR1YWwgfmNoYXJfcHJvZHVjZXIoKSB7fQorICB2aXJ0dWFsIHZvaWQgb3BlcmF0b3IoKShzaXplX3QgX19zdGFydF9wb3MsIHNpemVfdCBfX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX0NoYXJUKiBfX2J1ZmZlcikgPSAwOworICAvLyBCdWZmZXIgc2hvdWxkIHJlYWxseSBiZSBhbiBhcmJpdHJhcnkgb3V0cHV0IGl0ZXJhdG9yLgorICAvLyBUaGF0IHdheSB3ZSBjb3VsZCBmbGF0dGVuIGRpcmVjdGx5IGludG8gYW4gb3N0cmVhbSwgZXRjLgorICAvLyBUaGlzIGlzIHRob3JvdWdobHkgaW1wb3NzaWJsZSwgc2luY2UgaXRlcmF0b3IgdHlwZXMgZG9uJ3QKKyAgLy8gaGF2ZSBydW50aW1lIGRlc2NyaXB0aW9ucy4KK307CisKKy8vIFNlcXVlbmNlIGJ1ZmZlcnM6CisvLworLy8gU2VxdWVuY2UgbXVzdCBwcm92aWRlIGFuIGFwcGVuZCBvcGVyYXRpb24gdGhhdCBhcHBlbmRzIGFuCisvLyBhcnJheSB0byB0aGUgc2VxdWVuY2UuICBTZXF1ZW5jZSBidWZmZXJzIGFyZSB1c2VmdWwgb25seSBpZgorLy8gYXBwZW5kaW5nIGFuIGVudGlyZSBhcnJheSBpcyBjaGVhcGVyIHRoYW4gYXBwZW5kaW5nIGVsZW1lbnQgYnkgZWxlbWVudC4KKy8vIFRoaXMgaXMgdHJ1ZSBmb3IgbWFueSBzdHJpbmcgcmVwcmVzZW50YXRpb25zLgorLy8gVGhpcyBzaG91bGQgIHBlcmhhcHMgaW5oZXJpdCBmcm9tIG9zdHJlYW08c2VxdWVuY2U6OnZhbHVlX3R5cGU+CisvLyBhbmQgYmUgaW1wbGVtZW50ZWQgY29ycmVzcG9uZGluZ2x5LCBzbyB0aGF0IHRoZXkgY2FuIGJlIHVzZWQKKy8vIGZvciBmb3JtYXR0ZWQuICBGb3IgdGhlIHNha2Ugb2YgcG9ydGFiaWxpdHksIHdlIGRvbid0IGRvIHRoaXMgeWV0LgorLy8KKy8vIEZvciBub3csIHNlcXVlbmNlIGJ1ZmZlcnMgYmVoYXZlIGFzIG91dHB1dCBpdGVyYXRvcnMuICBCdXQgdGhleSBhbHNvCisvLyBiZWhhdmUgYSBsaXR0bGUgbGlrZSBiYXNpY19vc3RyaW5nc3RyZWFtPHNlcXVlbmNlOjp2YWx1ZV90eXBlPiBhbmQgYQorLy8gbGl0dGxlIGxpa2UgY29udGFpbmVycy4KKwordGVtcGxhdGU8Y2xhc3MgX1NlcXVlbmNlCisjIGlmICEoZGVmaW5lZCAoX1NUTFBfTk9OX1RZUEVfVE1QTF9QQVJBTV9CVUcpIHx8IFwKKyAgICAgICBkZWZpbmVkICggX1NUTFBfTk9fREVGQVVMVF9OT05fVFlQRV9QQVJBTSApKQorICAgICAgICAgLCBzaXplX3QgX0J1Zl9zeiA9IDEwMAorIyAgIGlmIGRlZmluZWQoX19zZ2kpICYmICFkZWZpbmVkKF9fR05VQ19fKQorIyAgIGRlZmluZSBfX1RZUEVERUZfV09SS0FST1VORAorICAgICAgICAgLGNsYXNzIF9WID0gdHlwZW5hbWUgX1NlcXVlbmNlOjp2YWx1ZV90eXBlCisjICAgZW5kaWYgLyogX19zZ2kgKi8KKyMgZW5kaWYgLyogX1NUTFBfTk9OX1RZUEVfVE1QTF9QQVJBTV9CVUcgKi8KKyAgICAgICAgID4KKy8vIFRoZSAzcmQgcGFyYW1ldGVyIHdvcmtzIGFyb3VuZCBhIGNvbW1vbiBjb21waWxlciBidWcuCitjbGFzcyBzZXF1ZW5jZV9idWZmZXIgOiBwdWJsaWMgaXRlcmF0b3IgPG91dHB1dF9pdGVyYXRvcl90YWcsIHZvaWQsIHZvaWQsIHZvaWQsIHZvaWQ+IHsKK3B1YmxpYzoKKyMgaWZuZGVmIF9fVFlQRURFRl9XT1JLQVJPVU5ECisgIHR5cGVkZWYgdHlwZW5hbWUgX1NlcXVlbmNlOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgc2VxdWVuY2VfYnVmZmVyPF9TZXF1ZW5jZQorIyBpZiAhKGRlZmluZWQgKF9TVExQX05PTl9UWVBFX1RNUExfUEFSQU1fQlVHKSB8fCBcCisgICAgICAgZGVmaW5lZCAoIF9TVExQX05PX0RFRkFVTFRfTk9OX1RZUEVfUEFSQU0gKSkKKyAgLCBfQnVmX3N6CisgID4gX1NlbGY7CisjIGVsc2UgLyogX1NUTFBfTk9OX1RZUEVfVE1QTF9QQVJBTV9CVUcgKi8KKyAgPiBfU2VsZjsKKyAgZW51bSB7IF9CdWZfc3ogPSAxMDB9OworIyBlbmRpZiAvKiBfU1RMUF9OT05fVFlQRV9UTVBMX1BBUkFNX0JVRyAqLworICAvLyAjIGVuZGlmCisjIGVsc2UgLyogX19UWVBFREVGX1dPUktBUk9VTkQgKi8KKyAgdHlwZWRlZiBfViB2YWx1ZV90eXBlOworICB0eXBlZGVmIHNlcXVlbmNlX2J1ZmZlcjxfU2VxdWVuY2UsIF9CdWZfc3osIF9WPiBfU2VsZjsKKyMgZW5kaWYgLyogX19UWVBFREVGX1dPUktBUk9VTkQgKi8KK3Byb3RlY3RlZDoKKyAgX1NlcXVlbmNlKiBfTV9wcmVmaXg7CisgIHZhbHVlX3R5cGUgX01fYnVmZmVyW19CdWZfc3pdOworICBzaXplX3QgICAgIF9NX2J1Zl9jb3VudDsKK3B1YmxpYzoKKyAgdm9pZCBmbHVzaCgpIHsKKyAgICBfTV9wcmVmaXgtPmFwcGVuZChfTV9idWZmZXIsIF9NX2J1ZmZlciArIF9NX2J1Zl9jb3VudCk7CisgICAgX01fYnVmX2NvdW50ID0gMDsKKyAgfQorICB+c2VxdWVuY2VfYnVmZmVyKCkgeyBmbHVzaCgpOyB9CisgIHNlcXVlbmNlX2J1ZmZlcigpIDogX01fcHJlZml4KDApLCBfTV9idWZfY291bnQoMCkge30KKyAgc2VxdWVuY2VfYnVmZmVyKGNvbnN0IF9TZWxmJiBfX3gpIHsKKyAgICBfTV9wcmVmaXggPSBfX3guX01fcHJlZml4OworICAgIF9NX2J1Zl9jb3VudCA9IF9feC5fTV9idWZfY291bnQ7CisgICAgY29weShfX3guX01fYnVmZmVyLCBfX3guX01fYnVmZmVyICsgX194Ll9NX2J1Zl9jb3VudCwgX01fYnVmZmVyKTsKKyAgfQorICBzZXF1ZW5jZV9idWZmZXIoX1NlbGYmIF9feCkgeworICAgIF9feC5mbHVzaCgpOworICAgIF9NX3ByZWZpeCA9IF9feC5fTV9wcmVmaXg7CisgICAgX01fYnVmX2NvdW50ID0gMDsKKyAgfQorICBzZXF1ZW5jZV9idWZmZXIoX1NlcXVlbmNlJiBfX3MpIDogX01fcHJlZml4KCZfX3MpLCBfTV9idWZfY291bnQoMCkge30KKyAgX1NlbGYmIG9wZXJhdG9yPSAoX1NlbGYmIF9feCkgeworICAgIF9feC5mbHVzaCgpOworICAgIF9NX3ByZWZpeCA9IF9feC5fTV9wcmVmaXg7CisgICAgX01fYnVmX2NvdW50ID0gMDsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgX1NlbGYmIG9wZXJhdG9yPSAoY29uc3QgX1NlbGYmIF9feCkgeworICAgIF9NX3ByZWZpeCA9IF9feC5fTV9wcmVmaXg7CisgICAgX01fYnVmX2NvdW50ID0gX194Ll9NX2J1Zl9jb3VudDsKKyAgICBjb3B5KF9feC5fTV9idWZmZXIsIF9feC5fTV9idWZmZXIgKyBfX3guX01fYnVmX2NvdW50LCBfTV9idWZmZXIpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICB2b2lkIHB1c2hfYmFjayh2YWx1ZV90eXBlIF9feCkgeworICAgIGlmIChfTV9idWZfY291bnQgPCBfQnVmX3N6KSB7CisgICAgICBfTV9idWZmZXJbX01fYnVmX2NvdW50XSA9IF9feDsKKyAgICAgICsrX01fYnVmX2NvdW50OworICAgIH0gZWxzZSB7CisgICAgICBmbHVzaCgpOworICAgICAgX01fYnVmZmVyWzBdID0gX194OworICAgICAgX01fYnVmX2NvdW50ID0gMTsKKyAgICB9CisgIH0KKyAgdm9pZCBhcHBlbmQoY29uc3QgdmFsdWVfdHlwZSAqX19zLCBzaXplX3QgX19sZW4pIHsKKyAgICBpZiAoX19sZW4gKyBfTV9idWZfY291bnQgPD0gX0J1Zl9zeikgeworICAgICAgc2l6ZV90IF9faSA9IF9NX2J1Zl9jb3VudDsKKyAgICAgIHNpemVfdCBfX2ogPSAwOworICAgICAgZm9yICg7IF9faiA8IF9fbGVuOyBfX2krKywgX19qKyspIHsKKyAgICAgICAgX01fYnVmZmVyW19faV0gPSBfX3NbX19qXTsKKyAgICAgIH0KKyAgICAgIF9NX2J1Zl9jb3VudCArPSBfX2xlbjsKKyAgICB9IGVsc2UgaWYgKDAgPT0gX01fYnVmX2NvdW50KSB7CisgICAgICBfTV9wcmVmaXgtPmFwcGVuZChfX3MsIF9fcyArIF9fbGVuKTsKKyAgICB9IGVsc2UgeworICAgICAgZmx1c2goKTsKKyAgICAgIGFwcGVuZChfX3MsIF9fbGVuKTsKKyAgICB9CisgIH0KKyAgX1NlbGYmIHdyaXRlKGNvbnN0IHZhbHVlX3R5cGUgKl9fcywgc2l6ZV90IF9fbGVuKSB7CisgICAgYXBwZW5kKF9fcywgX19sZW4pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBfU2VsZiYgcHV0KHZhbHVlX3R5cGUgX194KSB7CisgICAgcHVzaF9iYWNrKF9feCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIF9TZWxmJiBvcGVyYXRvcj0oY29uc3QgdmFsdWVfdHlwZSYgX19yaHMpIHsKKyAgICBwdXNoX2JhY2soX19yaHMpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBfU2VsZiYgb3BlcmF0b3IqKCkgeyByZXR1cm4gKnRoaXM7IH0KKyAgX1NlbGYmIG9wZXJhdG9yKysoKSB7IHJldHVybiAqdGhpczsgfQorICBfU2VsZiYgb3BlcmF0b3IrKyhpbnQpIHsgcmV0dXJuICp0aGlzOyB9Cit9OworCisvLyBUaGUgZm9sbG93aW5nIHNob3VsZCBiZSB0cmVhdGVkIGFzIHByaXZhdGUsIGF0IGxlYXN0IGZvciBub3cuCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQ+CitjbGFzcyBfUm9wZV9jaGFyX2NvbnN1bWVyIHsKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKK3B1YmxpYzoKKyAgLy9XaXRob3V0IG1lbWJlciB0ZW1wbGF0ZXMgd2UgaGF2ZSB0byB1c2UgcnVuLXRpbWUgcGFyYW1ldGVyaXphdGlvbi4KKyAgLy8gVGhlIHN5bW1ldHJ5IHdpdGggY2hhcl9wcm9kdWNlciBpcyBhY2NpZGVudGFsIGFuZCB0ZW1wb3JhcnkuCisgIHZpcnR1YWwgfl9Sb3BlX2NoYXJfY29uc3VtZXIoKSB7fQorICB2aXJ0dWFsIGJvb2wgb3BlcmF0b3IoKShjb25zdCBfQ2hhclQqIF9fYnVmZmVyLCBzaXplX3QgX19sZW4pID0gMDsKKyNlbmRpZgorfTsKKworLy8KKy8vIFdoYXQgZm9sbG93cyBzaG91bGQgcmVhbGx5IGJlIGxvY2FsIHRvIHJvcGUuICBVbmZvcnR1bmF0ZWx5LAorLy8gdGhhdCBkb2Vzbid0IHdvcmssIHNpbmNlIGl0IG1ha2VzIGl0IGltcG9zc2libGUgdG8gZGVmaW5lIGdlbmVyaWMKKy8vIGVxdWFsaXR5IG9uIHJvcGUgaXRlcmF0b3JzLiAgQWNjb3JkaW5nIHRvIHRoZSBkcmFmdCBzdGFuZGFyZCwgdGhlCisvLyB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGZvciBzdWNoIGFuIGVxdWFsaXR5IG9wZXJhdG9yIGNhbm5vdCBiZSBpbmZlcnJlZAorLy8gZnJvbSB0aGUgb2NjdXJlbmNlIG9mIGEgbWVtYmVyIGNsYXNzIGFzIGEgcGFyYW1ldGVyLgorLy8gKFNHSSBjb21waWxlcnMgaW4gZmFjdCBhbGxvdyB0aGlzLCBidXQgdGhlIF9fcmVzdWx0IHdvdWxkbid0IGJlCisvLyBwb3J0YWJsZS4pCisvLyBTaW1pbGFybHksIHNvbWUgb2YgdGhlIHN0YXRpYyBtZW1iZXIgZnVuY3Rpb25zIGFyZSBtZW1iZXIgZnVuY3Rpb25zCisvLyBvbmx5IHRvIGF2b2lkIHBvbGx1dGluZyB0aGUgZ2xvYmFsIG5hbWVzcGFjZSwgYW5kIHRvIGNpcmN1bXZlbnQKKy8vIHJlc3RyaWN0aW9ucyBvbiB0eXBlIGluZmVyZW5jZSBmb3IgdGVtcGxhdGUgZnVuY3Rpb25zLgorLy8KKworLy8KKy8vIFRoZSBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZSBmb3IgcmVwcmVzZW50aW5nIGEgcm9wZS4gIFRoaXMgaXMKKy8vIHByaXZhdGUgdG8gdGhlIGltcGxlbWVudGF0aW9uLiAgQSByb3BlIGlzIHJlYWxseSBqdXN0IGEgcG9pbnRlcgorLy8gdG8gb25lIG9mIHRoZXNlLgorLy8KKy8vIEEgZmV3IGJhc2ljIGZ1bmN0aW9ucyBmb3IgbWFuaXB1bGF0aW5nIHRoaXMgZGF0YSBzdHJ1Y3R1cmUKKy8vIGFyZSBtZW1iZXJzIG9mIF9Sb3BlUmVwLiAgTW9zdCBvZiB0aGUgbW9yZSBjb21wbGV4IGFsZ29yaXRobXMKKy8vIGFyZSBpbXBsZW1lbnRlZCBhcyByb3BlIG1lbWJlcnMuCisvLworLy8gU29tZSBvZiB0aGUgc3RhdGljIG1lbWJlciBmdW5jdGlvbnMgb2YgX1JvcGVSZXAgaGF2ZSBpZGVudGljYWxseQorLy8gbmFtZWQgZnVuY3Rpb25zIGluIHJvcGUgdGhhdCBzaW1wbHkgaW52b2tlIHRoZSBfUm9wZVJlcCB2ZXJzaW9ucy4KKy8vCisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorc3RydWN0IF9Sb3BlX1JvcGVSZXAKKyAgOiBwdWJsaWMgX1JlZmNvdW50X0Jhc2UKK3sKKyAgdHlwZWRlZiBfUm9wZV9Sb3BlUmVwPF9DaGFyVCwgX0FsbG9jPiBfU2VsZjsKK3B1YmxpYzoKKyAgLy8KKyAgLy8gR0FCOiAxMS8wOS8wNQorICAvLworICAvLyAiX19ST1BFX0RFUFRIX1NJWkUiIGlzIHNldCB0byBvbmUgbW9yZSB0aGVuIHRoZSAiX19ST1BFX01BWF9ERVBUSCIuCisgIC8vIFRoaXMgd2FzIG9yaWdpbmFsbHkganVzdCBhbiBhZGRpdGlvbiBvZiAiX19ST1BFX01BWF9ERVBUSCArIDEiCisgIC8vIGJ1dCB0aGlzIGFkZGl0aW9uIGNhdXNlcyB0aGUgc3VucHJvIGNvbXBpbGVyIHRvIGNvbXBsYWluIGFib3V0CisgIC8vIG11bHRpcGxlIGRlY2xhcmF0aW9ucyBkdXJpbmcgdGhlIGluaXRpYWxpemF0aW9uIG9mICJfU19taW5fbGVuIi4KKyAgLy8gQ2hhbmdlZCB0byBiZSBhIGZpeGVkIHZhbHVlIGFuZCB0aGUgc3VucHJvIGNvbXBpbGVyIGFwcGVhcnMgdG8KKyAgLy8gYmUgaGFwcHk/Pz8KKyAgLy8KKyMgIGRlZmluZSBfX1JPUEVfTUFYX0RFUFRIICA0NQorIyAgZGVmaW5lIF9fUk9QRV9ERVBUSF9TSVpFIDQ2IC8vIF9fUk9QRV9NQVhfREVQVEggKyAxCisgIGVudW0geyBfU19tYXhfcm9wZV9kZXB0aCA9IF9fUk9QRV9NQVhfREVQVEggfTsKKyAgZW51bSBfVGFnIHtfU19sZWFmLCBfU19jb25jYXQsIF9TX3N1YnN0cmluZ2ZuLCBfU19mdW5jdGlvbn07CisgIC8vIEFwcGFyZW50bHkgbmVlZGVkIGJ5IFZDKysKKyAgLy8gVGhlIGRhdGEgZmllbGRzIG9mIGxlYXZlcyBhcmUgYWxsb2NhdGVkIHdpdGggc29tZQorICAvLyBleHRyYSBzcGFjZSwgdG8gYWNjb21vZGF0ZSBmdXR1cmUgZ3Jvd3RoIGFuZCBmb3IgYmFzaWMKKyAgLy8gY2hhcmFjdGVyIHR5cGVzLCB0byBob2xkIGEgdHJhaWxpbmcgZW9zIGNoYXJhY3Rlci4KKyAgZW51bSB7IF9TX2FsbG9jX2dyYW51bGFyaXR5ID0gOCB9OworCisgIF9UYWcgX01fdGFnOjg7CisgIGJvb2wgX01faXNfYmFsYW5jZWQ6ODsKKworICBfU1RMUF9GT1JDRV9BTExPQ0FUT1JTKF9DaGFyVCwgX0FsbG9jKQorICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY190cmFpdHM8X0NoYXJULF9BbGxvYz46OmFsbG9jYXRvcl90eXBlIGFsbG9jYXRvcl90eXBlOworCisgIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdCB7IHJldHVybiBhbGxvY2F0b3JfdHlwZShfTV9zaXplKTsgIH0KKworICB1bnNpZ25lZCBjaGFyIF9NX2RlcHRoOworICBfQ2hhclQqIF9TVExQX1ZPTEFUSUxFIF9NX2Nfc3RyaW5nOworICBfU1RMUF9QUklWIF9TVExQX2FsbG9jX3Byb3h5PHNpemVfdCwgX0NoYXJULCBhbGxvY2F0b3JfdHlwZT4gX01fc2l6ZTsKKworIyBpZmRlZiBfU1RMUF9OT19BUlJPV19PUEVSQVRPUgorICBfUm9wZV9Sb3BlUmVwKCkgOiBfUmVmY291bnRfQmFzZSgxKSwgX01fc2l6ZShhbGxvY2F0b3JfdHlwZSgpLCAwKSB7fQorIyBlbmRpZgorCisgIC8qIEZsYXR0ZW5lZCB2ZXJzaW9uIG9mIHN0cmluZywgaWYgbmVlZGVkLiAgKi8KKyAgLyogdHlwaWNhbGx5IDAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBJZiBpdCdzIG5vdCAwLCB0aGVuIHRoZSBtZW1vcnkgaXMgb3duZWQgICovCisgIC8qIGJ5IHRoaXMgbm9kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogSW4gdGhlIGNhc2Ugb2YgYSBsZWFmLCB0aGlzIG1heSBwb2ludCB0byAqLworICAvKiB0aGUgc2FtZSBtZW1vcnkgYXMgdGhlIGRhdGEgZmllbGQuICAgICAgICovCisgIF9Sb3BlX1JvcGVSZXAoX1RhZyBfX3QsIHVuc2lnbmVkIGNoYXIgX19kLCBib29sIF9fYiwgc2l6ZV90IF9wX3NpemUsCisgICAgICAgICAgICAgICAgYWxsb2NhdG9yX3R5cGUgX19hKSA6CisgICAgX1JlZmNvdW50X0Jhc2UoMSksCisgICAgX01fdGFnKF9fdCksIF9NX2lzX2JhbGFuY2VkKF9fYiksIF9NX2RlcHRoKF9fZCksIF9NX2Nfc3RyaW5nKDApLCBfTV9zaXplKF9fYSwgX3Bfc2l6ZSkKKyAgeyB9CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQXJlU2FtZVVuQ1ZUeXBlczxfQ2hhclQsIGNoYXI+OjpfUmV0IF9Jc0NoYXI7CisjIGlmZGVmIF9TVExQX0hBU19XQ0hBUl9UCisgIHR5cGVkZWYgdHlwZW5hbWUgX0FyZVNhbWVVbkNWVHlwZXM8X0NoYXJULCB3Y2hhcl90Pjo6X1JldCBfSXNXQ2hhclQ7CisjIGVsc2UKKyAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgX0lzV0NoYXJUOworIyBlbmRpZgorCisgIHR5cGVkZWYgdHlwZW5hbWUgX0xvcjI8X0lzQ2hhciwgX0lzV0NoYXJUPjo6X1JldCBfSXNCYXNpY0NoYXJUeXBlOworCisjaWYgMAorICAvKiBQbGVhc2UgdGVsbCB3aHkgdGhpcyBjb2RlIGlzIG5lY2Vzc2FyeSBpZiB5b3UgdW5jb21tZW50IGl0LgorICAgKiBQcm9ibGVtIHdpdGggaXQgaXMgdGhhdCByb3BlIGltcGxlbWVudGF0aW9uIGV4cGVjdCB0aGF0IF9TX3JvdW5kZWRfdXBfc2l6ZShuKQorICAgKiByZXR1cm5zIGEgc2l6ZSA+IG4gaW4gb3JkZXIgdG8gc3RvcmUgdGhlIHRlcm1pbmF0aW5nIG51bGwgY2hhcmF0ZXIuIFdoZW4KKyAgICogaW5zdGFuY2lhdGlvbiB0eXBlIGlzIG5vdCBhIGNoYXIgb3Igd2NoYXJfdCB0aGlzIGlzIG5vdCBndWFyYW50eSByZXN1bHRpbmcgaW4KKyAgICogbWVtb3J5IG92ZXJydW4uCisgICAqLworICBzdGF0aWMgc2l6ZV90IF9TX3JvdW5kZWRfdXBfc2l6ZV9hdXgoc2l6ZV90IF9fbiwgX190cnVlX3R5cGUgY29uc3QmIC8qX0lzQmFzaWNDaGFyVHlwZSovKSB7CisgICAgLy8gQWxsb3cgc2xvcCBmb3IgaW4tcGxhY2UgZXhwYW5zaW9uLgorICAgIHJldHVybiAoX19uICsgX1NfYWxsb2NfZ3JhbnVsYXJpdHkpICYgfihfU19hbGxvY19ncmFudWxhcml0eSAtIDEpOworICB9CisKKyAgc3RhdGljIHNpemVfdCBfU19yb3VuZGVkX3VwX3NpemVfYXV4KHNpemVfdCBfX24sIF9fZmFsc2VfdHlwZSBjb25zdCYgLypfSXNCYXNpY0NoYXJUeXBlKi8pIHsKKyAgICAvLyBBbGxvdyBzbG9wIGZvciBpbi1wbGFjZSBleHBhbnNpb24uCisgICAgcmV0dXJuIChfX24gKyBfU19hbGxvY19ncmFudWxhcml0eSAtIDEpICYgfihfU19hbGxvY19ncmFudWxhcml0eSAtIDEpOworICB9CisjZW5kaWYKKyAgLy8gZmJwIDogbW92ZWQgZnJvbSBSb3BlTGVhZgorICBzdGF0aWMgc2l6ZV90IF9TX3JvdW5kZWRfdXBfc2l6ZShzaXplX3QgX19uKQorICAvL3sgcmV0dXJuIF9TX3JvdW5kZWRfdXBfc2l6ZV9hdXgoX19uLCBfSXNCYXNpY0NoYXJUeXBlKCkpOyB9CisgIHsgcmV0dXJuIChfX24gKyBfU19hbGxvY19ncmFudWxhcml0eSkgJiB+KF9TX2FsbG9jX2dyYW51bGFyaXR5IC0gMSk7IH0KKworICBzdGF0aWMgdm9pZCBfU19mcmVlX3N0cmluZyggX0NoYXJUKiBfX3MsIHNpemVfdCBfX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yX3R5cGUgX19hKSB7CisgICAgX1NUTFBfU1REOjpfRGVzdHJveV9SYW5nZShfX3MsIF9fcyArIF9fbGVuKTsKKyAgICAvLyAgVGhpcyBoYXMgdG8gYmUgYSBzdGF0aWMgbWVtYmVyLCBzbyB0aGlzIGdldHMgYSBiaXQgbWVzc3kKKyMgICBpZm5kZWYgX1NUTFBfRE9OVF9TVVBQT1JUX1JFQklORF9NRU1CRVJfVEVNUExBVEUKKyAgICBfX2EuZGVhbGxvY2F0ZShfX3MsIF9TX3JvdW5kZWRfdXBfc2l6ZShfX2xlbikpOyAgICAvLyp0eSAwMy8yNC8yMDAxIC0gcmVzdG9yZWQgbm90IHRvIHVzZSBfX3N0bF9hbGxvY19yZWJpbmQoKSBzaW5jZSBpdCBpcyBub3QgZGVmaW5lZCB1bmRlciBfU1RMUF9NRU1CRVJfVEVNUExBVEVfQ0xBU1NFUworIyAgIGVsc2UKKyAgICBfX3N0bF9hbGxvY19yZWJpbmQgKF9fYSwgKF9DaGFyVCopMCkuZGVhbGxvY2F0ZShfX3MsIF9TX3JvdW5kZWRfdXBfc2l6ZShfX2xlbikpOworIyAgIGVuZGlmCisgIH0KKworICAvLyBEZWFsbG9jYXRlIGRhdGEgc2VjdGlvbiBvZiBhIGxlYWYuCisgIC8vIFRoaXMgc2hvdWxkbid0IGJlIGEgbWVtYmVyIGZ1bmN0aW9uLgorICAvLyBCdXQgaXRzIGhhcmQgdG8gZG8gYW55dGhpbmcgZWxzZSBhdCB0aGUKKyAgLy8gbW9tZW50LCBiZWNhdXNlIGl0J3MgdGVtcGxhdGl6ZWQgdy5yLnQuCisgIC8vIGFuIGFsbG9jYXRvci4KKyAgLy8gRG9lcyBub3RoaW5nIGlmIF9fR0MgaXMgZGVmaW5lZC4KKyAgdm9pZCBfTV9mcmVlX2Nfc3RyaW5nKCk7CisgIHZvaWQgX01fZnJlZV90cmVlKCk7CisgIC8vIERlYWxsb2NhdGUgdC4gQXNzdW1lcyB0IGlzIG5vdCAwLgorICB2b2lkIF9NX3VucmVmX25vbm5pbCgpIHsKKyAgICBpZiAoX01fZGVjcigpID09IDApIF9NX2ZyZWVfdHJlZSgpOworICB9CisgIHZvaWQgX01fcmVmX25vbm5pbCgpIHsKKyAgICBfTV9pbmNyKCk7CisgIH0KKyAgc3RhdGljIHZvaWQgX1NfdW5yZWYoX1NlbGYqIF9fdCkgeworICAgIGlmICgwICE9IF9fdCkgeworICAgICAgX190LT5fTV91bnJlZl9ub25uaWwoKTsKKyAgICB9CisgIH0KKyAgc3RhdGljIHZvaWQgX1NfcmVmKF9TZWxmKiBfX3QpIHsKKyAgICBpZiAoMCAhPSBfX3QpIF9fdC0+X01faW5jcigpOworICB9CisgIC8vc3RhdGljIHZvaWQgX1NfZnJlZV9pZl91bnJlZihfU2VsZiogX190KSB7CisgIC8vICBpZiAoMCAhPSBfX3QgJiYgMCA9PSBfX3QtPl9NX3JlZl9jb3VudCkgX190LT5fTV9mcmVlX3RyZWUoKTsKKyAgLy99Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KK3N0cnVjdCBfUm9wZV9Sb3BlTGVhZiA6IHB1YmxpYyBfUm9wZV9Sb3BlUmVwPF9DaGFyVCxfQWxsb2M+IHsKK3B1YmxpYzoKKyAgX0NoYXJUKiBfTV9kYXRhOyAvKiBOb3QgbmVjZXNzYXJpbHkgMCB0ZXJtaW5hdGVkLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgYWxsb2NhdGVkIHNpemUgaXMgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBfU19yb3VuZGVkX3VwX3NpemUoc2l6ZSksIGV4Y2VwdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbiB0aGUgR0MgY2FzZSwgaW4gd2hpY2ggaXQgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkb2Vzbid0IG1hdHRlci4gICAgICAgICAgICAgICAqLworcHJpdmF0ZToKKyAgdHlwZWRlZiBfUm9wZV9Sb3BlUmVwPF9DaGFyVCxfQWxsb2M+IF9Sb3BlUmVwOworICB0eXBlZGVmIHR5cGVuYW1lIF9Sb3BlUmVwOjpfSXNCYXNpY0NoYXJUeXBlIF9Jc0Jhc2ljQ2hhclR5cGU7CisgIHZvaWQgX01faW5pdChfX3RydWVfdHlwZSBjb25zdCYgLypfSXNCYXNpY0NoYXJUeXBlKi8pIHsKKyAgICB0aGlzLT5fTV9jX3N0cmluZyA9IF9NX2RhdGE7CisgIH0KKyAgdm9pZCBfTV9pbml0KF9fZmFsc2VfdHlwZSBjb25zdCYgLypfSXNCYXNpY0NoYXJUeXBlKi8pIHt9CisKK3B1YmxpYzoKKyAgX1NUTFBfRk9SQ0VfQUxMT0NBVE9SUyhfQ2hhclQsIF9BbGxvYykKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUm9wZVJlcDo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7CisKKyAgX1JvcGVfUm9wZUxlYWYoIF9DaGFyVCogX19kLCBzaXplX3QgX3Bfc2l6ZSwgYWxsb2NhdG9yX3R5cGUgX19hKQorICAgIDogX1JvcGVfUm9wZVJlcDxfQ2hhclQsX0FsbG9jPihfUm9wZVJlcDo6X1NfbGVhZiwgMCwgdHJ1ZSwgX3Bfc2l6ZSwgX19hKSwKKyAgICAgIF9NX2RhdGEoX19kKSB7CisgICAgX1NUTFBfQVNTRVJUKF9wX3NpemUgPiAwKQorICAgIF9NX2luaXQoX0lzQmFzaWNDaGFyVHlwZSgpKTsKKyAgfQorCisjIGlmZGVmIF9TVExQX05PX0FSUk9XX09QRVJBVE9SCisgIF9Sb3BlX1JvcGVMZWFmKCkge30KKyAgX1JvcGVfUm9wZUxlYWYoY29uc3QgX1JvcGVfUm9wZUxlYWY8X0NoYXJULCBfQWxsb2M+JiApIHt9CisjIGVuZGlmCisKKy8vIFRoZSBjb25zdHJ1Y3RvciBhc3N1bWVzIHRoYXQgZCBoYXMgYmVlbiBhbGxvY2F0ZWQgd2l0aAorICAvLyB0aGUgcHJvcGVyIGFsbG9jYXRvciBhbmQgdGhlIHByb3Blcmx5IHBhZGRlZCBzaXplLgorICAvLyBJbiBjb250cmFzdCwgdGhlIGRlc3RydWN0b3IgZGVhbGxvY2F0ZXMgdGhlIGRhdGE6CisgIH5fUm9wZV9Sb3BlTGVhZigpIHsKKyAgICBpZiAoX01fZGF0YSAhPSB0aGlzLT5fTV9jX3N0cmluZykgeworICAgICAgdGhpcy0+X01fZnJlZV9jX3N0cmluZygpOworICAgIH0KKyAgICBfUm9wZVJlcDo6X1NfZnJlZV9zdHJpbmcoX01fZGF0YSwgdGhpcy0+X01fc2l6ZS5fTV9kYXRhLCB0aGlzLT5nZXRfYWxsb2NhdG9yKCkpOworICB9Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KK3N0cnVjdCBfUm9wZV9Sb3BlQ29uY2F0ZW5hdGlvbiA6IHB1YmxpYyBfUm9wZV9Sb3BlUmVwPF9DaGFyVCwgX0FsbG9jPiB7Citwcml2YXRlOgorICB0eXBlZGVmIF9Sb3BlX1JvcGVSZXA8X0NoYXJULF9BbGxvYz4gX1JvcGVSZXA7CisKK3B1YmxpYzoKKyAgX1JvcGVSZXAqIF9NX2xlZnQ7CisgIF9Sb3BlUmVwKiBfTV9yaWdodDsKKyAgX1NUTFBfRk9SQ0VfQUxMT0NBVE9SUyhfQ2hhclQsIF9BbGxvYykKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUm9wZVJlcDo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7CisgIF9Sb3BlX1JvcGVDb25jYXRlbmF0aW9uKF9Sb3BlUmVwKiBfX2wsIF9Sb3BlUmVwKiBfX3IsIGFsbG9jYXRvcl90eXBlIF9fYSkKKyAgICA6IF9Sb3BlX1JvcGVSZXA8X0NoYXJULF9BbGxvYz4oX1JvcGVSZXA6Ol9TX2NvbmNhdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1heCkoX19sLT5fTV9kZXB0aCwgX19yLT5fTV9kZXB0aCkgKyAxLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19sLT5fTV9zaXplLl9NX2RhdGEgKyBfX3ItPl9NX3NpemUuX01fZGF0YSwgX19hKSwgX01fbGVmdChfX2wpLCBfTV9yaWdodChfX3IpCisgIHt9CisjIGlmZGVmIF9TVExQX05PX0FSUk9XX09QRVJBVE9SCisgIF9Sb3BlX1JvcGVDb25jYXRlbmF0aW9uKCkge30KKyAgX1JvcGVfUm9wZUNvbmNhdGVuYXRpb24oY29uc3QgX1JvcGVfUm9wZUNvbmNhdGVuYXRpb248X0NoYXJULCBfQWxsb2M+Jikge30KKyMgZW5kaWYKKworICB+X1JvcGVfUm9wZUNvbmNhdGVuYXRpb24oKSB7CisgICAgdGhpcy0+X01fZnJlZV9jX3N0cmluZygpOworICAgIF9NX2xlZnQtPl9NX3VucmVmX25vbm5pbCgpOworICAgIF9NX3JpZ2h0LT5fTV91bnJlZl9ub25uaWwoKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorc3RydWN0IF9Sb3BlX1JvcGVGdW5jdGlvbiA6IHB1YmxpYyBfUm9wZV9Sb3BlUmVwPF9DaGFyVCwgX0FsbG9jPiB7Citwcml2YXRlOgorICB0eXBlZGVmIF9Sb3BlX1JvcGVSZXA8X0NoYXJULF9BbGxvYz4gX1JvcGVSZXA7CitwdWJsaWM6CisgIGNoYXJfcHJvZHVjZXI8X0NoYXJUPiogX01fZm47CisgIC8qCisgICAqIENoYXJfcHJvZHVjZXIgaXMgb3duZWQgYnkgdGhlCisgICAqIHJvcGUgYW5kIHNob3VsZCBiZSBleHBsaWNpdGx5CisgICAqIGRlbGV0ZWQgd2hlbiB0aGUgcm9wZSBiZWNvbWVzCisgICAqIGluYWNjZXNzaWJsZS4KKyAgICovCisgIGJvb2wgX01fZGVsZXRlX3doZW5fZG9uZTsKKyAgX1NUTFBfRk9SQ0VfQUxMT0NBVE9SUyhfQ2hhclQsIF9BbGxvYykKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUm9wZV9Sb3BlUmVwPF9DaGFyVCxfQWxsb2M+OjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKKyMgaWZkZWYgX1NUTFBfTk9fQVJST1dfT1BFUkFUT1IKKyAgX1JvcGVfUm9wZUZ1bmN0aW9uKCkge30KKyAgX1JvcGVfUm9wZUZ1bmN0aW9uKGNvbnN0IF9Sb3BlX1JvcGVGdW5jdGlvbjxfQ2hhclQsIF9BbGxvYz4mICkge30KKyMgZW5kaWYKKworICBfUm9wZV9Sb3BlRnVuY3Rpb24oY2hhcl9wcm9kdWNlcjxfQ2hhclQ+KiBfX2YsIHNpemVfdCBfcF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBfX2QsIGFsbG9jYXRvcl90eXBlIF9fYSkKKyAgICA6IF9Sb3BlX1JvcGVSZXA8X0NoYXJULF9BbGxvYz4oX1JvcGVSZXA6Ol9TX2Z1bmN0aW9uLCAwLCB0cnVlLCBfcF9zaXplLCBfX2EpLCBfTV9mbihfX2YpCisgICAgLCBfTV9kZWxldGVfd2hlbl9kb25lKF9fZCkKKyAgeyBfU1RMUF9BU1NFUlQoX3Bfc2l6ZSA+IDApIH0KKworICB+X1JvcGVfUm9wZUZ1bmN0aW9uKCkgeworICAgIHRoaXMtPl9NX2ZyZWVfY19zdHJpbmcoKTsKKyAgICBpZiAoX01fZGVsZXRlX3doZW5fZG9uZSkgeworICAgICAgZGVsZXRlIF9NX2ZuOworICAgIH0KKyAgfQorfTsKKworLyoKKyAqIFN1YnN0cmluZyByZXN1bHRzIGFyZSB1c3VhbGx5IHJlcHJlc2VudGVkIHVzaW5nIGp1c3QKKyAqIGNvbmNhdGVuYXRpb24gbm9kZXMuICBCdXQgaW4gdGhlIGNhc2Ugb2YgdmVyeSBsb25nIGZsYXQgcm9wZXMKKyAqIG9yIHJvcGVzIHdpdGggYSBmdW5jdGlvbmFsIHJlcHJlc2VudGF0aW9uIHRoYXQgaXNuJ3QgcHJhY3RpY2FsLgorICogSW4gdGhhdCBjYXNlLCB3ZSByZXByZXNlbnQgdGhlIF9fcmVzdWx0IGFzIGEgc3BlY2lhbCBjYXNlIG9mCisgKiBSb3BlRnVuY3Rpb24sIHdob3NlIGNoYXJfcHJvZHVjZXIgcG9pbnRzIGJhY2sgdG8gdGhlIHJvcGUgaXRzZWxmLgorICogSW4gYWxsIGNhc2VzIGV4Y2VwdCByZXBlYXRlZCBzdWJzdHJpbmcgb3BlcmF0aW9ucyBhbmQKKyAqIGRlYWxsb2NhdGlvbiwgd2UgdHJlYXQgdGhlIF9fcmVzdWx0IGFzIGEgUm9wZUZ1bmN0aW9uLgorICovCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KK3N0cnVjdCBfUm9wZV9Sb3BlU3Vic3RyaW5nIDogcHVibGljIGNoYXJfcHJvZHVjZXI8X0NoYXJUPiwgcHVibGljIF9Sb3BlX1JvcGVGdW5jdGlvbjxfQ2hhclQsX0FsbG9jPiB7CitwdWJsaWM6CisgIC8vIFhYWCB0aGlzIHdob2xlIGNsYXNzIHNob3VsZCBiZSByZXdyaXR0ZW4uCisgIHR5cGVkZWYgX1JvcGVfUm9wZVJlcDxfQ2hhclQsX0FsbG9jPiBfUm9wZVJlcDsKKyAgX1JvcGVSZXAgKl9NX2Jhc2U7ICAgICAgLy8gbm90IDAKKyAgc2l6ZV90IF9NX3N0YXJ0OworICAvKiB2aXJ0dWFsICovIHZvaWQgb3BlcmF0b3IoKShzaXplX3QgX19zdGFydF9wb3MsIHNpemVfdCBfX3JlcV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DaGFyVCogX19idWZmZXIpIHsKKyAgICB0eXBlZGVmIF9Sb3BlX1JvcGVGdW5jdGlvbjxfQ2hhclQsX0FsbG9jPiBfUm9wZUZ1bmN0aW9uOworICAgIHR5cGVkZWYgX1JvcGVfUm9wZUxlYWY8X0NoYXJULF9BbGxvYz4gX1JvcGVMZWFmOworICAgIHN3aXRjaCAoX01fYmFzZS0+X01fdGFnKSB7CisgICAgY2FzZSBfUm9wZVJlcDo6X1NfZnVuY3Rpb246CisgICAgY2FzZSBfUm9wZVJlcDo6X1Nfc3Vic3RyaW5nZm46CisgICAgICB7CisgICAgICAgIGNoYXJfcHJvZHVjZXI8X0NoYXJUPiogX19mbiA9CisgICAgICAgICAgX19TVEFUSUNfQ0FTVChfUm9wZUZ1bmN0aW9uKiwgX01fYmFzZSktPl9NX2ZuOworICAgICAgICBfU1RMUF9BU1NFUlQoX19zdGFydF9wb3MgKyBfX3JlcV9sZW4gPD0gdGhpcy0+X01fc2l6ZS5fTV9kYXRhKQorICAgICAgICBfU1RMUF9BU1NFUlQoX01fc3RhcnQgKyB0aGlzLT5fTV9zaXplLl9NX2RhdGEgPD0gX01fYmFzZS0+X01fc2l6ZS5fTV9kYXRhKQorICAgICAgICAoKl9fZm4pKF9fc3RhcnRfcG9zICsgX01fc3RhcnQsIF9fcmVxX2xlbiwgX19idWZmZXIpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBfUm9wZVJlcDo6X1NfbGVhZjoKKyAgICAgIHsKKyAgICAgICAgX0NoYXJUKiBfX3MgPQorICAgICAgICAgIF9fU1RBVElDX0NBU1QoX1JvcGVMZWFmKiwgX01fYmFzZSktPl9NX2RhdGE7CisgICAgICAgIF9TVExQX1BSSVYgX191Y29weV9uKF9fcyArIF9fc3RhcnRfcG9zICsgX01fc3RhcnQsIF9fcmVxX2xlbiwgX19idWZmZXIpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIF9TVExQX0FTU0VSVChmYWxzZSkKKyAgICAgICAgOworICAgIH0KKyAgfQorCisgIF9TVExQX0ZPUkNFX0FMTE9DQVRPUlMoX0NoYXJULCBfQWxsb2MpCisgIHR5cGVkZWYgdHlwZW5hbWUgX1JvcGVSZXA6OmFsbG9jYXRvcl90eXBlIGFsbG9jYXRvcl90eXBlOworCisgIF9Sb3BlX1JvcGVTdWJzdHJpbmcoX1JvcGVSZXAqIF9fYiwgc2l6ZV90IF9fcywgc2l6ZV90IF9fbCwgYWxsb2NhdG9yX3R5cGUgX19hKQorICAgIDogX1JvcGVfUm9wZUZ1bmN0aW9uPF9DaGFyVCxfQWxsb2M+KHRoaXMsIF9fbCwgZmFsc2UsIF9fYSksCisgICAgICBfTV9iYXNlKF9fYiksIF9NX3N0YXJ0KF9fcykgeworICAgIF9TVExQX0FTU0VSVChfX2wgPiAwKQorICAgIF9TVExQX0FTU0VSVChfX3MgKyBfX2wgPD0gX19iLT5fTV9zaXplLl9NX2RhdGEpCisgICAgX01fYmFzZS0+X01fcmVmX25vbm5pbCgpOworICAgIHRoaXMtPl9NX3RhZyA9IF9Sb3BlUmVwOjpfU19zdWJzdHJpbmdmbjsKKyAgfQorICB2aXJ0dWFsIH5fUm9wZV9Sb3BlU3Vic3RyaW5nKCkKKyAgeyBfTV9iYXNlLT5fTV91bnJlZl9ub25uaWwoKTsgfQorfTsKKworLyoKKyAqIFNlbGYtZGVzdHJ1Y3RpbmcgcG9pbnRlcnMgdG8gUm9wZV9yZXAuCisgKiBUaGVzZSBhcmUgbm90IGNvbnZlbnRpb25hbCBzbWFydCBwb2ludGVycy4gIFRoZWlyCisgKiBvbmx5IHB1cnBvc2UgaW4gbGlmZSBpcyB0byBlbnN1cmUgdGhhdCB1bnJlZiBpcyBjYWxsZWQKKyAqIG9uIHRoZSBwb2ludGVyIGVpdGhlciBhdCBub3JtYWwgZXhpdCBvciBpZiBhbiBleGNlcHRpb24KKyAqIGlzIHJhaXNlZC4gIEl0IGlzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0bworICogYWRqdXN0IHJlZmVyZW5jZSBjb3VudHMgd2hlbiB0aGVzZSBwb2ludGVycyBhcmUgaW5pdGlhbGl6ZWQKKyAqIG9yIGFzc2lnbmVkIHRvLiAgKFRoaXMgY29udmVudGlvbiBzaWduaWZpY2FudGx5IHJlZHVjZXMKKyAqIHRoZSBudW1iZXIgb2YgcG90ZW50aWFsbHkgZXhwZW5zaXZlIHJlZmVyZW5jZSBjb3VudAorICogdXBkYXRlcy4pCisgKi8KK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorc3RydWN0IF9Sb3BlX3NlbGZfZGVzdHJ1Y3RfcHRyIHsKKyAgX1JvcGVfUm9wZVJlcDxfQ2hhclQsX0FsbG9jPiogX01fcHRyOworICB+X1JvcGVfc2VsZl9kZXN0cnVjdF9wdHIoKQorICB7IF9Sb3BlX1JvcGVSZXA8X0NoYXJULF9BbGxvYz46Ol9TX3VucmVmKF9NX3B0cik7IH0KKyMgICBpZmRlZiBfU1RMUF9VU0VfRVhDRVBUSU9OUworICBfUm9wZV9zZWxmX2Rlc3RydWN0X3B0cigpIDogX01fcHRyKDApIHt9CisjICAgZWxzZQorICBfUm9wZV9zZWxmX2Rlc3RydWN0X3B0cigpIHt9CisjICAgZW5kaWYKKyAgX1JvcGVfc2VsZl9kZXN0cnVjdF9wdHIoX1JvcGVfUm9wZVJlcDxfQ2hhclQsX0FsbG9jPiogX19wKSA6IF9NX3B0cihfX3ApIHt9CisgIF9Sb3BlX1JvcGVSZXA8X0NoYXJULF9BbGxvYz4mIG9wZXJhdG9yKigpIHsgcmV0dXJuICpfTV9wdHI7IH0KKyAgX1JvcGVfUm9wZVJlcDxfQ2hhclQsX0FsbG9jPiogb3BlcmF0b3ItPigpIHsgcmV0dXJuIF9NX3B0cjsgfQorICBvcGVyYXRvciBfUm9wZV9Sb3BlUmVwPF9DaGFyVCxfQWxsb2M+KigpIHsgcmV0dXJuIF9NX3B0cjsgfQorICBfUm9wZV9zZWxmX2Rlc3RydWN0X3B0cjxfQ2hhclQsIF9BbGxvYz4mCisgIG9wZXJhdG9yPSAoX1JvcGVfUm9wZVJlcDxfQ2hhclQsX0FsbG9jPiogX194KQorICB7IF9NX3B0ciA9IF9feDsgcmV0dXJuICp0aGlzOyB9Cit9OworCisvKgorICogRGVyZWZlcmVuY2luZyBhIG5vbmNvbnN0IGl0ZXJhdG9yIGhhcyB0byByZXR1cm4gc29tZXRoaW5nCisgKiB0aGF0IGJlaGF2ZXMgYWxtb3N0IGxpa2UgYSByZWZlcmVuY2UuICBJdCdzIG5vdCBwb3NzaWJsZSB0bworICogcmV0dXJuIGFuIGFjdHVhbCByZWZlcmVuY2Ugc2luY2UgYXNzaWdubWVudCByZXF1aXJlcyBleHRyYQorICogd29yay4gIEFuZCB3ZSB3b3VsZCBnZXQgaW50byB0aGUgc2FtZSBwcm9ibGVtcyBhcyB3aXRoIHRoZQorICogQ0QyIHZlcnNpb24gb2YgYmFzaWNfc3RyaW5nLgorICovCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KK2NsYXNzIF9Sb3BlX2NoYXJfcmVmX3Byb3h5IHsKKyAgdHlwZWRlZiBfUm9wZV9jaGFyX3JlZl9wcm94eTxfQ2hhclQsIF9BbGxvYz4gX1NlbGY7CisgIGZyaWVuZCBjbGFzcyByb3BlPF9DaGFyVCxfQWxsb2M+OworICBmcmllbmQgY2xhc3MgX1JvcGVfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz47CisgIGZyaWVuZCBjbGFzcyBfUm9wZV9jaGFyX3B0cl9wcm94eTxfQ2hhclQsX0FsbG9jPjsKKyAgdHlwZWRlZiBfUm9wZV9zZWxmX2Rlc3RydWN0X3B0cjxfQ2hhclQsX0FsbG9jPiBfU2VsZl9kZXN0cnVjdF9wdHI7CisgIHR5cGVkZWYgX1JvcGVfUm9wZVJlcDxfQ2hhclQsX0FsbG9jPiBfUm9wZVJlcDsKKyAgdHlwZWRlZiByb3BlPF9DaGFyVCxfQWxsb2M+IF9NeV9yb3BlOworICBzaXplX3QgX01fcG9zOworICBfQ2hhclQgX01fY3VycmVudDsKKyAgYm9vbCBfTV9jdXJyZW50X3ZhbGlkOworICBfTXlfcm9wZSogX01fcm9vdDsgICAgIC8vIFRoZSB3aG9sZSByb3BlLgorcHVibGljOgorICBfUm9wZV9jaGFyX3JlZl9wcm94eShfTXlfcm9wZSogX19yLCBzaXplX3QgX19wKSA6CisgICAgX01fcG9zKF9fcCksIF9NX2N1cnJlbnRfdmFsaWQoZmFsc2UpLCBfTV9yb290KF9fcikge30KKyAgX1JvcGVfY2hhcl9yZWZfcHJveHkoY29uc3QgX1NlbGYmIF9feCkgOgorICAgIF9NX3BvcyhfX3guX01fcG9zKSwgX01fY3VycmVudF92YWxpZChmYWxzZSksIF9NX3Jvb3QoX194Ll9NX3Jvb3QpIHt9CisgIC8vIERvbid0IHByZXNlcnZlIGNhY2hlIGlmIHRoZSByZWZlcmVuY2UgY2FuIG91dGxpdmUgdGhlCisgIC8vIGV4cHJlc3Npb24uICBXZSBjbGFpbSB0aGF0J3Mgbm90IHBvc3NpYmxlIHdpdGhvdXQgY2FsbGluZworICAvLyBhIGNvcHkgY29uc3RydWN0b3Igb3IgZ2VuZXJhdGluZyByZWZlcmVuY2UgdG8gYSBwcm94eQorICAvLyByZWZlcmVuY2UuICBXZSBkZWNsYXJlIHRoZSBsYXR0ZXIgdG8gaGF2ZSB1bmRlZmluZWQgc2VtYW50aWNzLgorICBfUm9wZV9jaGFyX3JlZl9wcm94eShfTXlfcm9wZSogX19yLCBzaXplX3QgX19wLCBfQ2hhclQgX19jKQorICAgIDogX01fcG9zKF9fcCksIF9NX2N1cnJlbnQoX19jKSwgX01fY3VycmVudF92YWxpZCh0cnVlKSwgX01fcm9vdChfX3IpIHt9CisgIGlubGluZSBvcGVyYXRvciBfQ2hhclQgKCkgY29uc3Q7CisgIF9TZWxmJiBvcGVyYXRvcj0gKF9DaGFyVCBfX2MpOworICBfUm9wZV9jaGFyX3B0cl9wcm94eTxfQ2hhclQsIF9BbGxvYz4gb3BlcmF0b3ImICgpIGNvbnN0OworICBfU2VsZiYgb3BlcmF0b3I9IChjb25zdCBfU2VsZiYgX19jKSB7CisgICAgcmV0dXJuIG9wZXJhdG9yPSgoX0NoYXJUKV9fYyk7CisgIH0KK307CisKKyNpZmRlZiBfU1RMUF9GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX19BbGxvYz4KK2lubGluZSB2b2lkIHN3YXAoX1JvcGVfY2hhcl9yZWZfcHJveHkgPF9DaGFyVCwgX19BbGxvYyA+IF9fYSwKKyAgICAgICAgICAgICAgICAgX1JvcGVfY2hhcl9yZWZfcHJveHkgPF9DaGFyVCwgX19BbGxvYyA+IF9fYikgeworICBfQ2hhclQgX190bXAgPSBfX2E7CisgIF9fYSA9IF9fYjsKKyAgX19iID0gX190bXA7Cit9CisjZWxzZQorLy8gVGhlcmUgaXMgbm8gcmVhbGx5IGFjY2VwdGFibGUgd2F5IHRvIGhhbmRsZSB0aGlzLiAgVGhlIGRlZmF1bHQKKy8vIGRlZmluaXRpb24gb2Ygc3dhcCBkb2Vzbid0IHdvcmsgZm9yIHByb3h5IHJlZmVyZW5jZXMuCisvLyBJdCBjYW4ndCByZWFsbHkgYmUgbWFkZSB0byB3b3JrLCBldmVuIHdpdGggdWdseSBoYWNrcywgc2luY2UKKy8vIHRoZSBvbmx5IHVudXN1YWwgb3BlcmF0aW9uIGl0IHVzZXMgaXMgdGhlIGNvcHkgY29uc3RydWN0b3IsIHdoaWNoCisvLyBpcyBuZWVkZWQgZm9yIG90aGVyIHB1cnBvc2VzLiAgV2UgcHJvdmlkZSBhIG1hY3JvIGZvcgorLy8gZnVsbCBzcGVjaWFsaXphdGlvbnMsIGFuZCBpbnN0YW50aWF0ZSB0aGUgbW9zdCBjb21tb24gY2FzZS4KKyMgZGVmaW5lIF9ST1BFX1NXQVBfU1BFQ0lBTElaQVRJT04oX0NoYXJULCBfX0FsbG9jKSBcCisgICAgaW5saW5lIHZvaWQgc3dhcChfUm9wZV9jaGFyX3JlZl9wcm94eSA8X0NoYXJULCBfX0FsbG9jID4gX19hLCBcCisgICAgICAgICAgICAgICAgICAgICBfUm9wZV9jaGFyX3JlZl9wcm94eSA8X0NoYXJULCBfX0FsbG9jID4gX19iKSB7IFwKKyAgICAgICAgX0NoYXJUIF9fdG1wID0gX19hOyBcCisgICAgICAgIF9fYSA9IF9fYjsgXAorICAgICAgICBfX2IgPSBfX3RtcDsgXAorICAgIH0KKworX1JPUEVfU1dBUF9TUEVDSUFMSVpBVElPTihjaGFyLF9TVExQX0RFRkFVTFRfQUxMT0NBVE9SKGNoYXIpICkKKworIyBpZm5kZWYgX1NUTFBfTk9fV0NIQVJfVAorX1JPUEVfU1dBUF9TUEVDSUFMSVpBVElPTih3Y2hhcl90LF9TVExQX0RFRkFVTFRfQUxMT0NBVE9SKHdjaGFyX3QpICkKKyMgZW5kaWYKKworI2VuZGlmIC8qICFfU1RMUF9GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIgKi8KKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CitjbGFzcyBfUm9wZV9jaGFyX3B0cl9wcm94eSB7CisgIC8vIFhYWCB0aGlzIGNsYXNzIHNob3VsZCBiZSByZXdyaXR0ZW4uCitwdWJsaWM6CisgIHR5cGVkZWYgX1JvcGVfY2hhcl9wdHJfcHJveHk8X0NoYXJULCBfQWxsb2M+IF9TZWxmOworICBmcmllbmQgY2xhc3MgX1JvcGVfY2hhcl9yZWZfcHJveHk8X0NoYXJULF9BbGxvYz47CisgIHNpemVfdCBfTV9wb3M7CisgIHJvcGU8X0NoYXJULF9BbGxvYz4qIF9NX3Jvb3Q7ICAgICAvLyBUaGUgd2hvbGUgcm9wZS4KKworICBfUm9wZV9jaGFyX3B0cl9wcm94eShjb25zdCBfUm9wZV9jaGFyX3JlZl9wcm94eTxfQ2hhclQsX0FsbG9jPiYgX194KQorICAgIDogX01fcG9zKF9feC5fTV9wb3MpLCBfTV9yb290KF9feC5fTV9yb290KSB7fQorICBfUm9wZV9jaGFyX3B0cl9wcm94eShjb25zdCBfU2VsZiYgX194KQorICAgIDogX01fcG9zKF9feC5fTV9wb3MpLCBfTV9yb290KF9feC5fTV9yb290KSB7fQorICBfUm9wZV9jaGFyX3B0cl9wcm94eSgpIHt9CisgIF9Sb3BlX2NoYXJfcHRyX3Byb3h5KF9DaGFyVCogX194KSA6IF9NX3BvcygwKSwgX01fcm9vdCgwKSB7CisgICAgX1NUTFBfQVNTRVJUKDAgPT0gX194KQorICB9CisgIF9TZWxmJiBvcGVyYXRvcj0gKGNvbnN0IF9TZWxmJiBfX3gpIHsKKyAgICBfTV9wb3MgPSBfX3guX01fcG9zOworICAgIF9NX3Jvb3QgPSBfX3guX01fcm9vdDsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBfUm9wZV9jaGFyX3JlZl9wcm94eTxfQ2hhclQsX0FsbG9jPiBvcGVyYXRvciooKSBjb25zdCB7CisgICAgcmV0dXJuIF9Sb3BlX2NoYXJfcmVmX3Byb3h5PF9DaGFyVCxfQWxsb2M+KF9NX3Jvb3QsIF9NX3Bvcyk7CisgIH0KK307CisKKworLyoKKyAqIFJvcGUgaXRlcmF0b3JzOgorICogVW5saWtlIGluIHRoZSBDIHZlcnNpb24sIHdlIGNhY2hlIG9ubHkgcGFydCBvZiB0aGUgc3RhY2sKKyAqIGZvciByb3BlIGl0ZXJhdG9ycywgc2luY2UgdGhleSBtdXN0IGJlIGVmZmljaWVudGx5IGNvcHlhYmxlLgorICogV2hlbiB3ZSBydW4gb3V0IG9mIGNhY2hlLCB3ZSBoYXZlIHRvIHJlY29uc3RydWN0IHRoZSBpdGVyYXRvcgorICogdmFsdWUuCisgKiBQb2ludGVycyBmcm9tIGl0ZXJhdG9ycyBhcmUgbm90IGluY2x1ZGVkIGluIHJlZmVyZW5jZSBjb3VudHMuCisgKiBJdGVyYXRvcnMgYXJlIGFzc3VtZWQgdG8gYmUgdGhyZWFkIHByaXZhdGUuICBSb3BlcyBjYW4KKyAqIGJlIHNoYXJlZC4KKyAqLwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CitjbGFzcyBfUm9wZV9pdGVyYXRvcl9iYXNlCisvKiAgIDogcHVibGljIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3I8X0NoYXJULCBwdHJkaWZmX3Q+ICAqLworeworICBmcmllbmQgY2xhc3Mgcm9wZTxfQ2hhclQsX0FsbG9jPjsKKyAgdHlwZWRlZiBfUm9wZV9pdGVyYXRvcl9iYXNlPF9DaGFyVCwgX0FsbG9jPiBfU2VsZjsKKyAgdHlwZWRlZiBfUm9wZV9Sb3BlQ29uY2F0ZW5hdGlvbjxfQ2hhclQsX0FsbG9jPiBfUm9wZUNvbmNhdDsKK3B1YmxpYzoKKyAgdHlwZWRlZiBfUm9wZV9Sb3BlUmVwPF9DaGFyVCxfQWxsb2M+IF9Sb3BlUmVwOworCisgIGVudW0geyBfU19wYXRoX2NhY2hlX2xlbiA9IDQgfTsgLy8gTXVzdCBiZSA8PSA5IGJlY2F1c2Ugb2YgX01fcGF0aF9kaXJlY3Rpb24uCisgIGVudW0geyBfU19pdGVyYXRvcl9idWZfbGVuID0gMTUgfTsKKyAgc2l6ZV90IF9NX2N1cnJlbnRfcG9zOworICAvLyBUaGUgd2hvbGUgcm9wZS4KKyAgX1JvcGVSZXAqIF9NX3Jvb3Q7CisgIC8vIFN0YXJ0aW5nIHBvc2l0aW9uIGZvciBjdXJyZW50IGxlYWYKKyAgc2l6ZV90IF9NX2xlYWZfcG9zOworICAvLyBCdWZmZXIgcG9zc2libHkgY29udGFpbmluZyBjdXJyZW50IGNoYXIuCisgIF9DaGFyVCogX01fYnVmX3N0YXJ0OworICAvLyBQb2ludGVyIHRvIGN1cnJlbnQgY2hhciBpbiBidWZmZXIsICE9IDAgPT0+IGJ1ZmZlciB2YWxpZC4KKyAgX0NoYXJUKiBfTV9idWZfcHRyOworICAvLyBPbmUgcGFzdCBfX2xhc3QgdmFsaWQgY2hhciBpbiBidWZmZXIuCisgIF9DaGFyVCogX01fYnVmX2VuZDsKKworICAvLyBXaGF0IGZvbGxvd3MgaXMgdGhlIHBhdGggY2FjaGUuICBXZSBnbyBvdXQgb2Ygb3VyCisgIC8vIHdheSB0byBtYWtlIHRoaXMgY29tcGFjdC4KKyAgLy8gUGF0aF9lbmQgY29udGFpbnMgdGhlIGJvdHRvbSBzZWN0aW9uIG9mIHRoZSBwYXRoIGZyb20KKyAgLy8gdGhlIHJvb3QgdG8gdGhlIGN1cnJlbnQgbGVhZi4KKyAgc3RydWN0IHsKKyMgIGlmIGRlZmluZWQgKF9fQk9STEFORENfXykgJiYgKF9fQk9STEFORENfXyA8IDB4NTYwKQorICAgIF9Sb3BlUmVwIGNvbnN0Kl9NX2RhdGFbNF07CisjICBlbHNlCisgICAgX1JvcGVSZXAgY29uc3QqX01fZGF0YVtfU19wYXRoX2NhY2hlX2xlbl07CisjICBlbmRpZgorICB9IF9NX3BhdGhfZW5kOworICAvLyBMYXN0IHZhbGlkIF9fcG9zIGluIHBhdGhfZW5kOworICAvLyBfTV9wYXRoX2VuZFswXSAuLi4gX01fcGF0aF9lbmRbX01fbGVhZl9pbmRleC0xXQorICAvLyBwb2ludCB0byBjb25jYXRlbmF0aW9uIG5vZGVzLgorICBpbnQgX01fbGVhZl9pbmRleDsKKyAgLy8gKF9NX3BhdGhfZGlyZWN0aW9ucyA+PiBfX2kpICYgMSBpcyAxCisgIC8vIGlmIHdlIGdvdCBmcm9tIF9NX3BhdGhfZW5kW2xlYWZfaW5kZXggLSBfX2kgLSAxXQorICAvLyB0byBfTV9wYXRoX2VuZFtsZWFmX2luZGV4IC0gX19pXSBieSBnb2luZyB0byB0aGUKKyAgLy8gX19yaWdodC4gQXNzdW1lcyBwYXRoX2NhY2hlX2xlbiA8PSA5LgorICB1bnNpZ25lZCBjaGFyIF9NX3BhdGhfZGlyZWN0aW9uczsKKyAgLy8gU2hvcnQgYnVmZmVyIGZvciBzdXJyb3VuZGluZyBjaGFycy4KKyAgLy8gVGhpcyBpcyB1c2VmdWwgcHJpbWFyaWx5IGZvcgorICAvLyBSb3BlRnVuY3Rpb25zLiAgV2UgcHV0IHRoZSBidWZmZXIKKyAgLy8gaGVyZSB0byBhdm9pZCBsb2NraW5nIGluIHRoZQorICAvLyBtdWx0aXRocmVhZGVkIGNhc2UuCisgIC8vIFRoZSBjYWNoZWQgcGF0aCBpcyBnZW5lcmFsbHkgYXNzdW1lZCB0byBiZSB2YWxpZAorICAvLyBvbmx5IGlmIHRoZSBidWZmZXIgaXMgdmFsaWQuCisgIHN0cnVjdCB7CisjICBpZiBkZWZpbmVkIChfX0JPUkxBTkRDX18pICYmIChfX0JPUkxBTkRDX18gPCAweDU2MCkKKyAgICBfQ2hhclQgX01fZGF0YVsxNV07CisjICBlbHNlCisgICAgX0NoYXJUIF9NX2RhdGFbX1NfaXRlcmF0b3JfYnVmX2xlbl07CisjICBlbmRpZgorICB9IF9NX3RtcF9idWY7CisKKyAgLy8gU2V0IGJ1ZmZlciBjb250ZW50cyBnaXZlbiBwYXRoIGNhY2hlLgorICBzdGF0aWMgdm9pZCBfU19zZXRidWYoX1JvcGVfaXRlcmF0b3JfYmFzZTxfQ2hhclQsIF9BbGxvYz4mIF9feCk7CisgIC8vIFNldCBidWZmZXIgY29udGVudHMgYW5kIHBhdGggY2FjaGUuCisgIHN0YXRpYyB2b2lkIF9TX3NldGNhY2hlKF9Sb3BlX2l0ZXJhdG9yX2Jhc2U8X0NoYXJULCBfQWxsb2M+JiBfX3gpOworICAvLyBBcyBhYm92ZSwgYnV0IGFzc3VtZXMgcGF0aCBjYWNoZSBpcyB2YWxpZCBmb3IgcHJldmlvdXMgcG9zbi4KKyAgc3RhdGljIHZvaWQgX1Nfc2V0Y2FjaGVfZm9yX2luY3IoX1JvcGVfaXRlcmF0b3JfYmFzZTxfQ2hhclQsIF9BbGxvYz4mIF9feCk7CisgIF9Sb3BlX2l0ZXJhdG9yX2Jhc2UoKSB7fQorICBfUm9wZV9pdGVyYXRvcl9iYXNlKF9Sb3BlUmVwKiBfX3Jvb3QsIHNpemVfdCBfX3BvcykKKyAgICA6IF9NX2N1cnJlbnRfcG9zKF9fcG9zKSxfTV9yb290KF9fcm9vdCksICBfTV9idWZfcHRyKDApIHt9CisgIHZvaWQgX01faW5jcihzaXplX3QgX19uKTsKKyAgdm9pZCBfTV9kZWNyKHNpemVfdCBfX24pOworcHVibGljOgorICBzaXplX3QgaW5kZXgoKSBjb25zdCB7IHJldHVybiBfTV9jdXJyZW50X3BvczsgfQorcHJpdmF0ZToKKyAgdm9pZCBfTV9jb3B5X2J1Zihjb25zdCBfU2VsZiYgX194KSB7CisgICAgX01fdG1wX2J1ZiA9IF9feC5fTV90bXBfYnVmOworICAgIGlmIChfX3guX01fYnVmX3N0YXJ0ID09IF9feC5fTV90bXBfYnVmLl9NX2RhdGEpIHsKKyAgICAgIF9NX2J1Zl9zdGFydCA9IF9NX3RtcF9idWYuX01fZGF0YTsKKyAgICAgIF9NX2J1Zl9lbmQgPSBfTV9idWZfc3RhcnQgKyAoX194Ll9NX2J1Zl9lbmQgLSBfX3guX01fYnVmX3N0YXJ0KTsKKyAgICAgIF9NX2J1Zl9wdHIgPSBfTV9idWZfc3RhcnQgKyAoX194Ll9NX2J1Zl9wdHIgLSBfX3guX01fYnVmX3N0YXJ0KTsKKyAgICB9IGVsc2UgeworICAgICAgX01fYnVmX2VuZCA9IF9feC5fTV9idWZfZW5kOworICAgIH0KKyAgfQorCitwdWJsaWM6CisgIF9Sb3BlX2l0ZXJhdG9yX2Jhc2UoY29uc3QgX1NlbGYmIF9feCkgOiAKKyAgICAgIF9NX2N1cnJlbnRfcG9zKF9feC5fTV9jdXJyZW50X3BvcyksCisgICAgICBfTV9yb290KF9feC5fTV9yb290KSwKKyAgICAgIF9NX2xlYWZfcG9zKCBfX3guX01fbGVhZl9wb3MgKSwKKyAgICAgIF9NX2J1Zl9zdGFydChfX3guX01fYnVmX3N0YXJ0KSwKKyAgICAgIF9NX2J1Zl9wdHIoX194Ll9NX2J1Zl9wdHIpLAorICAgICAgX01fcGF0aF9lbmQoX194Ll9NX3BhdGhfZW5kKSwKKyAgICAgIF9NX2xlYWZfaW5kZXgoX194Ll9NX2xlYWZfaW5kZXgpLAorICAgICAgX01fcGF0aF9kaXJlY3Rpb25zKF9feC5fTV9wYXRoX2RpcmVjdGlvbnMpCisgICAgICB7CisgICAgICAgIGlmICgwICE9IF9feC5fTV9idWZfcHRyKSB7CisgICAgICAgICAgX01fY29weV9idWYoX194KTsKKyAgICAgICAgfQorICAgICAgfQorICBfU2VsZiYgb3BlcmF0b3IgPSAoY29uc3QgX1NlbGYmIF9feCkKKyAgICAgIHsKKyAgICAgICAgX01fY3VycmVudF9wb3MgPSBfX3guX01fY3VycmVudF9wb3M7CisgICAgICAgIF9NX3Jvb3QgPSBfX3guX01fcm9vdDsKKyAgICAgICAgX01fYnVmX3N0YXJ0ID0gX194Ll9NX2J1Zl9zdGFydDsKKyAgICAgICAgX01fYnVmX3B0ciA9IF9feC5fTV9idWZfcHRyOworICAgICAgICBfTV9wYXRoX2VuZCA9IF9feC5fTV9wYXRoX2VuZDsKKyAgICAgICAgX01fbGVhZl9pbmRleCA9IF9feC5fTV9sZWFmX2luZGV4OworICAgICAgICBfTV9wYXRoX2RpcmVjdGlvbnMgPSBfX3guX01fcGF0aF9kaXJlY3Rpb25zOworICAgICAgICBfTV9sZWFmX3BvcyA9IF9feC5fTV9sZWFmX3BvczsKKyAgICAgICAgaWYgKDAgIT0gX194Ll9NX2J1Zl9wdHIpIHsKKyAgICAgICAgICBfTV9jb3B5X2J1ZihfX3gpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIH0KK307CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPiBjbGFzcyBfUm9wZV9pdGVyYXRvcjsKKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CitjbGFzcyBfUm9wZV9jb25zdF9pdGVyYXRvciA6IHB1YmxpYyBfUm9wZV9pdGVyYXRvcl9iYXNlPF9DaGFyVCxfQWxsb2M+IHsKKyAgZnJpZW5kIGNsYXNzIHJvcGU8X0NoYXJULF9BbGxvYz47CisgIHR5cGVkZWYgIF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiBfU2VsZjsKKyAgdHlwZWRlZiBfUm9wZV9pdGVyYXRvcl9iYXNlPF9DaGFyVCxfQWxsb2M+IF9CYXNlOworICAvLyAgcHJvdGVjdGVkOgorcHVibGljOgorIyAgIGlmbmRlZiBfU1RMUF9IQVNfTk9fTkFNRVNQQUNFUworICB0eXBlZGVmIF9Sb3BlX1JvcGVSZXA8X0NoYXJULF9BbGxvYz4gX1JvcGVSZXA7CisgIC8vIFRoZSBvbmUgZnJvbSB0aGUgYmFzZSBjbGFzcyBtYXkgbm90IGJlIGRpcmVjdGx5IHZpc2libGUuCisjICAgZW5kaWYKKyAgX1JvcGVfY29uc3RfaXRlcmF0b3IoY29uc3QgX1JvcGVSZXAqIF9fcm9vdCwgc2l6ZV90IF9fcG9zKToKKyAgICBfUm9wZV9pdGVyYXRvcl9iYXNlPF9DaGFyVCxfQWxsb2M+KF9fQ09OU1RfQ0FTVChfUm9wZVJlcCosX19yb290KSwgX19wb3MpCisgICAgLy8gT25seSBub25jb25zdCBpdGVyYXRvcnMgbW9kaWZ5IHJvb3QgcmVmIGNvdW50CisgIHt9CitwdWJsaWM6CisgIHR5cGVkZWYgX0NoYXJUIHJlZmVyZW5jZTsgICAvLyBSZWFsbHkgYSB2YWx1ZS4gIFJldHVybmluZyBhIHJlZmVyZW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV291bGQgYmUgYSBtZXNzLCBzaW5jZSBpdCB3b3VsZCBoYXZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBiZSBpbmNsdWRlZCBpbiByZWZjb3VudC4KKyAgdHlwZWRlZiBjb25zdCBfQ2hhclQqIHBvaW50ZXI7CisgIHR5cGVkZWYgX0NoYXJUIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKKyAgdHlwZWRlZiByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKKworcHVibGljOgorICBfUm9wZV9jb25zdF9pdGVyYXRvcigpIHt9CisgIF9Sb3BlX2NvbnN0X2l0ZXJhdG9yKGNvbnN0IF9TZWxmJiBfX3gpIDoKKyAgICBfUm9wZV9pdGVyYXRvcl9iYXNlPF9DaGFyVCxfQWxsb2M+KF9feCkgeyB9CisgIF9Sb3BlX2NvbnN0X2l0ZXJhdG9yKGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+JiBfX3gpOgorICAgIF9Sb3BlX2l0ZXJhdG9yX2Jhc2U8X0NoYXJULF9BbGxvYz4oX194KSB7fQorICBfUm9wZV9jb25zdF9pdGVyYXRvcihjb25zdCByb3BlPF9DaGFyVCxfQWxsb2M+JiBfX3IsIHNpemVfdCBfX3BvcykgOgorICAgIF9Sb3BlX2l0ZXJhdG9yX2Jhc2U8X0NoYXJULF9BbGxvYz4oX19yLl9NX3RyZWVfcHRyLl9NX2RhdGEsIF9fcG9zKSB7fQorICBfU2VsZiYgb3BlcmF0b3I9IChjb25zdCBfU2VsZiYgX194KSB7CisgICAgX0Jhc2U6Om9wZXJhdG9yPShfX3gpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgeworICAgIGlmICgwID09IHRoaXMtPl9NX2J1Zl9wdHIpCisjaWYgIWRlZmluZWQgKF9fRE1DX18pCisgICAgICBfU19zZXRjYWNoZSgqdGhpcyk7CisjZWxzZQorICAgIHsgX1JvcGVfaXRlcmF0b3JfYmFzZTxfQ2hhclQsIF9BbGxvYz4qIF9feCA9IHRoaXM7IF9TX3NldGNhY2hlKCpfX3gpOyB9CisjZW5kaWYKKyAgICByZXR1cm4gKih0aGlzLT5fTV9idWZfcHRyKTsKKyAgfQorICBfU2VsZiYgb3BlcmF0b3IrKygpIHsKKyAgICBfQ2hhclQqIF9fbmV4dDsKKyAgICBpZiAoMCAhPSB0aGlzLT5fTV9idWZfcHRyICYmIChfX25leHQgPSB0aGlzLT5fTV9idWZfcHRyICsgMSkgPCB0aGlzLT5fTV9idWZfZW5kKSB7CisgICAgICB0aGlzLT5fTV9idWZfcHRyID0gX19uZXh0OworICAgICAgKyt0aGlzLT5fTV9jdXJyZW50X3BvczsKKyAgICB9IGVsc2UgeworICAgICAgdGhpcy0+X01faW5jcigxKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIF9TZWxmJiBvcGVyYXRvcis9KHB0cmRpZmZfdCBfX24pIHsKKyAgICBpZiAoX19uID49IDApIHsKKyAgICAgIHRoaXMtPl9NX2luY3IoX19uKTsKKyAgICB9IGVsc2UgeworICAgICAgdGhpcy0+X01fZGVjcigtX19uKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIF9TZWxmJiBvcGVyYXRvci0tKCkgeworICAgIHRoaXMtPl9NX2RlY3IoMSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIF9TZWxmJiBvcGVyYXRvci09KHB0cmRpZmZfdCBfX24pIHsKKyAgICBpZiAoX19uID49IDApIHsKKyAgICAgIHRoaXMtPl9NX2RlY3IoX19uKTsKKyAgICB9IGVsc2UgeworICAgICAgdGhpcy0+X01faW5jcigtX19uKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIF9TZWxmIG9wZXJhdG9yKysoaW50KSB7CisgICAgc2l6ZV90IF9fb2xkX3BvcyA9IHRoaXMtPl9NX2N1cnJlbnRfcG9zOworICAgIHRoaXMtPl9NX2luY3IoMSk7CisgICAgcmV0dXJuIF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+KHRoaXMtPl9NX3Jvb3QsIF9fb2xkX3Bvcyk7CisgICAgLy8gVGhpcyBtYWtlcyBhIHN1YnNlcXVlbnQgZGVyZWZlcmVuY2UgZXhwZW5zaXZlLgorICAgIC8vIFBlcmhhcHMgd2Ugc2hvdWxkIGluc3RlYWQgY29weSB0aGUgaXRlcmF0b3IKKyAgICAvLyBpZiBpdCBoYXMgYSB2YWxpZCBjYWNoZT8KKyAgfQorICBfU2VsZiBvcGVyYXRvci0tKGludCkgeworICAgIHNpemVfdCBfX29sZF9wb3MgPSB0aGlzLT5fTV9jdXJyZW50X3BvczsKKyAgICB0aGlzLT5fTV9kZWNyKDEpOworICAgIHJldHVybiBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPih0aGlzLT5fTV9yb290LCBfX29sZF9wb3MpOworICB9CisgIGlubGluZSByZWZlcmVuY2Ugb3BlcmF0b3JbXShzaXplX3QgX19uKTsKK307CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorY2xhc3MgX1JvcGVfaXRlcmF0b3IgOiBwdWJsaWMgX1JvcGVfaXRlcmF0b3JfYmFzZTxfQ2hhclQsX0FsbG9jPiB7CisgIGZyaWVuZCBjbGFzcyByb3BlPF9DaGFyVCxfQWxsb2M+OworICB0eXBlZGVmIF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiBfU2VsZjsKKyAgdHlwZWRlZiBfUm9wZV9pdGVyYXRvcl9iYXNlPF9DaGFyVCxfQWxsb2M+IF9CYXNlOworICB0eXBlZGVmIF9Sb3BlX1JvcGVSZXA8X0NoYXJULF9BbGxvYz4gX1JvcGVSZXA7CisKK3B1YmxpYzoKKyAgcm9wZTxfQ2hhclQsX0FsbG9jPiogX01fcm9vdF9yb3BlOworICAvLyByb290IGlzIHRyZWF0ZWQgYXMgYSBjYWNoZWQgdmVyc2lvbiBvZiB0aGlzLAorICAvLyBhbmQgaXMgdXNlZCB0byBkZXRlY3QgY2hhbmdlcyB0byB0aGUgdW5kZXJseWluZworICAvLyByb3BlLgorICAvLyBSb290IGlzIGluY2x1ZGVkIGluIHRoZSByZWZlcmVuY2UgY291bnQuCisgIC8vIFRoaXMgaXMgbmVjZXNzYXJ5IHNvIHRoYXQgd2UgY2FuIGRldGVjdCBjaGFuZ2VzIHJlbGlhYmx5LgorICAvLyBVbmZvcnR1bmF0ZWx5LCBpdCByZXF1aXJlcyBjYXJlZnVsIGJvb2trZWVwaW5nIGZvciB0aGUKKyAgLy8gbm9uR0MgY2FzZS4KKyAgX1JvcGVfaXRlcmF0b3Iocm9wZTxfQ2hhclQsX0FsbG9jPiogX19yLCBzaXplX3QgX19wb3MpOworCisgIHZvaWQgX01fY2hlY2soKTsKK3B1YmxpYzoKKyAgdHlwZWRlZiBfUm9wZV9jaGFyX3JlZl9wcm94eTxfQ2hhclQsX0FsbG9jPiAgcmVmZXJlbmNlOworICB0eXBlZGVmIF9Sb3BlX2NoYXJfcmVmX3Byb3h5PF9DaGFyVCxfQWxsb2M+KiBwb2ludGVyOworICB0eXBlZGVmIF9DaGFyVCB2YWx1ZV90eXBlOworICB0eXBlZGVmIHB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7CisgIHR5cGVkZWYgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CitwdWJsaWM6CisgIH5fUm9wZV9pdGVyYXRvcigpIHsgIC8vKlRZIDUvNi8wMCAtIGFkZGVkIGR0b3IgdG8gYmFsYW5jZSByZWZlcmVuY2UgY291bnQKKyAgICBfUm9wZVJlcDo6X1NfdW5yZWYodGhpcy0+X01fcm9vdCk7CisgIH0KKworICByb3BlPF9DaGFyVCxfQWxsb2M+JiBjb250YWluZXIoKSB7IHJldHVybiAqX01fcm9vdF9yb3BlOyB9CisgIF9Sb3BlX2l0ZXJhdG9yKCkgeworICAgIHRoaXMtPl9NX3Jvb3QgPSAwOyAgLy8gTmVlZGVkIGZvciByZWZlcmVuY2UgY291bnRpbmcuCisgIH0KKyAgX1JvcGVfaXRlcmF0b3IoY29uc3QgIF9TZWxmJiBfX3gpIDoKKyAgICBfUm9wZV9pdGVyYXRvcl9iYXNlPF9DaGFyVCxfQWxsb2M+KF9feCkgeworICAgIF9NX3Jvb3Rfcm9wZSA9IF9feC5fTV9yb290X3JvcGU7CisgICAgX1JvcGVSZXA6Ol9TX3JlZih0aGlzLT5fTV9yb290KTsKKyAgfQorICBfUm9wZV9pdGVyYXRvcihyb3BlPF9DaGFyVCxfQWxsb2M+JiBfX3IsIHNpemVfdCBfX3Bvcyk7CisgIF9TZWxmJiBvcGVyYXRvcj0gKGNvbnN0ICBfU2VsZiYgX194KSB7CisgICAgX1JvcGVSZXAqIF9fb2xkID0gdGhpcy0+X01fcm9vdDsKKyAgICBfUm9wZVJlcDo6X1NfcmVmKF9feC5fTV9yb290KTsKKyAgICBfQmFzZTo6b3BlcmF0b3I9KF9feCk7CisgICAgX01fcm9vdF9yb3BlID0gX194Ll9NX3Jvb3Rfcm9wZTsKKyAgICBfUm9wZVJlcDo6X1NfdW5yZWYoX19vbGQpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgeworICAgIF9NX2NoZWNrKCk7CisgICAgaWYgKDAgPT0gdGhpcy0+X01fYnVmX3B0cikgeworICAgICAgcmV0dXJuIHJlZmVyZW5jZShfTV9yb290X3JvcGUsIHRoaXMtPl9NX2N1cnJlbnRfcG9zKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHJlZmVyZW5jZShfTV9yb290X3JvcGUsIHRoaXMtPl9NX2N1cnJlbnRfcG9zLCAqKHRoaXMtPl9NX2J1Zl9wdHIpKTsKKyAgICB9CisgIH0KKyAgX1NlbGYmIG9wZXJhdG9yKysoKSB7CisgICAgdGhpcy0+X01faW5jcigxKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgX1NlbGYmIG9wZXJhdG9yKz0ocHRyZGlmZl90IF9fbikgeworICAgIGlmIChfX24gPj0gMCkgeworICAgICAgdGhpcy0+X01faW5jcihfX24pOworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLT5fTV9kZWNyKC1fX24pOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgX1NlbGYmIG9wZXJhdG9yLS0oKSB7CisgICAgdGhpcy0+X01fZGVjcigxKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgX1NlbGYmIG9wZXJhdG9yLT0ocHRyZGlmZl90IF9fbikgeworICAgIGlmIChfX24gPj0gMCkgeworICAgICAgdGhpcy0+X01fZGVjcihfX24pOworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLT5fTV9pbmNyKC1fX24pOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgX1NlbGYgb3BlcmF0b3IrKyhpbnQpIHsKKyAgICBzaXplX3QgX19vbGRfcG9zID0gdGhpcy0+X01fY3VycmVudF9wb3M7CisgICAgdGhpcy0+X01faW5jcigxKTsKKyAgICByZXR1cm4gX1NlbGYoX01fcm9vdF9yb3BlLCBfX29sZF9wb3MpOworICB9CisgIF9TZWxmIG9wZXJhdG9yLS0oaW50KSB7CisgICAgc2l6ZV90IF9fb2xkX3BvcyA9IHRoaXMtPl9NX2N1cnJlbnRfcG9zOworICAgIHRoaXMtPl9NX2RlY3IoMSk7CisgICAgcmV0dXJuIF9TZWxmKF9NX3Jvb3Rfcm9wZSwgX19vbGRfcG9zKTsKKyAgfQorICByZWZlcmVuY2Ugb3BlcmF0b3JbXShwdHJkaWZmX3QgX19uKSB7CisgICAgcmV0dXJuIHJlZmVyZW5jZShfTV9yb290X3JvcGUsIHRoaXMtPl9NX2N1cnJlbnRfcG9zICsgX19uKTsKKyAgfQorfTsKKworIyBpZmRlZiBfU1RMUF9VU0VfT0xEX0hQX0lURVJBVE9SX1FVRVJJRVMKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KK2lubGluZSByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZworaXRlcmF0b3JfY2F0ZWdvcnkoY29uc3QgX1JvcGVfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4mKSB7ICByZXR1cm4gcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcoKTt9Cit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgX0NoYXJUKiB2YWx1ZV90eXBlKGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+JikgeyByZXR1cm4gMDsgfQordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgoraW5saW5lIHB0cmRpZmZfdCogZGlzdGFuY2VfdHlwZShjb25zdCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPiYpIHsgcmV0dXJuIDA7IH0KK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KK2lubGluZSByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZworaXRlcmF0b3JfY2F0ZWdvcnkoY29uc3QgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4mKSB7IHJldHVybiByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZygpOyB9Cit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgX0NoYXJUKiB2YWx1ZV90eXBlKGNvbnN0IF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+JikgeyByZXR1cm4gMDsgfQordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgoraW5saW5lIHB0cmRpZmZfdCogZGlzdGFuY2VfdHlwZShjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPiYpIHsgcmV0dXJuIDA7IH0KKyNlbmRpZiAvKiBfU1RMUF9VU0VfT0xEX0hQX0lURVJBVE9SX1FVRVJJRVMgKi8KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jLCBjbGFzcyBfQ2hhckNvbnN1bWVyPgorYm9vbCBfU19hcHBseV90b19waWVjZXMoX0NoYXJDb25zdW1lciYgX19jLAorICAgICAgICAgICAgICAgICAgICAgICAgX1JvcGVfUm9wZVJlcDxfQ2hhclQsIF9BbGxvYz4gKl9fciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBfX2JlZ2luLCBzaXplX3QgX19lbmQpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVnaW4gYW5kIGVuZCBhcmUgYXNzdW1lZCB0byBiZSBpbiByYW5nZS4KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorY2xhc3Mgcm9wZQorI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QQVJUSUFMX1NQRUNfV09SS0FST1VORCkKKyAgICAgICAgICAgOiBwdWJsaWMgX19zdGxwb3J0X2NsYXNzPHJvcGU8X0NoYXJULCBfQWxsb2M+ID4KKyNlbmRpZgoreworICB0eXBlZGVmIHJvcGU8X0NoYXJULF9BbGxvYz4gX1NlbGY7CitwdWJsaWM6CisgIHR5cGVkZWYgX0NoYXJUIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKKyAgdHlwZWRlZiBzaXplX3Qgc2l6ZV90eXBlOworICB0eXBlZGVmIF9DaGFyVCBjb25zdF9yZWZlcmVuY2U7CisgIHR5cGVkZWYgY29uc3QgX0NoYXJUKiBjb25zdF9wb2ludGVyOworICB0eXBlZGVmIF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+IGl0ZXJhdG9yOworICB0eXBlZGVmIF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+IGNvbnN0X2l0ZXJhdG9yOworICB0eXBlZGVmIF9Sb3BlX2NoYXJfcmVmX3Byb3h5PF9DaGFyVCxfQWxsb2M+IHJlZmVyZW5jZTsKKyAgdHlwZWRlZiBfUm9wZV9jaGFyX3B0cl9wcm94eTxfQ2hhclQsX0FsbG9jPiBwb2ludGVyOworCisgIGZyaWVuZCBjbGFzcyBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPjsKKyAgZnJpZW5kIGNsYXNzIF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+OworICBmcmllbmQgc3RydWN0IF9Sb3BlX1JvcGVSZXA8X0NoYXJULF9BbGxvYz47CisgIGZyaWVuZCBjbGFzcyBfUm9wZV9pdGVyYXRvcl9iYXNlPF9DaGFyVCxfQWxsb2M+OworICBmcmllbmQgY2xhc3MgX1JvcGVfY2hhcl9wdHJfcHJveHk8X0NoYXJULF9BbGxvYz47CisgIGZyaWVuZCBjbGFzcyBfUm9wZV9jaGFyX3JlZl9wcm94eTxfQ2hhclQsX0FsbG9jPjsKKyAgZnJpZW5kIHN0cnVjdCBfUm9wZV9Sb3BlU3Vic3RyaW5nPF9DaGFyVCxfQWxsb2M+OworCisgIF9TVExQX0RFQ0xBUkVfUkFORE9NX0FDQ0VTU19SRVZFUlNFX0lURVJBVE9SUzsKKworcHJvdGVjdGVkOgorICB0eXBlZGVmIF9DaGFyVCogX0NzdHJwdHI7CisKKyAgc3RhdGljIF9DaGFyVCBfU19lbXB0eV9jX3N0clsxXTsKKworICBlbnVtIHsgX1NfY29weV9tYXggPSAyMyB9OworICAvLyBGb3Igc3RyaW5ncyBzaG9ydGVyIHRoYW4gX1NfY29weV9tYXgsIHdlIGNvcHkgdG8KKyAgLy8gY29uY2F0ZW5hdGUuCisKKyAgdHlwZWRlZiBfUm9wZV9Sb3BlUmVwPF9DaGFyVCwgX0FsbG9jPiBfUm9wZVJlcDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUm9wZVJlcDo6X0lzQmFzaWNDaGFyVHlwZSBfSXNCYXNpY0NoYXJUeXBlOworCitwdWJsaWM6CisgIF9TVExQX0ZPUkNFX0FMTE9DQVRPUlMoX0NoYXJULCBfQWxsb2MpCisgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jX3RyYWl0czxfQ2hhclQsX0FsbG9jPjo6YWxsb2NhdG9yX3R5cGUgIGFsbG9jYXRvcl90eXBlOworCitwdWJsaWM6CisgIC8vIFRoZSBvbmx5IGRhdGEgbWVtYmVyIG9mIGEgcm9wZToKKyAgX1NUTFBfUFJJViBfU1RMUF9hbGxvY19wcm94eTxfUm9wZVJlcCosIF9DaGFyVCwgYWxsb2NhdG9yX3R5cGU+IF9NX3RyZWVfcHRyOworCitwdWJsaWM6CisgIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdCB7IHJldHVybiBhbGxvY2F0b3JfdHlwZShfTV90cmVlX3B0cik7IH0KKworcHVibGljOgorICB0eXBlZGVmIF9Sb3BlX1JvcGVDb25jYXRlbmF0aW9uPF9DaGFyVCxfQWxsb2M+IF9Sb3BlQ29uY2F0ZW5hdGlvbjsKKyAgdHlwZWRlZiBfUm9wZV9Sb3BlTGVhZjxfQ2hhclQsX0FsbG9jPiBfUm9wZUxlYWY7CisgIHR5cGVkZWYgX1JvcGVfUm9wZUZ1bmN0aW9uPF9DaGFyVCxfQWxsb2M+IF9Sb3BlRnVuY3Rpb247CisgIHR5cGVkZWYgX1JvcGVfUm9wZVN1YnN0cmluZzxfQ2hhclQsX0FsbG9jPiBfUm9wZVN1YnN0cmluZzsKKworICAvLyBSZXRyaWV2ZSBhIGNoYXJhY3RlciBhdCB0aGUgaW5kaWNhdGVkIHBvc2l0aW9uLgorICBzdGF0aWMgX0NoYXJUIF9TX2ZldGNoKF9Sb3BlUmVwKiBfX3IsIHNpemVfdHlwZSBfX3Bvcyk7CisKKyAgLy8gT2J0YWluIGEgcG9pbnRlciB0byB0aGUgY2hhcmFjdGVyIGF0IHRoZSBpbmRpY2F0ZWQgcG9zaXRpb24uCisgIC8vIFRoZSBwb2ludGVyIGNhbiBiZSB1c2VkIHRvIGNoYW5nZSB0aGUgY2hhcmFjdGVyLgorICAvLyBJZiBzdWNoIGEgcG9pbnRlciBjYW5ub3QgYmUgcHJvZHVjZWQsIGFzIGlzIGZyZXF1ZW50bHkgdGhlCisgIC8vIGNhc2UsIDAgaXMgcmV0dXJuZWQgaW5zdGVhZC4KKyAgLy8gKFJldHVybnMgbm9uemVybyBvbmx5IGlmIGFsbCBub2RlcyBpbiB0aGUgcGF0aCBoYXZlIGEgcmVmY291bnQKKyAgLy8gb2YgMS4pCisgIHN0YXRpYyBfQ2hhclQqIF9TX2ZldGNoX3B0cihfUm9wZVJlcCogX19yLCBzaXplX3R5cGUgX19wb3MpOworCisgIHN0YXRpYyB2b2lkIF9TX3VucmVmKF9Sb3BlUmVwKiBfX3QpIHsKKyAgICBfUm9wZVJlcDo6X1NfdW5yZWYoX190KTsKKyAgfQorICBzdGF0aWMgdm9pZCBfU19yZWYoX1JvcGVSZXAqIF9fdCkgeworICAgIF9Sb3BlUmVwOjpfU19yZWYoX190KTsKKyAgfQorCisgIHR5cGVkZWYgX1JvcGVfc2VsZl9kZXN0cnVjdF9wdHI8X0NoYXJULF9BbGxvYz4gX1NlbGZfZGVzdHJ1Y3RfcHRyOworCisgIC8vIF9SZXN1bHQgaXMgY291bnRlZCBpbiByZWZjb3VudC4KKyAgc3RhdGljIF9Sb3BlUmVwKiBfU19zdWJzdHJpbmcoX1JvcGVSZXAqIF9fYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IF9fc3RhcnQsIHNpemVfdCBfX2VuZHAxKTsKKworICBzdGF0aWMgX1JvcGVSZXAqIF9TX2NvbmNhdF9jaGFyX2l0ZXIoX1JvcGVSZXAqIF9fciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9DaGFyVCogX19pdGVyLCBzaXplX3QgX19zbGVuKTsKKyAgLy8gQ29uY2F0ZW5hdGUgcm9wZSBhbmQgY2hhciBwdHIsIGNvcHlpbmcgX19zLgorICAvLyBTaG91bGQgcmVhbGx5IHRha2UgYW4gYXJiaXRyYXJ5IGl0ZXJhdG9yLgorICAvLyBSZXN1bHQgaXMgY291bnRlZCBpbiByZWZjb3VudC4KKyAgc3RhdGljIF9Sb3BlUmVwKiBfU19kZXN0cl9jb25jYXRfY2hhcl9pdGVyKF9Sb3BlUmVwKiBfX3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfQ2hhclQqIF9faXRlciwgc2l6ZV90IF9fc2xlbik7CisgICAgLy8gQXMgYWJvdmUsIGJ1dCBvbmUgcmVmZXJlbmNlIHRvIF9fciBpcyBhYm91dCB0byBiZQorICAgIC8vIGRlc3Ryb3llZC4gIFRodXMgdGhlIHBpZWNlcyBtYXkgYmUgcmVjeWNsZWQgaWYgYWxsCisgICAgLy8gcmVsZXZlbnQgcmVmZXJlbmNlIGNvdW50cyBhcmUgMS4KKworICAvLyBHZW5lcmFsIGNvbmNhdGVuYXRpb24gb24gX1JvcGVSZXAuICBfUmVzdWx0CisgIC8vIGhhcyByZWZjb3VudCBvZiAxLiAgQWRqdXN0cyBhcmd1bWVudCByZWZjb3VudHMuCisgIHN0YXRpYyBfUm9wZVJlcCogX1NfY29uY2F0X3JlcChfUm9wZVJlcCogX19sZWZ0LCBfUm9wZVJlcCogX19yaWdodCk7CisKK3B1YmxpYzoKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJDb25zdW1lcj4KKyNlbHNlCisgIHR5cGVkZWYgX1JvcGVfY2hhcl9jb25zdW1lcjxfQ2hhclQ+IF9DaGFyQ29uc3VtZXI7CisjZW5kaWYKKyAgdm9pZCBhcHBseV90b19waWVjZXMoc2l6ZV90IF9fYmVnaW4sIHNpemVfdCBfX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgX0NoYXJDb25zdW1lciYgX19jKSBjb25zdAorICB7IF9TX2FwcGx5X3RvX3BpZWNlcyhfX2MsIF9NX3RyZWVfcHRyLl9NX2RhdGEsIF9fYmVnaW4sIF9fZW5kKTsgfQorCitwcm90ZWN0ZWQ6CisKKyAgc3RhdGljIHNpemVfdCBfU19yb3VuZGVkX3VwX3NpemUoc2l6ZV90IF9fbikKKyAgeyByZXR1cm4gX1JvcGVSZXA6Ol9TX3JvdW5kZWRfdXBfc2l6ZShfX24pOyB9CisKKyAgLy8gQWxsb2NhdGUgYW5kIGNvbnN0cnVjdCBhIFJvcGVMZWFmIHVzaW5nIHRoZSBzdXBwbGllZCBhbGxvY2F0b3IKKyAgLy8gVGFrZXMgb3duZXJzaGlwIG9mIHMgaW5zdGVhZCBvZiBjb3B5aW5nLgorICBzdGF0aWMgX1JvcGVMZWFmKiBfU19uZXdfUm9wZUxlYWYoX0NoYXJUICpfX3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgX3Bfc2l6ZSwgYWxsb2NhdG9yX3R5cGUgX19hKSB7CisgICAgX1JvcGVMZWFmKiBfX3NwYWNlID0gX1NUTFBfQ1JFQVRFX0FMTE9DQVRPUihhbGxvY2F0b3JfdHlwZSwgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JvcGVMZWFmKS5hbGxvY2F0ZSgxKTsKKyAgICBfU1RMUF9UUlkgeworICAgICAgX1NUTFBfUExBQ0VNRU5UX05FVyhfX3NwYWNlKSBfUm9wZUxlYWYoX19zLCBfcF9zaXplLCBfX2EpOworICAgIH0KKyAgIF9TVExQX1VOV0lORChfU1RMUF9DUkVBVEVfQUxMT0NBVE9SKGFsbG9jYXRvcl90eXBlLF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Sb3BlTGVhZikuZGVhbGxvY2F0ZShfX3NwYWNlLCAxKSkKKyAgICByZXR1cm4gX19zcGFjZTsKKyAgfQorCisgIHN0YXRpYyBfUm9wZUNvbmNhdGVuYXRpb24qIF9TX25ld19Sb3BlQ29uY2F0ZW5hdGlvbihfUm9wZVJlcCogX19sZWZ0LCBfUm9wZVJlcCogX19yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRvcl90eXBlIF9fYSkgeworICAgX1JvcGVDb25jYXRlbmF0aW9uKiBfX3NwYWNlID0gX1NUTFBfQ1JFQVRFX0FMTE9DQVRPUihhbGxvY2F0b3JfdHlwZSwgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUm9wZUNvbmNhdGVuYXRpb24pLmFsbG9jYXRlKDEpOworICAgIHJldHVybiBfU1RMUF9QTEFDRU1FTlRfTkVXKF9fc3BhY2UpIF9Sb3BlQ29uY2F0ZW5hdGlvbihfX2xlZnQsIF9fcmlnaHQsIF9fYSk7CisgIH0KKworICBzdGF0aWMgX1JvcGVGdW5jdGlvbiogX1NfbmV3X1JvcGVGdW5jdGlvbihjaGFyX3Byb2R1Y2VyPF9DaGFyVD4qIF9fZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IF9wX3NpemUsIGJvb2wgX19kLCBhbGxvY2F0b3JfdHlwZSBfX2EpIHsKKyAgIF9Sb3BlRnVuY3Rpb24qIF9fc3BhY2UgPSBfU1RMUF9DUkVBVEVfQUxMT0NBVE9SKGFsbG9jYXRvcl90eXBlLCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUm9wZUZ1bmN0aW9uKS5hbGxvY2F0ZSgxKTsKKyAgICByZXR1cm4gX1NUTFBfUExBQ0VNRU5UX05FVyhfX3NwYWNlKSBfUm9wZUZ1bmN0aW9uKF9fZiwgX3Bfc2l6ZSwgX19kLCBfX2EpOworICB9CisKKyAgc3RhdGljIF9Sb3BlU3Vic3RyaW5nKiBfU19uZXdfUm9wZVN1YnN0cmluZyhfUm9wZV9Sb3BlUmVwPF9DaGFyVCxfQWxsb2M+KiBfX2IsIHNpemVfdCBfX3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IF9fbCwgYWxsb2NhdG9yX3R5cGUgX19hKSB7CisgICBfUm9wZVN1YnN0cmluZyogX19zcGFjZSA9IF9TVExQX0NSRUFURV9BTExPQ0FUT1IoYWxsb2NhdG9yX3R5cGUsIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUm9wZVN1YnN0cmluZykuYWxsb2NhdGUoMSk7CisgICAgcmV0dXJuIF9TVExQX1BMQUNFTUVOVF9ORVcoX19zcGFjZSkgX1JvcGVTdWJzdHJpbmcoX19iLCBfX3MsIF9fbCwgX19hKTsKKyAgfQorCisgIHN0YXRpYworICBfUm9wZUxlYWYqIF9TX1JvcGVMZWFmX2Zyb21fdW5vd25lZF9jaGFyX3B0cihjb25zdCBfQ2hhclQgKl9fcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IF9wX3NpemUsIGFsbG9jYXRvcl90eXBlIF9fYSkgeworICAgIGlmICgwID09IF9wX3NpemUpIHJldHVybiAwOworCisgICBfQ2hhclQqIF9fYnVmID0gX1NUTFBfQ1JFQVRFX0FMTE9DQVRPUihhbGxvY2F0b3JfdHlwZSxfX2EsIF9DaGFyVCkuYWxsb2NhdGUoX1Nfcm91bmRlZF91cF9zaXplKF9wX3NpemUpKTsKKworICAgIF9TVExQX1BSSVYgX191Y29weV9uKF9fcywgX3Bfc2l6ZSwgX19idWYpOworICAgIF9TX2NvbnN0cnVjdF9udWxsKF9fYnVmICsgX3Bfc2l6ZSk7CisKKyAgICBfU1RMUF9UUlkgeworICAgICAgcmV0dXJuIF9TX25ld19Sb3BlTGVhZihfX2J1ZiwgX3Bfc2l6ZSwgX19hKTsKKyAgICB9CisgICAgX1NUTFBfVU5XSU5EKF9Sb3BlUmVwOjpfU19mcmVlX3N0cmluZyhfX2J1ZiwgX3Bfc2l6ZSwgX19hKSkKKyAgICBfU1RMUF9SRVRfQUZURVJfVEhST1coMCkKKyAgfQorCisKKyAgLy8gQ29uY2F0ZW5hdGlvbiBvZiBub25lbXB0eSBzdHJpbmdzLgorICAvLyBBbHdheXMgYnVpbGRzIGEgY29uY2F0ZW5hdGlvbiBub2RlLgorICAvLyBSZWJhbGFuY2VzIGlmIHRoZSByZXN1bHQgaXMgdG9vIGRlZXAuCisgIC8vIFJlc3VsdCBoYXMgcmVmY291bnQgMS4KKyAgLy8gRG9lcyBub3QgaW5jcmVtZW50IGxlZnQgYW5kIHJpZ2h0IHJlZiBjb3VudHMgZXZlbiB0aG91Z2gKKyAgLy8gdGhleSBhcmUgcmVmZXJlbmNlZC4KKyAgc3RhdGljIF9Sb3BlUmVwKgorICBfU190cmVlX2NvbmNhdChfUm9wZVJlcCogX19sZWZ0LCBfUm9wZVJlcCogX19yaWdodCk7CisKKyAgLy8gQ29uY2F0ZW5hdGlvbiBoZWxwZXIgZnVuY3Rpb25zCisgIHN0YXRpYyBfUm9wZUxlYWYqCisgIF9TX2xlYWZfY29uY2F0X2NoYXJfaXRlcihfUm9wZUxlYWYqIF9fciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9DaGFyVCogX19pdGVyLCBzaXplX3QgX19zbGVuKTsKKyAgLy8gQ29uY2F0ZW5hdGUgYnkgY29weWluZyBsZWFmLgorICAvLyBzaG91bGQgdGFrZSBhbiBhcmJpdHJhcnkgaXRlcmF0b3IKKyAgLy8gcmVzdWx0IGhhcyByZWZjb3VudCAxLgorICBzdGF0aWMgX1JvcGVMZWFmKiBfU19kZXN0cl9sZWFmX2NvbmNhdF9jaGFyX2l0ZXIKKyAgKF9Sb3BlTGVhZiogX19yLCBjb25zdCBfQ2hhclQqIF9faXRlciwgc2l6ZV90IF9fc2xlbik7CisgIC8vIEEgdmVyc2lvbiB0aGF0IHBvdGVudGlhbGx5IGNsb2JiZXJzIF9fciBpZiBfX3ItPl9NX3JlZl9jb3VudCA9PSAxLgorCisKKyAgLy8gQSBoZWxwZXIgZnVuY3Rpb24gZm9yIGV4cG9uZW50aWF0aW5nIHN0cmluZ3MuCisgIC8vIFRoaXMgdXNlcyBhIG5vbnN0YW5kYXJkIHJlZmNvdW50IGNvbnZlbnRpb24uCisgIC8vIFRoZSByZXN1bHQgaGFzIHJlZmNvdW50IDAuCisgIHR5cGVkZWYgX1NUTFBfUFJJViBfUm9wZV9Db25jYXRfZm48X0NoYXJULF9BbGxvYz4gX0NvbmNhdF9mbjsKKyNpZiAhZGVmaW5lZCAoX19HTlVDX18pIHx8IChfX0dOVUNfXyA8IDMpCisgIGZyaWVuZCBfQ29uY2F0X2ZuOworI2Vsc2UKKyAgZnJpZW5kIHN0cnVjdCBfU1RMUF9QUklWIF9Sb3BlX0NvbmNhdF9mbjxfQ2hhclQsX0FsbG9jPjsKKyNlbmRpZgorCitwdWJsaWM6CisgIHN0YXRpYyBzaXplX3QgX1NfY2hhcl9wdHJfbGVuKGNvbnN0IF9DaGFyVCogX19zKSB7CisgICAgcmV0dXJuIGNoYXJfdHJhaXRzPF9DaGFyVD46Omxlbmd0aChfX3MpOworICB9CisKK3B1YmxpYzogLyogZm9yIG9wZXJhdG9ycyAqLworICByb3BlKF9Sb3BlUmVwKiBfX3QsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX01fdHJlZV9wdHIoX19hLCBfX3QpIHsgfQorcHJpdmF0ZToKKyAgLy8gQ29weSBfX3IgdG8gdGhlIF9DaGFyVCBidWZmZXIuCisgIC8vIFJldHVybnMgX19idWZmZXIgKyBfX3ItPl9NX3NpemUuX01fZGF0YS4KKyAgLy8gQXNzdW1lcyB0aGF0IGJ1ZmZlciBpcyB1bmluaXRpYWxpemVkLgorICBzdGF0aWMgX0NoYXJUKiBfU19mbGF0dGVuKF9Sb3BlUmVwKiBfX3IsIF9DaGFyVCogX19idWZmZXIpOworCisgIC8vIEFnYWluLCB3aXRoIGV4cGxpY2l0IHN0YXJ0aW5nIHBvc2l0aW9uIGFuZCBsZW5ndGguCisgIC8vIEFzc3VtZXMgdGhhdCBidWZmZXIgaXMgdW5pbml0aWFsaXplZC4KKyAgc3RhdGljIF9DaGFyVCogX1NfZmxhdHRlbihfUm9wZVJlcCogX19yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBfX3N0YXJ0LCBzaXplX3QgX19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NoYXJUKiBfX2J1ZmZlcik7CisKKyAgLy8gZmJwIDogSFAgYUNDIHByb2hpYml0cyBhY2Nlc3MgdG8gcHJvdGVjdGVkIG1pbl9sZW4gZnJvbSB3aXRoaW4gc3RhdGljIG1ldGhvZHMgKCA/PyApCitwdWJsaWM6CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIF9TX21pbl9sZW5bX19ST1BFX0RFUFRIX1NJWkVdOworcHJvdGVjdGVkOgorICBzdGF0aWMgYm9vbCBfU19pc19iYWxhbmNlZChfUm9wZVJlcCogX19yKQorICB7IHJldHVybiAoX19yLT5fTV9zaXplLl9NX2RhdGEgPj0gX1NfbWluX2xlbltfX3ItPl9NX2RlcHRoXSk7IH0KKworICBzdGF0aWMgYm9vbCBfU19pc19hbG1vc3RfYmFsYW5jZWQoX1JvcGVSZXAqIF9fcikgeworICAgIHJldHVybiAoX19yLT5fTV9kZXB0aCA9PSAwIHx8CisgICAgICAgICAgICBfX3ItPl9NX3NpemUuX01fZGF0YSA+PSBfU19taW5fbGVuW19fci0+X01fZGVwdGggLSAxXSk7CisgIH0KKworICBzdGF0aWMgYm9vbCBfU19pc19yb3VnaGx5X2JhbGFuY2VkKF9Sb3BlUmVwKiBfX3IpIHsKKyAgICByZXR1cm4gKF9fci0+X01fZGVwdGggPD0gMSB8fAorICAgICAgICAgICAgX19yLT5fTV9zaXplLl9NX2RhdGEgPj0gX1NfbWluX2xlbltfX3ItPl9NX2RlcHRoIC0gMl0pOworICB9CisKKyAgLy8gQXNzdW1lcyB0aGUgcmVzdWx0IGlzIG5vdCBlbXB0eS4KKyAgc3RhdGljIF9Sb3BlUmVwKiBfU19jb25jYXRfYW5kX3NldF9iYWxhbmNlZChfUm9wZVJlcCogX19sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Sb3BlUmVwKiBfX3JpZ2h0KSB7CisgICAgX1JvcGVSZXAqIF9fcmVzdWx0ID0gX1NfY29uY2F0X3JlcChfX2xlZnQsIF9fcmlnaHQpOworICAgIGlmIChfU19pc19iYWxhbmNlZChfX3Jlc3VsdCkpIF9fcmVzdWx0LT5fTV9pc19iYWxhbmNlZCA9IHRydWU7CisgICAgcmV0dXJuIF9fcmVzdWx0OworICB9CisKKyAgLy8gVGhlIGJhc2ljIHJlYmFsYW5jaW5nIG9wZXJhdGlvbi4gIExvZ2ljYWxseSBjb3BpZXMgdGhlCisgIC8vIHJvcGUuICBUaGUgcmVzdWx0IGhhcyByZWZjb3VudCBvZiAxLiAgVGhlIGNsaWVudCB3aWxsCisgIC8vIHVzdWFsbHkgZGVjcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgb2YgX19yLgorICAvLyBUaGUgcmVzdWx0IGlzIHdpdGhpbiBoZWlnaHQgMiBvZiBiYWxhbmNlZCBieSB0aGUgYWJvdmUKKyAgLy8gZGVmaW5pdGlvbi4KKyAgc3RhdGljIF9Sb3BlUmVwKiBfU19iYWxhbmNlKF9Sb3BlUmVwKiBfX3IpOworCisgIC8vIEFkZCBhbGwgdW5iYWxhbmNlZCBzdWJ0cmVlcyB0byB0aGUgZm9yZXN0IG9mIGJhbGFuY2VlZCB0cmVlcy4KKyAgLy8gVXNlZCBvbmx5IGJ5IGJhbGFuY2UuCisgIHN0YXRpYyB2b2lkIF9TX2FkZF90b19mb3Jlc3QoX1JvcGVSZXAqX19yLCBfUm9wZVJlcCoqIF9fZm9yZXN0KTsKKworICAvLyBBZGQgX19yIHRvIGZvcmVzdCwgYXNzdW1pbmcgX19yIGlzIGFscmVhZHkgYmFsYW5jZWQuCisgIHN0YXRpYyB2b2lkIF9TX2FkZF9sZWFmX3RvX2ZvcmVzdChfUm9wZVJlcCogX19yLCBfUm9wZVJlcCoqIF9fZm9yZXN0KTsKKworI2lmZGVmIF9TVExQX0RFQlVHCisgIC8vIFByaW50IHRvIHN0ZG91dCwgZXhwb3Npbmcgc3RydWN0dXJlCisgIHN0YXRpYyB2b2lkIF9TX2R1bXAoX1JvcGVSZXAqIF9fciwgaW50IF9faW5kZW50ID0gMCk7CisjZW5kaWYKKworICAvLyBSZXR1cm4gLTEsIDAsIG9yIDEgaWYgX194IDwgX195LCBfX3ggPT0gX195LCBvciBfX3ggPiBfX3kgcmVzcC4KKyAgc3RhdGljIGludCBfU19jb21wYXJlKGNvbnN0IF9Sb3BlUmVwKiBfX3gsIGNvbnN0IF9Sb3BlUmVwKiBfX3kpOworCisgIHZvaWQgX1NUTFBfRlVOQ1RJT05fVEhST1dTIF9NX3Rocm93X291dF9vZl9yYW5nZSgpIGNvbnN0OworCisgIHZvaWQgX01fcmVzZXQoX1JvcGVSZXAqIF9fcikgeworICAgIC8vaWYgKF9fciAhPSBfTV90cmVlX3B0ci5fTV9kYXRhKSB7CisgICAgICBfU191bnJlZihfTV90cmVlX3B0ci5fTV9kYXRhKTsKKyAgICAgIF9NX3RyZWVfcHRyLl9NX2RhdGEgPSBfX3I7CisgICAgLy99CisgIH0KKworcHVibGljOgorICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gMCA9PSBfTV90cmVlX3B0ci5fTV9kYXRhOyB9CisKKyAgLy8gQ29tcGFyaXNvbiBtZW1iZXIgZnVuY3Rpb24uICBUaGlzIGlzIHB1YmxpYyBvbmx5IGZvciB0aG9zZQorICAvLyBjbGllbnRzIHRoYXQgbmVlZCBhIHRlcm5hcnkgY29tcGFyaXNvbi4gIE90aGVycworICAvLyBzaG91bGQgdXNlIHRoZSBjb21wYXJpc29uIG9wZXJhdG9ycyBiZWxvdy4KKyAgaW50IGNvbXBhcmUoY29uc3QgX1NlbGYmIF9feSkgY29uc3QgeworICAgIHJldHVybiBfU19jb21wYXJlKF9NX3RyZWVfcHRyLl9NX2RhdGEsIF9feS5fTV90cmVlX3B0ci5fTV9kYXRhKTsKKyAgfQorCisgIHJvcGUoY29uc3QgX0NoYXJUKiBfX3MsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX01fdHJlZV9wdHIoX19hLCBfU19Sb3BlTGVhZl9mcm9tX3Vub3duZWRfY2hhcl9wdHIoX19zLCBfU19jaGFyX3B0cl9sZW4oX19zKSxfX2EpKQorICB7fQorCisgIHJvcGUoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdCBfX2xlbiwKKyAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9NX3RyZWVfcHRyKF9fYSwgKF9TX1JvcGVMZWFmX2Zyb21fdW5vd25lZF9jaGFyX3B0cihfX3MsIF9fbGVuLCBfX2EpKSkKKyAge30KKworICAvLyBTaG91bGQgcGVyaGFwcyBiZSB0ZW1wbGF0aXplZCB3aXRoIHJlc3BlY3QgdG8gdGhlIGl0ZXJhdG9yIHR5cGUKKyAgLy8gYW5kIHVzZSBTZXF1ZW5jZV9idWZmZXIuICAoSXQgc2hvdWxkIHBlcmhhcHMgdXNlIHNlcXVlbmNlX2J1ZmZlcgorICAvLyBldmVuIG5vdy4pCisgIHJvcGUoY29uc3QgX0NoYXJUICpfX3MsIGNvbnN0IF9DaGFyVCAqX19lLAorICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX01fdHJlZV9wdHIoX19hLCBfU19Sb3BlTGVhZl9mcm9tX3Vub3duZWRfY2hhcl9wdHIoX19zLCBfX2UgLSBfX3MsIF9fYSkpCisgIHt9CisKKyAgcm9wZShjb25zdCBjb25zdF9pdGVyYXRvciYgX19zLCBjb25zdCBjb25zdF9pdGVyYXRvciYgX19lLAorICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX01fdHJlZV9wdHIoX19hLCBfU19zdWJzdHJpbmcoX19zLl9NX3Jvb3QsIF9fcy5fTV9jdXJyZW50X3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZS5fTV9jdXJyZW50X3BvcykpCisgIHt9CisKKyAgcm9wZShjb25zdCBpdGVyYXRvciYgX19zLCBjb25zdCBpdGVyYXRvciYgX19lLAorICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX01fdHJlZV9wdHIoX19hLCBfU19zdWJzdHJpbmcoX19zLl9NX3Jvb3QsIF9fcy5fTV9jdXJyZW50X3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZS5fTV9jdXJyZW50X3BvcykpCisgIHt9CisKKyAgcm9wZShfQ2hhclQgX19jLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9NX3RyZWVfcHRyKF9fYSwgKF9Sb3BlUmVwKikwKSB7CisgICAgX0NoYXJUKiBfX2J1ZiA9IF9NX3RyZWVfcHRyLmFsbG9jYXRlKF9TX3JvdW5kZWRfdXBfc2l6ZSgxKSk7CisKKyAgICBfQ29weV9Db25zdHJ1Y3QoX19idWYsIF9fYyk7CisgICAgX1NfY29uc3RydWN0X251bGwoX19idWYgKyAxKTsKKworICAgIF9TVExQX1RSWSB7CisgICAgICBfTV90cmVlX3B0ci5fTV9kYXRhID0gX1NfbmV3X1JvcGVMZWFmKF9fYnVmLCAxLCBfX2EpOworICAgIH0KKyAgICBfU1RMUF9VTldJTkQoX1JvcGVSZXA6Ol9TX2ZyZWVfc3RyaW5nKF9fYnVmLCAxLCBfX2EpKQorICB9CisKKyAgcm9wZShzaXplX3QgX19uLCBfQ2hhclQgX19jLAorICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKToKKyAgICBfTV90cmVlX3B0cihfX2EsIChfUm9wZVJlcCopMCkgeworICAgIGlmICgwID09IF9fbikKKyAgICAgIHJldHVybjsKKworICAgIHJvcGU8X0NoYXJULF9BbGxvYz4gX19yZXN1bHQ7CisjIGRlZmluZSAgX19leHBvbmVudGlhdGVfdGhyZXNob2xkIHNpemVfdCgzMikKKyAgICBfUm9wZVJlcCogX19yZW1haW5kZXI7CisgICAgcm9wZTxfQ2hhclQsX0FsbG9jPiBfX3JlbWFpbmRlcl9yb3BlOworCisgICAgLy8gZ2NjLTIuNy4yIGJ1Z3MKKyAgICB0eXBlZGVmIF9TVExQX1BSSVYgX1JvcGVfQ29uY2F0X2ZuPF9DaGFyVCxfQWxsb2M+IF9Db25jYXRfZm47CisKKyAgICBzaXplX3QgX19leHBvbmVudCA9IF9fbiAvIF9fZXhwb25lbnRpYXRlX3RocmVzaG9sZDsKKyAgICBzaXplX3QgX19yZXN0ID0gX19uICUgX19leHBvbmVudGlhdGVfdGhyZXNob2xkOworICAgIGlmICgwID09IF9fcmVzdCkgeworICAgICAgX19yZW1haW5kZXIgPSAwOworICAgIH0gZWxzZSB7CisgICAgICBfQ2hhclQqIF9fcmVzdF9idWZmZXIgPSBfTV90cmVlX3B0ci5hbGxvY2F0ZShfU19yb3VuZGVkX3VwX3NpemUoX19yZXN0KSk7CisgICAgICB1bmluaXRpYWxpemVkX2ZpbGxfbihfX3Jlc3RfYnVmZmVyLCBfX3Jlc3QsIF9fYyk7CisgICAgICBfU19jb25zdHJ1Y3RfbnVsbChfX3Jlc3RfYnVmZmVyICsgX19yZXN0KTsKKyAgICAgIF9TVExQX1RSWSB7CisgICAgICAgIF9fcmVtYWluZGVyID0gX1NfbmV3X1JvcGVMZWFmKF9fcmVzdF9idWZmZXIsIF9fcmVzdCwgX19hKTsKKyAgICAgIH0KKyAgICAgIF9TVExQX1VOV0lORChfUm9wZVJlcDo6X1NfZnJlZV9zdHJpbmcoX19yZXN0X2J1ZmZlciwgX19yZXN0LCBfX2EpKQorICAgIH0KKyAgICBfX3JlbWFpbmRlcl9yb3BlLl9NX3RyZWVfcHRyLl9NX2RhdGEgPSBfX3JlbWFpbmRlcjsKKyAgICBpZiAoX19leHBvbmVudCAhPSAwKSB7CisgICAgICBfQ2hhclQqIF9fYmFzZV9idWZmZXIgPSBfTV90cmVlX3B0ci5hbGxvY2F0ZShfU19yb3VuZGVkX3VwX3NpemUoX19leHBvbmVudGlhdGVfdGhyZXNob2xkKSk7CisgICAgICBfUm9wZUxlYWYqIF9fYmFzZV9sZWFmOworICAgICAgcm9wZTxfQ2hhclQsX0FsbG9jPiBfX2Jhc2Vfcm9wZTsKKyAgICAgIHVuaW5pdGlhbGl6ZWRfZmlsbF9uKF9fYmFzZV9idWZmZXIsIF9fZXhwb25lbnRpYXRlX3RocmVzaG9sZCwgX19jKTsKKyAgICAgIF9TX2NvbnN0cnVjdF9udWxsKF9fYmFzZV9idWZmZXIgKyBfX2V4cG9uZW50aWF0ZV90aHJlc2hvbGQpOworICAgICAgX1NUTFBfVFJZIHsKKyAgICAgICAgX19iYXNlX2xlYWYgPSBfU19uZXdfUm9wZUxlYWYoX19iYXNlX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19leHBvbmVudGlhdGVfdGhyZXNob2xkLCBfX2EpOworICAgICAgfQorICAgICAgX1NUTFBfVU5XSU5EKF9Sb3BlUmVwOjpfU19mcmVlX3N0cmluZyhfX2Jhc2VfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2V4cG9uZW50aWF0ZV90aHJlc2hvbGQsIF9fYSkpCisgICAgICBfX2Jhc2Vfcm9wZS5fTV90cmVlX3B0ci5fTV9kYXRhID0gX19iYXNlX2xlYWY7CisgICAgICBpZiAoMSA9PSBfX2V4cG9uZW50KSB7CisgICAgICAgIF9fcmVzdWx0ID0gX19iYXNlX3JvcGU7CisgICAgICAgIC8vIE9uZSBlYWNoIGZvciBiYXNlX3JvcGUgYW5kIF9fcmVzdWx0CisgICAgICAgIC8vX1NUTFBfQVNTRVJUKDIgPT0gX19yZXN1bHQuX01fdHJlZV9wdHIuX01fZGF0YS0+X01fcmVmX2NvdW50KQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgX19yZXN1bHQgPSBfU1RMUF9QUklWIF9fcG93ZXIoX19iYXNlX3JvcGUsIF9fZXhwb25lbnQsIF9Db25jYXRfZm4oKSk7CisgICAgICB9CisgICAgICBpZiAoMCAhPSBfX3JlbWFpbmRlcikgeworICAgICAgICBfX3Jlc3VsdCArPSBfX3JlbWFpbmRlcl9yb3BlOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBfX3Jlc3VsdCA9IF9fcmVtYWluZGVyX3JvcGU7CisgICAgfQorICAgIF9NX3RyZWVfcHRyLl9NX2RhdGEgPSBfX3Jlc3VsdC5fTV90cmVlX3B0ci5fTV9kYXRhOworICAgIF9NX3RyZWVfcHRyLl9NX2RhdGEtPl9NX3JlZl9ub25uaWwoKTsKKyMgdW5kZWYgX19leHBvbmVudGlhdGVfdGhyZXNob2xkCisgIH0KKworICByb3BlKGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX01fdHJlZV9wdHIoX19hLCAoX1JvcGVSZXAqKTApIHt9CisKKyAgLy8gQ29uc3RydWN0IGEgcm9wZSBmcm9tIGEgZnVuY3Rpb24gdGhhdCBjYW4gY29tcHV0ZSBpdHMgbWVtYmVycworICByb3BlKGNoYXJfcHJvZHVjZXI8X0NoYXJUPiAqX19mbiwgc2l6ZV90IF9fbGVuLCBib29sIF9fZGVsZXRlX2ZuLAorICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX01fdHJlZV9wdHIoX19hLCAoX1JvcGVSZXAqKTApIHsKKyAgICBfTV90cmVlX3B0ci5fTV9kYXRhID0gKDAgPT0gX19sZW4pID8KKyAgICAgIDAgOiBfU19uZXdfUm9wZUZ1bmN0aW9uKF9fZm4sIF9fbGVuLCBfX2RlbGV0ZV9mbiwgX19hKTsKKyAgfQorCisgIHJvcGUoY29uc3QgX1NlbGYmIF9feCkKKyAgICA6IF9NX3RyZWVfcHRyKF9feC5fTV90cmVlX3B0ciwgX194Ll9NX3RyZWVfcHRyLl9NX2RhdGEpIHsKKyAgICBfU19yZWYoX01fdHJlZV9wdHIuX01fZGF0YSk7CisgIH0KKworICByb3BlKF9fbW92ZV9zb3VyY2U8X1NlbGY+IF9fc3JjKQorICAgIDogX01fdHJlZV9wdHIoX19zcmMuZ2V0KCkuX01fdHJlZV9wdHIsIF9fc3JjLmdldCgpLl9NX3RyZWVfcHRyLl9NX2RhdGEpIHsKKyAgICBfX3NyYy5nZXQoKS5fTV90cmVlX3B0ci5fTV9kYXRhID0gMDsKKyAgfQorCisgIH5yb3BlKCkgeworICAgIF9TX3VucmVmKF9NX3RyZWVfcHRyLl9NX2RhdGEpOworICB9CisKKyAgX1NlbGYmIG9wZXJhdG9yPShjb25zdCBfU2VsZiYgX194KSB7CisgICAgX1NUTFBfQVNTRVJUKGdldF9hbGxvY2F0b3IoKSA9PSBfX3guZ2V0X2FsbG9jYXRvcigpKQorICAgIF9TX3JlZihfX3guX01fdHJlZV9wdHIuX01fZGF0YSk7CisgICAgX01fcmVzZXQoX194Ll9NX3RyZWVfcHRyLl9NX2RhdGEpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHZvaWQgY2xlYXIoKSB7CisgICAgX1NfdW5yZWYoX01fdHJlZV9wdHIuX01fZGF0YSk7CisgICAgX01fdHJlZV9wdHIuX01fZGF0YSA9IDA7CisgIH0KKyAgdm9pZCBwdXNoX2JhY2soX0NoYXJUIF9feCkgeworICAgIF9NX3Jlc2V0KF9TX2Rlc3RyX2NvbmNhdF9jaGFyX2l0ZXIoX01fdHJlZV9wdHIuX01fZGF0YSwgJl9feCwgMSkpOworICB9CisKKyAgdm9pZCBwb3BfYmFjaygpIHsKKyAgICBfUm9wZVJlcCogX19vbGQgPSBfTV90cmVlX3B0ci5fTV9kYXRhOworICAgIF9NX3RyZWVfcHRyLl9NX2RhdGEgPQorICAgICAgX1Nfc3Vic3RyaW5nKF9NX3RyZWVfcHRyLl9NX2RhdGEsIDAsIF9NX3RyZWVfcHRyLl9NX2RhdGEtPl9NX3NpemUuX01fZGF0YSAtIDEpOworICAgIF9TX3VucmVmKF9fb2xkKTsKKyAgfQorCisgIF9DaGFyVCBiYWNrKCkgY29uc3QgeworICAgIHJldHVybiBfU19mZXRjaChfTV90cmVlX3B0ci5fTV9kYXRhLCBfTV90cmVlX3B0ci5fTV9kYXRhLT5fTV9zaXplLl9NX2RhdGEgLSAxKTsKKyAgfQorCisgIHZvaWQgcHVzaF9mcm9udChfQ2hhclQgX194KSB7CisgICAgX1JvcGVSZXAqIF9fb2xkID0gX01fdHJlZV9wdHIuX01fZGF0YTsKKyAgICBfUm9wZVJlcCogX19sZWZ0ID0KKyAgICAgIF9TX1JvcGVMZWFmX2Zyb21fdW5vd25lZF9jaGFyX3B0cigmX194LCAxLCBfTV90cmVlX3B0cik7CisgICAgX1NUTFBfVFJZIHsKKyAgICAgIF9NX3RyZWVfcHRyLl9NX2RhdGEgPSBfU19jb25jYXRfcmVwKF9fbGVmdCwgX01fdHJlZV9wdHIuX01fZGF0YSk7CisgICAgICBfU191bnJlZihfX29sZCk7CisgICAgICBfU191bnJlZihfX2xlZnQpOworICAgIH0KKyAgICBfU1RMUF9VTldJTkQoX1NfdW5yZWYoX19sZWZ0KSkKKyAgfQorCisgIHZvaWQgcG9wX2Zyb250KCkgeworICAgIF9Sb3BlUmVwKiBfX29sZCA9IF9NX3RyZWVfcHRyLl9NX2RhdGE7CisgICAgX01fdHJlZV9wdHIuX01fZGF0YSA9IF9TX3N1YnN0cmluZyhfTV90cmVlX3B0ci5fTV9kYXRhLCAxLCBfTV90cmVlX3B0ci5fTV9kYXRhLT5fTV9zaXplLl9NX2RhdGEpOworICAgIF9TX3VucmVmKF9fb2xkKTsKKyAgfQorCisgIF9DaGFyVCBmcm9udCgpIGNvbnN0IHsKKyAgICByZXR1cm4gX1NfZmV0Y2goX01fdHJlZV9wdHIuX01fZGF0YSwgMCk7CisgIH0KKworICB2b2lkIGJhbGFuY2UoKSB7CisgICAgX1JvcGVSZXAqIF9fb2xkID0gX01fdHJlZV9wdHIuX01fZGF0YTsKKyAgICBfTV90cmVlX3B0ci5fTV9kYXRhID0gX1NfYmFsYW5jZShfTV90cmVlX3B0ci5fTV9kYXRhKTsKKyAgICBfU191bnJlZihfX29sZCk7CisgIH0KKworICB2b2lkIGNvcHkoX0NoYXJUKiBfX2J1ZmZlcikgY29uc3QgeworICAgIF9TVExQX1NURDo6X0Rlc3Ryb3lfUmFuZ2UoX19idWZmZXIsIF9fYnVmZmVyICsgc2l6ZSgpKTsKKyAgICBfU19mbGF0dGVuKF9NX3RyZWVfcHRyLl9NX2RhdGEsIF9fYnVmZmVyKTsKKyAgfQorCisgIC8qCisgICAqIFRoaXMgaXMgdGhlIGNvcHkgZnVuY3Rpb24gZnJvbSB0aGUgc3RhbmRhcmQsIGJ1dAorICAgKiB3aXRoIHRoZSBhcmd1bWVudHMgcmVvcmRlcmVkIHRvIG1ha2UgaXQgY29uc2lzdGVudCB3aXRoIHRoZQorICAgKiByZXN0IG9mIHRoZSBpbnRlcmZhY2UuCisgICAqIE5vdGUgdGhhdCB0aGlzIGd1YXJhbnRlZWQgbm90IHRvIGNvbXBpbGUgaWYgdGhlIGRyYWZ0IHN0YW5kYXJkCisgICAqIG9yZGVyIGlzIGFzc3VtZWQuCisgICAqLworICBzaXplX3R5cGUgY29weShzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24sIF9DaGFyVCogX19idWZmZXIpIGNvbnN0IHsKKyAgICBzaXplX3QgX3Bfc2l6ZSA9IHNpemUoKTsKKyAgICBzaXplX3QgX19sZW4gPSAoX19wb3MgKyBfX24gPiBfcF9zaXplPyBfcF9zaXplIC0gX19wb3MgOiBfX24pOworCisgICAgX1NUTFBfU1REOjpfRGVzdHJveV9SYW5nZShfX2J1ZmZlciwgX19idWZmZXIgKyBfX2xlbik7CisgICAgX1NfZmxhdHRlbihfTV90cmVlX3B0ci5fTV9kYXRhLCBfX3BvcywgX19sZW4sIF9fYnVmZmVyKTsKKyAgICByZXR1cm4gX19sZW47CisgIH0KKworIyBpZmRlZiBfU1RMUF9ERUJVRworICAvLyBQcmludCB0byBzdGRvdXQsIGV4cG9zaW5nIHN0cnVjdHVyZS4gIE1heSBiZSB1c2VmdWwgZm9yCisgIC8vIHBlcmZvcm1hbmNlIGRlYnVnZ2luZy4KKyAgdm9pZCBkdW1wKCkgeworICAgIF9TX2R1bXAoX01fdHJlZV9wdHIuX01fZGF0YSk7CisgIH0KKyMgZW5kaWYKKworICAvLyBDb252ZXJ0IHRvIDAgdGVybWluYXRlZCBzdHJpbmcgaW4gbmV3IGFsbG9jYXRlZCBtZW1vcnkuCisgIC8vIEVtYmVkZGVkIDBzIGluIHRoZSBpbnB1dCBkbyBub3QgdGVybWluYXRlIHRoZSBjb3B5LgorICBjb25zdCBfQ2hhclQqIGNfc3RyKCkgY29uc3Q7CisKKyAgLy8gQXMgYWJvdmUsIGJ1dCBhbHNvIHVzZSB0aGUgZmxhdHRlbmVkIHJlcHJlc2VudGF0aW9uIGFzIHRoZQorICAvLyB0aGUgbmV3IHJvcGUgcmVwcmVzZW50YXRpb24uCisgIGNvbnN0IF9DaGFyVCogcmVwbGFjZV93aXRoX2Nfc3RyKCk7CisKKyAgLy8gUmVjbGFpbSBtZW1vcnkgZm9yIHRoZSBjX3N0ciBnZW5lcmF0ZWQgZmxhdHRlbmVkIHN0cmluZy4KKyAgLy8gSW50ZW50aW9uYWxseSB1bmRvY3VtZW50ZWQsIHNpbmNlIGl0J3MgaGFyZCB0byBzYXkgd2hlbiB0aGlzCisgIC8vIGlzIHNhZmUgZm9yIG11bHRpcGxlIHRocmVhZHMuCisgIHZvaWQgZGVsZXRlX2Nfc3RyICgpIHsKKyAgICBpZiAoMCA9PSBfTV90cmVlX3B0ci5fTV9kYXRhKSByZXR1cm47CisgICAgaWYgKF9Sb3BlUmVwOjpfU19sZWFmID09IF9NX3RyZWVfcHRyLl9NX2RhdGEtPl9NX3RhZyAmJgorICAgICAgICAoKF9Sb3BlTGVhZiopX01fdHJlZV9wdHIuX01fZGF0YSktPl9NX2RhdGEgPT0KKyAgICAgICAgX01fdHJlZV9wdHIuX01fZGF0YS0+X01fY19zdHJpbmcpIHsKKyAgICAgIC8vIFJlcHJlc2VudGF0aW9uIHNoYXJlZAorICAgICAgcmV0dXJuOworICAgIH0KKyAgICBfTV90cmVlX3B0ci5fTV9kYXRhLT5fTV9mcmVlX2Nfc3RyaW5nKCk7CisgICAgX01fdHJlZV9wdHIuX01fZGF0YS0+X01fY19zdHJpbmcgPSAwOworICB9CisKKyAgX0NoYXJUIG9wZXJhdG9yW10gKHNpemVfdHlwZSBfX3BvcykgY29uc3QgeworICAgIHJldHVybiBfU19mZXRjaChfTV90cmVlX3B0ci5fTV9kYXRhLCBfX3Bvcyk7CisgIH0KKworICBfQ2hhclQgYXQoc2l6ZV90eXBlIF9fcG9zKSBjb25zdCB7CisgICAgaWYgKF9fcG9zID49IHNpemUoKSkgX01fdGhyb3dfb3V0X29mX3JhbmdlKCk7CisgICAgcmV0dXJuICgqdGhpcylbX19wb3NdOworICB9CisKKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuKGNvbnN0X2l0ZXJhdG9yKF9NX3RyZWVfcHRyLl9NX2RhdGEsIDApKTsKKyAgfQorCisgIC8vIEFuIGVhc3kgd2F5IHRvIGdldCBhIGNvbnN0IGl0ZXJhdG9yIGZyb20gYSBub24tY29uc3QgY29udGFpbmVyLgorICBjb25zdF9pdGVyYXRvciBjb25zdF9iZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4oY29uc3RfaXRlcmF0b3IoX01fdHJlZV9wdHIuX01fZGF0YSwgMCkpOworICB9CisKKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeworICAgIHJldHVybihjb25zdF9pdGVyYXRvcihfTV90cmVlX3B0ci5fTV9kYXRhLCBzaXplKCkpKTsKKyAgfQorCisgIGNvbnN0X2l0ZXJhdG9yIGNvbnN0X2VuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4oY29uc3RfaXRlcmF0b3IoX01fdHJlZV9wdHIuX01fZGF0YSwgc2l6ZSgpKSk7CisgIH0KKworICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4oMCA9PSBfTV90cmVlX3B0ci5fTV9kYXRhPyAwIDogX01fdHJlZV9wdHIuX01fZGF0YS0+X01fc2l6ZS5fTV9kYXRhKTsKKyAgfQorCisgIHNpemVfdHlwZSBsZW5ndGgoKSBjb25zdCB7CisgICAgcmV0dXJuIHNpemUoKTsKKyAgfQorCisgIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gX1NfbWluX2xlbltfX1JPUEVfTUFYX0RFUFRILTFdIC0gMTsKKyAgICAvLyAgR3VhcmFudGVlcyB0aGF0IHRoZSByZXN1bHQgY2FuIGJlIHN1ZmZpY2llbnRseQorICAgIC8vICBiYWxhbmNlZC4gIExvbmdlciByb3BlcyB3aWxsIHByb2JhYmx5IHN0aWxsIHdvcmssCisgICAgLy8gIGJ1dCBpdCdzIGhhcmRlciB0byBtYWtlIGd1YXJhbnRlZXMuCisgIH0KKworICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7CisgIH0KKworICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGNvbnN0X3JiZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7CisgIH0KKworICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7CisgIH0KKworICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGNvbnN0X3JlbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7CisgIH0KKyAgLy8gVGhlIHN5bW1ldHJpYyBjYXNlcyBhcmUgaW50ZW50aW9uYWxseSBvbWl0dGVkLCBzaW5jZSB0aGV5J3JlIHByZXN1bWVkCisgIC8vIHRvIGJlIGxlc3MgY29tbW9uLCBhbmQgd2UgZG9uJ3QgaGFuZGxlIHRoZW0gYXMgd2VsbC4KKworICAvLyBUaGUgZm9sbG93aW5nIHNob3VsZCByZWFsbHkgYmUgdGVtcGxhdGl6ZWQuCisgIC8vIFRoZSBmaXJzdCBhcmd1bWVudCBzaG91bGQgYmUgYW4gaW5wdXQgaXRlcmF0b3Igb3IKKyAgLy8gZm9yd2FyZCBpdGVyYXRvciB3aXRoIHZhbHVlX3R5cGUgX0NoYXJULgorICBfU2VsZiYgYXBwZW5kKGNvbnN0IF9DaGFyVCogX19pdGVyLCBzaXplX3QgX19uKSB7CisgICAgX01fcmVzZXQoX1NfZGVzdHJfY29uY2F0X2NoYXJfaXRlcihfTV90cmVlX3B0ci5fTV9kYXRhLCBfX2l0ZXIsIF9fbikpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIF9TZWxmJiBhcHBlbmQoY29uc3QgX0NoYXJUKiBfX2Nfc3RyaW5nKSB7CisgICAgc2l6ZV90IF9fbGVuID0gX1NfY2hhcl9wdHJfbGVuKF9fY19zdHJpbmcpOworICAgIGFwcGVuZChfX2Nfc3RyaW5nLCBfX2xlbik7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgX1NlbGYmIGFwcGVuZChjb25zdCBfQ2hhclQqIF9fcywgY29uc3QgX0NoYXJUKiBfX2UpIHsKKyAgICBfTV9yZXNldChfU19kZXN0cl9jb25jYXRfY2hhcl9pdGVyKF9NX3RyZWVfcHRyLl9NX2RhdGEsIF9fcywgX19lIC0gX19zKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgX1NlbGYmIGFwcGVuZChjb25zdF9pdGVyYXRvciBfX3MsIGNvbnN0X2l0ZXJhdG9yIF9fZSkgeworICAgIF9TVExQX0FTU0VSVChfX3MuX01fcm9vdCA9PSBfX2UuX01fcm9vdCkKKyAgICBfU1RMUF9BU1NFUlQoZ2V0X2FsbG9jYXRvcigpID09IF9fcy5fTV9yb290LT5nZXRfYWxsb2NhdG9yKCkpCisgICAgX1NlbGZfZGVzdHJ1Y3RfcHRyIF9fYXBwZW5kZWUoX1Nfc3Vic3RyaW5nKF9fcy5fTV9yb290LCBfX3MuX01fY3VycmVudF9wb3MsIF9fZS5fTV9jdXJyZW50X3BvcykpOworICAgIF9NX3Jlc2V0KF9TX2NvbmNhdF9yZXAoX01fdHJlZV9wdHIuX01fZGF0YSwgKF9Sb3BlUmVwKilfX2FwcGVuZGVlKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgX1NlbGYmIGFwcGVuZChfQ2hhclQgX19jKSB7CisgICAgX01fcmVzZXQoX1NfZGVzdHJfY29uY2F0X2NoYXJfaXRlcihfTV90cmVlX3B0ci5fTV9kYXRhLCAmX19jLCAxKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgX1NlbGYmIGFwcGVuZCgpIHsgcmV0dXJuIGFwcGVuZChfQ2hhclQoKSk7IH0gIC8vIFhYWCB3aHk/CisKKyAgX1NlbGYmIGFwcGVuZChjb25zdCBfU2VsZiYgX195KSB7CisgICAgX1NUTFBfQVNTRVJUKF9feS5nZXRfYWxsb2NhdG9yKCkgPT0gZ2V0X2FsbG9jYXRvcigpKQorICAgIF9NX3Jlc2V0KF9TX2NvbmNhdF9yZXAoX01fdHJlZV9wdHIuX01fZGF0YSwgX195Ll9NX3RyZWVfcHRyLl9NX2RhdGEpKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBfU2VsZiYgYXBwZW5kKHNpemVfdCBfX24sIF9DaGFyVCBfX2MpIHsKKyAgICByb3BlPF9DaGFyVCxfQWxsb2M+IF9fbGFzdChfX24sIF9fYyk7CisgICAgcmV0dXJuIGFwcGVuZChfX2xhc3QpOworICB9CisKKyAgdm9pZCBzd2FwKF9TZWxmJiBfX2IpIHsKKyAgICBfTV90cmVlX3B0ci5zd2FwKF9fYi5fTV90cmVlX3B0cik7CisgIH0KKworcHJvdGVjdGVkOgorICAvLyBSZXN1bHQgaXMgaW5jbHVkZWQgaW4gcmVmY291bnQuCisgIHN0YXRpYyBfUm9wZVJlcCogcmVwbGFjZShfUm9wZVJlcCogX19vbGQsIHNpemVfdCBfX3BvczEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgX19wb3MyLCBfUm9wZVJlcCogX19yKSB7CisgICAgaWYgKDAgPT0gX19vbGQpIHsgX1NfcmVmKF9fcik7IHJldHVybiBfX3I7IH0KKyAgICBfU2VsZl9kZXN0cnVjdF9wdHIgX19sZWZ0KF9TX3N1YnN0cmluZyhfX29sZCwgMCwgX19wb3MxKSk7CisgICAgX1NlbGZfZGVzdHJ1Y3RfcHRyIF9fcmlnaHQoX1Nfc3Vic3RyaW5nKF9fb2xkLCBfX3BvczIsIF9fb2xkLT5fTV9zaXplLl9NX2RhdGEpKTsKKyAgICBfU1RMUF9NUFdGSVhfVFJZICAvLypUWSAwNi8wMS8yMDAwIC0KKyAgICBfUm9wZVJlcCogX19yZXN1bHQ7CisKKyAgICBpZiAoMCA9PSBfX3IpIHsKKyAgICAgIF9fcmVzdWx0ID0gX1NfY29uY2F0X3JlcChfX2xlZnQsIF9fcmlnaHQpOworICAgIH0gZWxzZSB7CisgICAgICBfU1RMUF9BU1NFUlQoX19vbGQtPmdldF9hbGxvY2F0b3IoKSA9PSBfX3ItPmdldF9hbGxvY2F0b3IoKSkKKyAgICAgIF9TZWxmX2Rlc3RydWN0X3B0ciBfX2xlZnRfcmVzdWx0KF9TX2NvbmNhdF9yZXAoX19sZWZ0LCBfX3IpKTsKKyAgICAgIF9fcmVzdWx0ID0gX1NfY29uY2F0X3JlcChfX2xlZnRfcmVzdWx0LCBfX3JpZ2h0KTsKKyAgICB9CisgICAgcmV0dXJuIF9fcmVzdWx0OworICAgIF9TVExQX01QV0ZJWF9DQVRDSCAgLy8qVFkgMDYvMDEvMjAwMCAtCisgIH0KKworcHVibGljOgorICB2b2lkIGluc2VydChzaXplX3QgX19wLCBjb25zdCBfU2VsZiYgX19yKSB7CisgICAgaWYgKF9fcCA+IHNpemUoKSkgX01fdGhyb3dfb3V0X29mX3JhbmdlKCk7CisgICAgX1NUTFBfQVNTRVJUKGdldF9hbGxvY2F0b3IoKSA9PSBfX3IuZ2V0X2FsbG9jYXRvcigpKQorICAgIF9NX3Jlc2V0KHJlcGxhY2UoX01fdHJlZV9wdHIuX01fZGF0YSwgX19wLCBfX3AsIF9fci5fTV90cmVlX3B0ci5fTV9kYXRhKSk7CisgIH0KKworICB2b2lkIGluc2VydChzaXplX3QgX19wLCBzaXplX3QgX19uLCBfQ2hhclQgX19jKSB7CisgICAgcm9wZTxfQ2hhclQsX0FsbG9jPiBfX3IoX19uLF9fYyk7CisgICAgaW5zZXJ0KF9fcCwgX19yKTsKKyAgfQorCisgIHZvaWQgaW5zZXJ0KHNpemVfdCBfX3AsIGNvbnN0IF9DaGFyVCogX19pLCBzaXplX3QgX19uKSB7CisgICAgaWYgKF9fcCA+IHNpemUoKSkgX01fdGhyb3dfb3V0X29mX3JhbmdlKCk7CisgICAgX1NlbGZfZGVzdHJ1Y3RfcHRyIF9fbGVmdChfU19zdWJzdHJpbmcoX01fdHJlZV9wdHIuX01fZGF0YSwgMCwgX19wKSk7CisgICAgX1NlbGZfZGVzdHJ1Y3RfcHRyIF9fcmlnaHQoX1Nfc3Vic3RyaW5nKF9NX3RyZWVfcHRyLl9NX2RhdGEsIF9fcCwgc2l6ZSgpKSk7CisgICAgX1NlbGZfZGVzdHJ1Y3RfcHRyIF9fbGVmdF9yZXN1bHQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NfY29uY2F0X2NoYXJfaXRlcihfX2xlZnQsIF9faSwgX19uKSk7CisgICAgLy8gX1NfIGRlc3RyX2NvbmNhdF9jaGFyX2l0ZXIgc2hvdWxkIGJlIHNhZmUgaGVyZS4KKyAgICAvLyBCdXQgYXMgaXQgc3RhbmRzIGl0J3MgcHJvYmFibHkgbm90IGEgd2luLCBzaW5jZSBfX2xlZnQKKyAgICAvLyBpcyBsaWtlbHkgdG8gaGF2ZSBhZGRpdGlvbmFsIHJlZmVyZW5jZXMuCisgICAgX01fcmVzZXQoX1NfY29uY2F0X3JlcChfX2xlZnRfcmVzdWx0LCBfX3JpZ2h0KSk7CisgIH0KKworICB2b2lkIGluc2VydChzaXplX3QgX19wLCBjb25zdCBfQ2hhclQqIF9fY19zdHJpbmcpIHsKKyAgICBpbnNlcnQoX19wLCBfX2Nfc3RyaW5nLCBfU19jaGFyX3B0cl9sZW4oX19jX3N0cmluZykpOworICB9CisKKyAgdm9pZCBpbnNlcnQoc2l6ZV90IF9fcCwgX0NoYXJUIF9fYykgeworICAgIGluc2VydChfX3AsICZfX2MsIDEpOworICB9CisKKyAgdm9pZCBpbnNlcnQoc2l6ZV90IF9fcCkgeworICAgIF9DaGFyVCBfX2MgPSBfQ2hhclQoKTsKKyAgICBpbnNlcnQoX19wLCAmX19jLCAxKTsKKyAgfQorCisgIHZvaWQgaW5zZXJ0KHNpemVfdCBfX3AsIGNvbnN0IF9DaGFyVCogX19pLCBjb25zdCBfQ2hhclQqIF9faikgeworICAgIF9TZWxmIF9fcihfX2ksIF9faik7CisgICAgaW5zZXJ0KF9fcCwgX19yKTsKKyAgfQorCisgIHZvaWQgaW5zZXJ0KHNpemVfdCBfX3AsIGNvbnN0IGNvbnN0X2l0ZXJhdG9yJiBfX2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnN0X2l0ZXJhdG9yJiBfX2opIHsKKyAgICBfU2VsZiBfX3IoX19pLCBfX2opOworICAgIGluc2VydChfX3AsIF9fcik7CisgIH0KKworICB2b2lkIGluc2VydChzaXplX3QgX19wLCBjb25zdCBpdGVyYXRvciYgX19pLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVyYXRvciYgX19qKSB7CisgICAgX1NlbGYgX19yKF9faSwgX19qKTsKKyAgICBpbnNlcnQoX19wLCBfX3IpOworICB9CisKKyAgLy8gKHBvc2l0aW9uLCBsZW5ndGgpIHZlcnNpb25zIG9mIHJlcGxhY2Ugb3BlcmF0aW9uczoKKyAgdm9pZCByZXBsYWNlKHNpemVfdCBfX3AsIHNpemVfdCBfX24sIGNvbnN0IF9TZWxmJiBfX3IpIHsKKyAgICBpZiAoX19wID4gc2l6ZSgpKSBfTV90aHJvd19vdXRfb2ZfcmFuZ2UoKTsKKyAgICBfTV9yZXNldChyZXBsYWNlKF9NX3RyZWVfcHRyLl9NX2RhdGEsIF9fcCwgX19wICsgX19uLCBfX3IuX01fdHJlZV9wdHIuX01fZGF0YSkpOworICB9CisKKyAgdm9pZCByZXBsYWNlKHNpemVfdCBfX3AsIHNpemVfdCBfX24sCisgICAgICAgICAgICAgICBjb25zdCBfQ2hhclQqIF9faSwgc2l6ZV90IF9faV9sZW4pIHsKKyAgICBfU2VsZiBfX3IoX19pLCBfX2lfbGVuKTsKKyAgICByZXBsYWNlKF9fcCwgX19uLCBfX3IpOworICB9CisKKyAgdm9pZCByZXBsYWNlKHNpemVfdCBfX3AsIHNpemVfdCBfX24sIF9DaGFyVCBfX2MpIHsKKyAgICBfU2VsZiBfX3IoX19jKTsKKyAgICByZXBsYWNlKF9fcCwgX19uLCBfX3IpOworICB9CisKKyAgdm9pZCByZXBsYWNlKHNpemVfdCBfX3AsIHNpemVfdCBfX24sIGNvbnN0IF9DaGFyVCogX19jX3N0cmluZykgeworICAgIF9TZWxmIF9fcihfX2Nfc3RyaW5nKTsKKyAgICByZXBsYWNlKF9fcCwgX19uLCBfX3IpOworICB9CisKKyAgdm9pZCByZXBsYWNlKHNpemVfdCBfX3AsIHNpemVfdCBfX24sCisgICAgICAgICAgICAgICBjb25zdCBfQ2hhclQqIF9faSwgY29uc3QgX0NoYXJUKiBfX2opIHsKKyAgICBfU2VsZiBfX3IoX19pLCBfX2opOworICAgIHJlcGxhY2UoX19wLCBfX24sIF9fcik7CisgIH0KKworICB2b2lkIHJlcGxhY2Uoc2l6ZV90IF9fcCwgc2l6ZV90IF9fbiwKKyAgICAgICAgICAgICAgIGNvbnN0IGNvbnN0X2l0ZXJhdG9yJiBfX2ksIGNvbnN0IGNvbnN0X2l0ZXJhdG9yJiBfX2opIHsKKyAgICBfU2VsZiBfX3IoX19pLCBfX2opOworICAgIHJlcGxhY2UoX19wLCBfX24sIF9fcik7CisgIH0KKworICB2b2lkIHJlcGxhY2Uoc2l6ZV90IF9fcCwgc2l6ZV90IF9fbiwKKyAgICAgICAgICAgICAgIGNvbnN0IGl0ZXJhdG9yJiBfX2ksIGNvbnN0IGl0ZXJhdG9yJiBfX2opIHsKKyAgICBfU2VsZiBfX3IoX19pLCBfX2opOworICAgIHJlcGxhY2UoX19wLCBfX24sIF9fcik7CisgIH0KKworICAvLyBTaW5nbGUgY2hhcmFjdGVyIHZhcmlhbnRzOgorICB2b2lkIHJlcGxhY2Uoc2l6ZV90IF9fcCwgX0NoYXJUIF9fYykgeworICAgIGlmIChfX3AgPiBzaXplKCkpIF9NX3Rocm93X291dF9vZl9yYW5nZSgpOworICAgIGl0ZXJhdG9yIF9faSh0aGlzLCBfX3ApOworICAgICpfX2kgPSBfX2M7CisgIH0KKworICB2b2lkIHJlcGxhY2Uoc2l6ZV90IF9fcCwgY29uc3QgX1NlbGYmIF9fcikgeworICAgIHJlcGxhY2UoX19wLCAxLCBfX3IpOworICB9CisKKyAgdm9pZCByZXBsYWNlKHNpemVfdCBfX3AsIGNvbnN0IF9DaGFyVCogX19pLCBzaXplX3QgX19pX2xlbikgeworICAgIHJlcGxhY2UoX19wLCAxLCBfX2ksIF9faV9sZW4pOworICB9CisKKyAgdm9pZCByZXBsYWNlKHNpemVfdCBfX3AsIGNvbnN0IF9DaGFyVCogX19jX3N0cmluZykgeworICAgIHJlcGxhY2UoX19wLCAxLCBfX2Nfc3RyaW5nKTsKKyAgfQorCisgIHZvaWQgcmVwbGFjZShzaXplX3QgX19wLCBjb25zdCBfQ2hhclQqIF9faSwgY29uc3QgX0NoYXJUKiBfX2opIHsKKyAgICByZXBsYWNlKF9fcCwgMSwgX19pLCBfX2opOworICB9CisKKyAgdm9pZCByZXBsYWNlKHNpemVfdCBfX3AsIGNvbnN0IGNvbnN0X2l0ZXJhdG9yJiBfX2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb25zdF9pdGVyYXRvciYgX19qKSB7CisgICAgcmVwbGFjZShfX3AsIDEsIF9faSwgX19qKTsKKyAgfQorCisgIHZvaWQgcmVwbGFjZShzaXplX3QgX19wLCBjb25zdCBpdGVyYXRvciYgX19pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlcmF0b3ImIF9faikgeworICAgIHJlcGxhY2UoX19wLCAxLCBfX2ksIF9faik7CisgIH0KKworICAvLyBFcmFzZSwgKHBvc2l0aW9uLCBzaXplKSB2YXJpYW50LgorICB2b2lkIGVyYXNlKHNpemVfdCBfX3AsIHNpemVfdCBfX24pIHsKKyAgICBpZiAoX19wID4gc2l6ZSgpKSBfTV90aHJvd19vdXRfb2ZfcmFuZ2UoKTsKKyAgICBfTV9yZXNldChyZXBsYWNlKF9NX3RyZWVfcHRyLl9NX2RhdGEsIF9fcCwgX19wICsgX19uLCAwKSk7CisgIH0KKworICAvLyBFcmFzZSwgc2luZ2xlIGNoYXJhY3RlcgorICB2b2lkIGVyYXNlKHNpemVfdCBfX3ApIHsKKyAgICBlcmFzZShfX3AsIF9fcCArIDEpOworICB9CisKKyAgLy8gSW5zZXJ0LCBpdGVyYXRvciB2YXJpYW50cy4KKyAgaXRlcmF0b3IgaW5zZXJ0KGNvbnN0IGl0ZXJhdG9yJiBfX3AsIGNvbnN0IF9TZWxmJiBfX3IpCisgIHsgaW5zZXJ0KF9fcC5pbmRleCgpLCBfX3IpOyByZXR1cm4gX19wOyB9CisgIGl0ZXJhdG9yIGluc2VydChjb25zdCBpdGVyYXRvciYgX19wLCBzaXplX3QgX19uLCBfQ2hhclQgX19jKQorICB7IGluc2VydChfX3AuaW5kZXgoKSwgX19uLCBfX2MpOyByZXR1cm4gX19wOyB9CisgIGl0ZXJhdG9yIGluc2VydChjb25zdCBpdGVyYXRvciYgX19wLCBfQ2hhclQgX19jKQorICB7IGluc2VydChfX3AuaW5kZXgoKSwgX19jKTsgcmV0dXJuIF9fcDsgfQorICBpdGVyYXRvciBpbnNlcnQoY29uc3QgaXRlcmF0b3ImIF9fcCApCisgIHsgaW5zZXJ0KF9fcC5pbmRleCgpKTsgcmV0dXJuIF9fcDsgfQorICBpdGVyYXRvciBpbnNlcnQoY29uc3QgaXRlcmF0b3ImIF9fcCwgY29uc3QgX0NoYXJUKiBjX3N0cmluZykKKyAgeyBpbnNlcnQoX19wLmluZGV4KCksIGNfc3RyaW5nKTsgcmV0dXJuIF9fcDsgfQorICBpdGVyYXRvciBpbnNlcnQoY29uc3QgaXRlcmF0b3ImIF9fcCwgY29uc3QgX0NoYXJUKiBfX2ksIHNpemVfdCBfX24pCisgIHsgaW5zZXJ0KF9fcC5pbmRleCgpLCBfX2ksIF9fbik7IHJldHVybiBfX3A7IH0KKyAgaXRlcmF0b3IgaW5zZXJ0KGNvbnN0IGl0ZXJhdG9yJiBfX3AsIGNvbnN0IF9DaGFyVCogX19pLAorICAgICAgICAgICAgICAgICAgY29uc3QgX0NoYXJUKiBfX2opCisgIHsgaW5zZXJ0KF9fcC5pbmRleCgpLCBfX2ksIF9faik7ICByZXR1cm4gX19wOyB9CisgIGl0ZXJhdG9yIGluc2VydChjb25zdCBpdGVyYXRvciYgX19wLAorICAgICAgICAgICAgICAgICAgY29uc3QgY29uc3RfaXRlcmF0b3ImIF9faSwgY29uc3QgY29uc3RfaXRlcmF0b3ImIF9faikKKyAgeyBpbnNlcnQoX19wLmluZGV4KCksIF9faSwgX19qKTsgcmV0dXJuIF9fcDsgfQorICBpdGVyYXRvciBpbnNlcnQoY29uc3QgaXRlcmF0b3ImIF9fcCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZXJhdG9yJiBfX2ksIGNvbnN0IGl0ZXJhdG9yJiBfX2opCisgIHsgaW5zZXJ0KF9fcC5pbmRleCgpLCBfX2ksIF9faik7IHJldHVybiBfX3A7IH0KKworICAvLyBSZXBsYWNlLCByYW5nZSB2YXJpYW50cy4KKyAgdm9pZCByZXBsYWNlKGNvbnN0IGl0ZXJhdG9yJiBfX3AsIGNvbnN0IGl0ZXJhdG9yJiBfX3EsCisgICAgICAgICAgICAgICBjb25zdCBfU2VsZiYgX19yKQorICB7IHJlcGxhY2UoX19wLmluZGV4KCksIF9fcS5pbmRleCgpIC0gX19wLmluZGV4KCksIF9fcik7IH0KKyAgdm9pZCByZXBsYWNlKGNvbnN0IGl0ZXJhdG9yJiBfX3AsIGNvbnN0IGl0ZXJhdG9yJiBfX3EsIF9DaGFyVCBfX2MpCisgIHsgcmVwbGFjZShfX3AuaW5kZXgoKSwgX19xLmluZGV4KCkgLSBfX3AuaW5kZXgoKSwgX19jKTsgfQorICB2b2lkIHJlcGxhY2UoY29uc3QgaXRlcmF0b3ImIF9fcCwgY29uc3QgaXRlcmF0b3ImIF9fcSwKKyAgICAgICAgICAgICAgIGNvbnN0IF9DaGFyVCogX19jX3N0cmluZykKKyAgeyByZXBsYWNlKF9fcC5pbmRleCgpLCBfX3EuaW5kZXgoKSAtIF9fcC5pbmRleCgpLCBfX2Nfc3RyaW5nKTsgfQorICB2b2lkIHJlcGxhY2UoY29uc3QgaXRlcmF0b3ImIF9fcCwgY29uc3QgaXRlcmF0b3ImIF9fcSwKKyAgICAgICAgICAgICAgIGNvbnN0IF9DaGFyVCogX19pLCBzaXplX3QgX19uKQorICB7IHJlcGxhY2UoX19wLmluZGV4KCksIF9fcS5pbmRleCgpIC0gX19wLmluZGV4KCksIF9faSwgX19uKTsgfQorICB2b2lkIHJlcGxhY2UoY29uc3QgaXRlcmF0b3ImIF9fcCwgY29uc3QgaXRlcmF0b3ImIF9fcSwKKyAgICAgICAgICAgICAgIGNvbnN0IF9DaGFyVCogX19pLCBjb25zdCBfQ2hhclQqIF9faikKKyAgeyByZXBsYWNlKF9fcC5pbmRleCgpLCBfX3EuaW5kZXgoKSAtIF9fcC5pbmRleCgpLCBfX2ksIF9faik7IH0KKyAgdm9pZCByZXBsYWNlKGNvbnN0IGl0ZXJhdG9yJiBfX3AsIGNvbnN0IGl0ZXJhdG9yJiBfX3EsCisgICAgICAgICAgICAgICBjb25zdCBjb25zdF9pdGVyYXRvciYgX19pLCBjb25zdCBjb25zdF9pdGVyYXRvciYgX19qKQorICB7IHJlcGxhY2UoX19wLmluZGV4KCksIF9fcS5pbmRleCgpIC0gX19wLmluZGV4KCksIF9faSwgX19qKTsgfQorICB2b2lkIHJlcGxhY2UoY29uc3QgaXRlcmF0b3ImIF9fcCwgY29uc3QgaXRlcmF0b3ImIF9fcSwKKyAgICAgICAgICAgICAgIGNvbnN0IGl0ZXJhdG9yJiBfX2ksIGNvbnN0IGl0ZXJhdG9yJiBfX2opCisgIHsgcmVwbGFjZShfX3AuaW5kZXgoKSwgX19xLmluZGV4KCkgLSBfX3AuaW5kZXgoKSwgX19pLCBfX2opOyB9CisKKyAgLy8gUmVwbGFjZSwgaXRlcmF0b3IgdmFyaWFudHMuCisgIHZvaWQgcmVwbGFjZShjb25zdCBpdGVyYXRvciYgX19wLCBjb25zdCBfU2VsZiYgX19yKQorICB7IHJlcGxhY2UoX19wLmluZGV4KCksIF9fcik7IH0KKyAgdm9pZCByZXBsYWNlKGNvbnN0IGl0ZXJhdG9yJiBfX3AsIF9DaGFyVCBfX2MpCisgIHsgcmVwbGFjZShfX3AuaW5kZXgoKSwgX19jKTsgfQorICB2b2lkIHJlcGxhY2UoY29uc3QgaXRlcmF0b3ImIF9fcCwgY29uc3QgX0NoYXJUKiBfX2Nfc3RyaW5nKQorICB7IHJlcGxhY2UoX19wLmluZGV4KCksIF9fY19zdHJpbmcpOyB9CisgIHZvaWQgcmVwbGFjZShjb25zdCBpdGVyYXRvciYgX19wLCBjb25zdCBfQ2hhclQqIF9faSwgc2l6ZV90IF9fbikKKyAgeyByZXBsYWNlKF9fcC5pbmRleCgpLCBfX2ksIF9fbik7IH0KKyAgdm9pZCByZXBsYWNlKGNvbnN0IGl0ZXJhdG9yJiBfX3AsIGNvbnN0IF9DaGFyVCogX19pLCBjb25zdCBfQ2hhclQqIF9faikKKyAgeyByZXBsYWNlKF9fcC5pbmRleCgpLCBfX2ksIF9faik7IH0KKyAgdm9pZCByZXBsYWNlKGNvbnN0IGl0ZXJhdG9yJiBfX3AsIGNvbnN0X2l0ZXJhdG9yIF9faSwKKyAgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yIF9faikKKyAgeyByZXBsYWNlKF9fcC5pbmRleCgpLCBfX2ksIF9faik7IH0KKyAgdm9pZCByZXBsYWNlKGNvbnN0IGl0ZXJhdG9yJiBfX3AsIGl0ZXJhdG9yIF9faSwgaXRlcmF0b3IgX19qKQorICB7IHJlcGxhY2UoX19wLmluZGV4KCksIF9faSwgX19qKTsgfQorCisgIC8vIEl0ZXJhdG9yIGFuZCByYW5nZSB2YXJpYW50cyBvZiBlcmFzZQorICBpdGVyYXRvciBlcmFzZShjb25zdCBpdGVyYXRvciYgX19wLCBjb25zdCBpdGVyYXRvciYgX19xKSB7CisgICAgc2l6ZV90IF9fcF9pbmRleCA9IF9fcC5pbmRleCgpOworICAgIGVyYXNlKF9fcF9pbmRleCwgX19xLmluZGV4KCkgLSBfX3BfaW5kZXgpOworICAgIHJldHVybiBpdGVyYXRvcih0aGlzLCBfX3BfaW5kZXgpOworICB9CisgIGl0ZXJhdG9yIGVyYXNlKGNvbnN0IGl0ZXJhdG9yJiBfX3ApIHsKKyAgICBzaXplX3QgX19wX2luZGV4ID0gX19wLmluZGV4KCk7CisgICAgZXJhc2UoX19wX2luZGV4LCAxKTsKKyAgICByZXR1cm4gaXRlcmF0b3IodGhpcywgX19wX2luZGV4KTsKKyAgfQorCisgIF9TZWxmIHN1YnN0cihzaXplX3QgX19zdGFydCwgc2l6ZV90IF9fbGVuID0gMSkgY29uc3QgeworICAgIGlmIChfX3N0YXJ0ID4gc2l6ZSgpKSBfTV90aHJvd19vdXRfb2ZfcmFuZ2UoKTsKKyAgICByZXR1cm4gcm9wZTxfQ2hhclQsX0FsbG9jPihfU19zdWJzdHJpbmcoX01fdHJlZV9wdHIuX01fZGF0YSwgX19zdGFydCwgX19zdGFydCArIF9fbGVuKSk7CisgIH0KKworICBfU2VsZiBzdWJzdHIoaXRlcmF0b3IgX19zdGFydCwgaXRlcmF0b3IgX19lbmQpIGNvbnN0IHsKKyAgICByZXR1cm4gcm9wZTxfQ2hhclQsX0FsbG9jPihfU19zdWJzdHJpbmcoX01fdHJlZV9wdHIuX01fZGF0YSwgX19zdGFydC5pbmRleCgpLCBfX2VuZC5pbmRleCgpKSk7CisgIH0KKworICBfU2VsZiBzdWJzdHIoaXRlcmF0b3IgX19zdGFydCkgY29uc3QgeworICAgIHNpemVfdCBfX3BvcyA9IF9fc3RhcnQuaW5kZXgoKTsKKyAgICByZXR1cm4gcm9wZTxfQ2hhclQsX0FsbG9jPihfU19zdWJzdHJpbmcoX01fdHJlZV9wdHIuX01fZGF0YSwgX19wb3MsIF9fcG9zICsgMSkpOworICB9CisKKyAgX1NlbGYgc3Vic3RyKGNvbnN0X2l0ZXJhdG9yIF9fc3RhcnQsIGNvbnN0X2l0ZXJhdG9yIF9fZW5kKSBjb25zdCB7CisgICAgLy8gVGhpcyBtaWdodCBldmVudHVhbGx5IHRha2UgYWR2YW50YWdlIG9mIHRoZSBjYWNoZSBpbiB0aGUKKyAgICAvLyBpdGVyYXRvci4KKyAgICByZXR1cm4gcm9wZTxfQ2hhclQsX0FsbG9jPihfU19zdWJzdHJpbmcoX01fdHJlZV9wdHIuX01fZGF0YSwgX19zdGFydC5pbmRleCgpLCBfX2VuZC5pbmRleCgpKSk7CisgIH0KKworICByb3BlPF9DaGFyVCxfQWxsb2M+IHN1YnN0cihjb25zdF9pdGVyYXRvciBfX3N0YXJ0KSB7CisgICAgc2l6ZV90IF9fcG9zID0gX19zdGFydC5pbmRleCgpOworICAgIHJldHVybiByb3BlPF9DaGFyVCxfQWxsb2M+KF9TX3N1YnN0cmluZyhfTV90cmVlX3B0ci5fTV9kYXRhLCBfX3BvcywgX19wb3MgKyAxKSk7CisgIH0KKworI2luY2x1ZGUgPHN0bC9fc3RyaW5nX25wb3MuaD4KKworICBzaXplX3R5cGUgZmluZChjb25zdCBfU2VsZiYgX19zLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdCB7CisgICAgaWYgKF9fcG9zID49IHNpemUoKSkKKyMgaWZuZGVmIF9TVExQX09MRF9ST1BFX1NFTUFOVElDUworICAgICAgcmV0dXJuIG5wb3M7CisjIGVsc2UKKyAgICAgIHJldHVybiBzaXplKCk7CisjIGVuZGlmCisKKyAgICBzaXplX3R5cGUgX19yZXN1bHRfcG9zOworICAgIGNvbnN0X2l0ZXJhdG9yIF9fcmVzdWx0ID0gc2VhcmNoKGNvbnN0X2JlZ2luKCkgKyAocHRyZGlmZl90KV9fcG9zLCBjb25zdF9lbmQoKSwgX19zLmJlZ2luKCksIF9fcy5lbmQoKSApOworICAgIF9fcmVzdWx0X3BvcyA9IF9fcmVzdWx0LmluZGV4KCk7CisjIGlmbmRlZiBfU1RMUF9PTERfUk9QRV9TRU1BTlRJQ1MKKyAgICBpZiAoX19yZXN1bHRfcG9zID09IHNpemUoKSkgX19yZXN1bHRfcG9zID0gbnBvczsKKyMgZW5kaWYKKyAgICByZXR1cm4gX19yZXN1bHRfcG9zOworICB9CisgIHNpemVfdHlwZSBmaW5kKF9DaGFyVCBfX2MsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0OworICBzaXplX3R5cGUgZmluZChjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QgeworICAgIHNpemVfdHlwZSBfX3Jlc3VsdF9wb3M7CisgICAgY29uc3RfaXRlcmF0b3IgX19yZXN1bHQgPSBzZWFyY2goY29uc3RfYmVnaW4oKSArIChwdHJkaWZmX3QpX19wb3MsIGNvbnN0X2VuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcywgX19zICsgX1NfY2hhcl9wdHJfbGVuKF9fcykpOworICAgIF9fcmVzdWx0X3BvcyA9IF9fcmVzdWx0LmluZGV4KCk7CisjIGlmbmRlZiBfU1RMUF9PTERfUk9QRV9TRU1BTlRJQ1MKKyAgICBpZiAoX19yZXN1bHRfcG9zID09IHNpemUoKSkgX19yZXN1bHRfcG9zID0gbnBvczsKKyMgZW5kaWYKKyAgICByZXR1cm4gX19yZXN1bHRfcG9zOworICB9CisKKyAgaXRlcmF0b3IgbXV0YWJsZV9iZWdpbigpIHsKKyAgICByZXR1cm4oaXRlcmF0b3IodGhpcywgMCkpOworICB9CisKKyAgaXRlcmF0b3IgbXV0YWJsZV9lbmQoKSB7CisgICAgcmV0dXJuKGl0ZXJhdG9yKHRoaXMsIHNpemUoKSkpOworICB9CisKKyAgcmV2ZXJzZV9pdGVyYXRvciBtdXRhYmxlX3JiZWdpbigpIHsKKyAgICByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihtdXRhYmxlX2VuZCgpKTsKKyAgfQorCisgIHJldmVyc2VfaXRlcmF0b3IgbXV0YWJsZV9yZW5kKCkgeworICAgIHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKG11dGFibGVfYmVnaW4oKSk7CisgIH0KKworICByZWZlcmVuY2UgbXV0YWJsZV9yZWZlcmVuY2VfYXQoc2l6ZV90eXBlIF9fcG9zKSB7CisgICAgcmV0dXJuIHJlZmVyZW5jZSh0aGlzLCBfX3Bvcyk7CisgIH0KKworIyBpZmRlZiBfX1NURF9TVFVGRgorICByZWZlcmVuY2Ugb3BlcmF0b3JbXSAoc2l6ZV90eXBlIF9fcG9zKSB7CisgICAgcmV0dXJuIHJlZmVyZW5jZSh0aGlzLCBfX3Bvcyk7CisgIH0KKworICByZWZlcmVuY2UgYXQoc2l6ZV90eXBlIF9fcG9zKSB7CisgICAgaWYgKF9fcG9zID49IHNpemUoKSkgX01fdGhyb3dfb3V0X29mX3JhbmdlKCk7CisgICAgcmV0dXJuICgqdGhpcylbX19wb3NdOworICB9CisKKyAgdm9pZCByZXNpemUoc2l6ZV90eXBlLCBfQ2hhclQpIHt9CisgIHZvaWQgcmVzaXplKHNpemVfdHlwZSkge30KKyAgdm9pZCByZXNlcnZlKHNpemVfdHlwZSA9IDApIHt9CisgIHNpemVfdHlwZSBjYXBhY2l0eSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbWF4X3NpemUoKTsKKyAgfQorCisgIC8vIFN0dWZmIGJlbG93IHRoaXMgbGluZSBpcyBkYW5nZXJvdXMgYmVjYXVzZSBpdCdzIGVycm9yIHByb25lLgorICAvLyBJIHdvdWxkIHJlYWxseSBsaWtlIHRvIGdldCByaWQgb2YgaXQuCisgIC8vIGNvcHkgZnVuY3Rpb24gd2l0aCBmdW5ueSBhcmcgb3JkZXJpbmcuCisgIHNpemVfdHlwZSBjb3B5KF9DaGFyVCogX19idWZmZXIsIHNpemVfdHlwZSBfX24sCisgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0IHsKKyAgICByZXR1cm4gY29weShfX3BvcywgX19uLCBfX2J1ZmZlcik7CisgIH0KKworICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBtdXRhYmxlX2VuZCgpOyB9CisKKyAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBtdXRhYmxlX2JlZ2luKCk7IH0KKworICByZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSB7IHJldHVybiBtdXRhYmxlX3JlbmQoKTsgfQorCisgIHJldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgeyByZXR1cm4gbXV0YWJsZV9yYmVnaW4oKTsgfQorCisjIGVsc2UKKworICBjb25zdF9pdGVyYXRvciBlbmQoKSB7IHJldHVybiBjb25zdF9lbmQoKTsgfQorCisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gY29uc3RfYmVnaW4oKTsgfQorCisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpIHsgcmV0dXJuIGNvbnN0X3JlbmQoKTsgfQorCisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgeyByZXR1cm4gY29uc3RfcmJlZ2luKCk7IH0KKworIyBlbmRpZgorfTsgLy9jbGFzcyByb3BlCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfU1RBVElDX0NPTlNUX0lOSVRfQlVHKQorIyAgaWYgZGVmaW5lZCAoX19HTlVDX18pICYmIChfX0dOVUNfXyA9PSAyKSAmJiAoX19HTlVDX01JTk9SX18gPT0gOTYpCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+Citjb25zdCBzaXplX3Qgcm9wZTxfQ2hhclQsIF9BbGxvYz46Om5wb3MgPSB+KHNpemVfdCkgMDsKKyMgIGVuZGlmCisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgoraW5saW5lIF9DaGFyVAorX1JvcGVfY29uc3RfaXRlcmF0b3I8IF9DaGFyVCwgX0FsbG9jPjo6b3BlcmF0b3JbXShzaXplX3QgX19uKQoreyByZXR1cm4gcm9wZTxfQ2hhclQsX0FsbG9jPjo6X1NfZmV0Y2godGhpcy0+X01fcm9vdCwgdGhpcy0+X01fY3VycmVudF9wb3MgKyBfX24pOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KK2lubGluZSBib29sIG9wZXJhdG9yPT0gKGNvbnN0IF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+JiBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPiYgX195KSB7CisgIHJldHVybiAoX194Ll9NX2N1cnJlbnRfcG9zID09IF9feS5fTV9jdXJyZW50X3BvcyAmJgorICAgICAgICAgIF9feC5fTV9yb290ID09IF9feS5fTV9yb290KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgoraW5saW5lIGJvb2wgb3BlcmF0b3I8IChjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPiYgX194LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPiYgX195KQoreyByZXR1cm4gKF9feC5fTV9jdXJyZW50X3BvcyA8IF9feS5fTV9jdXJyZW50X3Bvcyk7IH0KKworI2lmZGVmIF9TVExQX1VTRV9TRVBBUkFURV9SRUxPUFNfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KK2lubGluZSBib29sIG9wZXJhdG9yIT0gKGNvbnN0IF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+JiBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPiYgX195KQoreyByZXR1cm4gIShfX3ggPT0gX195KTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgYm9vbCBvcGVyYXRvcj4gKGNvbnN0IF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+JiBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+JiBfX3kpCit7IHJldHVybiBfX3kgPCBfX3g7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgoraW5saW5lIGJvb2wgb3BlcmF0b3I8PSAoY29uc3QgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4mIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+JiBfX3kpCit7IHJldHVybiAhKF9feSA8IF9feCk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgoraW5saW5lIGJvb2wgb3BlcmF0b3I+PSAoY29uc3QgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4mIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+JiBfX3kpCit7IHJldHVybiAhKF9feCA8IF9feSk7IH0KKworI2VuZGlmIC8qIF9TVExQX1VTRV9TRVBBUkFURV9SRUxPUFNfTkFNRVNQQUNFICovCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KK2lubGluZSBwdHJkaWZmX3Qgb3BlcmF0b3ItKGNvbnN0IF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+JiBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPiYgX195KQoreyByZXR1cm4gKHB0cmRpZmZfdClfX3guX01fY3VycmVudF9wb3MgLSAocHRyZGlmZl90KV9feS5fTV9jdXJyZW50X3BvczsgfQorCisjaWYgIWRlZmluZWQoIF9fTVdFUktTX18gKSB8fCBfX01XRVJLU19fID49IDB4MjAwMCAgLy8gZHdhIDgvMjEvOTcgIC0gImFtYmlndW91cyBhY2Nlc3MgdG8gb3ZlcmxvYWRlZCBmdW5jdGlvbiIgYnVnLgordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgoraW5saW5lIF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+CitvcGVyYXRvci0oY29uc3QgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4mIF9feCwgcHRyZGlmZl90IF9fbikKK3sgcmV0dXJuIF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+KF9feC5fTV9yb290LCBfX3guX01fY3VycmVudF9wb3MgLSBfX24pOyB9CisjIGVuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KK2lubGluZSBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPgorb3BlcmF0b3IrKGNvbnN0IF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+JiBfX3gsIHB0cmRpZmZfdCBfX24pCit7IHJldHVybiBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPihfX3guX01fcm9vdCwgX194Ll9NX2N1cnJlbnRfcG9zICsgX19uKTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4KK29wZXJhdG9yKyhwdHJkaWZmX3QgX19uLCBjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPiYgX194KQoreyByZXR1cm4gX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4oX194Ll9NX3Jvb3QsIF9feC5fTV9jdXJyZW50X3BvcyArIF9fbik7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgoraW5saW5lIGJvb2wgb3BlcmF0b3I9PSAoY29uc3QgX1JvcGVfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4mIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+JiBfX3kpIHsKKyAgcmV0dXJuIChfX3guX01fY3VycmVudF9wb3MgPT0gX195Ll9NX2N1cnJlbnRfcG9zICYmCisgICAgICAgICAgX194Ll9NX3Jvb3Rfcm9wZSA9PSBfX3kuX01fcm9vdF9yb3BlKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgoraW5saW5lIGJvb2wgb3BlcmF0b3I8IChjb25zdCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPiYgX194LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPiYgX195KQoreyByZXR1cm4gKF9feC5fTV9jdXJyZW50X3BvcyA8IF9feS5fTV9jdXJyZW50X3Bvcyk7IH0KKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9TRVBBUkFURV9SRUxPUFNfTkFNRVNQQUNFKQordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgoraW5saW5lIGJvb2wgb3BlcmF0b3IhPSAoY29uc3QgX1JvcGVfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4mIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+JiBfX3kpCit7IHJldHVybiAhKF9feCA9PSBfX3kpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KK2lubGluZSBib29sIG9wZXJhdG9yPiAoY29uc3QgX1JvcGVfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4mIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1JvcGVfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4mIF9feSkKK3sgcmV0dXJuIF9feSA8IF9feDsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgYm9vbCBvcGVyYXRvcjw9IChjb25zdCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPiYgX194LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1JvcGVfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4mIF9feSkKK3sgcmV0dXJuICEoX195IDwgX194KTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgYm9vbCBvcGVyYXRvcj49IChjb25zdCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPiYgX194LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1JvcGVfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4mIF9feSkKK3sgcmV0dXJuICEoX194IDwgX195KTsgfQorI2VuZGlmIC8qIF9TVExQX1VTRV9TRVBBUkFURV9SRUxPUFNfTkFNRVNQQUNFICovCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KK2lubGluZSBwdHJkaWZmX3Qgb3BlcmF0b3ItKGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+JiBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPiYgX195KQoreyByZXR1cm4gKHB0cmRpZmZfdClfX3guX01fY3VycmVudF9wb3MgLSAocHRyZGlmZl90KV9feS5fTV9jdXJyZW50X3BvczsgfQorCisjaWYgIWRlZmluZWQoIF9fTVdFUktTX18gKSB8fCBfX01XRVJLU19fID49IDB4MjAwMCAgLy8gZHdhIDgvMjEvOTcgIC0gImFtYmlndW91cyBhY2Nlc3MgdG8gb3ZlcmxvYWRlZCBmdW5jdGlvbiIgYnVnLgordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgoraW5saW5lIF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+CitvcGVyYXRvci0oY29uc3QgX1JvcGVfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4mIF9feCwKKyAgICAgICAgICBwdHJkaWZmX3QgX19uKSB7CisgIHJldHVybiBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPihfX3guX01fcm9vdF9yb3BlLCBfX3guX01fY3VycmVudF9wb3MgLSBfX24pOworfQorIyBlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgX1JvcGVfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4KK29wZXJhdG9yKyhjb25zdCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPiYgX194LAorICAgICAgICAgIHB0cmRpZmZfdCBfX24pIHsKKyAgcmV0dXJuIF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+KF9feC5fTV9yb290X3JvcGUsIF9feC5fTV9jdXJyZW50X3BvcyArIF9fbik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KK2lubGluZSBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPgorb3BlcmF0b3IrKHB0cmRpZmZfdCBfX24sIGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+JiBfX3gpIHsKKyAgcmV0dXJuIF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+KF9feC5fTV9yb290X3JvcGUsIF9feC5fTV9jdXJyZW50X3BvcyArIF9fbik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KK2lubGluZSByb3BlPF9DaGFyVCxfQWxsb2M+CitvcGVyYXRvcisgKGNvbnN0IHJvcGU8X0NoYXJULF9BbGxvYz4mIF9fbGVmdCwKKyAgICAgICAgICAgY29uc3Qgcm9wZTxfQ2hhclQsX0FsbG9jPiYgX19yaWdodCkgeworICBfU1RMUF9BU1NFUlQoX19sZWZ0LmdldF9hbGxvY2F0b3IoKSA9PSBfX3JpZ2h0LmdldF9hbGxvY2F0b3IoKSkKKyAgcmV0dXJuIHJvcGU8X0NoYXJULF9BbGxvYz4ocm9wZTxfQ2hhclQsX0FsbG9jPjo6X1NfY29uY2F0X3JlcChfX2xlZnQuX01fdHJlZV9wdHIuX01fZGF0YSwgX19yaWdodC5fTV90cmVlX3B0ci5fTV9kYXRhKSk7CisgIC8vIElubGluaW5nIHRoaXMgc2hvdWxkIG1ha2UgaXQgcG9zc2libGUgdG8ga2VlcCBfX2xlZnQgYW5kIF9fcmlnaHQgaW4gcmVnaXN0ZXJzLgorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgcm9wZTxfQ2hhclQsX0FsbG9jPiYKK29wZXJhdG9yKz0gKHJvcGU8X0NoYXJULF9BbGxvYz4mIF9fbGVmdCwKKyAgICAgICAgICAgIGNvbnN0IHJvcGU8X0NoYXJULF9BbGxvYz4mIF9fcmlnaHQpIHsKKyAgX19sZWZ0LmFwcGVuZChfX3JpZ2h0KTsKKyAgcmV0dXJuIF9fbGVmdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgoraW5saW5lIHJvcGU8X0NoYXJULF9BbGxvYz4KK29wZXJhdG9yKyAoY29uc3Qgcm9wZTxfQ2hhclQsX0FsbG9jPiYgX19sZWZ0LAorICAgICAgICAgICBjb25zdCBfQ2hhclQqIF9fcmlnaHQpIHsKKyAgc2l6ZV90IF9fcmxlbiA9IHJvcGU8X0NoYXJULF9BbGxvYz46Ol9TX2NoYXJfcHRyX2xlbihfX3JpZ2h0KTsKKyAgcmV0dXJuIHJvcGU8X0NoYXJULF9BbGxvYz4ocm9wZTxfQ2hhclQsX0FsbG9jPjo6X1NfY29uY2F0X2NoYXJfaXRlcihfX2xlZnQuX01fdHJlZV9wdHIuX01fZGF0YSwgX19yaWdodCwgX19ybGVuKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KK2lubGluZSByb3BlPF9DaGFyVCxfQWxsb2M+Jgorb3BlcmF0b3IrPSAocm9wZTxfQ2hhclQsX0FsbG9jPiYgX19sZWZ0LAorICAgICAgICAgICAgY29uc3QgX0NoYXJUKiBfX3JpZ2h0KSB7CisgIF9fbGVmdC5hcHBlbmQoX19yaWdodCk7CisgIHJldHVybiBfX2xlZnQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KK2lubGluZSByb3BlPF9DaGFyVCxfQWxsb2M+CitvcGVyYXRvcisgKGNvbnN0IHJvcGU8X0NoYXJULF9BbGxvYz4mIF9fbGVmdCwgX0NoYXJUIF9fcmlnaHQpIHsKKyAgcmV0dXJuIHJvcGU8X0NoYXJULF9BbGxvYz4ocm9wZTxfQ2hhclQsX0FsbG9jPjo6X1NfY29uY2F0X2NoYXJfaXRlcihfX2xlZnQuX01fdHJlZV9wdHIuX01fZGF0YSwgJl9fcmlnaHQsIDEpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgoraW5saW5lIHJvcGU8X0NoYXJULF9BbGxvYz4mCitvcGVyYXRvcis9IChyb3BlPF9DaGFyVCxfQWxsb2M+JiBfX2xlZnQsIF9DaGFyVCBfX3JpZ2h0KSB7CisgIF9fbGVmdC5hcHBlbmQoX19yaWdodCk7CisgIHJldHVybiBfX2xlZnQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KK2lubGluZSBib29sCitvcGVyYXRvcjwgKGNvbnN0IHJvcGU8X0NoYXJULF9BbGxvYz4mIF9fbGVmdCwKKyAgICAgICAgICAgY29uc3Qgcm9wZTxfQ2hhclQsX0FsbG9jPiYgX19yaWdodCkgeworICByZXR1cm4gX19sZWZ0LmNvbXBhcmUoX19yaWdodCkgPCAwOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgYm9vbAorb3BlcmF0b3I9PSAoY29uc3Qgcm9wZTxfQ2hhclQsX0FsbG9jPiYgX19sZWZ0LAorICAgICAgICAgICAgY29uc3Qgcm9wZTxfQ2hhclQsX0FsbG9jPiYgX19yaWdodCkgeworICByZXR1cm4gX19sZWZ0LmNvbXBhcmUoX19yaWdodCkgPT0gMDsKK30KKworI2lmZGVmIF9TVExQX1VTRV9TRVBBUkFURV9SRUxPUFNfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KK2lubGluZSBib29sCitvcGVyYXRvciE9IChjb25zdCByb3BlPF9DaGFyVCxfQWxsb2M+JiBfX3gsIGNvbnN0IHJvcGU8X0NoYXJULF9BbGxvYz4mIF9feSkgeworICByZXR1cm4gIShfX3ggPT0gX195KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgoraW5saW5lIGJvb2wKK29wZXJhdG9yPiAoY29uc3Qgcm9wZTxfQ2hhclQsX0FsbG9jPiYgX194LCBjb25zdCByb3BlPF9DaGFyVCxfQWxsb2M+JiBfX3kpIHsKKyAgcmV0dXJuIF9feSA8IF9feDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgoraW5saW5lIGJvb2wKK29wZXJhdG9yPD0gKGNvbnN0IHJvcGU8X0NoYXJULF9BbGxvYz4mIF9feCwgY29uc3Qgcm9wZTxfQ2hhclQsX0FsbG9jPiYgX195KSB7CisgIHJldHVybiAhKF9feSA8IF9feCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KK2lubGluZSBib29sCitvcGVyYXRvcj49IChjb25zdCByb3BlPF9DaGFyVCxfQWxsb2M+JiBfX3gsIGNvbnN0IHJvcGU8X0NoYXJULF9BbGxvYz4mIF9feSkgeworICByZXR1cm4gIShfX3ggPCBfX3kpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgYm9vbCBvcGVyYXRvciE9IChjb25zdCBfUm9wZV9jaGFyX3B0cl9wcm94eTxfQ2hhclQsX0FsbG9jPiYgX194LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1JvcGVfY2hhcl9wdHJfcHJveHk8X0NoYXJULF9BbGxvYz4mIF9feSkgeworICByZXR1cm4gIShfX3ggPT0gX195KTsKK30KKworI2VuZGlmIC8qIF9TVExQX1VTRV9TRVBBUkFURV9SRUxPUFNfTkFNRVNQQUNFICovCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KK2lubGluZSBib29sIG9wZXJhdG9yPT0gKGNvbnN0IF9Sb3BlX2NoYXJfcHRyX3Byb3h5PF9DaGFyVCxfQWxsb2M+JiBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfUm9wZV9jaGFyX3B0cl9wcm94eTxfQ2hhclQsX0FsbG9jPiYgX195KSB7CisgIHJldHVybiAoX194Ll9NX3BvcyA9PSBfX3kuX01fcG9zICYmIF9feC5fTV9yb290ID09IF9feS5fTV9yb290KTsKK30KKworI2lmICFkZWZpbmVkIChfU1RMUF9VU0VfTk9fSU9TVFJFQU1TKQordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CitiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIG9wZXJhdG9yPDwgKGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByb3BlPF9DaGFyVCwgX0FsbG9jPiYgX19yKTsKKyNlbmRpZgorCit0eXBlZGVmIHJvcGU8Y2hhciwgX1NUTFBfREVGQVVMVF9BTExPQ0FUT1IoY2hhcikgPiBjcm9wZTsKKyNpZiBkZWZpbmVkIChfU1RMUF9IQVNfV0NIQVJfVCkKK3R5cGVkZWYgcm9wZTx3Y2hhcl90LCBfU1RMUF9ERUZBVUxUX0FMTE9DQVRPUih3Y2hhcl90KSA+IHdyb3BlOworI2VuZGlmCisKK2lubGluZSBjcm9wZTo6cmVmZXJlbmNlIF9fbXV0YWJsZV9yZWZlcmVuY2VfYXQoY3JvcGUmIF9fYywgc2l6ZV90IF9faSkKK3sgcmV0dXJuIF9fYy5tdXRhYmxlX3JlZmVyZW5jZV9hdChfX2kpOyB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9IQVNfV0NIQVJfVCkKK2lubGluZSB3cm9wZTo6cmVmZXJlbmNlIF9fbXV0YWJsZV9yZWZlcmVuY2VfYXQod3JvcGUmIF9fYywgc2l6ZV90IF9faSkKK3sgcmV0dXJuIF9fYy5tdXRhYmxlX3JlZmVyZW5jZV9hdChfX2kpOyB9CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUikKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KK2lubGluZSB2b2lkIHN3YXAocm9wZTxfQ2hhclQsX0FsbG9jPiYgX194LCByb3BlPF9DaGFyVCxfQWxsb2M+JiBfX3kpCit7IF9feC5zd2FwKF9feSk7IH0KKyNlbHNlCisKK2lubGluZSB2b2lkIHN3YXAoY3JvcGUmIF9feCwgY3JvcGUmIF9feSkgeyBfX3guc3dhcChfX3kpOyB9CisjIGlmZGVmIF9TVExQX0hBU19XQ0hBUl9UICAvLyBkd2EgOC8yMS85NworaW5saW5lIHZvaWQgc3dhcCh3cm9wZSYgX194LCB3cm9wZSYgX195KSB7IF9feC5zd2FwKF9feSk7IH0KKyMgZW5kaWYKKworI2VuZGlmIC8qIF9TVExQX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUiAqLworCisKKy8vIEhhc2ggZnVuY3Rpb25zIHNob3VsZCBwcm9iYWJseSBiZSByZXZpc2l0ZWQgbGF0ZXI6CitfU1RMUF9URU1QTEFURV9OVUxMIHN0cnVjdCBoYXNoPGNyb3BlPiB7CisgIHNpemVfdCBvcGVyYXRvcigpKGNvbnN0IGNyb3BlJiBfX3N0cikgY29uc3QgeworICAgIHNpemVfdCBfcF9zaXplID0gX19zdHIuc2l6ZSgpOworCisgICAgaWYgKDAgPT0gX3Bfc2l6ZSkgcmV0dXJuIDA7CisgICAgcmV0dXJuIDEzKl9fc3RyWzBdICsgNSpfX3N0cltfcF9zaXplIC0gMV0gKyBfcF9zaXplOworICB9Cit9OworCisjaWYgZGVmaW5lZCAoX1NUTFBfSEFTX1dDSEFSX1QpICAvLyBkd2EgOC8yMS85NworX1NUTFBfVEVNUExBVEVfTlVMTCBzdHJ1Y3QgaGFzaDx3cm9wZT4geworICBzaXplX3Qgb3BlcmF0b3IoKShjb25zdCB3cm9wZSYgX19zdHIpIGNvbnN0IHsKKyAgICBzaXplX3QgX3Bfc2l6ZSA9IF9fc3RyLnNpemUoKTsKKworICAgIGlmICgwID09IF9wX3NpemUpIHJldHVybiAwOworICAgIHJldHVybiAxMypfX3N0clswXSArIDUqX19zdHJbX3Bfc2l6ZSAtIDFdICsgX3Bfc2l6ZTsKKyAgfQorfTsKKyNlbmRpZgorCisjaWYgKCFkZWZpbmVkIChfU1RMUF9NU1ZDKSB8fCAoX1NUTFBfTVNWQyA+PSAxMzEwKSkKKy8vIEkgY291bGRuJ3QgZ2V0IHRoaXMgdG8gd29yayB3aXRoIFZDKysKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCxjbGFzcyBfQWxsb2M+CisjICBpZiBkZWZpbmVkIChfX0RNQ19fKSAmJiAhZGVmaW5lZCAoX19QVVRfU1RBVElDX0RBVEFfTUVNQkVSU19IRVJFKQorZXh0ZXJuCisjICBlbmRpZgordm9pZCBfUm9wZV9yb3RhdGUoX1JvcGVfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+IF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4gX19taWRkbGUsCisgICAgICAgICAgICAgICAgICBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4gX19sYXN0KTsKKworaW5saW5lIHZvaWQgcm90YXRlKF9Sb3BlX2l0ZXJhdG9yPGNoYXIsIF9TVExQX0RFRkFVTFRfQUxMT0NBVE9SKGNoYXIpID4gX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICBfUm9wZV9pdGVyYXRvcjxjaGFyLCBfU1RMUF9ERUZBVUxUX0FMTE9DQVRPUihjaGFyKSA+IF9fbWlkZGxlLAorICAgICAgICAgICAgICAgICAgIF9Sb3BlX2l0ZXJhdG9yPGNoYXIsIF9TVExQX0RFRkFVTFRfQUxMT0NBVE9SKGNoYXIpID4gX19sYXN0KQoreyBfUm9wZV9yb3RhdGUoX19maXJzdCwgX19taWRkbGUsIF9fbGFzdCk7IH0KKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgX1JvcGVfY2hhcl9yZWZfcHJveHk8X0NoYXJULCBfQWxsb2M+OjpvcGVyYXRvciBfQ2hhclQgKCkgY29uc3QgeworICBpZiAoX01fY3VycmVudF92YWxpZCkgeworICAgIHJldHVybiBfTV9jdXJyZW50OworICB9IGVsc2UgeworICAgIHJldHVybiBfTXlfcm9wZTo6X1NfZmV0Y2goX01fcm9vdC0+X01fdHJlZV9wdHIuX01fZGF0YSwgX01fcG9zKTsKKyAgfQorfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KK3N0cnVjdCBfX21vdmVfdHJhaXRzPHJvcGU8X0NoYXJULCBfQWxsb2M+ID4geworICB0eXBlZGVmIF9fc3RscF9tb3ZhYmxlIGltcGxlbWVudGVkOworICAvL0NvbXBsZXRuZXNzIGRlcGVuZHMgb24gdGhlIGFsbG9jYXRvcjoKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX21vdmVfdHJhaXRzPF9BbGxvYz46OmNvbXBsZXRlIGNvbXBsZXRlOworfTsKKyNlbmRpZgorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTElOS19USU1FX0lOU1RBTlRJQVRJT04pCisjICBpbmNsdWRlIDxzdGwvX3JvcGUuYz4KKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfUk9QRV9IICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvX3NldC5oIGIvc3RsL19zZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjUzYjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc3RsL19zZXQuaApAQCAtMCwwICsxLDQwMiBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKy8qIE5PVEU6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIFNUTCBoZWFkZXJzLgorICogICBZb3Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4KKyAqLworCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX1NFVF9ICisjZGVmaW5lIF9TVExQX0lOVEVSTkFMX1NFVF9ICisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfVFJFRV9ICisjICBpbmNsdWRlIDxzdGwvX3RyZWUuaD4KKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKF9TVExQX1VTRV9QVFJfU1BFQ0lBTElaQVRJT05TKQorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworLy9TcGVjaWZpYyBpdGVyYXRvciB0cmFpdHMgY3JlYXRpb24KK19TVExQX0NSRUFURV9JVEVSQVRPUl9UUkFJVFMoU2V0VHJhaXRzVCwgQ29uc3RfdHJhaXRzKQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgX1NUTFBfREZMX1RNUExfUEFSQU0oX0NvbXBhcmUsIGxlc3M8X0tleT4pLAorICAgICAgICAgICAgICAgICAgICAgX1NUTFBfREVGQVVMVF9BTExPQ0FUT1JfU0VMRUNUKF9LZXkpID4KK2NsYXNzIHNldAorI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QQVJUSUFMX1NQRUNfV09SS0FST1VORCkKKyAgICAgICAgICA6IHB1YmxpYyBfX3N0bHBvcnRfY2xhc3M8c2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2M+ID4KKyNlbmRpZgoreworICB0eXBlZGVmIHNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jPiBfU2VsZjsKK3B1YmxpYzoKKy8vIHR5cGVkZWZzOgorICB0eXBlZGVmIF9LZXkgICAgIGtleV90eXBlOworICB0eXBlZGVmIF9LZXkgICAgIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgX0NvbXBhcmUga2V5X2NvbXBhcmU7CisgIHR5cGVkZWYgX0NvbXBhcmUgdmFsdWVfY29tcGFyZTsKKworcHJpdmF0ZToKKyAgLy9TcGVjaWZpYyBpdGVyYXRvciB0cmFpdHMgY3JlYXRpb24KKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9TZXRUcmFpdHNUPHZhbHVlX3R5cGU+IF9TZXRUcmFpdHM7CisKK3B1YmxpYzoKKyAgLy9Gb2xsb3dpbmcgdHlwZWRlZiBoYXZlIHRvIGJlIHB1YmxpYyBmb3IgX19tb3ZlX3RyYWl0cyBzcGVjaWFsaXphdGlvbi4KKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9SYl90cmVlPGtleV90eXBlLCBrZXlfY29tcGFyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGUsIF9TVExQX1BSSVYgX0lkZW50aXR5PHZhbHVlX3R5cGU+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NldFRyYWl0cywgX0FsbG9jPiBfUmVwX3R5cGU7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OnBvaW50ZXIgcG9pbnRlcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OmNvbnN0X3BvaW50ZXIgY29uc3RfcG9pbnRlcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OnJlZmVyZW5jZSByZWZlcmVuY2U7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpjb25zdF9yZWZlcmVuY2UgY29uc3RfcmVmZXJlbmNlOworICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6aXRlcmF0b3IgaXRlcmF0b3I7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OnJldmVyc2VfaXRlcmF0b3IgcmV2ZXJzZV9pdGVyYXRvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OnNpemVfdHlwZSBzaXplX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7CisKK3ByaXZhdGU6CisgIF9SZXBfdHlwZSBfTV90OyAgLy8gcmVkLWJsYWNrIHRyZWUgcmVwcmVzZW50aW5nIHNldAorICBfU1RMUF9LRVlfVFlQRV9GT1JfQ09OVF9FWFQoa2V5X3R5cGUpCisKK3B1YmxpYzoKKworICAvLyBhbGxvY2F0aW9uL2RlYWxsb2NhdGlvbgorI2lmICFkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQorICBleHBsaWNpdCBzZXQoY29uc3QgX0NvbXBhcmUmIF9fY29tcCA9IF9Db21wYXJlKCksCisgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyNlbHNlCisgIHNldCgpCisgICAgOiBfTV90KF9Db21wYXJlKCksIGFsbG9jYXRvcl90eXBlKCkpIHt9CisgIGV4cGxpY2l0IHNldChjb25zdCBfQ29tcGFyZSYgX19jb21wKQorICAgIDogX01fdChfX2NvbXAsIGFsbG9jYXRvcl90eXBlKCkpIHt9CisgIHNldChjb25zdCBfQ29tcGFyZSYgX19jb21wLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorI2VuZGlmCisgICAgOiBfTV90KF9fY29tcCwgX19hKSB7fQorCisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICBzZXQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgIDogX01fdChfQ29tcGFyZSgpLCBhbGxvY2F0b3JfdHlwZSgpKQorICAgIHsgX01fdC5pbnNlcnRfdW5pcXVlKF9fZmlyc3QsIF9fbGFzdCk7IH0KKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfTkVFRFNfRVhUUkFfVEVNUExBVEVfQ09OU1RSVUNUT1JTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHNldChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsIGNvbnN0IF9Db21wYXJlJiBfX2NvbXApCisgICAgOiBfTV90KF9fY29tcCwgYWxsb2NhdG9yX3R5cGUoKSkgeyBfTV90Lmluc2VydF91bmlxdWUoX19maXJzdCwgX19sYXN0KTsgfQorIyAgZW5kaWYKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICBzZXQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LCBjb25zdCBfQ29tcGFyZSYgX19jb21wLAorICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSBfU1RMUF9BTExPQ0FUT1JfVFlQRV9ERkwpCisgICAgOiBfTV90KF9fY29tcCwgX19hKSB7IF9NX3QuaW5zZXJ0X3VuaXF1ZShfX2ZpcnN0LCBfX2xhc3QpOyB9CisjZWxzZQorICBzZXQoY29uc3QgdmFsdWVfdHlwZSogX19maXJzdCwgY29uc3QgdmFsdWVfdHlwZSogX19sYXN0KQorICAgIDogX01fdChfQ29tcGFyZSgpLCBhbGxvY2F0b3JfdHlwZSgpKQorICAgIHsgX01fdC5pbnNlcnRfdW5pcXVlKF9fZmlyc3QsIF9fbGFzdCk7IH0KKworICBzZXQoY29uc3QgdmFsdWVfdHlwZSogX19maXJzdCwKKyAgICAgIGNvbnN0IHZhbHVlX3R5cGUqIF9fbGFzdCwgY29uc3QgX0NvbXBhcmUmIF9fY29tcCwKKyAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX01fdChfX2NvbXAsIF9fYSkgeyBfTV90Lmluc2VydF91bmlxdWUoX19maXJzdCwgX19sYXN0KTsgfQorCisgIHNldChjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpCisgICAgOiBfTV90KF9Db21wYXJlKCksIGFsbG9jYXRvcl90eXBlKCkpCisgICAgeyBfTV90Lmluc2VydF91bmlxdWUoX19maXJzdCwgX19sYXN0KTsgfQorCisgIHNldChjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QsIGNvbnN0IF9Db21wYXJlJiBfX2NvbXAsCisgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9NX3QoX19jb21wLCBfX2EpIHsgX01fdC5pbnNlcnRfdW5pcXVlKF9fZmlyc3QsIF9fbGFzdCk7IH0KKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisKKyAgc2V0KGNvbnN0IF9TZWxmJiBfX3gpIDogX01fdChfX3guX01fdCkge30KKworICBzZXQoX19tb3ZlX3NvdXJjZTxfU2VsZj4gc3JjKQorICAgIDogX01fdChfX21vdmVfc291cmNlPF9SZXBfdHlwZT4oc3JjLmdldCgpLl9NX3QpKSB7fQorCisgIF9TZWxmJiBvcGVyYXRvcj0oY29uc3QgX1NlbGYmIF9feCkgeworICAgIF9NX3QgPSBfX3guX01fdDsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLyBhY2Nlc3NvcnM6CisgIGtleV9jb21wYXJlIGtleV9jb21wKCkgY29uc3QgeyByZXR1cm4gX01fdC5rZXlfY29tcCgpOyB9CisgIHZhbHVlX2NvbXBhcmUgdmFsdWVfY29tcCgpIGNvbnN0IHsgcmV0dXJuIF9NX3Qua2V5X2NvbXAoKTsgfQorICBhbGxvY2F0b3JfdHlwZSBnZXRfYWxsb2NhdG9yKCkgY29uc3QgeyByZXR1cm4gX01fdC5nZXRfYWxsb2NhdG9yKCk7IH0KKworICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIF9NX3QuYmVnaW4oKTsgfQorICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBfTV90LmVuZCgpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gX01fdC5iZWdpbigpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIF9NX3QuZW5kKCk7IH0KKyAgcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSB7IHJldHVybiBfTV90LnJiZWdpbigpOyB9CisgIHJldmVyc2VfaXRlcmF0b3IgcmVuZCgpIHsgcmV0dXJuIF9NX3QucmVuZCgpOyB9CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgY29uc3QgeyByZXR1cm4gX01fdC5yYmVnaW4oKTsgfQorICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSBjb25zdCB7IHJldHVybiBfTV90LnJlbmQoKTsgfQorICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gX01fdC5lbXB0eSgpOyB9CisgIHNpemVfdHlwZSBzaXplKCkgY29uc3QgeyByZXR1cm4gX01fdC5zaXplKCk7IH0KKyAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgeyByZXR1cm4gX01fdC5tYXhfc2l6ZSgpOyB9CisgIHZvaWQgc3dhcChfU2VsZiYgX194KSB7IF9NX3Quc3dhcChfX3guX01fdCk7IH0KKworICAvLyBpbnNlcnQvZXJhc2UKKyAgcGFpcjxpdGVyYXRvcixib29sPiBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX194KQorICB7IHJldHVybiBfTV90Lmluc2VydF91bmlxdWUoX194KTsgfQorICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgeyByZXR1cm4gX01fdC5pbnNlcnRfdW5pcXVlKCBfX3BvcyAsIF9feCk7IH0KKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZvaWQgaW5zZXJ0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgeyBfTV90Lmluc2VydF91bmlxdWUoX19maXJzdCwgX19sYXN0KTsgfQorI2Vsc2UKKyAgdm9pZCBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KQorICB7IF9NX3QuaW5zZXJ0X3VuaXF1ZShfX2ZpcnN0LCBfX2xhc3QpOyB9CisgIHZvaWQgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUqIF9fZmlyc3QsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbGFzdCkKKyAgeyBfTV90Lmluc2VydF91bmlxdWUoX19maXJzdCwgX19sYXN0KTsgfQorI2VuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKyAgdm9pZCBlcmFzZShpdGVyYXRvciBfX3BvcykgeyBfTV90LmVyYXNlKCBfX3BvcyApOyB9CisgIHNpemVfdHlwZSBlcmFzZShjb25zdCBrZXlfdHlwZSYgX194KSB7IHJldHVybiBfTV90LmVyYXNlX3VuaXF1ZShfX3gpOyB9CisgIHZvaWQgZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KSB7IF9NX3QuZXJhc2UoX19maXJzdCwgX19sYXN0ICk7IH0KKyAgdm9pZCBjbGVhcigpIHsgX01fdC5jbGVhcigpOyB9CisKKyAgLy8gc2V0IG9wZXJhdGlvbnM6CisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBjb25zdF9pdGVyYXRvciBmaW5kKGNvbnN0IF9LVCYgX194KSBjb25zdCB7IHJldHVybiBfTV90LmZpbmQoX194KTsgfQorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgaXRlcmF0b3IgZmluZChjb25zdCBfS1QmIF9feCkgeyByZXR1cm4gX01fdC5maW5kKF9feCk7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIHNpemVfdHlwZSBjb3VudChjb25zdCBfS1QmIF9feCkgY29uc3QKKyAgeyByZXR1cm4gX01fdC5maW5kKF9feCkgPT0gX01fdC5lbmQoKSA/IDAgOiAxIDsgfQorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgaXRlcmF0b3IgbG93ZXJfYm91bmQoY29uc3QgX0tUJiBfX3gpIHsgcmV0dXJuIF9NX3QubG93ZXJfYm91bmQoX194KTsgfQorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgY29uc3RfaXRlcmF0b3IgbG93ZXJfYm91bmQoY29uc3QgX0tUJiBfX3gpIGNvbnN0IHsgcmV0dXJuIF9NX3QubG93ZXJfYm91bmQoX194KTsgfQorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgaXRlcmF0b3IgdXBwZXJfYm91bmQoY29uc3QgX0tUJiBfX3gpIHsgcmV0dXJuIF9NX3QudXBwZXJfYm91bmQoX194KTsgfQorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgY29uc3RfaXRlcmF0b3IgdXBwZXJfYm91bmQoY29uc3QgX0tUJiBfX3gpIGNvbnN0IHsgcmV0dXJuIF9NX3QudXBwZXJfYm91bmQoX194KTsgfQorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgcGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+IGVxdWFsX3JhbmdlKGNvbnN0IF9LVCYgX194KQorICB7IHJldHVybiBfTV90LmVxdWFsX3JhbmdlX3VuaXF1ZShfX3gpOyB9CisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4gZXF1YWxfcmFuZ2UoY29uc3QgX0tUJiBfX3gpIGNvbnN0CisgIHsgcmV0dXJuIF9NX3QuZXF1YWxfcmFuZ2VfdW5pcXVlKF9feCk7IH0KK307CisKKy8vU3BlY2lmaWMgaXRlcmF0b3IgdHJhaXRzIGNyZWF0aW9uCitfU1RMUF9DUkVBVEVfSVRFUkFUT1JfVFJBSVRTKE11bHRpc2V0VHJhaXRzVCwgQ29uc3RfdHJhaXRzKQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgX1NUTFBfREZMX1RNUExfUEFSQU0oX0NvbXBhcmUsIGxlc3M8X0tleT4pLAorICAgICAgICAgIF9TVExQX0RFRkFVTFRfQUxMT0NBVE9SX1NFTEVDVChfS2V5KSA+CitjbGFzcyBtdWx0aXNldAorI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QQVJUSUFMX1NQRUNfV09SS0FST1VORCkKKyAgICAgICAgICAgICAgIDogcHVibGljIF9fc3RscG9ydF9jbGFzczxtdWx0aXNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jPiA+CisjZW5kaWYKK3sKKyAgdHlwZWRlZiBtdWx0aXNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jPiBfU2VsZjsKK3B1YmxpYzoKKyAgLy8gdHlwZWRlZnM6CisKKyAgdHlwZWRlZiBfS2V5ICAgICBrZXlfdHlwZTsKKyAgdHlwZWRlZiBfS2V5ICAgICB2YWx1ZV90eXBlOworICB0eXBlZGVmIF9Db21wYXJlIGtleV9jb21wYXJlOworICB0eXBlZGVmIF9Db21wYXJlIHZhbHVlX2NvbXBhcmU7CisKK3ByaXZhdGU6CisgIC8vU3BlY2lmaWMgaXRlcmF0b3IgdHJhaXRzIGNyZWF0aW9uCisgIHR5cGVkZWYgX1NUTFBfUFJJViBfTXVsdGlzZXRUcmFpdHNUPHZhbHVlX3R5cGU+IF9NdWx0aXNldFRyYWl0czsKKworcHVibGljOgorICAvL0ZvbGxvd2luZyB0eXBlZGVmIGhhdmUgdG8gYmUgcHVibGljIGZvciBfX21vdmVfdHJhaXRzIHNwZWNpYWxpemF0aW9uLgorICB0eXBlZGVmIF9TVExQX1BSSVYgX1JiX3RyZWU8a2V5X3R5cGUsIGtleV9jb21wYXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZSwgX1NUTFBfUFJJViBfSWRlbnRpdHk8dmFsdWVfdHlwZT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTXVsdGlzZXRUcmFpdHMsIF9BbGxvYz4gX1JlcF90eXBlOworCisgIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpwb2ludGVyIHBvaW50ZXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpjb25zdF9wb2ludGVyIGNvbnN0X3BvaW50ZXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpyZWZlcmVuY2UgcmVmZXJlbmNlOworICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X3JlZmVyZW5jZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6Oml0ZXJhdG9yIGl0ZXJhdG9yOworICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpyZXZlcnNlX2l0ZXJhdG9yIHJldmVyc2VfaXRlcmF0b3I7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpzaXplX3R5cGUgc2l6ZV90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OmFsbG9jYXRvcl90eXBlIGFsbG9jYXRvcl90eXBlOworCitwcml2YXRlOgorICBfUmVwX3R5cGUgX01fdDsgIC8vIHJlZC1ibGFjayB0cmVlIHJlcHJlc2VudGluZyBtdWx0aXNldAorICBfU1RMUF9LRVlfVFlQRV9GT1JfQ09OVF9FWFQoa2V5X3R5cGUpCisKK3B1YmxpYzoKKyNpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKKyAgZXhwbGljaXQgbXVsdGlzZXQoY29uc3QgX0NvbXBhcmUmIF9fY29tcCA9IF9Db21wYXJlKCksCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorI2Vsc2UKKyAgbXVsdGlzZXQoKQorICAgIDogX01fdChfQ29tcGFyZSgpLCBhbGxvY2F0b3JfdHlwZSgpKSB7fQorICBleHBsaWNpdCBtdWx0aXNldChjb25zdCBfQ29tcGFyZSYgX19jb21wKQorICAgIDogX01fdChfX2NvbXAsIGFsbG9jYXRvcl90eXBlKCkpIHt9CisgIG11bHRpc2V0KGNvbnN0IF9Db21wYXJlJiBfX2NvbXAsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisjZW5kaWYKKyAgICA6IF9NX3QoX19jb21wLCBfX2EpIHt9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIG11bHRpc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgICA6IF9NX3QoX0NvbXBhcmUoKSwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICB7IF9NX3QuaW5zZXJ0X2VxdWFsKF9fZmlyc3QsIF9fbGFzdCk7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIG11bHRpc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgY29uc3QgX0NvbXBhcmUmIF9fY29tcCwKKyAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSBfU1RMUF9BTExPQ0FUT1JfVFlQRV9ERkwpCisgICAgOiBfTV90KF9fY29tcCwgX19hKSB7IF9NX3QuaW5zZXJ0X2VxdWFsKF9fZmlyc3QsIF9fbGFzdCk7IH0KKyMgIGlmIGRlZmluZWQgKF9TVExQX05FRURTX0VYVFJBX1RFTVBMQVRFX0NPTlNUUlVDVE9SUykKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICBtdWx0aXNldChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgIGNvbnN0IF9Db21wYXJlJiBfX2NvbXApCisgICAgOiBfTV90KF9fY29tcCwgYWxsb2NhdG9yX3R5cGUoKSkgeyBfTV90Lmluc2VydF9lcXVhbChfX2ZpcnN0LCBfX2xhc3QpOyB9CisjICBlbmRpZgorI2Vsc2UKKyAgbXVsdGlzZXQoY29uc3QgdmFsdWVfdHlwZSogX19maXJzdCwgY29uc3QgdmFsdWVfdHlwZSogX19sYXN0KQorICAgIDogX01fdChfQ29tcGFyZSgpLCBhbGxvY2F0b3JfdHlwZSgpKQorICAgIHsgX01fdC5pbnNlcnRfZXF1YWwoX19maXJzdCwgX19sYXN0KTsgfQorCisgIG11bHRpc2V0KGNvbnN0IHZhbHVlX3R5cGUqIF9fZmlyc3QsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbGFzdCwKKyAgICAgICAgICAgY29uc3QgX0NvbXBhcmUmIF9fY29tcCwKKyAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfTV90KF9fY29tcCwgX19hKSB7IF9NX3QuaW5zZXJ0X2VxdWFsKF9fZmlyc3QsIF9fbGFzdCk7IH0KKworICBtdWx0aXNldChjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpCisgICAgOiBfTV90KF9Db21wYXJlKCksIGFsbG9jYXRvcl90eXBlKCkpCisgICAgeyBfTV90Lmluc2VydF9lcXVhbChfX2ZpcnN0LCBfX2xhc3QpOyB9CisKKyAgbXVsdGlzZXQoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICBjb25zdCBfQ29tcGFyZSYgX19jb21wLAorICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9NX3QoX19jb21wLCBfX2EpIHsgX01fdC5pbnNlcnRfZXF1YWwoX19maXJzdCwgX19sYXN0KTsgfQorI2VuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKworICBtdWx0aXNldChjb25zdCBfU2VsZiYgX194KSA6IF9NX3QoX194Ll9NX3QpIHt9CisgIF9TZWxmJiBvcGVyYXRvcj0oY29uc3QgX1NlbGYmIF9feCkgeworICAgIF9NX3QgPSBfX3guX01fdDsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBtdWx0aXNldChfX21vdmVfc291cmNlPF9TZWxmPiBzcmMpCisgICAgOiBfTV90KF9fbW92ZV9zb3VyY2U8X1JlcF90eXBlPihzcmMuZ2V0KCkuX01fdCkpIHt9CisKKyAgLy8gYWNjZXNzb3JzOgorICBrZXlfY29tcGFyZSBrZXlfY29tcCgpIGNvbnN0IHsgcmV0dXJuIF9NX3Qua2V5X2NvbXAoKTsgfQorICB2YWx1ZV9jb21wYXJlIHZhbHVlX2NvbXAoKSBjb25zdCB7IHJldHVybiBfTV90LmtleV9jb21wKCk7IH0KKyAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IHsgcmV0dXJuIF9NX3QuZ2V0X2FsbG9jYXRvcigpOyB9CisKKyAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBfTV90LmJlZ2luKCk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gX01fdC5lbmQoKTsgfQorICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIF9NX3QuYmVnaW4oKTsgfQorICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBfTV90LmVuZCgpOyB9CisgIHJldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgeyByZXR1cm4gX01fdC5yYmVnaW4oKTsgfQorICByZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSB7IHJldHVybiBfTV90LnJlbmQoKTsgfQorICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0IHsgcmV0dXJuIF9NX3QucmJlZ2luKCk7IH0KKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgY29uc3QgeyByZXR1cm4gX01fdC5yZW5kKCk7IH0KKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIF9NX3QuZW1wdHkoKTsgfQorICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX3Quc2l6ZSgpOyB9CisgIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX3QubWF4X3NpemUoKTsgfQorICB2b2lkIHN3YXAoX1NlbGYmIF9feCkgeyBfTV90LnN3YXAoX194Ll9NX3QpOyB9CisKKyAgLy8gaW5zZXJ0L2VyYXNlCisgIGl0ZXJhdG9yIGluc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgIHsgcmV0dXJuIF9NX3QuaW5zZXJ0X2VxdWFsKF9feCk7IH0KKyAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgIHsgcmV0dXJuIF9NX3QuaW5zZXJ0X2VxdWFsKF9fcG9zLCBfX3gpOyB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZvaWQgaW5zZXJ0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgeyBfTV90Lmluc2VydF9lcXVhbChfX2ZpcnN0LCBfX2xhc3QpOyB9CisjZWxzZQorICB2b2lkIGluc2VydChjb25zdCB2YWx1ZV90eXBlKiBfX2ZpcnN0LCBjb25zdCB2YWx1ZV90eXBlKiBfX2xhc3QpCisgIHsgX01fdC5pbnNlcnRfZXF1YWwoX19maXJzdCwgX19sYXN0KTsgfQorICB2b2lkIGluc2VydChjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpCisgIHsgX01fdC5pbnNlcnRfZXF1YWwoX19maXJzdCwgX19sYXN0KTsgfQorI2VuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKyAgdm9pZCBlcmFzZShpdGVyYXRvciBfX3BvcykgeyBfTV90LmVyYXNlKCBfX3BvcyApOyB9CisgIHNpemVfdHlwZSBlcmFzZShjb25zdCBrZXlfdHlwZSYgX194KSB7IHJldHVybiBfTV90LmVyYXNlKF9feCk7IH0KKyAgdm9pZCBlcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpIHsgX01fdC5lcmFzZSggX19maXJzdCwgX19sYXN0ICk7IH0KKyAgdm9pZCBjbGVhcigpIHsgX01fdC5jbGVhcigpOyB9CisKKyAgLy8gbXVsdGlzZXQgb3BlcmF0aW9uczoKKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIGl0ZXJhdG9yIGZpbmQoY29uc3QgX0tUJiBfX3gpIHsgcmV0dXJuIF9NX3QuZmluZChfX3gpOyB9CisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBjb25zdF9pdGVyYXRvciBmaW5kKGNvbnN0IF9LVCYgX194KSBjb25zdCB7IHJldHVybiBfTV90LmZpbmQoX194KTsgfQorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgc2l6ZV90eXBlIGNvdW50KGNvbnN0IF9LVCYgX194KSBjb25zdCB7IHJldHVybiBfTV90LmNvdW50KF9feCk7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIGl0ZXJhdG9yIGxvd2VyX2JvdW5kKGNvbnN0IF9LVCYgX194KSB7IHJldHVybiBfTV90Lmxvd2VyX2JvdW5kKF9feCk7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIGNvbnN0X2l0ZXJhdG9yIGxvd2VyX2JvdW5kKGNvbnN0IF9LVCYgX194KSBjb25zdCB7IHJldHVybiBfTV90Lmxvd2VyX2JvdW5kKF9feCk7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIGl0ZXJhdG9yIHVwcGVyX2JvdW5kKGNvbnN0IF9LVCYgX194KSB7IHJldHVybiBfTV90LnVwcGVyX2JvdW5kKF9feCk7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIGNvbnN0X2l0ZXJhdG9yIHVwcGVyX2JvdW5kKGNvbnN0IF9LVCYgX194KSBjb25zdCB7IHJldHVybiBfTV90LnVwcGVyX2JvdW5kKF9feCk7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIHBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPiBlcXVhbF9yYW5nZShjb25zdCBfS1QmIF9feCkgeyByZXR1cm4gX01fdC5lcXVhbF9yYW5nZShfX3gpOyB9CisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4gZXF1YWxfcmFuZ2UoY29uc3QgX0tUJiBfX3gpIGNvbnN0IHsgcmV0dXJuIF9NX3QuZXF1YWxfcmFuZ2UoX194KTsgfQorfTsKKworI2Vsc2UKKyMgIGluY2x1ZGUgPHN0bC9wb2ludGVycy9fc2V0Lmg+CitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKyNlbmRpZiAvKiBfU1RMUF9VU0VfUFRSX1NQRUNJQUxJWkFUSU9OUyAqLworCisjZGVmaW5lIF9TVExQX1RFTVBMQVRFX0hFQURFUiB0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvYz4KKyNkZWZpbmUgX1NUTFBfVEVNUExBVEVfQ09OVEFJTkVSIHNldDxfS2V5LF9Db21wYXJlLF9BbGxvYz4KKyNpbmNsdWRlIDxzdGwvX3JlbG9wc19jb250Lmg+CisjdW5kZWYgIF9TVExQX1RFTVBMQVRFX0NPTlRBSU5FUgorI2RlZmluZSBfU1RMUF9URU1QTEFURV9DT05UQUlORVIgbXVsdGlzZXQ8X0tleSxfQ29tcGFyZSxfQWxsb2M+CisjaW5jbHVkZSA8c3RsL19yZWxvcHNfY29udC5oPgorI3VuZGVmICBfU1RMUF9URU1QTEFURV9DT05UQUlORVIKKyN1bmRlZiAgX1NUTFBfVEVNUExBVEVfSEVBREVSCisKKyNpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2M+CitzdHJ1Y3QgX19tb3ZlX3RyYWl0czxzZXQ8X0tleSxfQ29tcGFyZSxfQWxsb2M+ID4gOgorICBfU1RMUF9QUklWIF9fbW92ZV90cmFpdHNfYXV4PHR5cGVuYW1lIHNldDxfS2V5LF9Db21wYXJlLF9BbGxvYz46Ol9SZXBfdHlwZT4KK3t9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvYz4KK3N0cnVjdCBfX21vdmVfdHJhaXRzPG11bHRpc2V0PF9LZXksX0NvbXBhcmUsX0FsbG9jPiA+IDoKKyAgX1NUTFBfUFJJViBfX21vdmVfdHJhaXRzX2F1eDx0eXBlbmFtZSBtdWx0aXNldDxfS2V5LF9Db21wYXJlLF9BbGxvYz46Ol9SZXBfdHlwZT4KK3t9OworI2VuZGlmIC8qIF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04gKi8KKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfU0VUX0ggKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9fc2xpc3QuYyBiL3N0bC9fc2xpc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTE1OGQwCi0tLSAvZGV2L251bGwKKysrIGIvc3RsL19zbGlzdC5jCkBAIC0wLDAgKzEsMjMxIEBACisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworI2lmbmRlZiBfU1RMUF9TTElTVF9DCisjZGVmaW5lIF9TVExQX1NMSVNUX0MKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9TTElTVF9ICisjICBpbmNsdWRlIDxzdGwvX3NsaXN0Lmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9DQVJSQVlfSAorIyAgaW5jbHVkZSA8c3RsL19jYXJyYXkuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX1JBTkdFX0VSUk9SU19ICisjICBpbmNsdWRlIDxzdGwvX3JhbmdlX2Vycm9ycy5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9ORVNURURfVFlQRV9QQVJBTV9CVUcpCisjICBkZWZpbmUgc2l6ZV90eXBlIHNpemVfdAorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK19TbGlzdF9ub2RlX2Jhc2UqCitfU2xpc3RfYmFzZTxfVHAsX0FsbG9jPjo6X01fZXJhc2VfYWZ0ZXIoX1NsaXN0X25vZGVfYmFzZSogX19iZWZvcmVfZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NsaXN0X25vZGVfYmFzZSogX19sYXN0X25vZGUpIHsKKyAgX1NsaXN0X25vZGVfYmFzZSogX19jdXIgPSBfX2JlZm9yZV9maXJzdC0+X01fbmV4dDsKKyAgd2hpbGUgKF9fY3VyICE9IF9fbGFzdF9ub2RlKSB7CisgICAgX05vZGUqIF9fdG1wID0gX19TVEFUSUNfQ0FTVChfTm9kZSosIF9fY3VyKTsKKyAgICBfX2N1ciA9IF9fY3VyLT5fTV9uZXh0OworICAgIF9TVExQX1NURDo6X0Rlc3Ryb3koJl9fdG1wLT5fTV9kYXRhKTsKKyAgICBfTV9oZWFkLmRlYWxsb2NhdGUoX190bXAsMSk7CisgIH0KKyAgX19iZWZvcmVfZmlyc3QtPl9NX25leHQgPSBfX2xhc3Rfbm9kZTsKKyAgcmV0dXJuIF9fbGFzdF9ub2RlOworfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BUUl9TUEVDSUFMSVpBVElPTlMpCisjICBkZWZpbmUgc2xpc3QgX1NUTFBfUFRSX0lNUExfTkFNRShzbGlzdCkKKyNlbGlmIGRlZmluZWQgKF9TVExQX0RFQlVHKQorIyAgZGVmaW5lIHNsaXN0IF9TVExQX05PTl9EQkdfTkFNRShzbGlzdCkKKyNlbHNlCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKyNlbmRpZgorCisvKiBXaGVuIGJ1aWxkaW5nIFNUTHBvcnQgbGliIERpZ2l0YWwgTWFycyBDb21waWxlciBjb21wbGFpbnMgb24gdGhlIF9NX2RhdGEgYXNzaWdubWVudAorICogcHJvYmxlbSB3aGljaCB3b3VsZCBiZSBwZXJmZXJ0bHkgcmlnaHQgaWYgd2Ugd2VyZSB1c2luZyBpdC4gSGlkaW5nIGl0IGR1cmluZyBidWlsZAorICogZml4IHRoaXMgaXNzdWUuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK3NsaXN0PF9UcCxfQWxsb2M+JiBzbGlzdDxfVHAsX0FsbG9jPjo6b3BlcmF0b3I9KGNvbnN0IHNsaXN0PF9UcCxfQWxsb2M+JiBfX3gpIHsKKyAgaWYgKCZfX3ggIT0gdGhpcykgeworICAgIF9Ob2RlX2Jhc2UqIF9fcDEgPSAmdGhpcy0+X01faGVhZC5fTV9kYXRhOworICAgIF9Ob2RlX2Jhc2UqIF9fbjEgPSB0aGlzLT5fTV9oZWFkLl9NX2RhdGEuX01fbmV4dDsKKyAgICBjb25zdCBfTm9kZV9iYXNlKiBfX24yID0gX194Ll9NX2hlYWQuX01fZGF0YS5fTV9uZXh0OworICAgIHdoaWxlIChfX24xICYmIF9fbjIpIHsKKyAgICAgIF9fU1RBVElDX0NBU1QoX05vZGUqLCBfX24xKS0+X01fZGF0YSA9IF9fU1RBVElDX0NBU1QoY29uc3QgX05vZGUqLCBfX24yKS0+X01fZGF0YTsKKyAgICAgIF9fcDEgPSBfX24xOworICAgICAgX19uMSA9IF9fbjEtPl9NX25leHQ7CisgICAgICBfX24yID0gX19uMi0+X01fbmV4dDsKKyAgICB9CisgICAgaWYgKF9fbjIgPT0gMCkKKyAgICAgIHRoaXMtPl9NX2VyYXNlX2FmdGVyKF9fcDEsIDApOworICAgIGVsc2UKKyAgICAgIF9NX2luc2VydF9hZnRlcl9yYW5nZShfX3AxLCBjb25zdF9pdGVyYXRvcihfX0NPTlNUX0NBU1QoX05vZGVfYmFzZSosIF9fbjIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvcigwKSk7CisgIH0KKyAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Cit2b2lkIHNsaXN0PF9UcCwgX0FsbG9jPjo6X01fZmlsbF9hc3NpZ24oc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3ZhbCkgeworICBfTm9kZV9iYXNlKiBfX3ByZXYgPSAmdGhpcy0+X01faGVhZC5fTV9kYXRhOworICBfTm9kZV9iYXNlKiBfX25vZGUgPSB0aGlzLT5fTV9oZWFkLl9NX2RhdGEuX01fbmV4dDsKKyAgZm9yICggOyBfX25vZGUgIT0gMCAmJiBfX24gPiAwIDsgLS1fX24pIHsKKyAgICBfX1NUQVRJQ19DQVNUKF9Ob2RlKiwgX19ub2RlKS0+X01fZGF0YSA9IF9fdmFsOworICAgIF9fcHJldiA9IF9fbm9kZTsKKyAgICBfX25vZGUgPSBfX25vZGUtPl9NX25leHQ7CisgIH0KKyAgaWYgKF9fbiA+IDApCisgICAgX01faW5zZXJ0X2FmdGVyX2ZpbGwoX19wcmV2LCBfX24sIF9fdmFsKTsKKyAgZWxzZQorICAgIHRoaXMtPl9NX2VyYXNlX2FmdGVyKF9fcHJldiwgMCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK3ZvaWQgc2xpc3Q8X1RwLF9BbGxvYz46OnJlc2l6ZShzaXplX3R5cGUgX19sZW4sIGNvbnN0IF9UcCYgX194KSB7CisgIF9Ob2RlX2Jhc2UqIF9fY3VyID0gJnRoaXMtPl9NX2hlYWQuX01fZGF0YTsKKyAgd2hpbGUgKF9fY3VyLT5fTV9uZXh0ICE9IDAgJiYgX19sZW4gPiAwKSB7CisgICAgLS1fX2xlbjsKKyAgICBfX2N1ciA9IF9fY3VyLT5fTV9uZXh0OworICB9CisgIGlmIChfX2N1ci0+X01fbmV4dCkKKyAgICB0aGlzLT5fTV9lcmFzZV9hZnRlcihfX2N1ciwgMCk7CisgIGVsc2UKKyAgICBfTV9pbnNlcnRfYWZ0ZXJfZmlsbChfX2N1ciwgX19sZW4sIF9feCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK3ZvaWQgc2xpc3Q8X1RwLF9BbGxvYz46OnJlbW92ZShjb25zdCBfVHAmIF9fdmFsKSB7CisgIF9Ob2RlX2Jhc2UqIF9fY3VyID0gJnRoaXMtPl9NX2hlYWQuX01fZGF0YTsKKyAgd2hpbGUgKF9fY3VyICYmIF9fY3VyLT5fTV9uZXh0KSB7CisgICAgaWYgKF9fU1RBVElDX0NBU1QoX05vZGUqLCBfX2N1ci0+X01fbmV4dCktPl9NX2RhdGEgPT0gX192YWwpCisgICAgICB0aGlzLT5fTV9lcmFzZV9hZnRlcihfX2N1cik7CisgICAgZWxzZQorICAgICAgX19jdXIgPSBfX2N1ci0+X01fbmV4dDsKKyAgfQorfQorCisjaWYgIWRlZmluZWQgKHNsaXN0KQorX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYywgY2xhc3MgX0JpbmFyeVByZWRpY2F0ZT4KK3ZvaWQgX1NsaXN0X3VuaXF1ZShzbGlzdDxfVHAsIF9BbGxvYz4mIF9fdGhhdCwgX0JpbmFyeVByZWRpY2F0ZSBfX3ByZWQpIHsKKyAgdHlwZWRlZiBfU2xpc3Rfbm9kZTxfVHA+IF9Ob2RlOworICB0eXBlbmFtZSBzbGlzdDxfVHAsIF9BbGxvYz46Oml0ZXJhdG9yIF9faXRlKF9fdGhhdC5iZWdpbigpKTsKKyAgaWYgKF9faXRlICE9IF9fdGhhdC5lbmQoKSkgeworICAgIHdoaWxlIChfX2l0ZS5fTV9ub2RlLT5fTV9uZXh0KSB7CisgICAgICBpZiAoX19wcmVkKCpfX2l0ZSwgX19TVEFUSUNfQ0FTVChfTm9kZSosIF9faXRlLl9NX25vZGUtPl9NX25leHQpLT5fTV9kYXRhKSkKKyAgICAgICAgX190aGF0LmVyYXNlX2FmdGVyKF9faXRlKTsKKyAgICAgIGVsc2UKKyAgICAgICAgKytfX2l0ZTsKKyAgICB9CisgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jLCBjbGFzcyBfU3RyaWN0V2Vha09yZGVyaW5nPgordm9pZCBfU2xpc3RfbWVyZ2Uoc2xpc3Q8X1RwLCBfQWxsb2M+JiBfX3RoYXQsIHNsaXN0PF9UcCwgX0FsbG9jPiYgX194LAorICAgICAgICAgICAgICAgICAgX1N0cmljdFdlYWtPcmRlcmluZyBfX2NvbXApIHsKKyAgdHlwZWRlZiBfU2xpc3Rfbm9kZTxfVHA+IF9Ob2RlOworICB0eXBlZGVmIF9TVExQX1BSSVYgX1NsaXN0X25vZGVfYmFzZSBfTm9kZV9iYXNlOworICBpZiAoX190aGF0LmdldF9hbGxvY2F0b3IoKSA9PSBfX3guZ2V0X2FsbG9jYXRvcigpKSB7CisgICAgdHlwZW5hbWUgc2xpc3Q8X1RwLCBfQWxsb2M+OjppdGVyYXRvciBfX2l0ZShfX3RoYXQuYmVmb3JlX2JlZ2luKCkpOworICAgIHdoaWxlIChfX2l0ZS5fTV9ub2RlLT5fTV9uZXh0ICYmICFfX3guZW1wdHkoKSkgeworICAgICAgaWYgKF9fY29tcChfX3guZnJvbnQoKSwgX19TVEFUSUNfQ0FTVChfTm9kZSosIF9faXRlLl9NX25vZGUtPl9NX25leHQpLT5fTV9kYXRhKSkgeworICAgICAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghX19jb21wKF9fU1RBVElDX0NBU1QoX05vZGUqLCBfX2l0ZS5fTV9ub2RlLT5fTV9uZXh0KS0+X01fZGF0YSwgX194LmZyb250KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU3RsTXNnX0lOVkFMSURfU1RSSUNUX1dFQUtfUFJFRElDQVRFKQorICAgICAgICBfX3RoYXQuc3BsaWNlX2FmdGVyKF9faXRlLCBfX3gsIF9feC5iZWZvcmVfYmVnaW4oKSk7CisgICAgICB9CisgICAgICArK19faXRlOworICAgIH0KKyAgICBpZiAoIV9feC5lbXB0eSgpKSB7CisgICAgICBfX3RoYXQuc3BsaWNlX2FmdGVyKF9faXRlLCBfX3gpOworICAgIH0KKyAgfQorICBlbHNlIHsKKyAgICB0eXBlbmFtZSBzbGlzdDxfVHAsIF9BbGxvYz46Oml0ZXJhdG9yIF9faTEoX190aGF0LmJlZm9yZV9iZWdpbigpKSwgX19pMihfX3guYmVnaW4oKSk7CisgICAgd2hpbGUgKF9faTEuX01fbm9kZS0+X01fbmV4dCAmJiBfX2kyLl9NX25vZGUpIHsKKyAgICAgIGlmIChfX2NvbXAoX19TVEFUSUNfQ0FTVChfTm9kZSosIF9faTEuX01fbm9kZS0+X01fbmV4dCktPl9NX2RhdGEsICpfX2kyKSkgeworICAgICAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghX19jb21wKCpfX2kyLCBfX1NUQVRJQ19DQVNUKF9Ob2RlKiwgX19pMS5fTV9ub2RlLT5fTV9uZXh0KS0+X01fZGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TdGxNc2dfSU5WQUxJRF9TVFJJQ1RfV0VBS19QUkVESUNBVEUpCisgICAgICAgICsrX19pMTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBfX2kxID0gX190aGF0Lmluc2VydF9hZnRlcihfX2kxLCAqKF9faTIrKykpOworICAgICAgfQorICAgIH0KKyAgICBfX3RoYXQuaW5zZXJ0X2FmdGVyKF9faTEsIF9faTIsIF9feC5lbmQoKSk7CisgICAgX194LmNsZWFyKCk7CisgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jLCBjbGFzcyBfU3RyaWN0V2Vha09yZGVyaW5nPgordm9pZCBfU2xpc3Rfc29ydChzbGlzdDxfVHAsIF9BbGxvYz4mIF9fdGhhdCwgX1N0cmljdFdlYWtPcmRlcmluZyBfX2NvbXApIHsKKyAgaWYgKCFfX3RoYXQuYmVnaW4oKS5fTV9ub2RlIHx8ICFfX3RoYXQuYmVnaW4oKS5fTV9ub2RlLT5fTV9uZXh0KQorICAgIHJldHVybjsKKworICBzbGlzdDxfVHAsIF9BbGxvYz4gX19jYXJyeShfX3RoYXQuZ2V0X2FsbG9jYXRvcigpKTsKKyAgY29uc3QgaW50IE5CID0gNjQ7CisgIF9TVExQX1BSSVYgX0NBcnJheTxzbGlzdDxfVHAsIF9BbGxvYz4sIE5CPiBfX2NvdW50ZXIoX19jYXJyeSk7CisgIGludCBfX2ZpbGwgPSAwOworICB3aGlsZSAoIV9fdGhhdC5lbXB0eSgpKSB7CisgICAgX19jYXJyeS5zcGxpY2VfYWZ0ZXIoX19jYXJyeS5iZWZvcmVfYmVnaW4oKSwgX190aGF0LCBfX3RoYXQuYmVmb3JlX2JlZ2luKCkpOworICAgIGludCBfX2kgPSAwOworICAgIHdoaWxlIChfX2kgPCBfX2ZpbGwgJiYgIV9fY291bnRlcltfX2ldLmVtcHR5KCkpIHsKKyAgICAgIF9TVExQX1BSSVYgX1NsaXN0X21lcmdlKF9fY291bnRlcltfX2ldLCBfX2NhcnJ5LCBfX2NvbXApOworICAgICAgX19jYXJyeS5zd2FwKF9fY291bnRlcltfX2ldKTsKKyAgICAgICsrX19pOworICAgIH0KKyAgICBfX2NhcnJ5LnN3YXAoX19jb3VudGVyW19faV0pOworICAgIGlmIChfX2kgPT0gX19maWxsKSB7CisgICAgICArK19fZmlsbDsKKyAgICAgIGlmIChfX2ZpbGwgPj0gTkIpIHsKKyAgICAgICAgLy9Mb29rcyBsaWtlIHRoZSBzbGlzdCBoYXMgdG9vIG1hbnkgZWxlbWVudHMgdG8gYmUgc29ydGVkIHdpdGggdGhpcyBhbGdvcml0aG06CisgICAgICAgIF9fc3RsX3Rocm93X292ZXJmbG93X2Vycm9yKCJzbGlzdDo6c29ydCIpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGZvciAoaW50IF9faSA9IDE7IF9faSA8IF9fZmlsbDsgKytfX2kpCisgICAgX1NUTFBfUFJJViBfU2xpc3RfbWVyZ2UoX19jb3VudGVyW19faV0sIF9fY291bnRlcltfX2kgLSAxXSwgX19jb21wKTsKKyAgX190aGF0LnN3YXAoX19jb3VudGVyW19fZmlsbC0xXSk7Cit9CisKKyNpZiBkZWZpbmVkIChzbGlzdCkKKyMgIHVuZGVmIHNsaXN0CisjZW5kaWYKKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2lmIGRlZmluZWQgKF9TVExQX05FU1RFRF9UWVBFX1BBUkFNX0JVRykKKyMgIHVuZGVmIHNpemVfdHlwZQorI2VuZGlmCisKKyNlbmRpZiAvKiAgX1NUTFBfU0xJU1RfQyAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RsL19zbGlzdC5oIGIvc3RsL19zbGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZDk0MWEKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvX3NsaXN0LmgKQEAgLTAsMCArMSw5MDYgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKy8qIE5PVEU6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIFNUTCBoZWFkZXJzLgorICogICBZb3Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4KKyAqLworCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX1NMSVNUX0gKKyNkZWZpbmUgX1NUTFBfSU5URVJOQUxfU0xJU1RfSAorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0FMR09CQVNFX0gKKyMgIGluY2x1ZGUgPHN0bC9fYWxnb2Jhc2UuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0FMTE9DX0gKKyMgIGluY2x1ZGUgPHN0bC9fYWxsb2MuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0lURVJBVE9SX0gKKyMgIGluY2x1ZGUgPHN0bC9faXRlcmF0b3IuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NPTlNUUlVDVF9ICisjICBpbmNsdWRlIDxzdGwvX2NvbnN0cnVjdC5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfRlVOQ1RJT05fQkFTRV9ICisjICBpbmNsdWRlIDxzdGwvX2Z1bmN0aW9uX2Jhc2UuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX1NMSVNUX0JBU0VfSAorIyAgaW5jbHVkZSA8c3RsL19zbGlzdF9iYXNlLmg+CisjZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2NsYXNzIF9TbGlzdF9ub2RlIDogcHVibGljIF9TbGlzdF9ub2RlX2Jhc2UgeworcHVibGljOgorICBfVHAgX01fZGF0YTsKKyAgX19UUklWSUFMX1NUVUZGKF9TbGlzdF9ub2RlKQorfTsKKworc3RydWN0IF9TbGlzdF9pdGVyYXRvcl9iYXNlIHsKKyAgdHlwZWRlZiBzaXplX3QgICAgICAgICAgICAgICBzaXplX3R5cGU7CisgIHR5cGVkZWYgcHRyZGlmZl90ICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICB0eXBlZGVmIGZvcndhcmRfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OworCisgIF9TbGlzdF9ub2RlX2Jhc2UgKl9NX25vZGU7CisKKyAgX1NsaXN0X2l0ZXJhdG9yX2Jhc2UoX1NsaXN0X25vZGVfYmFzZSAqX194KSA6IF9NX25vZGUoX194KSB7fQorCisgIHZvaWQgX01faW5jcigpIHsKKyAgICBfTV9ub2RlID0gX01fbm9kZS0+X01fbmV4dDsKKyAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1RyYWl0cz4KK2NsYXNzIF9TbGlzdF9pdGVyYXRvciA6IHB1YmxpYyBfU2xpc3RfaXRlcmF0b3JfYmFzZSB7CitwdWJsaWM6CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OnBvaW50ZXIgICAgcG9pbnRlcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpyZWZlcmVuY2UgIHJlZmVyZW5jZTsKKyAgdHlwZWRlZiBmb3J3YXJkX2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKKyAgdHlwZWRlZiBzaXplX3Qgc2l6ZV90eXBlOworICB0eXBlZGVmIHB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7CisKKyAgdHlwZWRlZiBfU2xpc3RfaXRlcmF0b3I8X1RwLCBfVHJhaXRzPiAgICAgICAgIF9TZWxmOworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6Ol9Ob25Db25zdFRyYWl0cyAgICAgX05vbkNvbnN0VHJhaXRzOworICB0eXBlZGVmIF9TbGlzdF9pdGVyYXRvcjxfVHAsIF9Ob25Db25zdFRyYWl0cz4gaXRlcmF0b3I7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6X0NvbnN0VHJhaXRzICAgICAgICBfQ29uc3RUcmFpdHM7CisgIHR5cGVkZWYgX1NsaXN0X2l0ZXJhdG9yPF9UcCwgX0NvbnN0VHJhaXRzPiAgICBjb25zdF9pdGVyYXRvcjsKKworICB0eXBlZGVmIF9TbGlzdF9ub2RlPHZhbHVlX3R5cGU+IF9Ob2RlOworCisgIGV4cGxpY2l0IF9TbGlzdF9pdGVyYXRvcihfU2xpc3Rfbm9kZV9iYXNlICpfX3gpIDogX1NsaXN0X2l0ZXJhdG9yX2Jhc2UoX194KSB7fQorICBfU2xpc3RfaXRlcmF0b3IoKSA6IF9TbGlzdF9pdGVyYXRvcl9iYXNlKDApIHt9CisgIC8vY29weSBjb25zdHJ1Y3RvciBmb3IgaXRlcmF0b3IgYW5kIGNvbnN0cnVjdG9yIGZyb20gaXRlcmF0b3IgZm9yIGNvbnN0X2l0ZXJhdG9yCisgIF9TbGlzdF9pdGVyYXRvcihjb25zdCBpdGVyYXRvciYgX194KSA6IF9TbGlzdF9pdGVyYXRvcl9iYXNlKF9feC5fTV9ub2RlKSB7fQorCisgIHJlZmVyZW5jZSBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBfX1NUQVRJQ19DQVNUKF9Ob2RlKiwgdGhpcy0+X01fbm9kZSktPl9NX2RhdGE7IH0KKworICBfU1RMUF9ERUZJTkVfQVJST1dfT1BFUkFUT1IKKworICBfU2VsZiYgb3BlcmF0b3IrKygpIHsKKyAgICBfTV9pbmNyKCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIF9TZWxmIG9wZXJhdG9yKysoaW50KSB7CisgICAgX1NlbGYgX190bXAgPSAqdGhpczsKKyAgICBfTV9pbmNyKCk7CisgICAgcmV0dXJuIF9fdG1wOworICB9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0X2l0ZXJhdG9yIF9feSApIGNvbnN0IHsKKyAgICByZXR1cm4gdGhpcy0+X01fbm9kZSA9PSBfX3kuX01fbm9kZTsKKyAgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3RfaXRlcmF0b3IgX195ICkgY29uc3QgeworICAgIHJldHVybiB0aGlzLT5fTV9ub2RlICE9IF9feS5fTV9ub2RlOworICB9Cit9OworCisjaWYgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1RyYWl0cz4KK3N0cnVjdCBfX3R5cGVfdHJhaXRzPF9TVExQX1BSSVYgX1NsaXN0X2l0ZXJhdG9yPF9UcCwgX1RyYWl0cz4gPiB7CisgIHR5cGVkZWYgX19mYWxzZV90eXBlICAgaGFzX3RyaXZpYWxfZGVmYXVsdF9jb25zdHJ1Y3RvcjsKKyAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9jb3B5X2NvbnN0cnVjdG9yOworICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3I7CisgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjsKKyAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgICBpc19QT0RfdHlwZTsKK307CitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisjZW5kaWYgLyogX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTiAqLworCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX09MRF9IUF9JVEVSQVRPUl9RVUVSSUVTKQorX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVHJhaXRzPgoraW5saW5lIF9UcCogX1NUTFBfQ0FMTCB2YWx1ZV90eXBlKGNvbnN0IF9TVExQX1BSSVYgX1NsaXN0X2l0ZXJhdG9yPF9UcCwgX1RyYWl0cz4mKSB7IHJldHVybiBfX1NUQVRJQ19DQVNUKF9UcCosIDApOyB9CitpbmxpbmUgcHRyZGlmZl90KiBfU1RMUF9DQUxMIGRpc3RhbmNlX3R5cGUoY29uc3QgX1NUTFBfUFJJViBfU2xpc3RfaXRlcmF0b3JfYmFzZSYpIHsgcmV0dXJuIDA7IH0KK2lubGluZSBmb3J3YXJkX2l0ZXJhdG9yX3RhZyBfU1RMUF9DQUxMIGl0ZXJhdG9yX2NhdGVnb3J5KGNvbnN0IF9TVExQX1BSSVYgX1NsaXN0X2l0ZXJhdG9yX2Jhc2UmKSB7IHJldHVybiBmb3J3YXJkX2l0ZXJhdG9yX3RhZygpOyB9CitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisjZW5kaWYgLyogT0xEX1FVRVJJRVMgKi8KKworLy8gQmFzZSBjbGFzcyB0aGF0IGVuY2Fwc3VsYXRlcyBkZXRhaWxzIG9mIGFsbG9jYXRvcnMgYW5kIHNpbXBsaWZpZXMgRUgKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK2NsYXNzIF9TbGlzdF9iYXNlIHsKK3Byb3RlY3RlZDoKKyAgdHlwZWRlZiBfU2xpc3Rfbm9kZTxfVHA+IF9Ob2RlOworICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY190cmFpdHM8X05vZGUsX0FsbG9jPjo6YWxsb2NhdG9yX3R5cGUgX01fbm9kZV9hbGxvY2F0b3JfdHlwZTsKKyAgdHlwZWRlZiBfU2xpc3RfYmFzZTxfVHAsIF9BbGxvYz4gX1NlbGY7CisKK3B1YmxpYzoKKyAgdHlwZWRlZiBfU1RMUF9hbGxvY19wcm94eTxfU2xpc3Rfbm9kZV9iYXNlLCBfTm9kZSwgX01fbm9kZV9hbGxvY2F0b3JfdHlwZT4gX0FsbG9jUHJveHk7CisKKyAgX1NUTFBfRk9SQ0VfQUxMT0NBVE9SUyhfVHAsIF9BbGxvYykKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2NfdHJhaXRzPF9UcCxfQWxsb2M+OjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKKworICBfU2xpc3RfYmFzZShjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKSA6CisgICAgX01faGVhZChfU1RMUF9DT05WRVJUX0FMTE9DQVRPUihfX2EsIF9Ob2RlKSwgX1NsaXN0X25vZGVfYmFzZSgpICkgeworICAgIF9NX2hlYWQuX01fZGF0YS5fTV9uZXh0ID0gMDsKKyAgfQorICBfU2xpc3RfYmFzZShfX21vdmVfc291cmNlPF9TZWxmPiBzcmMpIDoKKyAgICBfTV9oZWFkKF9fbW92ZV9zb3VyY2U8X0FsbG9jUHJveHk+KHNyYy5nZXQoKS5fTV9oZWFkKSkgeworICAgICAgc3JjLmdldCgpLl9NX2hlYWQuX01fZGF0YS5fTV9uZXh0ID0gMDsKKyAgfQorICB+X1NsaXN0X2Jhc2UoKSB7IF9NX2VyYXNlX2FmdGVyKCZfTV9oZWFkLl9NX2RhdGEsIDApOyB9CisKK3Byb3RlY3RlZDoKKyAgX1NsaXN0X25vZGVfYmFzZSogX01fZXJhc2VfYWZ0ZXIoX1NsaXN0X25vZGVfYmFzZSogX19wb3MpIHsKKyAgICBfTm9kZSogX19uZXh0ID0gX19TVEFUSUNfQ0FTVChfTm9kZSosIF9fcG9zLT5fTV9uZXh0KTsKKyAgICBfU2xpc3Rfbm9kZV9iYXNlKiBfX25leHRfbmV4dCA9IF9fbmV4dC0+X01fbmV4dDsKKyAgICBfX3Bvcy0+X01fbmV4dCA9IF9fbmV4dF9uZXh0OworICAgIF9TVExQX1NURDo6X0Rlc3Ryb3koJl9fbmV4dC0+X01fZGF0YSk7CisgICAgX01faGVhZC5kZWFsbG9jYXRlKF9fbmV4dCwxKTsKKyAgICByZXR1cm4gX19uZXh0X25leHQ7CisgIH0KKyAgX1NsaXN0X25vZGVfYmFzZSogX01fZXJhc2VfYWZ0ZXIoX1NsaXN0X25vZGVfYmFzZSosIF9TbGlzdF9ub2RlX2Jhc2UqKTsKKworcHVibGljOgorICBhbGxvY2F0b3JfdHlwZSBnZXRfYWxsb2NhdG9yKCkgY29uc3QKKyAgeyByZXR1cm4gX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoKGNvbnN0IF9NX25vZGVfYWxsb2NhdG9yX3R5cGUmKV9NX2hlYWQsIF9UcCk7IH0KKyAgX0FsbG9jUHJveHkgX01faGVhZDsKK307CisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUFRSX1NQRUNJQUxJWkFUSU9OUykKKyMgIGRlZmluZSBzbGlzdCBfU1RMUF9QVFJfSU1QTF9OQU1FKHNsaXN0KQorI2VsaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpCisjICBkZWZpbmUgc2xpc3QgX1NUTFBfTk9OX0RCR19OQU1FKHNsaXN0KQorI2Vsc2UKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIF9TVExQX0RFRkFVTFRfQUxMT0NBVE9SX1NFTEVDVChfVHApID4KK2NsYXNzIHNsaXN0OworCisjaWYgIWRlZmluZWQgKHNsaXN0KQorX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorI2VuZGlmCisKKy8vIGhlbHBlciBmdW5jdGlvbnMgdG8gcmVkdWNlIGNvZGUgZHVwbGljYXRpb24KK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYywgY2xhc3MgX0JpbmFyeVByZWRpY2F0ZT4KK3ZvaWQgX1NsaXN0X3VuaXF1ZShzbGlzdDxfVHAsIF9BbGxvYz4mIF9fdGhhdCwgX0JpbmFyeVByZWRpY2F0ZSBfX2JpbmFyeV9wcmVkKTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jLCBjbGFzcyBfU3RyaWN0V2Vha09yZGVyaW5nPgordm9pZCBfU2xpc3RfbWVyZ2Uoc2xpc3Q8X1RwLCBfQWxsb2M+JiBfX3RoYXQsIHNsaXN0PF9UcCwgX0FsbG9jPiYgX194LAorICAgICAgICAgICAgICAgICAgX1N0cmljdFdlYWtPcmRlcmluZyBfX2NvbXApOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2MsIGNsYXNzIF9TdHJpY3RXZWFrT3JkZXJpbmc+Cit2b2lkIF9TbGlzdF9zb3J0KHNsaXN0PF9UcCwgX0FsbG9jPiYgX190aGF0LCBfU3RyaWN0V2Vha09yZGVyaW5nIF9fY29tcCk7CisKKyNpZiAhZGVmaW5lZCAoc2xpc3QpCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CitjbGFzcyBzbGlzdCA6IHByb3RlY3RlZCBfU1RMUF9QUklWIF9TbGlzdF9iYXNlPF9UcCxfQWxsb2M+CisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EKSAmJiAhZGVmaW5lZCAoc2xpc3QpCisgICAgICAgICAgICAsIHB1YmxpYyBfX3N0bHBvcnRfY2xhc3M8c2xpc3Q8X1RwLCBfQWxsb2M+ID4KKyNlbmRpZgoreworcHJpdmF0ZToKKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9TbGlzdF9iYXNlPF9UcCxfQWxsb2M+IF9CYXNlOworICB0eXBlZGVmIHNsaXN0PF9UcCxfQWxsb2M+IF9TZWxmOworcHVibGljOgorICB0eXBlZGVmIF9UcCAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworCisgIHR5cGVkZWYgdmFsdWVfdHlwZSogICAgICAgcG9pbnRlcjsKKyAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlKiBjb25zdF9wb2ludGVyOworICB0eXBlZGVmIHZhbHVlX3R5cGUmICAgICAgIHJlZmVyZW5jZTsKKyAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlJiBjb25zdF9yZWZlcmVuY2U7CisgIHR5cGVkZWYgc2l6ZV90ICAgICAgICAgICAgc2l6ZV90eXBlOworICB0eXBlZGVmIHB0cmRpZmZfdCAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgdHlwZWRlZiBmb3J3YXJkX2l0ZXJhdG9yX3RhZyBfSXRlcmF0b3JfY2F0ZWdvcnk7CisKKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9TbGlzdF9pdGVyYXRvcjxfVHAsIF9Ob25jb25zdF90cmFpdHM8X1RwPiA+IGl0ZXJhdG9yOworICB0eXBlZGVmIF9TVExQX1BSSVYgX1NsaXN0X2l0ZXJhdG9yPF9UcCwgX0NvbnN0X3RyYWl0czxfVHA+ID4gICAgY29uc3RfaXRlcmF0b3I7CisKKyAgX1NUTFBfRk9SQ0VfQUxMT0NBVE9SUyhfVHAsIF9BbGxvYykKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7CisKK3ByaXZhdGU6CisgIHR5cGVkZWYgX1NUTFBfUFJJViBfU2xpc3Rfbm9kZTxfVHA+IF9Ob2RlOworICB0eXBlZGVmIF9TVExQX1BSSVYgX1NsaXN0X25vZGVfYmFzZSBfTm9kZV9iYXNlOworCisjaWYgIWRlZmluZWQoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKKyAgX05vZGUqIF9NX2NyZWF0ZV9ub2RlKGNvbnN0IHZhbHVlX3R5cGUmIF9feCA9IF9UcCgpKSB7CisjZWxzZQorICBfTm9kZSogX01fY3JlYXRlX25vZGUoY29uc3QgdmFsdWVfdHlwZSYgX194KSB7CisjZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKi8KKyAgICBfTm9kZSogX19ub2RlID0gdGhpcy0+X01faGVhZC5hbGxvY2F0ZSgxKTsKKyAgICBfU1RMUF9UUlkgeworICAgICAgX0NvcHlfQ29uc3RydWN0KCZfX25vZGUtPl9NX2RhdGEsIF9feCk7CisgICAgICBfX25vZGUtPl9NX25leHQgPSAwOworICAgIH0KKyAgICBfU1RMUF9VTldJTkQodGhpcy0+X01faGVhZC5kZWFsbG9jYXRlKF9fbm9kZSwgMSkpCisgICAgcmV0dXJuIF9fbm9kZTsKKyAgfQorCisjaWYgZGVmaW5lZChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQorICBfTm9kZSogX01fY3JlYXRlX25vZGUoKSB7CisgICAgX05vZGUqIF9fbm9kZSA9IHRoaXMtPl9NX2hlYWQuYWxsb2NhdGUoMSk7CisgICAgX1NUTFBfVFJZIHsKKyAgICAgIF9TVExQX1NURDo6X0NvbnN0cnVjdCgmX19ub2RlLT5fTV9kYXRhKTsKKyAgICAgIF9fbm9kZS0+X01fbmV4dCA9IDA7CisgICAgfQorICAgIF9TVExQX1VOV0lORCh0aGlzLT5fTV9oZWFkLmRlYWxsb2NhdGUoX19ub2RlLCAxKSkKKyAgICByZXR1cm4gX19ub2RlOworICB9CisjZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKi8KKworcHVibGljOgorCisgIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdCB7IHJldHVybiBfQmFzZTo6Z2V0X2FsbG9jYXRvcigpOyB9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKKyAgZXhwbGljaXQgc2xpc3QoY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisjZWxzZQorICBzbGlzdCgpCisgICAgOiBfU1RMUF9QUklWIF9TbGlzdF9iYXNlPF9UcCxfQWxsb2M+KGFsbG9jYXRvcl90eXBlKCkpIHt9CisgIHNsaXN0KGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisjZW5kaWYKKyAgICA6IF9TVExQX1BSSVYgX1NsaXN0X2Jhc2U8X1RwLF9BbGxvYz4oX19hKSB7fQorCisjaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCisgIGV4cGxpY2l0IHNsaXN0KHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCA9IF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQoX1RwKSwKKyAgICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9ICBhbGxvY2F0b3JfdHlwZSgpKQorI2Vsc2UKKyAgZXhwbGljaXQgc2xpc3Qoc2l6ZV90eXBlIF9fbikKKyAgICA6IF9TVExQX1BSSVYgX1NsaXN0X2Jhc2U8X1RwLF9BbGxvYz4oYWxsb2NhdG9yX3R5cGUoKSkKKyAgICB7IF9NX2luc2VydF9hZnRlcl9maWxsKCZ0aGlzLT5fTV9oZWFkLl9NX2RhdGEsIF9fbiwgX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRChfVHApKTsgfQorICBzbGlzdChzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgICAgOiBfU1RMUF9QUklWIF9TbGlzdF9iYXNlPF9UcCxfQWxsb2M+KGFsbG9jYXRvcl90eXBlKCkpCisgICAgeyBfTV9pbnNlcnRfYWZ0ZXJfZmlsbCgmdGhpcy0+X01faGVhZC5fTV9kYXRhLCBfX24sIF9feCk7IH0KKyAgc2xpc3Qoc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX194LCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorI2VuZGlmCisgICAgOiBfU1RMUF9QUklWIF9TbGlzdF9iYXNlPF9UcCxfQWxsb2M+KF9fYSkKKyAgICB7IF9NX2luc2VydF9hZnRlcl9maWxsKCZ0aGlzLT5fTV9oZWFkLl9NX2RhdGEsIF9fbiwgX194KTsgfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyAgLy8gV2UgZG9uJ3QgbmVlZCBhbnkgZGlzcGF0Y2hpbmcgdHJpY2tzIGhlcmUsIGJlY2F1c2UgX01faW5zZXJ0X2FmdGVyX3JhbmdlCisgIC8vIGFscmVhZHkgZG9lcyB0aGVtLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHNsaXN0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSBfU1RMUF9BTExPQ0FUT1JfVFlQRV9ERkwpCisgICAgOiBfU1RMUF9QUklWIF9TbGlzdF9iYXNlPF9UcCxfQWxsb2M+KF9fYSkKKyAgICB7IF9NX2luc2VydF9hZnRlcl9yYW5nZSgmdGhpcy0+X01faGVhZC5fTV9kYXRhLCBfX2ZpcnN0LCBfX2xhc3QpOyB9CisjICBpZiBkZWZpbmVkIChfU1RMUF9ORUVEU19FWFRSQV9URU1QTEFURV9DT05TVFJVQ1RPUlMpCisgIC8vIFZDKysgbmVlZHMgdGhpcyBjcmF6eW5lc3MKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICBzbGlzdChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgOiBfU1RMUF9QUklWIF9TbGlzdF9iYXNlPF9UcCxfQWxsb2M+KGFsbG9jYXRvcl90eXBlKCkpCisgICAgeyBfTV9pbnNlcnRfYWZ0ZXJfcmFuZ2UoJnRoaXMtPl9NX2hlYWQuX01fZGF0YSwgX19maXJzdCwgX19sYXN0KTsgfQorIyBlbmRpZgorI2Vsc2UgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworICBzbGlzdChjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QsCisgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSAgYWxsb2NhdG9yX3R5cGUoKSApCisgICAgOiBfU1RMUF9QUklWIF9TbGlzdF9iYXNlPF9UcCxfQWxsb2M+KF9fYSkKKyAgICB7IF9NX2luc2VydF9hZnRlcl9yYW5nZSgmdGhpcy0+X01faGVhZC5fTV9kYXRhLCBfX2ZpcnN0LCBfX2xhc3QpOyB9CisgIHNsaXN0KGNvbnN0IHZhbHVlX3R5cGUqIF9fZmlyc3QsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbGFzdCwKKyAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9ICBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX1NUTFBfUFJJViBfU2xpc3RfYmFzZTxfVHAsX0FsbG9jPihfX2EpCisgICAgeyBfTV9pbnNlcnRfYWZ0ZXJfcmFuZ2UoJnRoaXMtPl9NX2hlYWQuX01fZGF0YSwgX19maXJzdCwgX19sYXN0KTsgfQorI2VuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKworICBzbGlzdChjb25zdCBfU2VsZiYgX194KQorICAgIDogX1NUTFBfUFJJViBfU2xpc3RfYmFzZTxfVHAsX0FsbG9jPihfX3guZ2V0X2FsbG9jYXRvcigpKQorICAgIHsgX01faW5zZXJ0X2FmdGVyX3JhbmdlKCZ0aGlzLT5fTV9oZWFkLl9NX2RhdGEsIF9feC5iZWdpbigpLCBfX3guZW5kKCkpOyB9CisKKyAgc2xpc3QoX19tb3ZlX3NvdXJjZTxfU2VsZj4gc3JjKQorICAgIDogX1NUTFBfUFJJViBfU2xpc3RfYmFzZTxfVHAsIF9BbGxvYz4oX19tb3ZlX3NvdXJjZTxfQmFzZT4oc3JjLmdldCgpKSkge30KKworICBfU2VsZiYgb3BlcmF0b3I9IChjb25zdCBfU2VsZiYgX194KTsKKworICB+c2xpc3QoKSB7fQorCitwdWJsaWM6CisgIC8vIGFzc2lnbigpLCBhIGdlbmVyYWxpemVkIGFzc2lnbm1lbnQgbWVtYmVyIGZ1bmN0aW9uLiAgVHdvCisgIC8vIHZlcnNpb25zOiBvbmUgdGhhdCB0YWtlcyBhIGNvdW50LCBhbmQgb25lIHRoYXQgdGFrZXMgYSByYW5nZS4KKyAgLy8gVGhlIHJhbmdlIHZlcnNpb24gaXMgYSBtZW1iZXIgdGVtcGxhdGUsIHNvIHdlIGRpc3BhdGNoIG9uIHdoZXRoZXIKKyAgLy8gb3Igbm90IHRoZSB0eXBlIGlzIGFuIGludGVnZXIuCisKKyAgdm9pZCBhc3NpZ24oc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3ZhbCkgeyBfTV9maWxsX2Fzc2lnbihfX24sIF9fdmFsKTsgfQorCitwcml2YXRlOgorICB2b2lkIF9NX2ZpbGxfYXNzaWduKHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX192YWwpOworCisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKK3B1YmxpYzoKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICB2b2lkIGFzc2lnbihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Jc0ludGVncmFsPF9JbnB1dEl0ZXJhdG9yPjo6X1JldCBfSW50ZWdyYWw7CisgICAgX01fYXNzaWduX2Rpc3BhdGNoKF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOworICB9CisKK3ByaXZhdGU6CisgIHRlbXBsYXRlIDxjbGFzcyBfSW50ZWdlcj4KKyAgdm9pZCBfTV9hc3NpZ25fZGlzcGF0Y2goX0ludGVnZXIgX19uLCBfSW50ZWdlciBfX3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX190cnVlX3R5cGUmIC8qX0lzSW50ZWdyYWwqLykgeworICAgIF9NX2ZpbGxfYXNzaWduKChzaXplX3R5cGUpIF9fbiwgKF9UcCkgX192YWwpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXI+CisgIHZvaWQgX01fYXNzaWduX2Rpc3BhdGNoKF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypfSXNJbnRlZ3JhbCovKSB7CisjZWxzZQorcHVibGljOgorICB2b2lkIGFzc2lnbihjb25zdF9wb2ludGVyIF9fZmlyc3QsIGNvbnN0X3BvaW50ZXIgX19sYXN0KSB7CisgICAgX05vZGVfYmFzZSogX19wcmV2ID0gJnRoaXMtPl9NX2hlYWQuX01fZGF0YTsKKyAgICBfTm9kZV9iYXNlKiBfX25vZGUgPSB0aGlzLT5fTV9oZWFkLl9NX2RhdGEuX01fbmV4dDsKKyAgICB3aGlsZSAoX19ub2RlICE9IDAgJiYgX19maXJzdCAhPSBfX2xhc3QpIHsKKyAgICAgIF9fU1RBVElDX0NBU1QoX05vZGUqLCBfX25vZGUpLT5fTV9kYXRhID0gKl9fZmlyc3Q7CisgICAgICBfX3ByZXYgPSBfX25vZGU7CisgICAgICBfX25vZGUgPSBfX25vZGUtPl9NX25leHQ7CisgICAgICArK19fZmlyc3Q7CisgICAgfQorICAgIGlmIChfX2ZpcnN0ICE9IF9fbGFzdCkKKyAgICAgIF9NX2luc2VydF9hZnRlcl9yYW5nZShfX3ByZXYsIF9fZmlyc3QsIF9fbGFzdCk7CisgICAgZWxzZQorICAgICAgdGhpcy0+X01fZXJhc2VfYWZ0ZXIoX19wcmV2LCAwKTsKKyAgfQorICB2b2lkIGFzc2lnbihjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpIHsKKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisgICAgX05vZGVfYmFzZSogX19wcmV2ID0gJnRoaXMtPl9NX2hlYWQuX01fZGF0YTsKKyAgICBfTm9kZV9iYXNlKiBfX25vZGUgPSB0aGlzLT5fTV9oZWFkLl9NX2RhdGEuX01fbmV4dDsKKyAgICB3aGlsZSAoX19ub2RlICE9IDAgJiYgX19maXJzdCAhPSBfX2xhc3QpIHsKKyAgICAgIF9fU1RBVElDX0NBU1QoX05vZGUqLCBfX25vZGUpLT5fTV9kYXRhID0gKl9fZmlyc3Q7CisgICAgICBfX3ByZXYgPSBfX25vZGU7CisgICAgICBfX25vZGUgPSBfX25vZGUtPl9NX25leHQ7CisgICAgICArK19fZmlyc3Q7CisgICAgfQorICAgIGlmIChfX2ZpcnN0ICE9IF9fbGFzdCkKKyAgICAgIF9NX2luc2VydF9hZnRlcl9yYW5nZShfX3ByZXYsIF9fZmlyc3QsIF9fbGFzdCk7CisgICAgZWxzZQorICAgICAgdGhpcy0+X01fZXJhc2VfYWZ0ZXIoX19wcmV2LCAwKTsKKyAgfQorCitwdWJsaWM6CisKKyAgLy8gRXhwZXJpbWVudGFsIG5ldyBmZWF0dXJlOiBiZWZvcmVfYmVnaW4oKSByZXR1cm5zIGEKKyAgLy8gbm9uLWRlcmVmZXJlbmNlYWJsZSBpdGVyYXRvciB0aGF0LCB3aGVuIGluY3JlbWVudGVkLCB5aWVsZHMKKyAgLy8gYmVnaW4oKS4gIFRoaXMgaXRlcmF0b3IgbWF5IGJlIHVzZWQgYXMgdGhlIGFyZ3VtZW50IHRvCisgIC8vIGluc2VydF9hZnRlciwgZXJhc2VfYWZ0ZXIsIGV0Yy4gIE5vdGUgdGhhdCBldmVuIGZvciBhbiBlbXB0eQorICAvLyBzbGlzdCwgYmVmb3JlX2JlZ2luKCkgaXMgbm90IHRoZSBzYW1lIGl0ZXJhdG9yIGFzIGVuZCgpLiAgSXQKKyAgLy8gaXMgYWx3YXlzIG5lY2Vzc2FyeSB0byBpbmNyZW1lbnQgYmVmb3JlX2JlZ2luKCkgYXQgbGVhc3Qgb25jZSB0bworICAvLyBvYnRhaW4gZW5kKCkuCisgIGl0ZXJhdG9yIGJlZm9yZV9iZWdpbigpIHsgcmV0dXJuIGl0ZXJhdG9yKCZ0aGlzLT5fTV9oZWFkLl9NX2RhdGEpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGJlZm9yZV9iZWdpbigpIGNvbnN0CisgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX19DT05TVF9DQVNUKF9Ob2RlX2Jhc2UqLCAmdGhpcy0+X01faGVhZC5fTV9kYXRhKSk7IH0KKworICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIGl0ZXJhdG9yKHRoaXMtPl9NX2hlYWQuX01fZGF0YS5fTV9uZXh0KTsgfQorICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0CisgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IodGhpcy0+X01faGVhZC5fTV9kYXRhLl9NX25leHQpO30KKworICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBpdGVyYXRvcigpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKCk7IH0KKworICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0CisgIHsgcmV0dXJuIF9TVExQX1BSSVYgX1NsX2dsb2JhbF9pbnN0OjpzaXplKHRoaXMtPl9NX2hlYWQuX01fZGF0YS5fTV9uZXh0KTsgfQorCisgIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHNpemVfdHlwZSgtMSk7IH0KKworICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gdGhpcy0+X01faGVhZC5fTV9kYXRhLl9NX25leHQgPT0gMDsgfQorCisgIHZvaWQgc3dhcChfU2VsZiYgX194KSB7CisgICAgdGhpcy0+X01faGVhZC5zd2FwKF9feC5fTV9oZWFkKTsKKyAgfQorCitwdWJsaWM6CisgIHJlZmVyZW5jZSBmcm9udCgpICAgICAgICAgICAgIHsgcmV0dXJuICpiZWdpbigpOyB9CisgIGNvbnN0X3JlZmVyZW5jZSBmcm9udCgpIGNvbnN0IHsgcmV0dXJuICpiZWdpbigpOyB9CisjaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pICYmICFkZWZpbmVkIChfU1RMUF9OT19BTkFDSFJPTklTTVMpCisgIHZvaWQgcHVzaF9mcm9udChjb25zdCB2YWx1ZV90eXBlJiBfX3ggPSBfVHAoKSkgICB7CisjZWxzZQorICB2b2lkIHB1c2hfZnJvbnQoY29uc3QgdmFsdWVfdHlwZSYgX194KSAgIHsKKyNlbmRpZiAvKiFfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNICYmICFfU1RMUF9OT19BTkFDSFJPTklTTVMqLworICAgIF9TVExQX1BSSVYgX19zbGlzdF9tYWtlX2xpbmsoJnRoaXMtPl9NX2hlYWQuX01fZGF0YSwgX01fY3JlYXRlX25vZGUoX194KSk7CisgIH0KKworI2lmIGRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pICYmICFkZWZpbmVkIChfU1RMUF9OT19BTkFDSFJPTklTTVMpCisgIHZvaWQgcHVzaF9mcm9udCgpIHsgX1NUTFBfUFJJViBfX3NsaXN0X21ha2VfbGluaygmdGhpcy0+X01faGVhZC5fTV9kYXRhLCBfTV9jcmVhdGVfbm9kZSgpKTt9CisjZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNICYmICFfU1RMUF9OT19BTkFDSFJPTklTTVMqLworCisgIHZvaWQgcG9wX2Zyb250KCkgeworICAgIF9Ob2RlKiBfX25vZGUgPSBfX1NUQVRJQ19DQVNUKF9Ob2RlKiwgdGhpcy0+X01faGVhZC5fTV9kYXRhLl9NX25leHQpOworICAgIHRoaXMtPl9NX2hlYWQuX01fZGF0YS5fTV9uZXh0ID0gX19ub2RlLT5fTV9uZXh0OworICAgIF9TVExQX1NURDo6X0Rlc3Ryb3koJl9fbm9kZS0+X01fZGF0YSk7CisgICAgdGhpcy0+X01faGVhZC5kZWFsbG9jYXRlKF9fbm9kZSwgMSk7CisgIH0KKworICBpdGVyYXRvciBwcmV2aW91cyhjb25zdF9pdGVyYXRvciBfX3BvcykgeworICAgIHJldHVybiBpdGVyYXRvcihfU1RMUF9QUklWIF9TbF9nbG9iYWxfaW5zdDo6X19wcmV2aW91cygmdGhpcy0+X01faGVhZC5fTV9kYXRhLCBfX3Bvcy5fTV9ub2RlKSk7CisgIH0KKyAgY29uc3RfaXRlcmF0b3IgcHJldmlvdXMoY29uc3RfaXRlcmF0b3IgX19wb3MpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfaXRlcmF0b3IoX19DT05TVF9DQVNUKF9Ob2RlX2Jhc2UqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfU2xfZ2xvYmFsX2luc3Q6Ol9fcHJldmlvdXMoJnRoaXMtPl9NX2hlYWQuX01fZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3Bvcy5fTV9ub2RlKSkpOworICB9CisKK3ByaXZhdGU6CisjaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCisgIF9Ob2RlKiBfTV9pbnNlcnRfYWZ0ZXIoX05vZGVfYmFzZSogX19wb3MsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCA9IF9UcCgpKSB7CisjZWxzZQorICBfTm9kZSogX01faW5zZXJ0X2FmdGVyKF9Ob2RlX2Jhc2UqIF9fcG9zLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpIHsKKyNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0qLworICAgIHJldHVybiBfX1NUQVRJQ19DQVNUKF9Ob2RlKiwgX1NUTFBfUFJJViBfX3NsaXN0X21ha2VfbGluayhfX3BvcywgX01fY3JlYXRlX25vZGUoX194KSkpOworICB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQorICBfTm9kZSogX01faW5zZXJ0X2FmdGVyKF9Ob2RlX2Jhc2UqIF9fcG9zKSB7CisgICAgcmV0dXJuIF9fU1RBVElDX0NBU1QoX05vZGUqLCBfU1RMUF9QUklWIF9fc2xpc3RfbWFrZV9saW5rKF9fcG9zLCBfTV9jcmVhdGVfbm9kZSgpKSk7CisgIH0KKyNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0qLworCisgIHZvaWQgX01faW5zZXJ0X2FmdGVyX2ZpbGwoX05vZGVfYmFzZSogX19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX194KSB7CisgICAgZm9yIChzaXplX3R5cGUgX19pID0gMDsgX19pIDwgX19uOyArK19faSkKKyAgICAgIF9fcG9zID0gX1NUTFBfUFJJViBfX3NsaXN0X21ha2VfbGluayhfX3BvcywgX01fY3JlYXRlX25vZGUoX194KSk7CisgIH0KKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIC8vIENoZWNrIHdoZXRoZXIgaXQncyBhbiBpbnRlZ3JhbCB0eXBlLiAgSWYgc28sIGl0J3Mgbm90IGFuIGl0ZXJhdG9yLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0luSXRlcj4KKyAgdm9pZCBfTV9pbnNlcnRfYWZ0ZXJfcmFuZ2UoX05vZGVfYmFzZSogX19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Jbkl0ZXIgX19maXJzdCwgX0luSXRlciBfX2xhc3QpIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Jc0ludGVncmFsPF9Jbkl0ZXI+OjpfUmV0IF9JbnRlZ3JhbDsKKyAgICBfTV9pbnNlcnRfYWZ0ZXJfcmFuZ2UoX19wb3MsIF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnRlZ2VyPgorICB2b2lkIF9NX2luc2VydF9hZnRlcl9yYW5nZShfTm9kZV9iYXNlKiBfX3BvcywgX0ludGVnZXIgX19uLCBfSW50ZWdlciBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fdHJ1ZV90eXBlJikgeworICAgIF9NX2luc2VydF9hZnRlcl9maWxsKF9fcG9zLCBfX24sIF9feCk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0luSXRlcj4KKyAgdm9pZCBfTV9pbnNlcnRfYWZ0ZXJfcmFuZ2UoX05vZGVfYmFzZSogX19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Jbkl0ZXIgX19maXJzdCwgX0luSXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fZmFsc2VfdHlwZSYpIHsKKyNlbHNlIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKyAgdm9pZCBfTV9pbnNlcnRfYWZ0ZXJfcmFuZ2UoX05vZGVfYmFzZSogX19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlX3R5cGUqIF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlX3R5cGUqIF9fbGFzdCkgeworICAgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkgeworICAgICAgX19wb3MgPSBfU1RMUF9QUklWIF9fc2xpc3RfbWFrZV9saW5rKF9fcG9zLCBfTV9jcmVhdGVfbm9kZSgqX19maXJzdCkpOworICAgICAgKytfX2ZpcnN0OworICAgIH0KKyAgfQorICB2b2lkIF9NX2luc2VydF9hZnRlcl9yYW5nZShfTm9kZV9iYXNlKiBfX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KSB7CisjZW5kaWYgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworICAgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkgeworICAgICAgX19wb3MgPSBfU1RMUF9QUklWIF9fc2xpc3RfbWFrZV9saW5rKF9fcG9zLCBfTV9jcmVhdGVfbm9kZSgqX19maXJzdCkpOworICAgICAgKytfX2ZpcnN0OworICAgIH0KKyAgfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyAgLy8gQ2hlY2sgd2hldGhlciBpdCdzIGFuIGludGVncmFsIHR5cGUuICBJZiBzbywgaXQncyBub3QgYW4gaXRlcmF0b3IuCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5JdGVyPgorICB2b2lkIF9NX3NwbGljZV9hZnRlcl9yYW5nZShfTm9kZV9iYXNlKiBfX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0luSXRlciBfX2ZpcnN0LCBfSW5JdGVyIF9fbGFzdCkgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lzSW50ZWdyYWw8X0luSXRlcj46Ol9SZXQgX0ludGVncmFsOworICAgIF9NX3NwbGljZV9hZnRlcl9yYW5nZShfX3BvcywgX19maXJzdCwgX19sYXN0LCBfSW50ZWdyYWwoKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0ludGVnZXI+CisgIHZvaWQgX01fc3BsaWNlX2FmdGVyX3JhbmdlKF9Ob2RlX2Jhc2UqIF9fcG9zLCBfSW50ZWdlciBfX24sIF9JbnRlZ2VyIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX190cnVlX3R5cGUmKSB7CisgICAgX01faW5zZXJ0X2FmdGVyX2ZpbGwoX19wb3MsIF9fbiwgX194KTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5JdGVyPgorICB2b2lkIF9NX3NwbGljZV9hZnRlcl9yYW5nZShfTm9kZV9iYXNlKiBfX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0luSXRlciBfX2ZpcnN0LCBfSW5JdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19mYWxzZV90eXBlJikgeworI2Vsc2UgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworICB2b2lkIF9NX3NwbGljZV9hZnRlcl9yYW5nZShfTm9kZV9iYXNlKiBfX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWVfdHlwZSogX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWVfdHlwZSogX19sYXN0KSB7CisgICAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0KSB7CisgICAgICBfX3BvcyA9IF9TVExQX1BSSVYgX19zbGlzdF9tYWtlX2xpbmsoX19wb3MsIF9NX2NyZWF0ZV9ub2RlKCpfX2ZpcnN0KSk7CisgICAgICArK19fZmlyc3Q7CisgICAgfQorICB9CisgIHZvaWQgX01fc3BsaWNlX2FmdGVyX3JhbmdlKF9Ob2RlX2Jhc2UqIF9fcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpIHsKKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisgICAgLy9XZSB1c2UgYSB0ZW1wb3Jhcnkgc2xpc3QgdG8gYXZvaWQgdGhlIGF1dG8gcmVmZXJlbmNlIHRyb3VibGVzIChpbmZpbml0ZSBsb29wKQorICAgIF9TZWxmIF9fdG1wKF9fZmlyc3QsIF9fbGFzdCwgdGhpcy0+Z2V0X2FsbG9jYXRvcigpKTsKKyAgICBzcGxpY2VfYWZ0ZXIoaXRlcmF0b3IoX19wb3MpLCBfX3RtcCk7CisgIH0KKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIC8vIENoZWNrIHdoZXRoZXIgaXQncyBhbiBpbnRlZ3JhbCB0eXBlLiAgSWYgc28sIGl0J3Mgbm90IGFuIGl0ZXJhdG9yLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0luSXRlcj4KKyAgdm9pZCBfTV9zcGxpY2VfcmFuZ2UoX05vZGVfYmFzZSogX19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgIF9Jbkl0ZXIgX19maXJzdCwgX0luSXRlciBfX2xhc3QpIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Jc0ludGVncmFsPF9Jbkl0ZXI+OjpfUmV0IF9JbnRlZ3JhbDsKKyAgICBfTV9zcGxpY2VfcmFuZ2UoX19wb3MsIF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnRlZ2VyPgorICB2b2lkIF9NX3NwbGljZV9yYW5nZShfTm9kZV9iYXNlKiBfX3BvcywgX0ludGVnZXIgX19uLCBfSW50ZWdlciBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fdHJ1ZV90eXBlJikgeworICAgIF9NX2luc2VydF9hZnRlcl9maWxsKF9TVExQX1BSSVYgX1NsX2dsb2JhbF9pbnN0OjpfX3ByZXZpb3VzKCZ0aGlzLT5fTV9oZWFkLl9NX2RhdGEsIF9fcG9zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfX24sIF9feCk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0luSXRlcj4KKyAgdm9pZCBfTV9zcGxpY2VfcmFuZ2UoX05vZGVfYmFzZSogX19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgIF9Jbkl0ZXIgX19maXJzdCwgX0luSXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fZmFsc2VfdHlwZSYpIHsKKyNlbHNlIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKyAgdm9pZCBfTV9zcGxpY2VfcmFuZ2UoX05vZGVfYmFzZSogX19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlX3R5cGUqIF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlX3R5cGUqIF9fbGFzdCkgeworICAgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkgeworICAgICAgX19wb3MgPSBfU1RMUF9QUklWIF9fc2xpc3RfbWFrZV9saW5rKF9fcG9zLCBfTV9jcmVhdGVfbm9kZSgqX19maXJzdCkpOworICAgICAgKytfX2ZpcnN0OworICAgIH0KKyAgfQorICB2b2lkIF9NX3NwbGljZV9yYW5nZShfTm9kZV9iYXNlKiBfX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KSB7CisjZW5kaWYgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworICAgIC8vV2UgdXNlIGEgdGVtcG9yYXJ5IHNsaXN0IHRvIGF2b2lkIHRoZSBhdXRvIHJlZmVyZW5jZSB0cm91YmxlcyAoaW5maW5pdGUgbG9vcCkKKyAgICBfU2VsZiBfX3RtcChfX2ZpcnN0LCBfX2xhc3QsIHRoaXMtPmdldF9hbGxvY2F0b3IoKSk7CisgICAgc3BsaWNlKGl0ZXJhdG9yKF9fcG9zKSwgX190bXApOworICB9CisKK3B1YmxpYzoKKworI2lmICFkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQorICBpdGVyYXRvciBpbnNlcnRfYWZ0ZXIoaXRlcmF0b3IgX19wb3MsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCA9IF9UcCgpKSB7CisjZWxzZQorICBpdGVyYXRvciBpbnNlcnRfYWZ0ZXIoaXRlcmF0b3IgX19wb3MsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkgeworI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCisgICAgcmV0dXJuIGl0ZXJhdG9yKF9NX2luc2VydF9hZnRlcihfX3Bvcy5fTV9ub2RlLCBfX3gpKTsKKyAgfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKKyAgaXRlcmF0b3IgaW5zZXJ0X2FmdGVyKGl0ZXJhdG9yIF9fcG9zKSB7CisgICAgcmV0dXJuIGluc2VydF9hZnRlcihfX3BvcywgX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRChfVHApKTsKKyAgfQorI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCisKKyAgdm9pZCBpbnNlcnRfYWZ0ZXIoaXRlcmF0b3IgX19wb3MsIHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkgeworICAgIF9NX2luc2VydF9hZnRlcl9maWxsKF9fcG9zLl9NX25vZGUsIF9fbiwgX194KTsKKyAgfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyAgLy8gV2UgZG9uJ3QgbmVlZCBhbnkgZGlzcGF0Y2hpbmcgdHJpY2tzIGhlcmUsIGJlY2F1c2UgX01faW5zZXJ0X2FmdGVyX3JhbmdlCisgIC8vIGFscmVhZHkgZG9lcyB0aGVtLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0luSXRlcj4KKyAgdm9pZCBpbnNlcnRfYWZ0ZXIoaXRlcmF0b3IgX19wb3MsIF9Jbkl0ZXIgX19maXJzdCwgX0luSXRlciBfX2xhc3QpIHsKKyNlbHNlIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKyAgdm9pZCBpbnNlcnRfYWZ0ZXIoaXRlcmF0b3IgX19wb3MsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlX3R5cGUqIF9fZmlyc3QsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbGFzdCkgeworICAgIF9NX2luc2VydF9hZnRlcl9yYW5nZShfX3Bvcy5fTV9ub2RlLCBfX2ZpcnN0LCBfX2xhc3QpOworICB9CisgIHZvaWQgaW5zZXJ0X2FmdGVyKGl0ZXJhdG9yIF9fcG9zLAorICAgICAgICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpIHsKKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisgICAgX01fc3BsaWNlX2FmdGVyX3JhbmdlKF9fcG9zLl9NX25vZGUsIF9fZmlyc3QsIF9fbGFzdCk7CisgIH0KKworI2lmICFkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQorICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCA9IF9UcCgpKSB7CisjZWxzZQorICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkgeworI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCisgICAgcmV0dXJuIGl0ZXJhdG9yKF9NX2luc2VydF9hZnRlcihfU1RMUF9QUklWIF9TbF9nbG9iYWxfaW5zdDo6X19wcmV2aW91cygmdGhpcy0+X01faGVhZC5fTV9kYXRhLCBfX3Bvcy5fTV9ub2RlKSwKKyAgICAgICAgICAgICAgICAgICAgX194KSk7CisgIH0KKworI2lmIGRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCisgIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBfX3BvcykgeworICAgIHJldHVybiBpdGVyYXRvcihfTV9pbnNlcnRfYWZ0ZXIoX1NUTFBfUFJJViBfU2xfZ2xvYmFsX2luc3Q6Ol9fcHJldmlvdXMoJnRoaXMtPl9NX2hlYWQuX01fZGF0YSwgX19wb3MuX01fbm9kZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKF9UcCkpKTsKKyAgfQorI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCisKKyAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkgeworICAgIF9NX2luc2VydF9hZnRlcl9maWxsKF9TVExQX1BSSVYgX1NsX2dsb2JhbF9pbnN0OjpfX3ByZXZpb3VzKCZ0aGlzLT5fTV9oZWFkLl9NX2RhdGEsIF9fcG9zLl9NX25vZGUpLCBfX24sIF9feCk7CisgIH0KKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIC8vIFdlIGRvbid0IG5lZWQgYW55IGRpc3BhdGNoaW5nIHRyaWNrcyBoZXJlLCBiZWNhdXNlIF9NX2luc2VydF9hZnRlcl9yYW5nZQorICAvLyBhbHJlYWR5IGRvZXMgdGhlbS4KKyAgdGVtcGxhdGUgPGNsYXNzIF9Jbkl0ZXI+CisgIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBfSW5JdGVyIF9fZmlyc3QsIF9Jbkl0ZXIgX19sYXN0KSB7CisjZWxzZSAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisgIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBjb25zdCB2YWx1ZV90eXBlKiBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWVfdHlwZSogX19sYXN0KSB7CisgICAgX01faW5zZXJ0X2FmdGVyX3JhbmdlKF9TVExQX1BSSVYgX1NsX2dsb2JhbF9pbnN0OjpfX3ByZXZpb3VzKCZ0aGlzLT5fTV9oZWFkLl9NX2RhdGEsIF9fcG9zLl9NX25vZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ZpcnN0LCBfX2xhc3QpOworICB9CisgIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpIHsKKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisgICAgX01fc3BsaWNlX3JhbmdlKF9fcG9zLl9NX25vZGUsIF9fZmlyc3QsIF9fbGFzdCk7CisgIH0KKworcHVibGljOgorICBpdGVyYXRvciBlcmFzZV9hZnRlcihpdGVyYXRvciBfX3BvcykKKyAgeyByZXR1cm4gaXRlcmF0b3IodGhpcy0+X01fZXJhc2VfYWZ0ZXIoX19wb3MuX01fbm9kZSkpOyB9CisgIGl0ZXJhdG9yIGVyYXNlX2FmdGVyKGl0ZXJhdG9yIF9fYmVmb3JlX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpCisgIHsgcmV0dXJuIGl0ZXJhdG9yKHRoaXMtPl9NX2VyYXNlX2FmdGVyKF9fYmVmb3JlX2ZpcnN0Ll9NX25vZGUsIF9fbGFzdC5fTV9ub2RlKSk7IH0KKworICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBfX3BvcykKKyAgeyByZXR1cm4gaXRlcmF0b3IodGhpcy0+X01fZXJhc2VfYWZ0ZXIoX1NUTFBfUFJJViBfU2xfZ2xvYmFsX2luc3Q6Ol9fcHJldmlvdXMoJnRoaXMtPl9NX2hlYWQuX01fZGF0YSwgX19wb3MuX01fbm9kZSkpKTsgfQorICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpCisgIHsgcmV0dXJuIGl0ZXJhdG9yKHRoaXMtPl9NX2VyYXNlX2FmdGVyKF9TVExQX1BSSVYgX1NsX2dsb2JhbF9pbnN0OjpfX3ByZXZpb3VzKCZ0aGlzLT5fTV9oZWFkLl9NX2RhdGEsIF9fZmlyc3QuX01fbm9kZSksIF9fbGFzdC5fTV9ub2RlKSk7IH0KKworI2lmICFkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQorICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgbmV3X3NpemUsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCA9IF9UcCgpKTsKKyNlbHNlCisgIHZvaWQgcmVzaXplKHNpemVfdHlwZSBuZXdfc2l6ZSwgY29uc3QgdmFsdWVfdHlwZSYgX194KTsKKyNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0qLworCisjaWYgZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKKyAgdm9pZCByZXNpemUoc2l6ZV90eXBlIG5ld19zaXplKSB7IHJlc2l6ZShuZXdfc2l6ZSwgX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRChfVHApKTsgfQorI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCisKKyAgdm9pZCBjbGVhcigpCisgIHsgdGhpcy0+X01fZXJhc2VfYWZ0ZXIoJnRoaXMtPl9NX2hlYWQuX01fZGF0YSwgMCk7IH0KKworcHVibGljOgorICAvLyBNb3ZlcyB0aGUgcmFuZ2UgW19fYmVmb3JlX2ZpcnN0ICsgMSwgX19iZWZvcmVfbGFzdCArIDEpIHRvICp0aGlzLAorICAvLyAgaW5zZXJ0aW5nIGl0IGltbWVkaWF0ZWx5IGFmdGVyIF9fcG9zLiAgVGhpcyBpcyBjb25zdGFudCB0aW1lLgorICB2b2lkIHNwbGljZV9hZnRlcihpdGVyYXRvciBfX3BvcywgX1NlbGYmIF9feCwKKyAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3IgX19iZWZvcmVfZmlyc3QsIGl0ZXJhdG9yIF9fYmVmb3JlX2xhc3QpIHsKKyAgICBpZiAoX19iZWZvcmVfZmlyc3QgIT0gX19iZWZvcmVfbGFzdCkgeworICAgICAgaWYgKHRoaXMtPmdldF9hbGxvY2F0b3IoKSA9PSBfX3guZ2V0X2FsbG9jYXRvcigpKSB7CisgICAgICAgIF9TVExQX1BSSVYgX1NsX2dsb2JhbF9pbnN0OjpfX3NwbGljZV9hZnRlcihfX3Bvcy5fTV9ub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19iZWZvcmVfZmlyc3QuX01fbm9kZSwgX19iZWZvcmVfbGFzdC5fTV9ub2RlKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICB0aGlzLT5pbnNlcnRfYWZ0ZXIoX19wb3MsIGl0ZXJhdG9yKF9fYmVmb3JlX2ZpcnN0Ll9NX25vZGUtPl9NX25leHQpLCBpdGVyYXRvcihfX2JlZm9yZV9sYXN0Ll9NX25vZGUtPl9NX25leHQpKTsKKyAgICAgICAgX194LmVyYXNlX2FmdGVyKF9fYmVmb3JlX2ZpcnN0LCArK19fYmVmb3JlX2xhc3QpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIE1vdmVzIHRoZSBlbGVtZW50IHRoYXQgZm9sbG93cyBfX3ByZXYgdG8gKnRoaXMsIGluc2VydGluZyBpdCBpbW1lZGlhdGVseQorICAvLyAgYWZ0ZXIgX19wb3MuICBUaGlzIGlzIGNvbnN0YW50IHRpbWUuCisgIHZvaWQgc3BsaWNlX2FmdGVyKGl0ZXJhdG9yIF9fcG9zLCBfU2VsZiYgX194LCBpdGVyYXRvciBfX3ByZXYpIHsKKyAgICBpZiAodGhpcy0+Z2V0X2FsbG9jYXRvcigpID09IF9feC5nZXRfYWxsb2NhdG9yKCkpIHsKKyAgICAgIF9TVExQX1BSSVYgX1NsX2dsb2JhbF9pbnN0OjpfX3NwbGljZV9hZnRlcihfX3Bvcy5fTV9ub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcHJldi5fTV9ub2RlLCBfX3ByZXYuX01fbm9kZS0+X01fbmV4dCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgdGhpcy0+aW5zZXJ0X2FmdGVyKF9fcG9zLCBfX1NUQVRJQ19DQVNUKF9Ob2RlKiwgX19wcmV2Ll9NX25vZGUtPl9NX25leHQpLT5fTV9kYXRhKTsKKyAgICAgIF9feC5lcmFzZV9hZnRlcihfX3ByZXYpOworICAgIH0KKyAgfQorCisgIC8vIFJlbW92ZXMgYWxsIG9mIHRoZSBlbGVtZW50cyBmcm9tIHRoZSBsaXN0IF9feCB0byAqdGhpcywgaW5zZXJ0aW5nCisgIC8vIHRoZW0gaW1tZWRpYXRlbHkgYWZ0ZXIgX19wb3MuICBfX3ggbXVzdCBub3QgYmUgKnRoaXMuICBDb21wbGV4aXR5OgorICAvLyBsaW5lYXIgaW4gX194LnNpemUoKS4KKyAgdm9pZCBzcGxpY2VfYWZ0ZXIoaXRlcmF0b3IgX19wb3MsIF9TZWxmJiBfX3gpIHsKKyAgICBpZiAodGhpcy0+Z2V0X2FsbG9jYXRvcigpID09IF9feC5nZXRfYWxsb2NhdG9yKCkpCisgICAgICBfU1RMUF9QUklWIF9TbF9nbG9iYWxfaW5zdDo6X19zcGxpY2VfYWZ0ZXIoX19wb3MuX01fbm9kZSwgJl9feC5fTV9oZWFkLl9NX2RhdGEpOworICAgIGVsc2UgeworICAgICAgdGhpcy0+aW5zZXJ0X2FmdGVyKF9fcG9zLCBfX3guYmVnaW4oKSwgX194LmVuZCgpKTsKKyAgICAgIF9feC5jbGVhcigpOworICAgIH0KKyAgfQorCisgIC8vIExpbmVhciBpbiBkaXN0YW5jZShiZWdpbigpLCBfX3BvcyksIGFuZCBsaW5lYXIgaW4gX194LnNpemUoKS4KKyAgdm9pZCBzcGxpY2UoaXRlcmF0b3IgX19wb3MsIF9TZWxmJiBfX3gpIHsKKyAgICBpZiAoX194Ll9NX2hlYWQuX01fZGF0YS5fTV9uZXh0KSB7CisgICAgICBpZiAodGhpcy0+Z2V0X2FsbG9jYXRvcigpID09IF9feC5nZXRfYWxsb2NhdG9yKCkpIHsKKyAgICAgICAgX1NUTFBfUFJJViBfU2xfZ2xvYmFsX2luc3Q6Ol9fc3BsaWNlX2FmdGVyKF9TVExQX1BSSVYgX1NsX2dsb2JhbF9pbnN0OjpfX3ByZXZpb3VzKCZ0aGlzLT5fTV9oZWFkLl9NX2RhdGEsIF9fcG9zLl9NX25vZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJl9feC5fTV9oZWFkLl9NX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9TbF9nbG9iYWxfaW5zdDo6X19wcmV2aW91cygmX194Ll9NX2hlYWQuX01fZGF0YSwgMCkpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGluc2VydChfX3BvcywgX194LmJlZ2luKCksIF9feC5lbmQoKSk7CisgICAgICAgIF9feC5jbGVhcigpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIExpbmVhciBpbiBkaXN0YW5jZShiZWdpbigpLCBfX3BvcyksIGFuZCBpbiBkaXN0YW5jZShfX3guYmVnaW4oKSwgX19pKS4KKyAgdm9pZCBzcGxpY2UoaXRlcmF0b3IgX19wb3MsIF9TZWxmJiBfX3gsIGl0ZXJhdG9yIF9faSkgeworICAgIGlmICh0aGlzLT5nZXRfYWxsb2NhdG9yKCkgPT0gX194LmdldF9hbGxvY2F0b3IoKSkgeworICAgICAgX1NUTFBfUFJJViBfU2xfZ2xvYmFsX2luc3Q6Ol9fc3BsaWNlX2FmdGVyKF9TVExQX1BSSVYgX1NsX2dsb2JhbF9pbnN0OjpfX3ByZXZpb3VzKCZ0aGlzLT5fTV9oZWFkLl9NX2RhdGEsIF9fcG9zLl9NX25vZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX1NsX2dsb2JhbF9pbnN0OjpfX3ByZXZpb3VzKCZfX3guX01faGVhZC5fTV9kYXRhLCBfX2kuX01fbm9kZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19pLl9NX25vZGUpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGluc2VydChfX3BvcywgKl9faSk7CisgICAgICBfX3guZXJhc2UoX19pKTsKKyAgICB9CisgIH0KKworICAvLyBMaW5lYXIgaW4gZGlzdGFuY2UoYmVnaW4oKSwgX19wb3MpLCBpbiBkaXN0YW5jZShfX3guYmVnaW4oKSwgX19maXJzdCksCisgIC8vIGFuZCBpbiBkaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QpLgorICB2b2lkIHNwbGljZShpdGVyYXRvciBfX3BvcywgX1NlbGYmIF9feCwgaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KSB7CisgICAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KSB7CisgICAgICBpZiAodGhpcy0+Z2V0X2FsbG9jYXRvcigpID09IF9feC5nZXRfYWxsb2NhdG9yKCkpIHsKKyAgICAgICAgX1NUTFBfUFJJViBfU2xfZ2xvYmFsX2luc3Q6Ol9fc3BsaWNlX2FmdGVyKF9TVExQX1BSSVYgX1NsX2dsb2JhbF9pbnN0OjpfX3ByZXZpb3VzKCZ0aGlzLT5fTV9oZWFkLl9NX2RhdGEsIF9fcG9zLl9NX25vZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfU2xfZ2xvYmFsX2luc3Q6Ol9fcHJldmlvdXMoJl9feC5fTV9oZWFkLl9NX2RhdGEsIF9fZmlyc3QuX01fbm9kZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9TbF9nbG9iYWxfaW5zdDo6X19wcmV2aW91cyhfX2ZpcnN0Ll9NX25vZGUsIF9fbGFzdC5fTV9ub2RlKSk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgaW5zZXJ0KF9fcG9zLCBfX2ZpcnN0LCBfX2xhc3QpOworICAgICAgICBfX3guZXJhc2UoX19maXJzdCwgX19sYXN0KTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworcHVibGljOgorICB2b2lkIHJldmVyc2UoKSB7CisgICAgaWYgKHRoaXMtPl9NX2hlYWQuX01fZGF0YS5fTV9uZXh0KQorICAgICAgdGhpcy0+X01faGVhZC5fTV9kYXRhLl9NX25leHQgPSBfU1RMUF9QUklWIF9TbF9nbG9iYWxfaW5zdDo6X19yZXZlcnNlKHRoaXMtPl9NX2hlYWQuX01fZGF0YS5fTV9uZXh0KTsKKyAgfQorCisgIHZvaWQgcmVtb3ZlKGNvbnN0IF9UcCYgX192YWwpOworCisgIHZvaWQgdW5pcXVlKCkgeyBfU1RMUF9QUklWIF9TbGlzdF91bmlxdWUoKnRoaXMsIGVxdWFsX3RvPHZhbHVlX3R5cGU+KCkpOyB9CisgIHZvaWQgbWVyZ2UoX1NlbGYmIF9feCkgeyBfU1RMUF9QUklWIF9TbGlzdF9tZXJnZSgqdGhpcywgX194LCBsZXNzPHZhbHVlX3R5cGU+KCkpOyB9CisgIHZvaWQgc29ydCgpIHsgX1NUTFBfUFJJViBfU2xpc3Rfc29ydCgqdGhpcywgbGVzczx2YWx1ZV90eXBlPigpKTsgfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyAgdGVtcGxhdGUgPGNsYXNzIF9QcmVkaWNhdGU+CisgIHZvaWQgcmVtb3ZlX2lmKF9QcmVkaWNhdGUgX19wcmVkKSB7CisgICAgX05vZGVfYmFzZSogX19jdXIgPSAmdGhpcy0+X01faGVhZC5fTV9kYXRhOworICAgIHdoaWxlIChfX2N1ci0+X01fbmV4dCkgeworICAgICAgaWYgKF9fcHJlZChfX1NUQVRJQ19DQVNUKF9Ob2RlKiwgX19jdXItPl9NX25leHQpLT5fTV9kYXRhKSkKKyAgICAgICAgdGhpcy0+X01fZXJhc2VfYWZ0ZXIoX19jdXIpOworICAgICAgZWxzZQorICAgICAgICBfX2N1ciA9IF9fY3VyLT5fTV9uZXh0OworICAgIH0KKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfQmluYXJ5UHJlZGljYXRlPgorICB2b2lkIHVuaXF1ZShfQmluYXJ5UHJlZGljYXRlIF9fcHJlZCkKKyAgeyBfU1RMUF9QUklWIF9TbGlzdF91bmlxdWUoKnRoaXMsIF9fcHJlZCk7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1N0cmljdFdlYWtPcmRlcmluZz4KKyAgdm9pZCBtZXJnZShfU2VsZiYgX194LCBfU3RyaWN0V2Vha09yZGVyaW5nIF9fY29tcCkKKyAgeyBfU1RMUF9QUklWIF9TbGlzdF9tZXJnZSgqdGhpcywgX194LCBfX2NvbXApOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9TdHJpY3RXZWFrT3JkZXJpbmc+CisgIHZvaWQgc29ydChfU3RyaWN0V2Vha09yZGVyaW5nIF9fY29tcCkKKyAgeyBfU1RMUF9QUklWIF9TbGlzdF9zb3J0KCp0aGlzLCBfX2NvbXApOyB9CisjZW5kaWYgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworfTsKKworI2lmIGRlZmluZWQgKHNsaXN0KQorIyAgdW5kZWYgc2xpc3QKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorI2VuZGlmCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2lmICFkZWZpbmVkIChfU1RMUF9MSU5LX1RJTUVfSU5TVEFOVElBVElPTikKKyMgIGluY2x1ZGUgPHN0bC9fc2xpc3QuYz4KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BUUl9TUEVDSUFMSVpBVElPTlMpCisjICBpbmNsdWRlIDxzdGwvcG9pbnRlcnMvX3NsaXN0Lmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHKQorIyAgaW5jbHVkZSA8c3RsL2RlYnVnL19zbGlzdC5oPgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgYm9vbCAgX1NUTFBfQ0FMTAorb3BlcmF0b3IgPT0gKGNvbnN0IHNsaXN0PF9UcCxfQWxsb2M+JiBfU0wxLCBjb25zdCBzbGlzdDxfVHAsX0FsbG9jPiYgX1NMMikgeworICB0eXBlZGVmIHR5cGVuYW1lIHNsaXN0PF9UcCxfQWxsb2M+Ojpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKKyAgY29uc3RfaXRlcmF0b3IgX19lbmQxID0gX1NMMS5lbmQoKTsKKyAgY29uc3RfaXRlcmF0b3IgX19lbmQyID0gX1NMMi5lbmQoKTsKKworICBjb25zdF9pdGVyYXRvciBfX2kxID0gX1NMMS5iZWdpbigpOworICBjb25zdF9pdGVyYXRvciBfX2kyID0gX1NMMi5iZWdpbigpOworICB3aGlsZSAoX19pMSAhPSBfX2VuZDEgJiYgX19pMiAhPSBfX2VuZDIgJiYgKl9faTEgPT0gKl9faTIpIHsKKyAgICArK19faTE7CisgICAgKytfX2kyOworICB9CisgIHJldHVybiBfX2kxID09IF9fZW5kMSAmJiBfX2kyID09IF9fZW5kMjsKK30KKworI2RlZmluZSBfU1RMUF9FUVVBTF9PUEVSQVRPUl9TUEVDSUFMSVpFRAorI2RlZmluZSBfU1RMUF9URU1QTEFURV9IRUFERVIgICAgdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgorI2RlZmluZSBfU1RMUF9URU1QTEFURV9DT05UQUlORVIgc2xpc3Q8X1RwLCBfQWxsb2M+CisjaW5jbHVkZSA8c3RsL19yZWxvcHNfY29udC5oPgorI3VuZGVmIF9TVExQX1RFTVBMQVRFX0NPTlRBSU5FUgorI3VuZGVmIF9TVExQX1RFTVBMQVRFX0hFQURFUgorI3VuZGVmIF9TVExQX0VRVUFMX09QRVJBVE9SX1NQRUNJQUxJWkVECisKKyNpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgorc3RydWN0IF9fbW92ZV90cmFpdHM8c2xpc3Q8X1RwLCBfQWxsb2M+ID4geworICB0eXBlZGVmIF9fc3RscF9tb3ZhYmxlIGltcGxlbWVudGVkOworICB0eXBlZGVmIHR5cGVuYW1lIF9fbW92ZV90cmFpdHM8X0FsbG9jPjo6Y29tcGxldGUgY29tcGxldGU7Cit9OworCisvLyBTcGVjaWFsaXphdGlvbiBvZiBpbnNlcnRfaXRlcmF0b3Igc28gdGhhdCBpbnNlcnRpb25zIHdpbGwgYmUgY29uc3RhbnQKKy8vIHRpbWUgcmF0aGVyIHRoYW4gbGluZWFyIHRpbWUuCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CitjbGFzcyBpbnNlcnRfaXRlcmF0b3I8c2xpc3Q8X1RwLCBfQWxsb2M+ID4geworcHJvdGVjdGVkOgorICB0eXBlZGVmIHNsaXN0PF9UcCwgX0FsbG9jPiBfQ29udGFpbmVyOworICBfQ29udGFpbmVyKiBfTV9jb250YWluZXI7CisgIHR5cGVuYW1lIF9Db250YWluZXI6Oml0ZXJhdG9yIF9NX2l0ZXI7CitwdWJsaWM6CisgIHR5cGVkZWYgX0NvbnRhaW5lciAgICAgICAgICBjb250YWluZXJfdHlwZTsKKyAgdHlwZWRlZiBvdXRwdXRfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OworICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisKKyAgaW5zZXJ0X2l0ZXJhdG9yKF9Db250YWluZXImIF9feCwgdHlwZW5hbWUgX0NvbnRhaW5lcjo6aXRlcmF0b3IgX19pKQorICAgIDogX01fY29udGFpbmVyKCZfX3gpIHsKKyAgICBpZiAoX19pID09IF9feC5iZWdpbigpKQorICAgICAgX01faXRlciA9IF9feC5iZWZvcmVfYmVnaW4oKTsKKyAgICBlbHNlCisgICAgICBfTV9pdGVyID0gX194LnByZXZpb3VzKF9faSk7CisgIH0KKworICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mCisgIG9wZXJhdG9yID0gKGNvbnN0IHR5cGVuYW1lIF9Db250YWluZXI6OnZhbHVlX3R5cGUmIF9fdmFsKSB7CisgICAgX01faXRlciA9IF9NX2NvbnRhaW5lci0+aW5zZXJ0X2FmdGVyKF9NX2l0ZXIsIF9fdmFsKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mIG9wZXJhdG9yKigpIHsgcmV0dXJuICp0aGlzOyB9CisgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYgb3BlcmF0b3IrKygpIHsgcmV0dXJuICp0aGlzOyB9CisgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYgb3BlcmF0b3IrKyhpbnQpIHsgcmV0dXJuICp0aGlzOyB9Cit9OworI2VuZGlmIC8qIF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04gKi8KKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfU0xJU1RfSCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RsL19zbGlzdF9iYXNlLmMgYi9zdGwvX3NsaXN0X2Jhc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGU2OGM5Ci0tLSAvZGV2L251bGwKKysrIGIvc3RsL19zbGlzdF9iYXNlLmMKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBNb3Njb3cgQ2VudGVyIGZvciBTUEFSQyBUZWNobm9sb2d5CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKyNpZm5kZWYgX1NUTFBfU0xJU1RfQkFTRV9DCisjZGVmaW5lIF9TVExQX1NMSVNUX0JBU0VfQworCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX1NMSVNUX0JBU0VfSAorIyAgaW5jbHVkZSA8c3RsL19zbGlzdF9iYXNlLmg+CisjZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9EdW1teT4KK19TbGlzdF9ub2RlX2Jhc2UqICBfU1RMUF9DQUxMCitfU2xfZ2xvYmFsPF9EdW1teT46Ol9fcHJldmlvdXMoX1NsaXN0X25vZGVfYmFzZSogX19oZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9TbGlzdF9ub2RlX2Jhc2UqIF9fbm9kZSkgeworICB3aGlsZSAoX19oZWFkICYmIF9faGVhZC0+X01fbmV4dCAhPSBfX25vZGUpCisgICAgX19oZWFkID0gX19oZWFkLT5fTV9uZXh0OworICByZXR1cm4gX19oZWFkOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0R1bW15Pgordm9pZCBfU1RMUF9DQUxMCitfU2xfZ2xvYmFsPF9EdW1teT46Ol9fc3BsaWNlX2FmdGVyKF9TbGlzdF9ub2RlX2Jhc2UqIF9fcG9zLCBfU2xpc3Rfbm9kZV9iYXNlKiBfX2hlYWQpIHsKKyAgX1NsaXN0X25vZGVfYmFzZSogX19iZWZvcmVfbGFzdCA9IF9fcHJldmlvdXMoX19oZWFkLCAwKTsKKyAgaWYgKF9fYmVmb3JlX2xhc3QgIT0gX19oZWFkKSB7CisgICAgX1NsaXN0X25vZGVfYmFzZSogX19hZnRlciA9IF9fcG9zLT5fTV9uZXh0OworICAgIF9fcG9zLT5fTV9uZXh0ID0gX19oZWFkLT5fTV9uZXh0OworICAgIF9faGVhZC0+X01fbmV4dCA9IDA7CisgICAgX19iZWZvcmVfbGFzdC0+X01fbmV4dCA9IF9fYWZ0ZXI7CisgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9EdW1teT4KK3ZvaWQgX1NUTFBfQ0FMTAorX1NsX2dsb2JhbDxfRHVtbXk+OjpfX3NwbGljZV9hZnRlcihfU2xpc3Rfbm9kZV9iYXNlKiBfX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NsaXN0X25vZGVfYmFzZSogX19iZWZvcmVfZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TbGlzdF9ub2RlX2Jhc2UqIF9fYmVmb3JlX2xhc3QpIHsKKyAgaWYgKF9fcG9zICE9IF9fYmVmb3JlX2ZpcnN0ICYmIF9fcG9zICE9IF9fYmVmb3JlX2xhc3QpIHsKKyAgICBfU2xpc3Rfbm9kZV9iYXNlKiBfX2ZpcnN0ID0gX19iZWZvcmVfZmlyc3QtPl9NX25leHQ7CisgICAgX1NsaXN0X25vZGVfYmFzZSogX19hZnRlciA9IF9fcG9zLT5fTV9uZXh0OworICAgIF9fYmVmb3JlX2ZpcnN0LT5fTV9uZXh0ID0gX19iZWZvcmVfbGFzdC0+X01fbmV4dDsKKyAgICBfX3Bvcy0+X01fbmV4dCA9IF9fZmlyc3Q7CisgICAgX19iZWZvcmVfbGFzdC0+X01fbmV4dCA9IF9fYWZ0ZXI7CisgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9EdW1teT4KK19TbGlzdF9ub2RlX2Jhc2UqIF9TVExQX0NBTEwKK19TbF9nbG9iYWw8X0R1bW15Pjo6X19yZXZlcnNlKF9TbGlzdF9ub2RlX2Jhc2UqIF9fbm9kZSkgeworICBfU2xpc3Rfbm9kZV9iYXNlKiBfX3Jlc3VsdCA9IF9fbm9kZTsKKyAgX19ub2RlID0gX19ub2RlLT5fTV9uZXh0OworICBfX3Jlc3VsdC0+X01fbmV4dCA9IDA7CisgIHdoaWxlKF9fbm9kZSkgeworICAgIF9TbGlzdF9ub2RlX2Jhc2UqIF9fbmV4dCA9IF9fbm9kZS0+X01fbmV4dDsKKyAgICBfX25vZGUtPl9NX25leHQgPSBfX3Jlc3VsdDsKKyAgICBfX3Jlc3VsdCA9IF9fbm9kZTsKKyAgICBfX25vZGUgPSBfX25leHQ7CisgIH0KKyAgcmV0dXJuIF9fcmVzdWx0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0R1bW15Pgorc2l6ZV90IF9TVExQX0NBTEwKK19TbF9nbG9iYWw8X0R1bW15Pjo6c2l6ZShfU2xpc3Rfbm9kZV9iYXNlKiBfX25vZGUpIHsKKyAgc2l6ZV90IF9fcmVzdWx0ID0gMDsKKyAgZm9yICggOyBfX25vZGUgIT0gMDsgX19ub2RlID0gX19ub2RlLT5fTV9uZXh0KQorICAgICsrX19yZXN1bHQ7CisgIHJldHVybiBfX3Jlc3VsdDsKK30KKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2VuZGlmIC8qICBfU1RMUF9TTElTVF9CQVNFX0MgKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9fc2xpc3RfYmFzZS5oIGIvc3RsL19zbGlzdF9iYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FmYTE4YQotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9fc2xpc3RfYmFzZS5oCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKy8qIE5PVEU6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIFNUTCBoZWFkZXJzLgorICogICBZb3Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4KKyAqLworCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX1NMSVNUX0JBU0VfSAorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9TTElTVF9CQVNFX0gKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DU1REREVGCisjICBpbmNsdWRlIDxzdGwvX2NzdGRkZWYuaD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCitzdHJ1Y3QgX1NsaXN0X25vZGVfYmFzZSB7CisgIF9TbGlzdF9ub2RlX2Jhc2UqIF9NX25leHQ7Cit9OworCitpbmxpbmUgX1NsaXN0X25vZGVfYmFzZSoKK19fc2xpc3RfbWFrZV9saW5rKF9TbGlzdF9ub2RlX2Jhc2UqIF9fcHJldl9ub2RlLAorICAgICAgICAgICAgICAgICAgX1NsaXN0X25vZGVfYmFzZSogX19uZXdfbm9kZSkgeworICBfX25ld19ub2RlLT5fTV9uZXh0ID0gX19wcmV2X25vZGUtPl9NX25leHQ7CisgIF9fcHJldl9ub2RlLT5fTV9uZXh0ID0gX19uZXdfbm9kZTsKKyAgcmV0dXJuIF9fbmV3X25vZGU7Cit9CisKKwordGVtcGxhdGUgPGNsYXNzIF9EdW1teT4KK2NsYXNzIF9TbF9nbG9iYWwgeworcHVibGljOgorICAvLyB0aG9zZSB1c2VkIHRvIGJlIGdsb2JhbCBmdW5jdGlvbnMKKyAgLy8gbW92ZWQgaGVyZSB0byByZWR1Y2UgY29kZSBibG9hdCB3aXRob3V0IHRlbXBsYXRpemluZyBfU2xpc3RfaXRlcmF0b3JfYmFzZQorICBzdGF0aWMgc2l6ZV90IF9TVExQX0NBTEwgc2l6ZShfU2xpc3Rfbm9kZV9iYXNlKiBfX25vZGUpOworICBzdGF0aWMgX1NsaXN0X25vZGVfYmFzZSogX1NUTFBfQ0FMTCBfX3JldmVyc2UoX1NsaXN0X25vZGVfYmFzZSogX19ub2RlKTsKKyAgc3RhdGljIHZvaWQgX1NUTFBfQ0FMTCBfX3NwbGljZV9hZnRlcihfU2xpc3Rfbm9kZV9iYXNlKiBfX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU2xpc3Rfbm9kZV9iYXNlKiBfX2JlZm9yZV9maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU2xpc3Rfbm9kZV9iYXNlKiBfX2JlZm9yZV9sYXN0KTsKKworICBzdGF0aWMgdm9pZCBfU1RMUF9DQUxMIF9fc3BsaWNlX2FmdGVyKF9TbGlzdF9ub2RlX2Jhc2UqIF9fcG9zLCBfU2xpc3Rfbm9kZV9iYXNlKiBfX2hlYWQpOworCisgIHN0YXRpYyBfU2xpc3Rfbm9kZV9iYXNlKiBfU1RMUF9DQUxMIF9fcHJldmlvdXMoX1NsaXN0X25vZGVfYmFzZSogX19oZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9TbGlzdF9ub2RlX2Jhc2UqIF9fbm9kZSk7CisgIHN0YXRpYyBjb25zdCBfU2xpc3Rfbm9kZV9iYXNlKiBfU1RMUF9DQUxMIF9fcHJldmlvdXMoY29uc3QgX1NsaXN0X25vZGVfYmFzZSogX19oZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9TbGlzdF9ub2RlX2Jhc2UqIF9fbm9kZSkgeworICAgIHJldHVybiBfU2xfZ2xvYmFsPF9EdW1teT46Ol9fcHJldmlvdXMoX19DT05TVF9DQVNUKF9TbGlzdF9ub2RlX2Jhc2UqLCBfX2hlYWQpLCBfX25vZGUpOworICB9Cit9OworCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCkKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBfU2xfZ2xvYmFsPGJvb2w+OworI2VuZGlmCisKK3R5cGVkZWYgX1NsX2dsb2JhbDxib29sPiBfU2xfZ2xvYmFsX2luc3Q7CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTElOS19USU1FX0lOU1RBTlRJQVRJT04pICYmIGRlZmluZWQgKF9TVExQX0VYUE9TRV9HTE9CQUxTX0lNUExFTUVOVEFUSU9OKQorIyAgaW5jbHVkZSA8c3RsL19zbGlzdF9iYXNlLmM+CisjZW5kaWYKKworI2VuZGlmIC8qIF9TVExQX0lOVEVSTkFMX1NMSVNUX0JBU0VfSCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RsL19zcGFyY19hdG9taWMuaCBiL3N0bC9fc3BhcmNfYXRvbWljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBkMTBmMwotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9fc3BhcmNfYXRvbWljLmgKQEAgLTAsMCArMSw2MiBAQAorCisvLyBDdXJyZW50bHksIFNVTiBDQyByZXF1aXJlcyBvYmplY3QgZmlsZQorCisjaWYgZGVmaW5lZCAoX19HTlVDX18pCisKKy8qCisqKiAgaW50IF9TVExQX2F0b21pY19leGNoYW5nZSAoX19zdGxfYXRvbWljX3QgKnB2YWx1ZSwgX19zdGxfYXRvbWljX3QgdmFsdWUpCisqLworCisjIGlmIGRlZmluZWQoX19zcGFyY192OV9fKSB8fCBkZWZpbmVkIChfX3NwYXJjdjkpIAorCisjICBpZmRlZiBfX2FyY2g2NF9fCisKKyMgICBkZWZpbmUgX1NUTFBfRVhDSF9BU00gIGFzbSB2b2xhdGlsZSAoImNhc3ggWyUzXSwgJTQsICUwIDsgIG1lbWJhciAgI0xvYWRMb2FkIHwgI0xvYWRTdG9yZSAiIDogXAorICAgICAgICAgICAgICAgICAgICI9ciIgKF9MX3ZhbHVlMiksICI9bSIgKCpfTF9wdmFsdWUxKSA6IFwKKyAgICAgICAgICAgICAgICAgICAibSIgKCpfTF9wdmFsdWUxKSwgInIiIChfTF9wdmFsdWUxKSwgInIiIChfTF92YWx1ZTEpLCAiMCIgKF9MX3ZhbHVlMikgKQorCisjICBlbHNlIC8qIF9fYXJjaDY0X18gKi8KKworIyAgIGRlZmluZSBfU1RMUF9FWENIX0FTTSAgYXNtIHZvbGF0aWxlICgiY2FzIFslM10sICU0LCAlMCIgOiBcCisgICAgICAgICAgICAgICAgICAgIj1yIiAoX0xfdmFsdWUyKSwgIj1tIiAoKl9MX3B2YWx1ZTEpIDogXAorICAgICAgICAgICAgICAgICAgICJtIiAoKl9MX3B2YWx1ZTEpLCAiciIgKF9MX3B2YWx1ZTEpLCAiciIgKF9MX3ZhbHVlMSksICIwIiAoX0xfdmFsdWUyKSApCisjICBlbmRpZgorCisjIGVsc2UgLyogX19zcGFyY192OV9fICovCisKKyMgIGRlZmluZSBfU1RMUF9FWENIX0FTTSBhc20gdm9sYXRpbGUgKCJzd2FwIFslM10sICUwICIgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPXIiIChfTF92YWx1ZTIpLCAiPW0iICgqX0xfcHZhbHVlMSkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibSIgKCpfTF9wdmFsdWUxKSwgInIiIChfTF9wdmFsdWUxKSwgICIwIiAoX0xfdmFsdWUyKSApCisjIGVuZGlmCisKKworIyAgZGVmaW5lIF9TVExQX0FUT01JQ19FWENIQU5HRShfX3B2YWx1ZTEsIF9fdmFsdWUyKSBcCisgKHsgIHJlZ2lzdGVyIHZvbGF0aWxlIF9fc3RsX2F0b21pY190ICpfTF9wdmFsdWUxID0gX19wdmFsdWUxOyBcCisgICAgIHJlZ2lzdGVyIF9fc3RsX2F0b21pY190IF9MX3ZhbHVlMSwgX0xfdmFsdWUyID0gIF9fdmFsdWUyIDsgXAorICAgICBkbyB7IF9MX3ZhbHVlMSA9ICpfTF9wdmFsdWUxOyBfU1RMUF9FWENIX0FTTTsgfSB3aGlsZSAoIF9MX3ZhbHVlMSAhPSBfTF92YWx1ZTIgKSA7IFwKKyAgICAgX0xfdmFsdWUxOyB9KQorCisjICBkZWZpbmUgX1NUTFBfQVRPTUlDX0lOQ1JFTUVOVChfX3B2YWx1ZTEpIFwKKyAoeyAgcmVnaXN0ZXIgdm9sYXRpbGUgX19zdGxfYXRvbWljX3QgKl9MX3B2YWx1ZTEgPSBfX3B2YWx1ZTE7IFwKKyAgICByZWdpc3RlciBfX3N0bF9hdG9taWNfdCBfTF92YWx1ZTEsIF9MX3ZhbHVlMjsgXAorICAgIGRvIHsgX0xfdmFsdWUxID0gKl9MX3B2YWx1ZTE7ICBfTF92YWx1ZTIgPSBfTF92YWx1ZTErMTsgX1NUTFBfRVhDSF9BU007IH0gd2hpbGUgKCBfTF92YWx1ZTEgIT0gX0xfdmFsdWUyICkgOyBcCisgICAgKF9MX3ZhbHVlMiArIDEpOyB9KQorCisjICBkZWZpbmUgX1NUTFBfQVRPTUlDX0RFQ1JFTUVOVChfX3B2YWx1ZTEpIFwKKyAoeyAgcmVnaXN0ZXIgdm9sYXRpbGUgX19zdGxfYXRvbWljX3QgKl9MX3B2YWx1ZTEgPSBfX3B2YWx1ZTE7IFwKKyAgICByZWdpc3RlciBfX3N0bF9hdG9taWNfdCBfTF92YWx1ZTEsIF9MX3ZhbHVlMjsgXAorICAgIGRvIHsgX0xfdmFsdWUxID0gKl9MX3B2YWx1ZTE7ICBfTF92YWx1ZTIgPSBfTF92YWx1ZTEtMTsgX1NUTFBfRVhDSF9BU007IH0gd2hpbGUgKCBfTF92YWx1ZTEgIT0gX0xfdmFsdWUyICkgOyBcCisgICAgKF9MX3ZhbHVlMiAtIDEpOyB9KQorCisjIGVsaWYgISBkZWZpbmVkIChfU1RMUF9OT19FWFRFUk5fSU5MSU5FKQorCitleHRlcm4gIkMiIF9fc3RsX2F0b21pY190IF9TVExQX2F0b21pY19leGNoYW5nZShfX3N0bF9hdG9taWNfdCAqIF9feCwgX19zdGxfYXRvbWljX3QgX192KTsKK2V4dGVybiAiQyIgdm9pZCBfU1RMUF9hdG9taWNfZGVjcmVtZW50KF9fc3RsX2F0b21pY190KiBpKTsKK2V4dGVybiAiQyIgdm9pZCBfU1RMUF9hdG9taWNfaW5jcmVtZW50KF9fc3RsX2F0b21pY190KiBpKTsKKworIyAgZGVmaW5lIF9TVExQX0FUT01JQ19JTkNSRU1FTlQoX194KSAgICAgICAgICAgX1NUTFBfYXRvbWljX2luY3JlbWVudCgoX19zdGxfYXRvbWljX3QqKV9feCkKKyMgIGRlZmluZSBfU1RMUF9BVE9NSUNfREVDUkVNRU5UKF9feCkgICAgICAgICAgIF9TVExQX2F0b21pY19kZWNyZW1lbnQoKF9fc3RsX2F0b21pY190KilfX3gpCisjICBkZWZpbmUgX1NUTFBfQVRPTUlDX0VYQ0hBTkdFKF9feCwgX195KSAgICAgICBfU1RMUF9hdG9taWNfZXhjaGFuZ2UoKF9fc3RsX2F0b21pY190KilfX3gsIChfX3N0bF9hdG9taWNfdClfX3kpCisKKyMgZW5kaWYKKwpkaWZmIC0tZ2l0IGEvc3RsL19zc3RyZWFtLmMgYi9zdGwvX3NzdHJlYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmY0MzlmCi0tLSAvZGV2L251bGwKKysrIGIvc3RsL19zc3RyZWFtLmMKQEAgLTAsMCArMSw1MzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfU1NUUkVBTV9DCisjZGVmaW5lIF9TVExQX1NTVFJFQU1fQworCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX1NTVFJFQU0KKyMgIGluY2x1ZGUgPHN0bC9fc3N0cmVhbS5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkICggX1NUTFBfTkVTVEVEX1RZUEVfUEFSQU1fQlVHICkKKy8vIG5vIHdpbnRfdCBpcyBzdXBwb3J0ZWQgZm9yIHRoaXMgbW9kZQorIyAgZGVmaW5lIF9fQlNCX2ludF90eXBlX18gaW50CisjICBkZWZpbmUgX19CU0JfcG9zX3R5cGVfXyBzdHJlYW1wb3MKKyNlbHNlCisjICBkZWZpbmUgX19CU0JfaW50X3R5cGVfXyBfU1RMUF9UWVBFTkFNRV9PTl9SRVRVUk5fVFlQRSBiYXNpY19zdHJpbmdidWY8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjppbnRfdHlwZQorIyAgZGVmaW5lIF9fQlNCX3Bvc190eXBlX18gX1NUTFBfVFlQRU5BTUVfT05fUkVUVVJOX1RZUEUgYmFzaWNfc3RyaW5nYnVmPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6cG9zX3R5cGUKKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBOb24taW5saW5lIHN0cmluZ2J1ZiBtZW1iZXIgZnVuY3Rpb25zLgorCisvLyBDb25zdHJ1Y3RvcnMuICBOb3RlIHRoYXQgdGhlIGJhc2UgY2xhc3MgY29uc3RydWN0b3Igc2V0cyBhbGwgb2YgdGhlCisvLyBnZXQgYW5kIGFyZWEgcG9pbnRlcnMgdG8gbnVsbC4KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorYmFzaWNfc3RyaW5nYnVmPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPgorICA6OmJhc2ljX3N0cmluZ2J1Zihpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlKQorICAgIDogYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4oKSwgX01fbW9kZShfX21vZGUpLCBfTV9zdHIoKQore30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorYmFzaWNfc3RyaW5nYnVmPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPgorICA6OmJhc2ljX3N0cmluZ2J1Zihjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX3MsIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUpCisgICAgOiBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPigpLCBfTV9tb2RlKF9fbW9kZSksIF9NX3N0cihfX3MpCit7CisgIF9NX3NldF9wdHJzKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK2Jhc2ljX3N0cmluZ2J1ZjxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46On5iYXNpY19zdHJpbmdidWYoKQore30KKworLy8gU2V0IHRoZSB1bmRlcmx5aW5nIHN0cmluZyB0byBhIG5ldyB2YWx1ZS4KK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK3ZvaWQKK2Jhc2ljX3N0cmluZ2J1ZjxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OnN0cihjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX3MpCit7CisgIF9NX3N0ciA9IF9fczsKKyAgX01fc2V0X3B0cnMoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgordm9pZAorYmFzaWNfc3RyaW5nYnVmPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6X01fc2V0X3B0cnMoKSB7CisgIF9DaGFyVCogX19kYXRhX3B0ciA9IF9fQ09OU1RfQ0FTVChfQ2hhclQqLF9NX3N0ci5kYXRhKCkpOworICBfQ2hhclQqIF9fZGF0YV9lbmQgPSBfX2RhdGFfcHRyICsgX01fc3RyLnNpemUoKTsKKyAgLy8gVGhlIGluaXRpYWwgcmVhZCBwb3NpdGlvbiBpcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJpbmcuCisgIGlmIChfTV9tb2RlICYgaW9zX2Jhc2U6OmluKSB7CisgICAgaWYgKF9NX21vZGUgJiBpb3NfYmFzZTo6YXRlKQorICAgICAgdGhpcy0+c2V0ZyhfX2RhdGFfcHRyLCBfX2RhdGFfZW5kLCBfX2RhdGFfZW5kKTsKKyAgICBlbHNlCisgICAgICB0aGlzLT5zZXRnKF9fZGF0YV9wdHIsIF9fZGF0YV9wdHIsIF9fZGF0YV9lbmQpOworICB9CisKKyAgLy8gVGhlIGluaXRpYWwgd3JpdGUgcG9zaXRpb24gaXMgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyaW5nLgorICBpZiAoX01fbW9kZSAmIGlvc19iYXNlOjpvdXQpIHsKKyAgICBpZiAoX01fbW9kZSAmIChpb3NfYmFzZTo6YXBwIHwgaW9zX2Jhc2U6OmF0ZSkpCisgICAgICB0aGlzLT5zZXRwKF9fZGF0YV9lbmQsIF9fZGF0YV9lbmQpOworICAgIGVsc2UKKyAgICAgIHRoaXMtPnNldHAoX19kYXRhX3B0ciwgX19kYXRhX2VuZCk7CisgIH0KK30KKworLy8gUHJlY29uZGl0aW9uOiBncHRyKCkgPj0gZWdwdHIoKS4gIFJldHVybnMgYSBjaGFyYWN0ZXIsIGlmIG9uZSBpcyBhdmFpbGFibGUuCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CitfX0JTQl9pbnRfdHlwZV9fCitiYXNpY19zdHJpbmdidWY8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+Ojp1bmRlcmZsb3coKSB7CisgIHJldHVybiB0aGlzLT5ncHRyKCkgIT0gdGhpcy0+ZWdwdHIoKQorICAgID8gX1RyYWl0czo6dG9faW50X3R5cGUoKnRoaXMtPmdwdHIoKSkKKyAgICA6IF9UcmFpdHM6OmVvZigpOworfQorCisvLyBQcmVjb25kaXRpb246IGdwdHIoKSA+PSBlZ3B0cigpLgordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorX19CU0JfaW50X3R5cGVfXworYmFzaWNfc3RyaW5nYnVmPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6dWZsb3coKSB7CisgIGlmICh0aGlzLT5ncHRyKCkgIT0gdGhpcy0+ZWdwdHIoKSkgeworICAgIGludF90eXBlIF9fYyA9IF9UcmFpdHM6OnRvX2ludF90eXBlKCp0aGlzLT5ncHRyKCkpOworICAgIHRoaXMtPmdidW1wKDEpOworICAgIHJldHVybiBfX2M7CisgIH0KKyAgZWxzZQorICAgIHJldHVybiBfVHJhaXRzOjplb2YoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorX19CU0JfaW50X3R5cGVfXworYmFzaWNfc3RyaW5nYnVmPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6cGJhY2tmYWlsKGludF90eXBlIF9fYykgeworICBpZiAodGhpcy0+Z3B0cigpICE9IHRoaXMtPmViYWNrKCkpIHsKKyAgICBpZiAoIV9UcmFpdHM6OmVxX2ludF90eXBlKF9fYywgX1RyYWl0czo6ZW9mKCkpKSB7CisgICAgICBpZiAoX1RyYWl0czo6ZXEoX1RyYWl0czo6dG9fY2hhcl90eXBlKF9fYyksIHRoaXMtPmdwdHIoKVstMV0pKSB7CisgICAgICAgIHRoaXMtPmdidW1wKC0xKTsKKyAgICAgICAgcmV0dXJuIF9fYzsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKF9NX21vZGUgJiBpb3NfYmFzZTo6b3V0KSB7CisgICAgICAgIHRoaXMtPmdidW1wKC0xKTsKKyAgICAgICAgKnRoaXMtPmdwdHIoKSA9IF9UcmFpdHM6OnRvX2NoYXJfdHlwZShfX2MpOworICAgICAgICByZXR1cm4gX19jOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICByZXR1cm4gX1RyYWl0czo6ZW9mKCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgdGhpcy0+Z2J1bXAoLTEpOworICAgICAgcmV0dXJuIF9UcmFpdHM6Om5vdF9lb2YoX19jKTsKKyAgICB9CisgIH0KKyAgZWxzZQorICAgIHJldHVybiBfVHJhaXRzOjplb2YoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorX19CU0JfaW50X3R5cGVfXworYmFzaWNfc3RyaW5nYnVmPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6b3ZlcmZsb3coaW50X3R5cGUgX19jKSB7CisgIC8vIGZicCA6IHJldmVyc2Ugb3JkZXIgb2YgImlmcyIgdG8gcGFzcyBEaWV0bWFyJ3MgdGVzdC4KKyAgLy8gQXBwYXJlbnRseSwgc3RhbmRhcmQgYWxsb3dzIG92ZXJmbG93IHdpdGggZW9mIGV2ZW4gZm9yIHJlYWQtb25seSBzdHJlYW1zLgorICBpZiAoIV9UcmFpdHM6OmVxX2ludF90eXBlKF9fYywgX1RyYWl0czo6ZW9mKCkpKSB7CisgICAgaWYgKF9NX21vZGUgJiBpb3NfYmFzZTo6b3V0KSB7CisgICAgICBpZiAoIShfTV9tb2RlICYgaW9zX2Jhc2U6OmluKSkgeworICAgICAgICAvLyBJdCdzIGEgd3JpdGUtb25seSBzdHJlYW1idWYsIHNvIHdlIGNhbiB1c2Ugc3BlY2lhbCBhcHBlbmQgYnVmZmVyLgorICAgICAgICBpZiAodGhpcy0+cHB0cigpID09IHRoaXMtPmVwcHRyKCkpCisgICAgICAgICAgdGhpcy0+X01fYXBwZW5kX2J1ZmZlcigpOworCisgICAgICAgIGlmICh0aGlzLT5wcHRyKCkgIT0gdGhpcy0+ZXBwdHIoKSkgeworICAgICAgICAgICp0aGlzLT5wcHRyKCkgPSBfVHJhaXRzOjp0b19jaGFyX3R5cGUoX19jKTsKKyAgICAgICAgICB0aGlzLT5wYnVtcCgxKTsKKyAgICAgICAgICByZXR1cm4gX19jOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICByZXR1cm4gX1RyYWl0czo6ZW9mKCk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgLy8gV2UncmUgbm90IHVzaW5nIGEgc3BlY2lhbCBhcHBlbmQgYnVmZmVyLCBqdXN0IHRoZSBzdHJpbmcgaXRzZWxmLgorICAgICAgICBpZiAodGhpcy0+cHB0cigpID09IHRoaXMtPmVwcHRyKCkpIHsKKyAgICAgICAgICBwdHJkaWZmX3QgX19vZmZzZXQgPSB0aGlzLT5ncHRyKCkgLSB0aGlzLT5lYmFjaygpOworICAgICAgICAgIF9NX3N0ci5wdXNoX2JhY2soX1RyYWl0czo6dG9fY2hhcl90eXBlKF9fYykpOworCisgICAgICAgICAgX0NoYXJUKiBfX2RhdGFfcHRyID0gX19DT05TVF9DQVNUKF9DaGFyVCosX01fc3RyLmRhdGEoKSk7CisgICAgICAgICAgc2l6ZV90IF9fZGF0YV9zaXplID0gX01fc3RyLnNpemUoKTsKKworICAgICAgICAgIHRoaXMtPnNldGcoX19kYXRhX3B0ciwgX19kYXRhX3B0ciArIF9fb2Zmc2V0LCBfX2RhdGFfcHRyK19fZGF0YV9zaXplKTsKKyAgICAgICAgICB0aGlzLT5zZXRwKF9fZGF0YV9wdHIsIF9fZGF0YV9wdHIgKyBfX2RhdGFfc2l6ZSk7CisgICAgICAgICAgdGhpcy0+cGJ1bXAoKGludClfX2RhdGFfc2l6ZSk7CisgICAgICAgICAgcmV0dXJuIF9fYzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAqdGhpcy0+cHB0cigpID0gX1RyYWl0czo6dG9fY2hhcl90eXBlKF9fYyk7CisgICAgICAgICAgdGhpcy0+cGJ1bXAoMSk7CisgICAgICAgICAgcmV0dXJuIF9fYzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPdmVyZmxvdyBhbHdheXMgZmFpbHMgaWYgaXQncyByZWFkLW9ubHkKKyAgICAgIHJldHVybiBfVHJhaXRzOjplb2YoKTsKKyAgfQorICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgLy8gX19jIGlzIEVPRiwgc28gd2UgZG9uJ3QgaGF2ZSB0byBkbyBhbnl0aGluZworICAgIHJldHVybiBfVHJhaXRzOjpub3RfZW9mKF9fYyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK3N0cmVhbXNpemUKK2Jhc2ljX3N0cmluZ2J1ZjxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OnhzcHV0bihjb25zdCBjaGFyX3R5cGUqIF9fcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1zaXplIF9fbikgeworICBzdHJlYW1zaXplIF9fbndyaXR0ZW4gPSAwOworCisgIGlmICgoX01fbW9kZSAmIGlvc19iYXNlOjpvdXQpICYmIF9fbiA+IDApIHsKKyAgICAvLyBJZiB0aGUgcHV0IHBvaW50ZXIgaXMgc29tZXdoZXJlIGluIHRoZSBtaWRkbGUgb2YgdGhlIHN0cmluZywKKyAgICAvLyB0aGVuIG92ZXJ3cml0ZSBpbnN0ZWFkIG9mIGFwcGVuZC4KKyAgICBpZiAodGhpcy0+cGJhc2UoKSA9PSBfTV9zdHIuZGF0YSgpICkgeworICAgICAgcHRyZGlmZl90IF9fYXZhaWwgPSBfTV9zdHIuZGF0YSgpICsgX01fc3RyLnNpemUoKSAtIHRoaXMtPnBwdHIoKTsKKyAgICAgIGlmIChfX2F2YWlsID4gX19uKSB7CisgICAgICAgIF9UcmFpdHM6OmNvcHkodGhpcy0+cHB0cigpLCBfX3MsIF9fU1RBVElDX0NBU1Qoc2l6ZV90LCBfX24pKTsKKyAgICAgICAgdGhpcy0+cGJ1bXAoKGludClfX24pOworICAgICAgICByZXR1cm4gX19uOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIF9UcmFpdHM6OmNvcHkodGhpcy0+cHB0cigpLCBfX3MsIF9fYXZhaWwpOworICAgICAgICBfX253cml0dGVuICs9IF9fYXZhaWw7CisgICAgICAgIF9fbiAtPSBfX2F2YWlsOworICAgICAgICBfX3MgKz0gX19hdmFpbDsKKyAgICAgICAgdGhpcy0+c2V0cChfTV9CdWYsIF9NX0J1ZiArIF9fU1RBVElDX0NBU1QoaW50LF9TX0J1ZlNpeikpOworICAgICAgfQorICAgIH0KKworICAgIC8vIEF0IHRoaXMgcG9pbnQgd2Uga25vdyB3ZSdyZSBhcHBlbmRpbmcuCisgICAgaWYgKF9NX21vZGUgJiBpb3NfYmFzZTo6aW4pIHsKKyAgICAgIHB0cmRpZmZfdCBfX2dldF9vZmZzZXQgPSB0aGlzLT5ncHRyKCkgLSB0aGlzLT5lYmFjaygpOworICAgICAgX01fc3RyLmFwcGVuZChfX3MsIF9fcyArIF9fU1RBVElDX0NBU1QocHRyZGlmZl90LCBfX24pKTsKKworICAgICAgX0NoYXJUKiBfX2RhdGFfcHRyID0gX19DT05TVF9DQVNUKF9DaGFyVCosIF9NX3N0ci5kYXRhKCkpOworICAgICAgc2l6ZV90IF9fZGF0YV9zaXplID0gX01fc3RyLnNpemUoKTsKKworICAgICAgdGhpcy0+c2V0ZyhfX2RhdGFfcHRyLCBfX2RhdGFfcHRyICsgX19nZXRfb2Zmc2V0LCBfX2RhdGFfcHRyICsgX19kYXRhX3NpemUpOworICAgICAgdGhpcy0+c2V0cChfX2RhdGFfcHRyLCBfX2RhdGFfcHRyICsgX19kYXRhX3NpemUpOworICAgICAgdGhpcy0+cGJ1bXAoKGludClfX2RhdGFfc2l6ZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgX01fYXBwZW5kX2J1ZmZlcigpOworICAgICAgX01fc3RyLmFwcGVuZChfX3MsIF9fcyArIF9fU1RBVElDX0NBU1QocHRyZGlmZl90LCBfX24pKTsKKyAgICB9CisKKyAgICBfX253cml0dGVuICs9IF9fbjsKKyAgfQorCisgIHJldHVybiBfX253cml0dGVuOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CitzdHJlYW1zaXplCitiYXNpY19zdHJpbmdidWY8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjpfTV94c3B1dG5jKGNoYXJfdHlwZSBfX2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbXNpemUgX19uKSB7CisgIHN0cmVhbXNpemUgX19ud3JpdHRlbiA9IDA7CisKKyAgaWYgKChfTV9tb2RlICYgaW9zX2Jhc2U6Om91dCkgJiYgX19uID4gMCkgeworICAgIC8vIElmIHRoZSBwdXQgcG9pbnRlciBpcyBzb21ld2hlcmUgaW4gdGhlIG1pZGRsZSBvZiB0aGUgc3RyaW5nLAorICAgIC8vIHRoZW4gb3ZlcndyaXRlIGluc3RlYWQgb2YgYXBwZW5kLgorICAgIGlmICh0aGlzLT5wYmFzZSgpID09IF9NX3N0ci5kYXRhKCkpIHsKKyAgICAgIHB0cmRpZmZfdCBfX2F2YWlsID0gX01fc3RyLmRhdGEoKSArIF9NX3N0ci5zaXplKCkgLSB0aGlzLT5wcHRyKCk7CisgICAgICBpZiAoX19hdmFpbCA+IF9fbikgeworICAgICAgICBfVHJhaXRzOjphc3NpZ24odGhpcy0+cHB0cigpLCBfX1NUQVRJQ19DQVNUKHNpemVfdCwgX19uKSwgX19jKTsKKyAgICAgICAgdGhpcy0+cGJ1bXAoX19TVEFUSUNfQ0FTVChpbnQsIF9fbikpOworICAgICAgICByZXR1cm4gX19uOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIF9UcmFpdHM6OmFzc2lnbih0aGlzLT5wcHRyKCksIF9fYXZhaWwsIF9fYyk7CisgICAgICAgIF9fbndyaXR0ZW4gKz0gX19hdmFpbDsKKyAgICAgICAgX19uIC09IF9fYXZhaWw7CisgICAgICAgIHRoaXMtPnNldHAoX01fQnVmLCBfTV9CdWYgKyBfX1NUQVRJQ19DQVNUKGludCxfU19CdWZTaXopKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBBdCB0aGlzIHBvaW50IHdlIGtub3cgd2UncmUgYXBwZW5kaW5nLgorICAgIHNpemVfdCBfX2FwcF9zaXplID0gc2l6ZW9mKHN0cmVhbXNpemUpID4gc2l6ZW9mKHNpemVfdCkgPyBfX1NUQVRJQ19DQVNUKHNpemVfdCwgKG1pbikoX19uLCBfX1NUQVRJQ19DQVNUKHN0cmVhbXNpemUsIF9NX3N0ci5tYXhfc2l6ZSgpKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF9fU1RBVElDX0NBU1Qoc2l6ZV90LCBfX24pOworICAgIGlmICh0aGlzLT5fTV9tb2RlICYgaW9zX2Jhc2U6OmluKSB7CisgICAgICBwdHJkaWZmX3QgX19nZXRfb2Zmc2V0ID0gdGhpcy0+Z3B0cigpIC0gdGhpcy0+ZWJhY2soKTsKKyAgICAgIF9NX3N0ci5hcHBlbmQoX19hcHBfc2l6ZSwgX19jKTsKKworICAgICAgX0NoYXJUKiBfX2RhdGFfcHRyID0gX19DT05TVF9DQVNUKF9DaGFyVCosX01fc3RyLmRhdGEoKSk7CisgICAgICBzaXplX3QgX19kYXRhX3NpemUgPSBfTV9zdHIuc2l6ZSgpOworCisgICAgICB0aGlzLT5zZXRnKF9fZGF0YV9wdHIsIF9fZGF0YV9wdHIgKyBfX2dldF9vZmZzZXQsIF9fZGF0YV9wdHIgKyBfX2RhdGFfc2l6ZSk7CisgICAgICB0aGlzLT5zZXRwKF9fZGF0YV9wdHIsIF9fZGF0YV9wdHIgKyBfX2RhdGFfc2l6ZSk7CisgICAgICB0aGlzLT5wYnVtcCgoaW50KV9fZGF0YV9zaXplKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBfTV9hcHBlbmRfYnVmZmVyKCk7CisgICAgICBfTV9zdHIuYXBwZW5kKF9fYXBwX3NpemUsIF9fYyk7CisgICAgfQorCisgICAgX19ud3JpdHRlbiArPSBfX2FwcF9zaXplOworICB9CisKKyAgcmV0dXJuIF9fbndyaXR0ZW47Cit9CisKKy8vIEFjY29yZGluZyB0byB0aGUgQysrIHN0YW5kYXJkIHRoZSBlZmZlY3RzIG9mIHNldGJ1ZiBhcmUgaW1wbGVtZW50YXRpb24KKy8vIGRlZmluZWQsIGV4Y2VwdCB0aGF0IHNldGJ1ZigwLCAwKSBoYXMgbm8gZWZmZWN0LiAgSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiwKKy8vIHNldGJ1Zig8YW55dGhpbmc+LCBuKSwgZm9yIG4gPiAwLCBjYWxscyByZXNlcnZlKG4pIG9uIHRoZSB1bmRlcmx5aW5nCisvLyBzdHJpbmcuCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CitiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPioKK2Jhc2ljX3N0cmluZ2J1ZjxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OnNldGJ1ZihfQ2hhclQqLCBzdHJlYW1zaXplIF9fbikgeworICBpZiAoX19uID4gMCkgeworICAgIGJvb2wgX19kb19nZXRfYXJlYSA9IGZhbHNlOworICAgIGJvb2wgX19kb19wdXRfYXJlYSA9IGZhbHNlOworICAgIHB0cmRpZmZfdCBfX29mZmcgPSAwOworICAgIHB0cmRpZmZfdCBfX29mZnAgPSAwOworCisgICAgaWYgKHRoaXMtPnBiYXNlKCkgPT0gX01fc3RyLmRhdGEoKSkgeworICAgICAgX19kb19wdXRfYXJlYSA9IHRydWU7CisgICAgICBfX29mZnAgPSB0aGlzLT5wcHRyKCkgLSB0aGlzLT5wYmFzZSgpOworICAgIH0KKworICAgIGlmICh0aGlzLT5lYmFjaygpID09IF9NX3N0ci5kYXRhKCkpIHsKKyAgICAgIF9fZG9fZ2V0X2FyZWEgPSB0cnVlOworICAgICAgX19vZmZnID0gdGhpcy0+Z3B0cigpIC0gdGhpcy0+ZWJhY2soKTsKKyAgICB9CisKKyAgICBpZiAoKF9NX21vZGUgJiBpb3NfYmFzZTo6b3V0KSAmJiAhKF9NX21vZGUgJiBpb3NfYmFzZTo6aW4pKQorICAgICAgX01fYXBwZW5kX2J1ZmZlcigpOworCisgICAgX01fc3RyLnJlc2VydmUoc2l6ZW9mKHN0cmVhbXNpemUpID4gc2l6ZW9mKHNpemVfdCkgPyBfX1NUQVRJQ19DQVNUKHNpemVfdCwgKG1pbikoX19uLCBfX1NUQVRJQ19DQVNUKHN0cmVhbXNpemUsIF9NX3N0ci5tYXhfc2l6ZSgpKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfX1NUQVRJQ19DQVNUKHNpemVfdCwgX19uKSk7CisKKyAgICBfQ2hhclQqIF9fZGF0YV9wdHIgPSBfX0NPTlNUX0NBU1QoX0NoYXJUKiwgX01fc3RyLmRhdGEoKSk7CisgICAgc2l6ZV90IF9fZGF0YV9zaXplID0gX01fc3RyLnNpemUoKTsKKworICAgIGlmIChfX2RvX2dldF9hcmVhKSB7CisgICAgICB0aGlzLT5zZXRnKF9fZGF0YV9wdHIsIF9fZGF0YV9wdHIgKyBfX29mZmcsIF9fZGF0YV9wdHIgKyBfX2RhdGFfc2l6ZSk7CisgICAgfQorCisgICAgaWYgKF9fZG9fcHV0X2FyZWEpIHsKKyAgICAgIHRoaXMtPnNldHAoX19kYXRhX3B0ciwgX19kYXRhX3B0ciArIF9fZGF0YV9zaXplKTsKKyAgICAgIHRoaXMtPnBidW1wKChpbnQpX19vZmZwKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorX19CU0JfcG9zX3R5cGVfXworYmFzaWNfc3RyaW5nYnVmPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPgorICA6OnNlZWtvZmYob2ZmX3R5cGUgX19vZmYsCisgICAgICAgICAgICBpb3NfYmFzZTo6c2Vla2RpciBfX2RpciwKKyAgICAgICAgICAgIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUpIHsKKyAgX19tb2RlICY9IF9NX21vZGU7CisKKyAgYm9vbCBfX2ltb2RlICA9IChfX21vZGUgJiBpb3NfYmFzZTo6aW4pICE9IDA7CisgIGJvb2wgX19vbW9kZSA9IChfX21vZGUgJiBpb3NfYmFzZTo6b3V0KSAhPSAwOworCisgIGlmICggIShfX2ltb2RlIHx8IF9fb21vZGUpICkKKyAgICByZXR1cm4gcG9zX3R5cGUob2ZmX3R5cGUoLTEpKTsKKworICBpZiAoIChfX2ltb2RlICYmICh0aGlzLT5ncHRyKCkgPT0gMCkpIHx8IChfX29tb2RlICYmICh0aGlzLT5wcHRyKCkgPT0gMCkpICkKKyAgICByZXR1cm4gcG9zX3R5cGUob2ZmX3R5cGUoLTEpKTsKKworICBpZiAoKF9NX21vZGUgJiBpb3NfYmFzZTo6b3V0KSAmJiAhKF9NX21vZGUgJiBpb3NfYmFzZTo6aW4pKQorICAgIF9NX2FwcGVuZF9idWZmZXIoKTsKKworICBzdHJlYW1vZmYgX19uZXdvZmY7CisgIHN3aXRjaChfX2RpcikgeworICBjYXNlIGlvc19iYXNlOjpiZWc6CisgICAgX19uZXdvZmYgPSAwOworICAgIGJyZWFrOworICBjYXNlIGlvc19iYXNlOjplbmQ6CisgICAgX19uZXdvZmYgPSBfTV9zdHIuc2l6ZSgpOworICAgIGJyZWFrOworICBjYXNlIGlvc19iYXNlOjpjdXI6CisgICAgX19uZXdvZmYgPSBfX2ltb2RlID8gdGhpcy0+Z3B0cigpIC0gdGhpcy0+ZWJhY2soKSA6IHRoaXMtPnBwdHIoKSAtIHRoaXMtPnBiYXNlKCk7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIHBvc190eXBlKG9mZl90eXBlKC0xKSk7CisgIH0KKworICBfX29mZiArPSBfX25ld29mZjsKKworICBpZiAoX19pbW9kZSkgeworICAgIHB0cmRpZmZfdCBfX24gPSB0aGlzLT5lZ3B0cigpIC0gdGhpcy0+ZWJhY2soKTsKKworICAgIGlmIChfX29mZiA8IDAgfHwgX19vZmYgPiBfX24pCisgICAgICByZXR1cm4gcG9zX3R5cGUob2ZmX3R5cGUoLTEpKTsKKyAgICB0aGlzLT5zZXRnKHRoaXMtPmViYWNrKCksIHRoaXMtPmViYWNrKCkgKyBfX1NUQVRJQ19DQVNUKHB0cmRpZmZfdCwgX19vZmYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+ZWJhY2soKSArIF9fU1RBVElDX0NBU1QocHRyZGlmZl90LCBfX24pKTsKKyAgfQorCisgIGlmIChfX29tb2RlKSB7CisgICAgcHRyZGlmZl90IF9fbiA9IHRoaXMtPmVwcHRyKCkgLSB0aGlzLT5wYmFzZSgpOworCisgICAgaWYgKF9fb2ZmIDwgMCB8fCBfX29mZiA+IF9fbikKKyAgICAgIHJldHVybiBwb3NfdHlwZShvZmZfdHlwZSgtMSkpOworICAgIHRoaXMtPnNldHAodGhpcy0+cGJhc2UoKSwgdGhpcy0+cGJhc2UoKSArIF9fbik7CisgICAgdGhpcy0+cGJ1bXAoKGludClfX29mZik7CisgIH0KKworICByZXR1cm4gcG9zX3R5cGUoX19vZmYpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CitfX0JTQl9wb3NfdHlwZV9fCitiYXNpY19zdHJpbmdidWY8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+CisgIDo6c2Vla3Bvcyhwb3NfdHlwZSBfX3BvcywgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSkgeworICBfX21vZGUgJj0gX01fbW9kZTsKKworICBib29sIF9faW1vZGUgID0gKF9fbW9kZSAmIGlvc19iYXNlOjppbikgIT0gMDsKKyAgYm9vbCBfX29tb2RlID0gKF9fbW9kZSAmIGlvc19iYXNlOjpvdXQpICE9IDA7CisKKyAgaWYgKCAhKF9faW1vZGUgfHwgX19vbW9kZSkgKQorICAgIHJldHVybiBwb3NfdHlwZShvZmZfdHlwZSgtMSkpOworCisgIGlmICggKF9faW1vZGUgJiYgKHRoaXMtPmdwdHIoKSA9PSAwKSkgfHwgKF9fb21vZGUgJiYgKHRoaXMtPnBwdHIoKSA9PSAwKSkgKQorICAgIHJldHVybiBwb3NfdHlwZShvZmZfdHlwZSgtMSkpOworCisgIGNvbnN0IG9mZl90eXBlIF9fbiA9IF9fcG9zIC0gcG9zX3R5cGUob2ZmX3R5cGUoMCkpOworICBpZiAoKF9NX21vZGUgJiBpb3NfYmFzZTo6b3V0KSAmJiAhKF9NX21vZGUgJiBpb3NfYmFzZTo6aW4pKQorICAgIF9NX2FwcGVuZF9idWZmZXIoKTsKKworICBpZiAoX19pbW9kZSkgeworICAgIGlmIChfX24gPCAwIHx8IF9fbiA+IHRoaXMtPmVncHRyKCkgLSB0aGlzLT5lYmFjaygpKQorICAgICAgcmV0dXJuIHBvc190eXBlKG9mZl90eXBlKC0xKSk7CisgICAgdGhpcy0+c2V0Zyh0aGlzLT5lYmFjaygpLCB0aGlzLT5lYmFjaygpICsgX19TVEFUSUNfQ0FTVChwdHJkaWZmX3QsIF9fbiksIHRoaXMtPmVncHRyKCkpOworICB9CisKKyAgaWYgKF9fb21vZGUpIHsKKyAgICBpZiAoX19uIDwgMCB8fCBzaXplX3QoX19uKSA+IF9NX3N0ci5zaXplKCkpCisgICAgICByZXR1cm4gcG9zX3R5cGUob2ZmX3R5cGUoLTEpKTsKKworICAgIF9DaGFyVCogX19kYXRhX3B0ciA9IF9fQ09OU1RfQ0FTVChfQ2hhclQqLF9NX3N0ci5kYXRhKCkpOworICAgIHNpemVfdCBfX2RhdGFfc2l6ZSA9IF9NX3N0ci5zaXplKCk7CisKKyAgICB0aGlzLT5zZXRwKF9fZGF0YV9wdHIsIF9fZGF0YV9wdHIrX19kYXRhX3NpemUpOworICAgIHRoaXMtPnBidW1wKChpbnQpX19uKTsKKyAgfQorCisgIHJldHVybiBfX3BvczsKK30KKworLy8gVGhpcyBpcyBkZWNsYXJlZCBhcyBhIGNvbnN0IG1lbWJlciBmdW5jdGlvbiBiZWNhdXNlIGl0IGlzCisvLyBjYWxsZWQgYnkgYmFzaWNfc3RyaW5nYnVmPD46OnN0cigpLiAgUHJlY29uZGl0aW9uOiB0aGlzIGlzIGEKKy8vIHdyaXRlLW9ubHkgc3RyaW5nYnVmLiAgV2UgY2FuJ3QgdXNlIGFuIG91dHB1dCBidWZmZXIgZm9yIHJlYWQtCisvLyB3cml0ZSBzdHJpbmdidWZzLiAgUG9zdGNvbmRpdGlvbjogcHB0ciBpcyByZXNldCB0byB0aGUgYmVnaW5uaW5nCisvLyBvZiB0aGUgYnVmZmVyLgordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgordm9pZCBiYXNpY19zdHJpbmdidWY8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjpfTV9hcHBlbmRfYnVmZmVyKCkgY29uc3QgeworICAvLyBEbyB3ZSBoYXZlIGEgYnVmZmVyIHRvIGFwcGVuZD8KKyAgaWYgKHRoaXMtPnBiYXNlKCkgPT0gdGhpcy0+X01fQnVmICYmIHRoaXMtPnBwdHIoKSAhPSB0aGlzLT5fTV9CdWYpIHsKKyAgICBiYXNpY19zdHJpbmdidWY8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+KiBfX3RoaXMgPSBfX0NPTlNUX0NBU1QoX1NlbGYqLHRoaXMpOworICAgIF9fdGhpcy0+X01fc3RyLmFwcGVuZCgoY29uc3QgX0NoYXJUKil0aGlzLT5wYmFzZSgpLCAoY29uc3QgX0NoYXJUKil0aGlzLT5wcHRyKCkpOworI2lmbmRlZiBfX01XRVJLU19fCisgICAgX190aGlzLT5zZXRwKF9fQ09OU1RfQ0FTVChfQ2hhclQqLF9NX0J1ZiksCisgICAgICAgICAgICAgICAgIF9fQ09OU1RfQ0FTVChfQ2hhclQqLF9NX0J1ZiArIF9fU1RBVElDX0NBU1QoaW50LF9TX0J1ZlNpeikpKTsKKyNlbHNlIC8vIENvZGVXYXJyaW9yIHRyZWF0IGNvbnN0IGNoYXIgKiBhbmQgY29uc3QgY2hhciBbOF0gYXMgZGlmZmVyZW50IHR5cGVzCisgICAgX190aGlzLT5zZXRwKChfQ2hhclQqKV9NX0J1ZiwKKyAgICAgICAgICAgICAgICAgKF9DaGFyVCopKF9NX0J1ZiArIF9fU1RBVElDX0NBU1QoaW50LF9TX0J1ZlNpeikpKTsKKyNlbmRpZgorICB9CisKKyAgLy8gSGF2ZSB3ZSBydW4gb2ZmIHRoZSBlbmQgb2YgdGhlIHN0cmluZz8KKyAgZWxzZSBpZiAodGhpcy0+cHB0cigpID09IHRoaXMtPmVwcHRyKCkpIHsKKyAgICBiYXNpY19zdHJpbmdidWY8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+KiBfX3RoaXMgPSBfX0NPTlNUX0NBU1QoX1NlbGYqLHRoaXMpOworI2lmbmRlZiBfX01XRVJLU19fCisgICAgX190aGlzLT5zZXRwKF9fQ09OU1RfQ0FTVChfQ2hhclQqLF9NX0J1ZiksCisgICAgICAgICAgICAgICAgIF9fQ09OU1RfQ0FTVChfQ2hhclQqLF9NX0J1ZiArIF9fU1RBVElDX0NBU1QoaW50LF9TX0J1ZlNpeikpKTsKKyNlbHNlIC8vIENvZGVXYXJyaW9yIHRyZWF0IGNvbnN0IGNoYXIgKiBhbmQgY29uc3QgY2hhciBbOF0gYXMgZGlmZmVyZW50IHR5cGVzCisgICAgX190aGlzLT5zZXRwKChfQ2hhclQqKV9NX0J1ZiwKKyAgICAgICAgICAgICAgICAgKF9DaGFyVCopKF9NX0J1ZiArIF9fU1RBVElDX0NBU1QoaW50LF9TX0J1ZlNpeikpKTsKKyNlbmRpZgorICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTm9uLWlubGluZSBpc3RyaW5nc3RyZWFtIG1lbWJlciBmdW5jdGlvbnMuCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK2Jhc2ljX2lzdHJpbmdzdHJlYW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+CisgIDo6YmFzaWNfaXN0cmluZ3N0cmVhbShpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlKQorICAgIDogYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+KDApLAorICAgICAgX01fYnVmKF9fbW9kZSB8IGlvc19iYXNlOjppbikgeworICB0aGlzLT5pbml0KCZfTV9idWYpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CitiYXNpY19pc3RyaW5nc3RyZWFtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPgorICA6OmJhc2ljX2lzdHJpbmdzdHJlYW0oY29uc3QgX1N0cmluZyYgX19zdHIsaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSkKKyAgICA6IGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPigwKSwKKyAgICAgIF9NX2J1ZihfX3N0ciwgX19tb2RlIHwgaW9zX2Jhc2U6OmluKSB7CisgIHRoaXMtPmluaXQoJl9NX2J1Zik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK2Jhc2ljX2lzdHJpbmdzdHJlYW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+Ojp+YmFzaWNfaXN0cmluZ3N0cmVhbSgpCit7fQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE5vbi1pbmxpbmUgb3N0cmluZ3N0cmVhbSBtZW1iZXIgZnVuY3Rpb25zLgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CitiYXNpY19vc3RyaW5nc3RyZWFtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPgorICA6OmJhc2ljX29zdHJpbmdzdHJlYW0oaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSkKKyAgICA6IGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPigwKSwKKyAgICAgIF9NX2J1ZihfX21vZGUgfCBpb3NfYmFzZTo6b3V0KSB7CisgIHRoaXMtPmluaXQoJl9NX2J1Zik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK2Jhc2ljX29zdHJpbmdzdHJlYW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+CisgIDo6YmFzaWNfb3N0cmluZ3N0cmVhbShjb25zdCBfU3RyaW5nJiBfX3N0ciwgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSkKKyAgICA6IGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPigwKSwKKyAgICAgIF9NX2J1ZihfX3N0ciwgX19tb2RlIHwgaW9zX2Jhc2U6Om91dCkgeworICB0aGlzLT5pbml0KCZfTV9idWYpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CitiYXNpY19vc3RyaW5nc3RyZWFtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6fmJhc2ljX29zdHJpbmdzdHJlYW0oKQore30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBOb24taW5saW5lIHN0cmluZ3N0cmVhbSBtZW1iZXIgZnVuY3Rpb25zLgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CitiYXNpY19zdHJpbmdzdHJlYW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+CisgIDo6YmFzaWNfc3RyaW5nc3RyZWFtKGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUpCisgICAgOiBiYXNpY19pb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+KDApLCBfTV9idWYoX19tb2RlKSB7CisgICB0aGlzLT5pbml0KCZfTV9idWYpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CitiYXNpY19zdHJpbmdzdHJlYW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+CisgIDo6YmFzaWNfc3RyaW5nc3RyZWFtKGNvbnN0IF9TdHJpbmcmIF9fc3RyLCBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlKQorICAgIDogYmFzaWNfaW9zdHJlYW08X0NoYXJULCBfVHJhaXRzPigwKSwgX01fYnVmKF9fc3RyLCBfX21vZGUpIHsKKyAgdGhpcy0+aW5pdCgmX01fYnVmKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorYmFzaWNfc3RyaW5nc3RyZWFtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6fmJhc2ljX3N0cmluZ3N0cmVhbSgpCit7fQorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyMgdW5kZWYgX19CU0JfaW50X3R5cGVfXworIyB1bmRlZiBfX0JTQl9wb3NfdHlwZV9fCisKKyNlbmRpZiAvKiBfU1RMUF9TU1RSRUFNX0MgKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9fc3N0cmVhbS5oIGIvc3RsL19zc3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODIzOTY0OAotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9fc3N0cmVhbS5oCkBAIC0wLDAgKzEsMjY5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisKKy8vIFRoaXMgaGVhZGVyIGRlZmluZXMgY2xhc3NlcyBiYXNpY19zdHJpbmdidWYsIGJhc2ljX2lzdHJpbmdzdHJlYW0sCisvLyBiYXNpY19vc3RyaW5nc3RyZWFtLCBhbmQgYmFzaWNfc3RyaW5nc3RyZWFtLiAgVGhlc2UgY2xhc3NlcworLy8gcmVwcmVzZW50IHN0cmVhbXNidWZzIGFuZCBzdHJlYW1zIHdob3NlIHNvdXJjZXMgb3IgZGVzdGluYXRpb25zIGFyZQorLy8gQysrIHN0cmluZ3MuCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfU1NUUkVBTQorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9TU1RSRUFNCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfU1RSRUFNQlVGCisjICBpbmNsdWRlIDxzdGwvX3N0cmVhbWJ1Zi5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfSVNUUkVBTQorIyAgaW5jbHVkZSA8c3RsL19pc3RyZWFtLmg+IC8vIEluY2x1ZGVzIDxvc3RyZWFtPiwgPGlvcz4sIDxpb3Nmd2Q+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9TVFJJTkdfSAorIyAgaW5jbHVkZSA8c3RsL19zdHJpbmcuaD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUaGlzIHZlcnNpb24gb2YgYmFzaWNfc3RyaW5nYnVmIHJlbGllcyBvbiB0aGUgaW50ZXJuYWwgZGV0YWlscyBvZgorLy8gYmFzaWNfc3RyaW5nLiAgSXQgcmVsaWVzIG9uIHRoZSBmYWN0IHRoYXQsIGluIHRoaXMgaW1wbGVtZW50YXRpb24sCisvLyBiYXNpY19zdHJpbmcncyBpdGVyYXRvcnMgYXJlIHBvaW50ZXJzLiAgSXQgYWxzbyBhc3N1bWVzIChhcyBhbGxvd2VkCisvLyBieSB0aGUgc3RhbmRhcmQpIHRoYXQgX0NoYXJUIGlzIGEgUE9EIHR5cGUuCisKKy8vIFdlIGhhdmUgYSB2ZXJ5IHNtYWxsIGJ1ZmZlciBmb3IgdGhlIHB1dCBhcmVhLCBqdXN0IHNvIHRoYXQgd2UgZG9uJ3QKKy8vIGhhdmUgdG8gdXNlIGFwcGVuZCgpIGZvciBldmVyeSBzcHV0Yy4gIENvbmNlcHR1YWxseSwgdGhlIGJ1ZmZlcgorLy8gaW1tZWRpYXRlbHkgZm9sbG93cyB0aGUgZW5kIG9mIHRoZSB1bmRlcmx5aW5nIHN0cmluZy4gIFdlIHVzZSB0aGlzCisvLyBidWZmZXIgd2hlbiBhcHBlbmRpbmcgdG8gd3JpdGUtb25seSBzdHJlYW1idWZzLCBidXQgd2UgZG9uJ3QgdXNlIGl0CisvLyBmb3IgcmVhZC13cml0ZSBzdHJlYW1idWZzLgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CitjbGFzcyBiYXNpY19zdHJpbmdidWYgOiBwdWJsaWMgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4geworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUeXBlZGVmcy4KKyAgdHlwZWRlZiBfQ2hhclQgICAgICAgICAgICAgICAgICAgICBjaGFyX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6aW50X3R5cGUgaW50X3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6cG9zX3R5cGUgcG9zX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6b2ZmX3R5cGUgb2ZmX3R5cGU7CisgIHR5cGVkZWYgX1RyYWl0cyAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3R5cGU7CisKKyAgdHlwZWRlZiBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiAgICAgICAgICBfQmFzZTsKKyAgdHlwZWRlZiBiYXNpY19zdHJpbmdidWY8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+ICBfU2VsZjsKKyAgdHlwZWRlZiBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+ICAgICBfU3RyaW5nOworCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbnN0cnVjdG9ycywgZGVzdHJ1Y3Rvci4KKyAgZXhwbGljaXQgYmFzaWNfc3RyaW5nYnVmKGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0KTsKKyAgZXhwbGljaXQgYmFzaWNfc3RyaW5nYnVmKGNvbnN0IF9TdHJpbmcmIF9fcywgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpOworICB2aXJ0dWFsIH5iYXNpY19zdHJpbmdidWYoKTsKKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHZXQgb3Igc2V0IHRoZSBzdHJpbmcuCisgIF9TdHJpbmcgc3RyKCkgY29uc3QgeyBfTV9hcHBlbmRfYnVmZmVyKCk7IHJldHVybiBfTV9zdHI7IH0KKyAgdm9pZCBzdHIoY29uc3QgX1N0cmluZyYgX19zKTsKKworcHJvdGVjdGVkOiAgICAgICAgICAgICAgICAgICAgICAvLyBPdmVycmlkZGVuIHZpcnR1YWwgbWVtYmVyIGZ1bmN0aW9ucy4KKyAgdmlydHVhbCBpbnRfdHlwZSB1bmRlcmZsb3coKTsKKyAgdmlydHVhbCBpbnRfdHlwZSB1ZmxvdygpOworICB2aXJ0dWFsIGludF90eXBlIHBiYWNrZmFpbChpbnRfdHlwZSBfX2MpOworICB2aXJ0dWFsIGludF90eXBlIG92ZXJmbG93KGludF90eXBlIF9fYyk7CisgIGludF90eXBlIHBiYWNrZmFpbCgpIHtyZXR1cm4gcGJhY2tmYWlsKF9UcmFpdHM6OmVvZigpKTt9CisgIGludF90eXBlIG92ZXJmbG93KCkge3JldHVybiBvdmVyZmxvdyhfVHJhaXRzOjplb2YoKSk7fQorCisgIHZpcnR1YWwgc3RyZWFtc2l6ZSB4c3B1dG4oY29uc3QgY2hhcl90eXBlKiBfX3MsIHN0cmVhbXNpemUgX19uKTsKKyAgdmlydHVhbCBzdHJlYW1zaXplIF9NX3hzcHV0bmMoY2hhcl90eXBlIF9fYywgc3RyZWFtc2l6ZSBfX24pOworCisgIHZpcnR1YWwgX0Jhc2UqIHNldGJ1ZihfQ2hhclQqIF9fYnVmLCBzdHJlYW1zaXplIF9fbik7CisgIHZpcnR1YWwgcG9zX3R5cGUgc2Vla29mZihvZmZfdHlwZSBfX29mZiwgaW9zX2Jhc2U6OnNlZWtkaXIgX19kaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6Om91dCk7CisgIHZpcnR1YWwgcG9zX3R5cGUgc2Vla3Bvcyhwb3NfdHlwZSBfX3BvcywgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpOworCitwcml2YXRlOiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhlbHBlciBmdW5jdGlvbnMuCisgIC8vIEFwcGVuZCB0aGUgaW50ZXJuYWwgYnVmZmVyIHRvIHRoZSBzdHJpbmcgaWYgbmVjZXNzYXJ5LgorICB2b2lkIF9NX2FwcGVuZF9idWZmZXIoKSBjb25zdDsKKyAgdm9pZCBfTV9zZXRfcHRycygpOworCitwcml2YXRlOgorICBpb3NfYmFzZTo6b3Blbm1vZGUgX01fbW9kZTsKKyAgbXV0YWJsZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+IF9NX3N0cjsKKworICBlbnVtIF9KdXN0TmFtZSB7IF9TX0J1ZlNpeiA9IDggfTsKKyAgX0NoYXJUIF9NX0J1ZlsgOCAvKiBfU19CdWZTaXogKi9dOworfTsKKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9URU1QTEFURV9FWFBPUlQpCitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgYmFzaWNfc3RyaW5nYnVmPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+LCBhbGxvY2F0b3I8Y2hhcj4gPjsKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQorX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIGJhc2ljX3N0cmluZ2J1Zjx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiwgYWxsb2NhdG9yPHdjaGFyX3Q+ICA+OworIyAgZW5kaWYKKyNlbmRpZiAvKiBfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUICovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ2xhc3MgYmFzaWNfaXN0cmluZ3N0cmVhbSwgYW4gaW5wdXQgc3RyZWFtIHRoYXQgdXNlcyBhIHN0cmluZ2J1Zi4KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorY2xhc3MgYmFzaWNfaXN0cmluZ3N0cmVhbSA6IHB1YmxpYyBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4geworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUeXBlZGVmcworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OmNoYXJfdHlwZSAgIGNoYXJfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjppbnRfdHlwZSAgICBpbnRfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpwb3NfdHlwZSAgICBwb3NfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpvZmZfdHlwZSAgICBvZmZfdHlwZTsKKyAgdHlwZWRlZiBfVHJhaXRzIHRyYWl0c190eXBlOworCisgIHR5cGVkZWYgYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz4gICAgICAgICAgICAgICAgX0Jhc2ljX2lvczsKKyAgdHlwZWRlZiBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gICAgICAgICAgICBfQmFzZTsKKyAgdHlwZWRlZiBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+ICAgICBfU3RyaW5nOworICB0eXBlZGVmIGJhc2ljX3N0cmluZ2J1ZjxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4gIF9CdWY7CisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29uc3RydWN0b3JzLCBkZXN0cnVjdG9yLgorICBiYXNpY19pc3RyaW5nc3RyZWFtKGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUgPSBpb3NfYmFzZTo6aW4pOworICBiYXNpY19pc3RyaW5nc3RyZWFtKGNvbnN0IF9TdHJpbmcmIF9fc3RyLAorICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUgPSBpb3NfYmFzZTo6aW4pOworICB+YmFzaWNfaXN0cmluZ3N0cmVhbSgpOworCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1lbWJlciBmdW5jdGlvbnMKKworICBiYXNpY19zdHJpbmdidWY8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+KiByZGJ1ZigpIGNvbnN0CisgICAgeyByZXR1cm4gX19DT05TVF9DQVNUKF9CdWYqLCZfTV9idWYpOyB9CisKKyAgX1N0cmluZyBzdHIoKSBjb25zdCB7IHJldHVybiBfTV9idWYuc3RyKCk7IH0KKyAgdm9pZCBzdHIoY29uc3QgX1N0cmluZyYgX19zKSB7IF9NX2J1Zi5zdHIoX19zKTsgfQorCitwcml2YXRlOgorICBiYXNpY19zdHJpbmdidWY8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+IF9NX2J1ZjsKKworI2lmIGRlZmluZWQgKF9TVExQX01TVkMpICYmIChfU1RMUF9NU1ZDID49IDEzMDAgJiYgX1NUTFBfTVNWQyA8PSAxMzEwKQorICB0eXBlZGVmIGJhc2ljX2lzdHJpbmdzdHJlYW08X0NoYXJULCBfVHJhaXRzPiBfU2VsZjsKKyAgLy9leHBsaWNpdGVseSBkZWZpbmVkIGFzIHByaXZhdGUgdG8gYXZvaWQgd2FybmluZ3M6CisgIGJhc2ljX2lzdHJpbmdzdHJlYW0oX1NlbGYgY29uc3QmKTsKKyAgX1NlbGYmIG9wZXJhdG9yID0gKF9TZWxmIGNvbnN0Jik7CisjZW5kaWYKK307CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDbGFzcyBiYXNpY19vc3RyaW5nc3RyZWFtLCBhbiBvdXRwdXQgc3RyZWFtIHRoYXQgdXNlcyBhIHN0cmluZ2J1Zi4KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorY2xhc3MgYmFzaWNfb3N0cmluZ3N0cmVhbSA6IHB1YmxpYyBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4geworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUeXBlZGVmcworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OmNoYXJfdHlwZSAgIGNoYXJfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjppbnRfdHlwZSAgICBpbnRfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpwb3NfdHlwZSAgICBwb3NfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpvZmZfdHlwZSAgICBvZmZfdHlwZTsKKyAgdHlwZWRlZiBfVHJhaXRzIHRyYWl0c190eXBlOworCisgIHR5cGVkZWYgYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz4gICAgICAgICAgICAgICAgX0Jhc2ljX2lvczsKKyAgdHlwZWRlZiBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gICAgICAgICAgICBfQmFzZTsKKyAgdHlwZWRlZiBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+ICAgICBfU3RyaW5nOworICB0eXBlZGVmIGJhc2ljX3N0cmluZ2J1ZjxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4gIF9CdWY7CisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29uc3RydWN0b3JzLCBkZXN0cnVjdG9yLgorICBiYXNpY19vc3RyaW5nc3RyZWFtKGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUgPSBpb3NfYmFzZTo6b3V0KTsKKyAgYmFzaWNfb3N0cmluZ3N0cmVhbShjb25zdCBfU3RyaW5nJiBfX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlID0gaW9zX2Jhc2U6Om91dCk7CisgIH5iYXNpY19vc3RyaW5nc3RyZWFtKCk7CisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWVtYmVyIGZ1bmN0aW9ucy4KKworICBiYXNpY19zdHJpbmdidWY8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+KiByZGJ1ZigpIGNvbnN0CisgICAgeyByZXR1cm4gX19DT05TVF9DQVNUKF9CdWYqLCZfTV9idWYpOyB9CisKKyAgX1N0cmluZyBzdHIoKSBjb25zdCB7IHJldHVybiBfTV9idWYuc3RyKCk7IH0KKyAgICB2b2lkIHN0cihjb25zdCBfU3RyaW5nJiBfX3MpIHsgX01fYnVmLnN0cihfX3MpOyB9IC8vIGR3YSAwMi8wNy8wMCAtIEJVRyBTVE9NUEVSIERBVkUKKworCitwcml2YXRlOgorICBiYXNpY19zdHJpbmdidWY8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+IF9NX2J1ZjsKKworI2lmIGRlZmluZWQgKF9TVExQX01TVkMpICYmIChfU1RMUF9NU1ZDID49IDEzMDAgJiYgX1NUTFBfTVNWQyA8PSAxMzEwKQorICB0eXBlZGVmIGJhc2ljX29zdHJpbmdzdHJlYW08X0NoYXJULCBfVHJhaXRzPiBfU2VsZjsKKyAgLy9leHBsaWNpdGVseSBkZWZpbmVkIGFzIHByaXZhdGUgdG8gYXZvaWQgd2FybmluZ3M6CisgIGJhc2ljX29zdHJpbmdzdHJlYW0oX1NlbGYgY29uc3QmKTsKKyAgX1NlbGYmIG9wZXJhdG9yID0gKF9TZWxmIGNvbnN0Jik7CisjZW5kaWYKK307CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDbGFzcyBiYXNpY19zdHJpbmdzdHJlYW0sIGEgYmlkaXJlY3Rpb25hbCBzdHJlYW0gdGhhdCB1c2VzIGEgc3RyaW5nYnVmLgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CitjbGFzcyBiYXNpY19zdHJpbmdzdHJlYW0gOiBwdWJsaWMgYmFzaWNfaW9zdHJlYW08X0NoYXJULCBfVHJhaXRzPiB7CitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR5cGVkZWZzCisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6Y2hhcl90eXBlIGNoYXJfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjppbnRfdHlwZSAgaW50X3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6cG9zX3R5cGUgIHBvc190eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6Om9mZl90eXBlICBvZmZfdHlwZTsKKyAgdHlwZWRlZiBfVHJhaXRzICB0cmFpdHNfdHlwZTsKKworICB0eXBlZGVmIGJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+ICAgICAgICAgICAgICAgICBfQmFzaWNfaW9zOworICB0eXBlZGVmIGJhc2ljX2lvc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gICAgICAgICAgICBfQmFzZTsKKyAgdHlwZWRlZiBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+ICAgICAgX1N0cmluZzsKKyAgdHlwZWRlZiBiYXNpY19zdHJpbmdidWY8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+ICBfQnVmOworCisgIHR5cGVkZWYgaW9zX2Jhc2U6Om9wZW5tb2RlIG9wZW5tb2RlOworCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbnN0cnVjdG9ycywgZGVzdHJ1Y3Rvci4KKyAgYmFzaWNfc3RyaW5nc3RyZWFtKG9wZW5tb2RlIF9fbW9kID0gaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6Om91dCk7CisgIGJhc2ljX3N0cmluZ3N0cmVhbShjb25zdCBfU3RyaW5nJiBfX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgIG9wZW5tb2RlIF9fbW9kID0gaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6Om91dCk7CisgIH5iYXNpY19zdHJpbmdzdHJlYW0oKTsKKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNZW1iZXIgZnVuY3Rpb25zLgorCisgIGJhc2ljX3N0cmluZ2J1ZjxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4qIHJkYnVmKCkgY29uc3QKKyAgICB7IHJldHVybiBfX0NPTlNUX0NBU1QoX0J1ZiosJl9NX2J1Zik7IH0KKworICBfU3RyaW5nIHN0cigpIGNvbnN0IHsgcmV0dXJuIF9NX2J1Zi5zdHIoKTsgfQorICAgIHZvaWQgc3RyKGNvbnN0IF9TdHJpbmcmIF9fcykgeyBfTV9idWYuc3RyKF9fcyk7IH0KKworcHJpdmF0ZToKKyAgYmFzaWNfc3RyaW5nYnVmPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiBfTV9idWY7CisKKyNpZiBkZWZpbmVkIChfU1RMUF9NU1ZDKSAmJiAoX1NUTFBfTVNWQyA+PSAxMzAwICYmIF9TVExQX01TVkMgPD0gMTMxMCkKKyAgdHlwZWRlZiBiYXNpY19zdHJpbmdzdHJlYW08X0NoYXJULCBfVHJhaXRzPiBfU2VsZjsKKyAgLy9leHBsaWNpdGVseSBkZWZpbmVkIGFzIHByaXZhdGUgdG8gYXZvaWQgd2FybmluZ3M6CisgIGJhc2ljX3N0cmluZ3N0cmVhbShfU2VsZiBjb25zdCYpOworICBfU2VsZiYgb3BlcmF0b3IgPSAoX1NlbGYgY29uc3QmKTsKKyNlbmRpZgorfTsKKworCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCkKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBiYXNpY19pc3RyaW5nc3RyZWFtPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+LCBhbGxvY2F0b3I8Y2hhcj4gPjsKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBiYXNpY19vc3RyaW5nc3RyZWFtPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+LCBhbGxvY2F0b3I8Y2hhcj4gPjsKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBiYXNpY19zdHJpbmdzdHJlYW08Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4sIGFsbG9jYXRvcjxjaGFyPiA+OworIyAgaWYgIWRlZmluZWQgKF9TVExQX05PX1dDSEFSX1QpCitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgYmFzaWNfaXN0cmluZ3N0cmVhbTx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiwgYWxsb2NhdG9yPHdjaGFyX3Q+ICA+OworX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIGJhc2ljX29zdHJpbmdzdHJlYW08d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4sIGFsbG9jYXRvcjx3Y2hhcl90PiAgPjsKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBiYXNpY19zdHJpbmdzdHJlYW08d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4sIGFsbG9jYXRvcjx3Y2hhcl90PiAgPjsKKyMgIGVuZGlmCisjZW5kaWYgLyogX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCAqLworCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNpZiBkZWZpbmVkIChfU1RMUF9FWFBPU0VfU1RSRUFNX0lNUExFTUVOVEFUSU9OKSAmJiAhZGVmaW5lZCAoX1NUTFBfTElOS19USU1FX0lOU1RBTlRJQVRJT04pCisjICBpbmNsdWRlIDxzdGwvX3NzdHJlYW0uYz4KKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfU1NUUkVBTSAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RsL19zdGFjay5oIGIvc3RsL19zdGFjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhYTQ2OGQKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvX3N0YWNrLmgKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisvKiBOT1RFOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBTVEwgaGVhZGVycy4KKyAqICAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuCisgKi8KKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9TVEFDS19ICisjZGVmaW5lIF9TVExQX0lOVEVSTkFMX1NUQUNLX0gKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9ERVFVRV9ICisjICBpbmNsdWRlIDxzdGwvX2RlcXVlLmg+CisjZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKKyNpZiAhZGVmaW5lZCAoIF9TVExQX0xJTUlURURfREVGQVVMVF9URU1QTEFURVMgKQordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1NlcXVlbmNlID0gZGVxdWU8X1RwPiA+CisjZWxpZiBkZWZpbmVkICggX1NUTFBfTUlOSU1VTV9ERUZBVUxUX1RFTVBMQVRFX1BBUkFNUyApCisjICBkZWZpbmUgX1NUTFBfU1RBQ0tfQVJHUyBfVHAKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CisjZWxzZQordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1NlcXVlbmNlPgorI2VuZGlmCitjbGFzcyBzdGFjaworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QQVJUSUFMX1NQRUNfV09SS0FST1VORCkKKyMgIGlmIGRlZmluZWQgKF9TVExQX1NUQUNLX0FSR1MpCisgICAgICAgICAgICA6IHB1YmxpYyBfX3N0bHBvcnRfY2xhc3M8c3RhY2s8X1RwPiA+CisjICBlbHNlCisgICAgICAgICAgICA6IHB1YmxpYyBfX3N0bHBvcnRfY2xhc3M8c3RhY2s8X1RwLCBfU2VxdWVuY2U+ID4KKyMgIGVuZGlmCisjZW5kaWYKK3sKKyNpZmRlZiBfU1RMUF9TVEFDS19BUkdTCisgIHR5cGVkZWYgZGVxdWU8X1RwPiBfU2VxdWVuY2U7CisgIHR5cGVkZWYgc3RhY2s8X1RwPiBfU2VsZjsKKyNlbHNlCisgIHR5cGVkZWYgc3RhY2s8X1RwLCBfU2VxdWVuY2U+IF9TZWxmOworI2VuZGlmCisKK3B1YmxpYzoKKyAgdHlwZWRlZiB0eXBlbmFtZSBfU2VxdWVuY2U6OnZhbHVlX3R5cGUgICAgICB2YWx1ZV90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9TZXF1ZW5jZTo6c2l6ZV90eXBlICAgICAgIHNpemVfdHlwZTsKKyAgdHlwZWRlZiAgICAgICAgICBfU2VxdWVuY2UgICAgICAgICAgICAgICAgICBjb250YWluZXJfdHlwZTsKKworICB0eXBlZGVmIHR5cGVuYW1lIF9TZXF1ZW5jZTo6cmVmZXJlbmNlICAgICAgIHJlZmVyZW5jZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfU2VxdWVuY2U6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9yZWZlcmVuY2U7Citwcm90ZWN0ZWQ6CisgIC8vYyBpcyBhIFN0YW5kYXJkIG5hbWUgKDIzLjIuMy4zKSwgZG8gbm8gbWFrZSBpdCBTVExwb3J0IG5hbWluZyBjb252ZW50aW9uIGNvbXBsaWFudC4KKyAgX1NlcXVlbmNlIGM7CitwdWJsaWM6CisgIHN0YWNrKCkgOiBjKCkge30KKyAgZXhwbGljaXQgc3RhY2soY29uc3QgX1NlcXVlbmNlJiBfX3MpIDogYyhfX3MpIHt9CisKKyAgc3RhY2soX19tb3ZlX3NvdXJjZTxfU2VsZj4gc3JjKQorICAgIDogYyhfU1RMUF9QUklWIF9Bc01vdmVTb3VyY2Uoc3JjLmdldCgpLmMpKSB7fQorCisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBjLmVtcHR5KCk7IH0KKyAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCB7IHJldHVybiBjLnNpemUoKTsgfQorICByZWZlcmVuY2UgdG9wKCkgeyByZXR1cm4gYy5iYWNrKCk7IH0KKyAgY29uc3RfcmVmZXJlbmNlIHRvcCgpIGNvbnN0IHsgcmV0dXJuIGMuYmFjaygpOyB9CisgIHZvaWQgcHVzaChjb25zdCB2YWx1ZV90eXBlJiBfX3gpIHsgYy5wdXNoX2JhY2soX194KTsgfQorICB2b2lkIHBvcCgpIHsgYy5wb3BfYmFjaygpOyB9CisgIGNvbnN0IF9TZXF1ZW5jZSYgX0dldF9zKCkgY29uc3QgeyByZXR1cm4gYzsgfQorfTsKKworI2lmbmRlZiBfU1RMUF9TVEFDS19BUkdTCisjICBkZWZpbmUgX1NUTFBfU1RBQ0tfQVJHUyBfVHAsIF9TZXF1ZW5jZQorIyAgZGVmaW5lIF9TVExQX1NUQUNLX0hFQURFUl9BUkdTIGNsYXNzIF9UcCwgY2xhc3MgX1NlcXVlbmNlCisjZWxzZQorIyAgZGVmaW5lIF9TVExQX1NUQUNLX0hFQURFUl9BUkdTIGNsYXNzIF9UcAorI2VuZGlmCisKK3RlbXBsYXRlIDwgX1NUTFBfU1RBQ0tfSEVBREVSX0FSR1MgPgoraW5saW5lIGJvb2wgX1NUTFBfQ0FMTCAgb3BlcmF0b3I9PShjb25zdCBzdGFjazwgX1NUTFBfU1RBQ0tfQVJHUyA+JiBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YWNrPCBfU1RMUF9TVEFDS19BUkdTID4mIF9feSkKK3sgcmV0dXJuIF9feC5fR2V0X3MoKSA9PSBfX3kuX0dldF9zKCk7IH0KKwordGVtcGxhdGUgPCBfU1RMUF9TVEFDS19IRUFERVJfQVJHUyA+CitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMICBvcGVyYXRvcjwoY29uc3Qgc3RhY2s8IF9TVExQX1NUQUNLX0FSR1MgPiYgX194LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YWNrPCBfU1RMUF9TVEFDS19BUkdTID4mIF9feSkKK3sgcmV0dXJuIF9feC5fR2V0X3MoKSA8IF9feS5fR2V0X3MoKTsgfQorCitfU1RMUF9SRUxPUFNfT1BFUkFUT1JTKHRlbXBsYXRlIDwgX1NUTFBfU1RBQ0tfSEVBREVSX0FSR1MgPiwgc3RhY2s8IF9TVExQX1NUQUNLX0FSR1MgPikKKworI3VuZGVmIF9TVExQX1NUQUNLX0FSR1MKKyN1bmRlZiBfU1RMUF9TVEFDS19IRUFERVJfQVJHUworCisjaWYgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9TZXF1ZW5jZT4KK3N0cnVjdCBfX21vdmVfdHJhaXRzPHN0YWNrPF9UcCwgX1NlcXVlbmNlPiA+IDoKKyAgX1NUTFBfUFJJViBfX21vdmVfdHJhaXRzX2F1eDxfU2VxdWVuY2U+Cit7fTsKKyNlbmRpZgorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9TVEFDS19IICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvX3N0ZGV4Y2VwdC5oIGIvc3RsL19zdGRleGNlcHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Yzc4NGJiCi0tLSAvZGV2L251bGwKKysrIGIvc3RsL19zdGRleGNlcHQuaApAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX1NUREVYQ0VQVAorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9TVERFWENFUFQKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9TVERFWENFUFRfQkFTRQorIyAgaW5jbHVkZSA8c3RsL19zdGRleGNlcHRfYmFzZS5oPgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX05BVElWRV9TVERFWENFUFQpIHx8IGRlZmluZWQgKF9TVExQX1VTRV9PV05fTkFNRVNQQUNFKQorCisjICBpZiBkZWZpbmVkKF9TVExQX1VTRV9FWENFUFRJT05TKSB8fCBcCisgICAgIShkZWZpbmVkKF9NSVBTX1NJTSkgJiYgZGVmaW5lZChfQUJJTzMyKSAmJiAoX01JUFNfU0lNID09IF9BQklPMzIpKQorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgbG9naWNfZXJyb3IgOiBwdWJsaWMgX19OYW1lZF9leGNlcHRpb24geworcHVibGljOgorICBsb2dpY19lcnJvcihjb25zdCBzdHJpbmcmIF9fcykgOiBfX05hbWVkX2V4Y2VwdGlvbihfX3MpIHt9CisjICAgIGlmbmRlZiBfU1RMUF9VU0VfTk9fSU9TVFJFQU1TCisgIH5sb2dpY19lcnJvcigpIF9TVExQX05PVEhST1dfSU5IRVJFTlRMWTsKKyMgICAgZW5kaWYKK307CisKK2NsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIHJ1bnRpbWVfZXJyb3IgOiBwdWJsaWMgX19OYW1lZF9leGNlcHRpb24geworcHVibGljOgorICBydW50aW1lX2Vycm9yKGNvbnN0IHN0cmluZyYgX19zKSA6IF9fTmFtZWRfZXhjZXB0aW9uKF9fcykge30KKyMgICAgaWZuZGVmIF9TVExQX1VTRV9OT19JT1NUUkVBTVMKKyAgfnJ1bnRpbWVfZXJyb3IoKSBfU1RMUF9OT1RIUk9XX0lOSEVSRU5UTFk7CisjICAgIGVuZGlmCit9OworCitjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBkb21haW5fZXJyb3IgOiBwdWJsaWMgbG9naWNfZXJyb3IgeworcHVibGljOgorICBkb21haW5fZXJyb3IoY29uc3Qgc3RyaW5nJiBfX2FyZykgOiBsb2dpY19lcnJvcihfX2FyZykge30KKyMgICAgaWZuZGVmIF9TVExQX1VTRV9OT19JT1NUUkVBTVMKKyAgfmRvbWFpbl9lcnJvcigpIF9TVExQX05PVEhST1dfSU5IRVJFTlRMWTsKKyMgICAgZW5kaWYKK307CisKK2NsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIGludmFsaWRfYXJndW1lbnQgOiBwdWJsaWMgbG9naWNfZXJyb3IgeworcHVibGljOgorICBpbnZhbGlkX2FyZ3VtZW50KGNvbnN0IHN0cmluZyYgX19hcmcpIDogbG9naWNfZXJyb3IoX19hcmcpIHt9CisjICAgIGlmbmRlZiBfU1RMUF9VU0VfTk9fSU9TVFJFQU1TCisgIH5pbnZhbGlkX2FyZ3VtZW50KCkgX1NUTFBfTk9USFJPV19JTkhFUkVOVExZOworIyAgICBlbmRpZgorfTsKKworY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgbGVuZ3RoX2Vycm9yIDogcHVibGljIGxvZ2ljX2Vycm9yIHsKK3B1YmxpYzoKKyAgbGVuZ3RoX2Vycm9yKGNvbnN0IHN0cmluZyYgX19hcmcpIDogbG9naWNfZXJyb3IoX19hcmcpIHt9CisjICAgIGlmbmRlZiBfU1RMUF9VU0VfTk9fSU9TVFJFQU1TCisgIH5sZW5ndGhfZXJyb3IoKSBfU1RMUF9OT1RIUk9XX0lOSEVSRU5UTFk7CisjICAgIGVuZGlmCit9OworCitjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBvdXRfb2ZfcmFuZ2UgOiBwdWJsaWMgbG9naWNfZXJyb3IgeworcHVibGljOgorICBvdXRfb2ZfcmFuZ2UoY29uc3Qgc3RyaW5nJiBfX2FyZykgOiBsb2dpY19lcnJvcihfX2FyZykge30KKyMgICAgaWZuZGVmIF9TVExQX1VTRV9OT19JT1NUUkVBTVMKKyAgfm91dF9vZl9yYW5nZSgpIF9TVExQX05PVEhST1dfSU5IRVJFTlRMWTsKKyMgICAgZW5kaWYKK307CisKK2NsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIHJhbmdlX2Vycm9yIDogcHVibGljIHJ1bnRpbWVfZXJyb3IgeworcHVibGljOgorICByYW5nZV9lcnJvcihjb25zdCBzdHJpbmcmIF9fYXJnKSA6IHJ1bnRpbWVfZXJyb3IoX19hcmcpIHt9CisjICAgIGlmbmRlZiBfU1RMUF9VU0VfTk9fSU9TVFJFQU1TCisgIH5yYW5nZV9lcnJvcigpIF9TVExQX05PVEhST1dfSU5IRVJFTlRMWTsKKyMgICAgZW5kaWYKK307CisKK2NsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIG92ZXJmbG93X2Vycm9yIDogcHVibGljIHJ1bnRpbWVfZXJyb3IgeworcHVibGljOgorICBvdmVyZmxvd19lcnJvcihjb25zdCBzdHJpbmcmIF9fYXJnKSA6IHJ1bnRpbWVfZXJyb3IoX19hcmcpIHt9CisjICAgIGlmbmRlZiBfU1RMUF9VU0VfTk9fSU9TVFJFQU1TCisgIH5vdmVyZmxvd19lcnJvcigpIF9TVExQX05PVEhST1dfSU5IRVJFTlRMWTsKKyMgICAgZW5kaWYKK307CisKK2NsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIHVuZGVyZmxvd19lcnJvciA6IHB1YmxpYyBydW50aW1lX2Vycm9yIHsKK3B1YmxpYzoKKyAgdW5kZXJmbG93X2Vycm9yKGNvbnN0IHN0cmluZyYgX19hcmcpIDogcnVudGltZV9lcnJvcihfX2FyZykge30KKyMgICAgaWZuZGVmIF9TVExQX1VTRV9OT19JT1NUUkVBTVMKKyAgfnVuZGVyZmxvd19lcnJvcigpIF9TVExQX05PVEhST1dfSU5IRVJFTlRMWTsKKyMgICAgZW5kaWYKK307CisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworIyAgZW5kaWYKKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfU1RERVhDRVBUICovCmRpZmYgLS1naXQgYS9zdGwvX3N0ZGV4Y2VwdF9iYXNlLmggYi9zdGwvX3N0ZGV4Y2VwdF9iYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JjZDg0OQotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9fc3RkZXhjZXB0X2Jhc2UuaApAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX1NUREVYQ0VQVF9CQVNFCisjZGVmaW5lIF9TVExQX0lOVEVSTkFMX1NUREVYQ0VQVF9CQVNFCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX05BVElWRV9TVERFWENFUFQpIHx8IGRlZmluZWQgKF9TVExQX1VTRV9PV05fTkFNRVNQQUNFKQorCisjICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfRVhDRVBUSU9OCisjICAgIGluY2x1ZGUgPHN0bC9fZXhjZXB0aW9uLmg+CisjICBlbmRpZgorCisjICBpZiBkZWZpbmVkKF9TVExQX1VTRV9FWENFUFRJT05TKSB8fCBcCisgICAgIShkZWZpbmVkKF9NSVBTX1NJTSkgJiYgZGVmaW5lZChfQUJJTzMyKSAmJiAoX01JUFNfU0lNID09IF9BQklPMzIpKQorCisjICAgIGlmbmRlZiBfU1RMUF9JTlRFUk5BTF9DU1RSSU5HCisjICAgICAgaW5jbHVkZSA8c3RsL19jc3RyaW5nLmg+CisjICAgIGVuZGlmCisKKyMgICAgaWZuZGVmIF9TVExQX1NUUklOR19GV0RfSAorIyAgICAgIGluY2x1ZGUgPHN0bC9fc3RyaW5nX2Z3ZC5oPgorIyAgICBlbmRpZgorCisjICAgIGlmbmRlZiBfU1RMUF9VU0VfTk9fSU9TVFJFQU1TCisjICAgICAgZGVmaW5lIF9TVExQX09XTl9TVERFWENFUFQgMQorIyAgICBlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworLyogV2UgZGlzYWJsZSB0aGUgNDI3NSB3YXJuaW5nIGZvcgorICogIC0gV2luQ0Ugd2hlcmUgdGhlcmUgYXJlIG9ubHkgc3RhdGljIHZlcnNpb24gb2YgdGhlIG5hdGl2ZSBDKysgcnVudGltZS4KKyAqICAtIFRoZSBNU1ZDIGNvbXBpbGVycyB3aGVuIHRoZSBTVExwb3J0IHVzZXIgd2FudHMgdG8gbWFrZSBhbiBTVExwb3J0IGRsbCBsaW5rZWQgdG8KKyAqICAgIHRoZSBzdGF0aWMgQysrIG5hdGl2ZSBydW50aW1lLiBJbiB0aGlzIGNhc2UgdGhlIHN0ZDo6ZXhjZXB0aW9uIGJhc2UgY2xhc3MgaXMgbm8gbW9yZQorICogICAgZXhwb3J0ZWQgZnJvbSBuYXRpdmUgZGxsIGJ1dCBpcyB1c2VkIGFzIGEgYmFzZSBjbGFzcyBmb3IgdGhlIGV4cG9ydGVkIF9fTmFtZWRfZXhjZXB0aW9uCisgKiAgICBjbGFzcy4KKyAqLworIyAgICBpZiBkZWZpbmVkIChfU1RMUF9XQ0VfTkVUKSB8fCBcCisgICAgICAgIGRlZmluZWQgKF9TVExQX1VTRV9EWU5BTUlDX0xJQikgJiYgZGVmaW5lZCAoX1NUTFBfVVNJTkdfQ1JPU1NfTkFUSVZFX1JVTlRJTUVfTElCKQorIyAgICAgIGRlZmluZSBfU1RMUF9ET19XQVJOSU5HX1BPUAorIyAgICAgIHByYWdtYSB3YXJuaW5nIChwdXNoKQorIyAgICAgIHByYWdtYSB3YXJuaW5nIChkaXNhYmxlOiA0Mjc1KSAvLyBOb24gZGxsIGludGVyZmFjZSBjbGFzcyAnZXhjZXB0aW9uJyB1c2VkIGFzIGJhc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGRsbC1pbnRlcmZhY2UgY2xhc3MgJ19fTmFtZWRfZXhjZXB0aW9uJworIyAgICBlbmRpZgorCisjICAgIGlmICFkZWZpbmVkIChfU1RMUF9OT19FWENFUFRJT05fSEVBREVSKQorIyAgICAgIGlmICFkZWZpbmVkIChfU1RMUF9FWENFUFRJT05fQkFTRSkgJiYgIWRlZmluZWQgKF9TVExQX0JST0tFTl9FWENFUFRJT05fQ0xBU1MpICYmIFwKKyAgICAgICAgICAgZGVmaW5lZCAoX1NUTFBfVVNFX05BTUVTUEFDRVMpICYmICBkZWZpbmVkIChfU1RMUF9VU0VfT1dOX05BTUVTUEFDRSkKK3VzaW5nIF9TVExQX1ZFTkRPUl9FWENFUFRfU1REOjpleGNlcHRpb247CisjICAgICAgZW5kaWYKKyMgICAgZW5kaWYKKyMgICAgZGVmaW5lIF9TVExQX0VYQ0VQVElPTl9CQVNFIGV4Y2VwdGlvbgorCitjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBfX05hbWVkX2V4Y2VwdGlvbiA6IHB1YmxpYyBfU1RMUF9FWENFUFRJT05fQkFTRSB7CitwdWJsaWM6CisgIF9fTmFtZWRfZXhjZXB0aW9uKGNvbnN0IHN0cmluZyYgX19zdHIpCisjICAgIGlmbmRlZiBfU1RMUF9VU0VfTk9fSU9TVFJFQU1TCisgICAgOworICBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3QgX1NUTFBfTk9USFJPV19JTkhFUkVOVExZOworICB+X19OYW1lZF9leGNlcHRpb24oKSBfU1RMUF9OT1RIUk9XX0lOSEVSRU5UTFk7CisjICAgIGVsc2UKKyAgeworIyAgICAgIGlmICFkZWZpbmVkIChfU1RMUF9VU0VfU0FGRV9TVFJJTkdfRlVOQ1RJT05TKQorICAgIHN0cm5jcHkoX01fbmFtZSwgX1NUTFBfUFJJViBfX2dldF9jX3N0cmluZyhfX3N0ciksIF9TX2J1ZnNpemUpOworICAgIF9NX25hbWVbX1NfYnVmc2l6ZSAtIDFdID0gJ1wwJzsKKyMgICAgICBlbHNlCisgICAgc3RybmNweV9zKF9TVExQX0FSUkFZX0FORF9TSVpFKF9NX25hbWUpLCBfU1RMUF9QUklWIF9fZ2V0X2Nfc3RyaW5nKF9fc3RyKSwgX1RSVU5DQVRFKTsKKyMgICAgICBlbmRpZgorICB9CisgIGNvbnN0IGNoYXIqIHdoYXQoKSBjb25zdCBfU1RMUF9OT1RIUk9XX0lOSEVSRU5UTFkgeyByZXR1cm4gX01fbmFtZTsgfQorIyAgICBlbmRpZgorCitwcml2YXRlOgorICBlbnVtIHsgX1NfYnVmc2l6ZSA9IDI1NiB9OworICBjaGFyIF9NX25hbWVbX1NfYnVmc2l6ZV07Cit9OworCisjICAgIGlmIGRlZmluZWQgKF9TVExQX0RPX1dBUk5JTkdfUE9QKQorIyAgICAgIHByYWdtYSB3YXJuaW5nIChwb3ApCisjICAgICAgdW5kZWYgX1NUTFBfRE9fV0FSTklOR19QT1AKKyMgICAgZW5kaWYKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjICBlbmRpZiAvKiBOb3QgbzMyLCBhbmQgbm8gZXhjZXB0aW9ucyAqLworI2VuZGlmIC8qIF9TVExQX1NUREVYQ0VQVF9TRUVOICovCisKKyNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9TVERFWENFUFRfQkFTRSAqLwpkaWZmIC0tZ2l0IGEvc3RsL19zdGxwb3J0X3ZlcnNpb24uaCBiL3N0bC9fc3RscG9ydF92ZXJzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY4MDU1YgotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9fc3RscG9ydF92ZXJzaW9uLmgKQEAgLTAsMCArMSwzMCBAQAorIC8qCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA1CisgKiBGcmFuY29pcyBEdW1vbnQKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmbmRlZiBfU1RMUF9TVExQT1JUX1ZFUlNJT05fSAorI2RlZmluZSBfU1RMUF9TVExQT1JUX1ZFUlNJT05fSAorCisvKiBUaGUgbGFzdCBTR0kgU1RMIHJlbGVhc2Ugd2UgbWVyZ2VkIHdpdGggKi8KKyNkZWZpbmUgX19TR0lfU1RMIDB4MzMwCisKKy8qIFNUTHBvcnQgdmVyc2lvbiAqLworI2RlZmluZSBfU1RMUE9SVF9NQUpPUiA1CisjZGVmaW5lIF9TVExQT1JUX01JTk9SIDEKKyNkZWZpbmUgX1NUTFBPUlRfUEFUQ0hMRVZFTCA0CisKKyNkZWZpbmUgX1NUTFBPUlRfVkVSU0lPTiAweDUxNAorCisjZW5kaWYgLyogX1NUTFBfU1RMUE9SVF9WRVJTSU9OX0ggKi8KZGlmZiAtLWdpdCBhL3N0bC9fc3RyZWFtX2l0ZXJhdG9yLmggYi9zdGwvX3N0cmVhbV9pdGVyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMWZmM2YKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvX3N0cmVhbV9pdGVyYXRvci5oCkBAIC0wLDAgKzEsMjUzIEBACisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYtMTk5OAorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBNb3Njb3cgQ2VudGVyIGZvciBTUEFSQyBUZWNobm9sb2d5CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworLyogTk9URTogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgU1RMIGhlYWRlcnMuCisgKiAgIFlvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LgorICovCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfSU5URVJOQUxfU1RSRUFNX0lURVJBVE9SX0gpICYmICFkZWZpbmVkIChfU1RMUF9VU0VfTk9fSU9TVFJFQU1TKQorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9TVFJFQU1fSVRFUkFUT1JfSAorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0lURVJBVE9SX0JBU0VfSAorIyAgaW5jbHVkZSA8c3RsL19pdGVyYXRvcl9iYXNlLmg+CisjZW5kaWYKKworLy8gc3RyZWFtYnVmX2l0ZXJhdG9ycyBwcmVkZWNsYXJhdGlvbnMgbXVzdCBhcHBlYXIgZmlyc3QKKyNpZm5kZWYgX1NUTFBfSU9TRldECisjICBpbmNsdWRlIDxpb3Nmd2Q+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9BTEdPQkFTRV9ICisjICBpbmNsdWRlIDxzdGwvX2FsZ29iYXNlLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9PU1RSRUFNQlVGX0lURVJBVE9SX0gKKyMgIGluY2x1ZGUgPHN0bC9fb3N0cmVhbWJ1Zl9pdGVyYXRvci5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfSVNUUkVBTUJVRl9JVEVSQVRPUl9ICisjICBpbmNsdWRlIDxzdGwvX2lzdHJlYW1idWZfaXRlcmF0b3IuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0lTVFJFQU0KKyMgIGluY2x1ZGUgPHN0bC9faXN0cmVhbS5oPgorI2VuZGlmCisKKy8vIGlzdHJlYW1faXRlcmF0b3IgYW5kIG9zdHJlYW1faXRlcmF0b3IgbG9vayB2ZXJ5IGRpZmZlcmVudCBpZiB3ZSdyZQorLy8gdXNpbmcgbmV3LCB0ZW1wbGF0aXplZCBpb3N0cmVhbXMgdGhhbiBpZiB3ZSdyZSB1c2luZyB0aGUgb2xkIGNmcm9udAorLy8gdmVyc2lvbi4KKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTElNSVRFRF9ERUZBVUxUX1RFTVBMQVRFUykKKyMgIGRlZmluZSBfX0lTSV9UTVBMX0hFQURFUl9BUkdVTUVOVFMgY2xhc3MgX1RwLCBjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9EaXN0CisjICBkZWZpbmUgX19JU0lfVE1QTF9BUkdVTUVOVFMgX1RwLCBfQ2hhclQsIF9UcmFpdHMsIF9EaXN0Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLAorICAgICAgICAgIGNsYXNzIF9DaGFyVCA9IF9TVExQX0RFRkFVTFRDSEFSLCBjbGFzcyBfVHJhaXRzID0gY2hhcl90cmFpdHM8X0NoYXJUPiwKKyAgICAgICAgICBjbGFzcyBfRGlzdCA9IHB0cmRpZmZfdD4KK2NsYXNzIGlzdHJlYW1faXRlcmF0b3IgOiBwdWJsaWMgaXRlcmF0b3I8aW5wdXRfaXRlcmF0b3JfdGFnLCBfVHAgLCBfRGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1RwKiwgY29uc3QgX1RwJiA+IHsKKyNlbHNlCisjICBpZiBkZWZpbmVkIChfU1RMUF9NSU5JTVVNX0RFRkFVTFRfVEVNUExBVEVfUEFSQU1TKSAmJiAhZGVmaW5lZCAoX1NUTFBfREVGQVVMVF9UWVBFX1BBUkFNKQorIyAgICBkZWZpbmUgX19JU0lfVE1QTF9IRUFERVJfQVJHVU1FTlRTIGNsYXNzIF9UcAorIyAgICBkZWZpbmUgX19JU0lfVE1QTF9BUkdVTUVOVFMgICAgICAgIF9UcAordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2NsYXNzIGlzdHJlYW1faXRlcmF0b3IgOiBwdWJsaWMgaXRlcmF0b3I8aW5wdXRfaXRlcmF0b3JfdGFnLCBfVHAgLCBwdHJkaWZmX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9UcCosIGNvbnN0IF9UcCYgPiB7CisjICBlbHNlCisjICAgIGRlZmluZSBfX0lTSV9UTVBMX0hFQURFUl9BUkdVTUVOVFMgY2xhc3MgX1RwLCBjbGFzcyBfRGlzdAorIyAgICBkZWZpbmUgX19JU0lfVE1QTF9BUkdVTUVOVFMgICAgICAgIF9UcCwgX0Rpc3QKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIF9TVExQX0RGTF9UWVBFX1BBUkFNKF9EaXN0LCBwdHJkaWZmX3QpPgorY2xhc3MgaXN0cmVhbV9pdGVyYXRvciA6IHB1YmxpYyBpdGVyYXRvcjxpbnB1dF9pdGVyYXRvcl90YWcsIF9UcCwgX0Rpc3QgLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfVHAqLCBjb25zdCBfVHAmID4geworIyAgZW5kaWYgLyogX1NUTFBfTUlOSU1VTV9ERUZBVUxUX1RFTVBMQVRFX1BBUkFNUyAqLworI2VuZGlmIC8qIF9TVExQX0xJTUlURURfREVGQVVMVF9URU1QTEFURVMgKi8KKworI2lmIGRlZmluZWQgKF9TVExQX0xJTUlURURfREVGQVVMVF9URU1QTEFURVMpCisgIHR5cGVkZWYgY2hhciBfQ2hhclQ7CisgIHR5cGVkZWYgY2hhcl90cmFpdHM8Y2hhcj4gX1RyYWl0czsKKyMgIGlmIGRlZmluZWQgKF9TVExQX01JTklNVU1fREVGQVVMVF9URU1QTEFURV9QQVJBTVMpICYmICFkZWZpbmVkIChfU1RMUF9ERUZBVUxUX1RZUEVfUEFSQU0pCisgIHR5cGVkZWYgcHRyZGlmZl90IF9EaXN0OworIyAgZW5kaWYKKyNlbmRpZgorCisgIHR5cGVkZWYgaXN0cmVhbV9pdGVyYXRvcjwgX19JU0lfVE1QTF9BUkdVTUVOVFMgPiBfU2VsZjsKK3B1YmxpYzoKKyAgdHlwZWRlZiBfQ2hhclQgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl90eXBlOworICB0eXBlZGVmIF9UcmFpdHMgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdHlwZTsKKyAgdHlwZWRlZiBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gaXN0cmVhbV90eXBlOworCisgIHR5cGVkZWYgaW5wdXRfaXRlcmF0b3JfdGFnICAgICAgICAgICAgIGl0ZXJhdG9yX2NhdGVnb3J5OworICB0eXBlZGVmIF9UcCAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICB0eXBlZGVmIF9EaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgIHR5cGVkZWYgY29uc3QgX1RwKiAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgIHR5cGVkZWYgY29uc3QgX1RwJiAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKworICBpc3RyZWFtX2l0ZXJhdG9yKCkgOiBfTV9zdHJlYW0oMCksIF9NX29rKGZhbHNlKSwgX01fcmVhZF9kb25lKHRydWUpIHt9CisgIGlzdHJlYW1faXRlcmF0b3IoaXN0cmVhbV90eXBlJiBfX3MpIDogX01fc3RyZWFtKCZfX3MpLCBfTV9vayhmYWxzZSksIF9NX3JlYWRfZG9uZShmYWxzZSkge30KKworICByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3QgeworICAgIGlmICghX01fcmVhZF9kb25lKSB7CisgICAgICBfTV9yZWFkKCk7CisgICAgfQorICAgIHJldHVybiBfTV92YWx1ZTsKKyAgfQorCisgIF9TVExQX0RFRklORV9BUlJPV19PUEVSQVRPUgorCisgIF9TZWxmJiBvcGVyYXRvcisrKCkgeworICAgIF9NX3JlYWQoKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgX1NlbGYgb3BlcmF0b3IrKyhpbnQpICB7CisgICAgX1NlbGYgX190bXAgPSAqdGhpczsKKyAgICBfTV9yZWFkKCk7CisgICAgcmV0dXJuIF9fdG1wOworICB9CisKKyAgYm9vbCBfTV9lcXVhbChjb25zdCBfU2VsZiYgX194KSBjb25zdCB7CisgICAgaWYgKCFfTV9yZWFkX2RvbmUpIHsKKyAgICAgIF9NX3JlYWQoKTsKKyAgICB9CisgICAgaWYgKCFfX3guX01fcmVhZF9kb25lKSB7CisgICAgICBfX3guX01fcmVhZCgpOworICAgIH0KKyAgICByZXR1cm4gKF9NX29rID09IF9feC5fTV9vaykgJiYgKCFfTV9vayB8fCBfTV9zdHJlYW0gPT0gX194Ll9NX3N0cmVhbSk7CisgIH0KKworcHJpdmF0ZToKKyAgaXN0cmVhbV90eXBlKiBfTV9zdHJlYW07CisgIG11dGFibGUgX1RwIF9NX3ZhbHVlOworICBtdXRhYmxlIGJvb2wgX01fb2s7CisgIG11dGFibGUgYm9vbCBfTV9yZWFkX2RvbmU7CisKKyAgdm9pZCBfTV9yZWFkKCkgY29uc3QgeworICAgIF9NX29rID0gKChfTV9zdHJlYW0gIT0gMCkgJiYgIV9NX3N0cmVhbS0+ZmFpbCgpKTsKKyAgICBpZiAoX01fb2spIHsKKyAgICAgICpfTV9zdHJlYW0gPj4gX01fdmFsdWU7CisgICAgICBfTV9vayA9ICFfTV9zdHJlYW0tPmZhaWwoKTsKKyAgICB9CisgICAgX01fcmVhZF9kb25lID0gdHJ1ZTsKKyAgfQorfTsKKworI2lmICFkZWZpbmVkIChfU1RMUF9MSU1JVEVEX0RFRkFVTFRfVEVNUExBVEVTKQordGVtcGxhdGUgPGNsYXNzIF9UcFAsCisgICAgICAgICAgY2xhc3MgX0NoYXJUID0gX1NUTFBfREVGQVVMVENIQVIsIGNsYXNzIF9UcmFpdHMgPSBjaGFyX3RyYWl0czxfQ2hhclQ+ID4KKyNlbHNlCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwUD4KKyNlbmRpZgorY2xhc3Mgb3N0cmVhbV9pdGVyYXRvcjogcHVibGljIGl0ZXJhdG9yPG91dHB1dF9pdGVyYXRvcl90YWcsIHZvaWQsIHZvaWQsIHZvaWQsIHZvaWQ+IHsKKyNpZiBkZWZpbmVkIChfU1RMUF9MSU1JVEVEX0RFRkFVTFRfVEVNUExBVEVTKQorICB0eXBlZGVmIGNoYXIgX0NoYXJUOworICB0eXBlZGVmIGNoYXJfdHJhaXRzPGNoYXI+IF9UcmFpdHM7CisgIHR5cGVkZWYgb3N0cmVhbV9pdGVyYXRvcjxfVHBQPiBfU2VsZjsKKyNlbHNlCisgIHR5cGVkZWYgb3N0cmVhbV9pdGVyYXRvcjxfVHBQLCBfQ2hhclQsIF9UcmFpdHM+IF9TZWxmOworI2VuZGlmCitwdWJsaWM6CisgIHR5cGVkZWYgX0NoYXJUICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKKyAgdHlwZWRlZiBfVHJhaXRzICAgICAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3R5cGU7CisgIHR5cGVkZWYgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+IG9zdHJlYW1fdHlwZTsKKworICB0eXBlZGVmIG91dHB1dF9pdGVyYXRvcl90YWcgICAgICAgICAgICBpdGVyYXRvcl9jYXRlZ29yeTsKKworICBvc3RyZWFtX2l0ZXJhdG9yKG9zdHJlYW1fdHlwZSYgX19zKSA6IF9NX3N0cmVhbSgmX19zKSwgX01fc3RyaW5nKDApIHt9CisgIG9zdHJlYW1faXRlcmF0b3Iob3N0cmVhbV90eXBlJiBfX3MsIGNvbnN0IF9DaGFyVCogX19jKQorICAgIDogX01fc3RyZWFtKCZfX3MpLCBfTV9zdHJpbmcoX19jKSAge30KKyAgX1NlbGYmIG9wZXJhdG9yPShjb25zdCBfVHBQJiBfX3ZhbCkgeworICAgICpfTV9zdHJlYW0gPDwgX192YWw7CisgICAgaWYgKF9NX3N0cmluZykgKl9NX3N0cmVhbSA8PCBfTV9zdHJpbmc7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIF9TZWxmJiBvcGVyYXRvciooKSB7IHJldHVybiAqdGhpczsgfQorICBfU2VsZiYgb3BlcmF0b3IrKygpIHsgcmV0dXJuICp0aGlzOyB9CisgIF9TZWxmJiBvcGVyYXRvcisrKGludCkgeyByZXR1cm4gKnRoaXM7IH0KK3ByaXZhdGU6CisgIG9zdHJlYW1fdHlwZSogX01fc3RyZWFtOworICBjb25zdCBfQ2hhclQqIF9NX3N0cmluZzsKK307CisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfT0xEX0hQX0lURVJBVE9SX1FVRVJJRVMpCisjICBpZiBkZWZpbmVkIChfU1RMUF9MSU1JVEVEX0RFRkFVTFRfVEVNUExBVEVTKQordGVtcGxhdGUgPGNsYXNzIF9UcFA+CitpbmxpbmUgb3V0cHV0X2l0ZXJhdG9yX3RhZyBfU1RMUF9DQUxMCitpdGVyYXRvcl9jYXRlZ29yeShjb25zdCBvc3RyZWFtX2l0ZXJhdG9yPF9UcFA+JikgeyByZXR1cm4gb3V0cHV0X2l0ZXJhdG9yX3RhZygpOyB9CisjICBlbHNlCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwUCwgY2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgoraW5saW5lIG91dHB1dF9pdGVyYXRvcl90YWcgX1NUTFBfQ0FMTAoraXRlcmF0b3JfY2F0ZWdvcnkoY29uc3Qgb3N0cmVhbV9pdGVyYXRvcjxfVHBQLCBfQ2hhclQsIF9UcmFpdHM+JikgeyByZXR1cm4gb3V0cHV0X2l0ZXJhdG9yX3RhZygpOyB9CisjICBlbmRpZgorI2VuZGlmCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworLy8gZm9ybS1pbmRlcGVuZGVudCBkZWZpbmlvdGlvbiBvZiBzdHJlYW0gaXRlcmF0b3JzCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPCBfX0lTSV9UTVBMX0hFQURFUl9BUkdVTUVOVFMgPgoraW5saW5lIGJvb2wgX1NUTFBfQ0FMTAorb3BlcmF0b3I9PShjb25zdCBpc3RyZWFtX2l0ZXJhdG9yPCBfX0lTSV9UTVBMX0FSR1VNRU5UUyA+JiBfX3gsCisgICAgICAgICAgIGNvbnN0IGlzdHJlYW1faXRlcmF0b3I8IF9fSVNJX1RNUExfQVJHVU1FTlRTID4mIF9feSkKK3sgcmV0dXJuIF9feC5fTV9lcXVhbChfX3kpOyB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfU0VQQVJBVEVfUkVMT1BTX05BTUVTUEFDRSkKK3RlbXBsYXRlIDwgX19JU0lfVE1QTF9IRUFERVJfQVJHVU1FTlRTID4KK2lubGluZSBib29sIF9TVExQX0NBTEwKK29wZXJhdG9yIT0oY29uc3QgaXN0cmVhbV9pdGVyYXRvcjwgX19JU0lfVE1QTF9BUkdVTUVOVFMgPiYgX194LAorICAgICAgICAgICBjb25zdCBpc3RyZWFtX2l0ZXJhdG9yPCBfX0lTSV9UTVBMX0FSR1VNRU5UUyA+JiBfX3kpCit7IHJldHVybiAhX194Ll9NX2VxdWFsKF9feSk7IH0KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX09MRF9IUF9JVEVSQVRPUl9RVUVSSUVTKQordGVtcGxhdGUgPCBfX0lTSV9UTVBMX0hFQURFUl9BUkdVTUVOVFMgPgoraW5saW5lIGlucHV0X2l0ZXJhdG9yX3RhZyBfU1RMUF9DQUxMCitpdGVyYXRvcl9jYXRlZ29yeShjb25zdCBpc3RyZWFtX2l0ZXJhdG9yPCBfX0lTSV9UTVBMX0FSR1VNRU5UUyA+JikKK3sgcmV0dXJuIGlucHV0X2l0ZXJhdG9yX3RhZygpOyB9Cit0ZW1wbGF0ZSA8IF9fSVNJX1RNUExfSEVBREVSX0FSR1VNRU5UUyA+CitpbmxpbmUgX1RwKiBfU1RMUF9DQUxMCit2YWx1ZV90eXBlKGNvbnN0IGlzdHJlYW1faXRlcmF0b3I8IF9fSVNJX1RNUExfQVJHVU1FTlRTID4mKSB7IHJldHVybiAoX1RwKikgMDsgfQorCisjICBpZiBkZWZpbmVkIChfU1RMUF9NSU5JTVVNX0RFRkFVTFRfVEVNUExBVEVfUEFSQU1TKSAmJiAhZGVmaW5lZCAoX1NUTFBfREVGQVVMVF9UWVBFX1BBUkFNKQordGVtcGxhdGUgPCBfX0lTSV9UTVBMX0hFQURFUl9BUkdVTUVOVFMgPgoraW5saW5lIHB0cmRpZmZfdCogX1NUTFBfQ0FMTAorZGlzdGFuY2VfdHlwZShjb25zdCBpc3RyZWFtX2l0ZXJhdG9yPCBfX0lTSV9UTVBMX0FSR1VNRU5UUyA+JikgeyByZXR1cm4gKHB0cmRpZmZfdCopMDsgfQorIyAgZWxzZQordGVtcGxhdGUgPCBfX0lTSV9UTVBMX0hFQURFUl9BUkdVTUVOVFMgPgoraW5saW5lIF9EaXN0KiBfU1RMUF9DQUxMCitkaXN0YW5jZV90eXBlKGNvbnN0IGlzdHJlYW1faXRlcmF0b3I8IF9fSVNJX1RNUExfQVJHVU1FTlRTID4mKSB7IHJldHVybiAoX0Rpc3QqKTA7IH0KKyMgIGVuZGlmIC8qIF9TVExQX01JTklNVU1fREVGQVVMVF9URU1QTEFURV9QQVJBTVMgKi8KKyNlbmRpZgorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyN1bmRlZiBfX0lTSV9UTVBMX0hFQURFUl9BUkdVTUVOVFMKKyN1bmRlZiBfX0lTSV9UTVBMX0FSR1VNRU5UUworCisjZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfU1RSRUFNX0lURVJBVE9SX0ggKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9fc3RyZWFtYnVmLmMgYi9zdGwvX3N0cmVhbWJ1Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNjFhMjAKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvX3N0cmVhbWJ1Zi5jCkBAIC0wLDAgKzEsMjA4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworI2lmbmRlZiBfU1RMUF9TVFJFQU1CVUZfQworI2RlZmluZSBfU1RMUF9TVFJFQU1CVUZfQworCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX1NUUkVBTUJVRgorIyAgaW5jbHVkZSA8c3RsL19zdHJlYW1idWYuaD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTm9uLWlubGluZSBiYXNpY19zdHJlYW1idWY8PiBtZW1iZXIgZnVuY3Rpb25zLgorCisjaWYgIWRlZmluZWQgKF9TVExQX01TVkMpIHx8IChfU1RMUF9NU1ZDID49IDEzMDApIHx8ICFkZWZpbmVkIChfU1RMUF9VU0VfU1RBVElDX0xJQikKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPjo6YmFzaWNfc3RyZWFtYnVmKCkKKyAgOiBfTV9nYmVnaW4oMCksIF9NX2duZXh0KDApLCBfTV9nZW5kKDApLAorICAgIF9NX3BiZWdpbigwKSwgX01fcG5leHQoMCksIF9NX3BlbmQoMCksCisgICAgX01fbG9jYWxlKCkgeworICAvLyAgX01fbG9jay5fTV9pbml0aWFsaXplKCk7Cit9CisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+Ojp+YmFzaWNfc3RyZWFtYnVmKCkKK3t9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Citsb2NhbGUKK2Jhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjpwdWJpbWJ1ZShjb25zdCBsb2NhbGUmIF9fbG9jKSB7CisgIHRoaXMtPmltYnVlKF9fbG9jKTsKKyAgbG9jYWxlIF9fdG1wID0gX01fbG9jYWxlOworICBfTV9sb2NhbGUgPSBfX2xvYzsKKyAgcmV0dXJuIF9fdG1wOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorc3RyZWFtc2l6ZQorYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz46OnhzZ2V0bihfQ2hhclQqIF9fcywgc3RyZWFtc2l6ZSBfX24pIHsKKyAgc3RyZWFtc2l6ZSBfX3Jlc3VsdCA9IDA7CisgIGNvbnN0IGludF90eXBlIF9fZW9mID0gX1RyYWl0czo6ZW9mKCk7CisKKyAgd2hpbGUgKF9fcmVzdWx0IDwgX19uKSB7CisgICAgaWYgKF9NX2duZXh0IDwgX01fZ2VuZCkgeworICAgICAgc2l6ZV90IF9fY2h1bmsgPSAobWluKSAoX19TVEFUSUNfQ0FTVChzaXplX3QsX01fZ2VuZCAtIF9NX2duZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fU1RBVElDX0NBU1Qoc2l6ZV90LF9fbiAtIF9fcmVzdWx0KSk7CisgICAgICBfVHJhaXRzOjpjb3B5KF9fcywgX01fZ25leHQsIF9fY2h1bmspOworICAgICAgX19yZXN1bHQgKz0gX19jaHVuazsKKyAgICAgIF9fcyArPSBfX2NodW5rOworICAgICAgX01fZ25leHQgKz0gX19jaHVuazsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBpbnRfdHlwZSBfX2MgPSB0aGlzLT5zYnVtcGMoKTsKKyAgICAgIGlmICghX1RyYWl0czo6ZXFfaW50X3R5cGUoX19jLCBfX2VvZikpIHsKKyAgICAgICAgKl9fcyA9IF9UcmFpdHM6OnRvX2NoYXJfdHlwZShfX2MpOworICAgICAgICArK19fcmVzdWx0OworICAgICAgICArK19fczsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgcmV0dXJuIF9fcmVzdWx0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorc3RyZWFtc2l6ZQorYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz46OnhzcHV0bihjb25zdCBfQ2hhclQqIF9fcywgc3RyZWFtc2l6ZSBfX24pCit7CisgIHN0cmVhbXNpemUgX19yZXN1bHQgPSAwOworICBjb25zdCBpbnRfdHlwZSBfX2VvZiA9IF9UcmFpdHM6OmVvZigpOworCisgIHdoaWxlIChfX3Jlc3VsdCA8IF9fbikgeworICAgIGlmIChfTV9wbmV4dCA8IF9NX3BlbmQpIHsKKyAgICAgIHNpemVfdCBfX2NodW5rID0gKG1pbikgKF9fU1RBVElDX0NBU1Qoc2l6ZV90LF9NX3BlbmQgLSBfTV9wbmV4dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX1NUQVRJQ19DQVNUKHNpemVfdCxfX24gLSBfX3Jlc3VsdCkpOworICAgICAgX1RyYWl0czo6Y29weShfTV9wbmV4dCwgX19zLCBfX2NodW5rKTsKKyAgICAgIF9fcmVzdWx0ICs9IF9fY2h1bms7CisgICAgICBfX3MgKz0gX19jaHVuazsKKyAgICAgIF9NX3BuZXh0ICs9IF9fY2h1bms7CisgICAgfQorCisgICAgZWxzZSBpZiAoIV9UcmFpdHM6OmVxX2ludF90eXBlKHRoaXMtPm92ZXJmbG93KF9UcmFpdHM6OnRvX2ludF90eXBlKCpfX3MpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19lb2YpKSB7CisgICAgICArK19fcmVzdWx0OworICAgICAgKytfX3M7CisgICAgfQorICAgIGVsc2UKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBfX3Jlc3VsdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK3N0cmVhbXNpemUKK2Jhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjpfTV94c3B1dG5jKF9DaGFyVCBfX2MsIHN0cmVhbXNpemUgX19uKQoreworICBzdHJlYW1zaXplIF9fcmVzdWx0ID0gMDsKKyAgY29uc3QgaW50X3R5cGUgX19lb2YgPSBfVHJhaXRzOjplb2YoKTsKKworICB3aGlsZSAoX19yZXN1bHQgPCBfX24pIHsKKyAgICBpZiAoX01fcG5leHQgPCBfTV9wZW5kKSB7CisgICAgICBzaXplX3QgX19jaHVuayA9IChtaW4pIChfX1NUQVRJQ19DQVNUKHNpemVfdCxfTV9wZW5kIC0gX01fcG5leHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX19TVEFUSUNfQ0FTVChzaXplX3QsX19uIC0gX19yZXN1bHQpKTsKKyAgICAgIF9UcmFpdHM6OmFzc2lnbihfTV9wbmV4dCwgX19jaHVuaywgX19jKTsKKyAgICAgIF9fcmVzdWx0ICs9IF9fY2h1bms7CisgICAgICBfTV9wbmV4dCArPSBfX2NodW5rOworICAgIH0KKworICAgIGVsc2UgaWYgKCFfVHJhaXRzOjplcV9pbnRfdHlwZSh0aGlzLT5vdmVyZmxvdyhfVHJhaXRzOjp0b19pbnRfdHlwZShfX2MpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19lb2YpKQorICAgICAgKytfX3Jlc3VsdDsKKyAgICBlbHNlCisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gX19yZXN1bHQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitfU1RMUF9UWVBFTkFNRV9PTl9SRVRVUk5fVFlQRSBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPjo6aW50X3R5cGUKK2Jhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjpfTV9zbmV4dGNfYXV4KCkKK3sKKyAgaW50X3R5cGUgX19lb2YgPSBfVHJhaXRzOjplb2YoKTsKKyAgaWYgKF9NX2dlbmQgPT0gX01fZ25leHQpCisgICAgcmV0dXJuIF9UcmFpdHM6OmVxX2ludF90eXBlKHRoaXMtPnVmbG93KCksIF9fZW9mKSA/IF9fZW9mIDogdGhpcy0+c2dldGMoKTsKKyAgZWxzZSB7CisgICAgX01fZ25leHQgPSBfTV9nZW5kOworICAgIHJldHVybiB0aGlzLT51bmRlcmZsb3coKTsKKyAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorX1NUTFBfVFlQRU5BTUVfT05fUkVUVVJOX1RZUEUgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz46OmludF90eXBlCitiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPjo6cGJhY2tmYWlsKGludF90eXBlKSB7CisgcmV0dXJuIF9UcmFpdHM6OmVvZigpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorX1NUTFBfVFlQRU5BTUVfT05fUkVUVVJOX1RZUEUgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz46OmludF90eXBlCitiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPjo6b3ZlcmZsb3coaW50X3R5cGUpIHsKKyAgcmV0dXJuIF9UcmFpdHM6OmVvZigpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorX1NUTFBfVFlQRU5BTUVfT05fUkVUVVJOX1RZUEUgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz46OmludF90eXBlCitiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPjo6dWZsb3coKSB7CisgICAgcmV0dXJuICggX1RyYWl0czo6ZXFfaW50X3R5cGUodGhpcy0+dW5kZXJmbG93KCksX1RyYWl0czo6ZW9mKCkpID8KKyAgICAgICAgICAgICBfVHJhaXRzOjplb2YoKSA6CisgICAgICAgICAgICAgX1RyYWl0czo6dG9faW50X3R5cGUoKl9NX2duZXh0KyspKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK19TVExQX1RZUEVOQU1FX09OX1JFVFVSTl9UWVBFIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjppbnRfdHlwZQorYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz46OnVuZGVyZmxvdygpCit7IHJldHVybiBfVHJhaXRzOjplb2YoKTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorc3RyZWFtc2l6ZQorYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz46OnNob3dtYW55YygpCit7IHJldHVybiAwOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Cit2b2lkCitiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPjo6aW1idWUoY29uc3QgbG9jYWxlJikge30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2ludAorYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz46OnN5bmMoKSB7IHJldHVybiAwOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitfU1RMUF9UWVBFTkFNRV9PTl9SRVRVUk5fVFlQRSBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPjo6cG9zX3R5cGUKK2Jhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjpzZWVrcG9zKHBvc190eXBlLCBpb3NfYmFzZTo6b3Blbm1vZGUpCit7IHJldHVybiBwb3NfdHlwZSgtMSk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK19TVExQX1RZUEVOQU1FX09OX1JFVFVSTl9UWVBFIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+Ojpwb3NfdHlwZQorYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz46OnNlZWtvZmYob2ZmX3R5cGUsIGlvc19iYXNlOjpzZWVrZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Om9wZW5tb2RlKQoreyByZXR1cm4gcG9zX3R5cGUoLTEpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPioKK2Jhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+Ojogc2V0YnVmKGNoYXJfdHlwZSosIHN0cmVhbXNpemUpCit7IHJldHVybiB0aGlzOyB9CisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2VuZGlmCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvX3N0cmVhbWJ1Zi5oIGIvc3RsL19zdHJlYW1idWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmRmMGE3Ci0tLSAvZGV2L251bGwKKysrIGIvc3RsL19zdHJlYW1idWYuaApAQCAtMCwwICsxLDMwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfU1RSRUFNQlVGCisjZGVmaW5lIF9TVExQX0lOVEVSTkFMX1NUUkVBTUJVRgorCisjaWZuZGVmIF9TVExQX0lPU19CQVNFX0gKKyMgIGluY2x1ZGUgPHN0bC9faW9zX2Jhc2UuaD4gICAgICAvLyBOZWVkZWQgZm9yIGlvc19iYXNlIGJpdGZpZWxkIG1lbWJlcnMuCisjZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPGlvc19iYXNlPiBpbmNsdWRlcyA8aW9zZndkPi4KKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ2xhc3MgYmFzaWNfc3RyZWFtYnVmPD4sIHRoZSBiYXNlIGNsYXNzIG9mIHRoZSBzdHJlYW1idWYgaGllcmFyY2h5LgorCisvLyBBIGJhc2ljX3N0cmVhbWJ1Zjw+IG1hbmFnZXMgYW4gaW5wdXQgKGdldCkgYXJlYSBhbmQgYW4gb3V0cHV0IChwdXQpCisvLyBhcmVhLiAgRWFjaCBpcyBkZXNjcmliZWQgYnkgdGhyZWUgcG9pbnRlcnM6IGEgYmVnaW5uaW5nLCBhbiBlbmQsIGFuZCBhCisvLyBjdXJyZW50IHBvc2l0aW9uLiAgYmFzaWNfc3RyZWFtYnVmPD4gY29udGFpbnMgc29tZSB2ZXJ5IHNpbXBsZSBtZW1iZXIKKy8vIGZ1bmN0aW9ucyB0aGF0IG1hbmlwdWxhdGUgdGhvc2Ugc2l4IHBvaW50ZXJzLCBidXQgYWxtb3N0IGFsbCBvZiB0aGUgcmVhbAorLy8gZnVuY3Rpb25hbGl0eSBnZXRzIGRlbGVnYXRlZCB0byBwcm90ZWN0ZWQgdmlydHVhbCBtZW1iZXIgZnVuY3Rpb25zLgorLy8gQWxsIG9mIHRoZSBwdWJsaWMgbWVtYmVyIGZ1bmN0aW9ucyBhcmUgaW5saW5lLCBhbmQgbW9zdCBvZiB0aGUgcHJvdGVjdGVkCisvLyBtZW1iZXIgZnVuY3Rpb25zIGFyZSB2aXJ0dWFsLgorCisvLyBBbHRob3VnaCBiYXNpY19zdHJlYW1idWY8PiBpcyBub3QgYWJzdHJhY3QsIGl0IGlzIHVzZWZ1bCBvbmx5IGFzIGEgYmFzZQorLy8gY2xhc3MuICBJdHMgdmlydHVhbCBtZW1iZXIgZnVuY3Rpb25zIGhhdmUgZGVmYXVsdCBkZWZpbml0aW9ucyBzdWNoIHRoYXQKKy8vIHJlYWRpbmcgZnJvbSBhIGJhc2ljX3N0cmVhbWJ1Zjw+IHdpbGwgYWx3YXlzIHlpZWxkIEVPRiwgYW5kIHdyaXRpbmcgdG8gYQorLy8gYmFzaWNfc3RyZWFtYnVmPD4gd2lsbCBhbHdheXMgZmFpbC4KKworLy8gVGhlIHNlY29uZCB0ZW1wbGF0ZSBwYXJhbWV0ZXIsIF9UcmFpdHMsIGRlZmF1bHRzIHRvIGNoYXJfdHJhaXRzPF9DaGFyVD4uCisvLyBUaGUgZGVmYXVsdCBpcyBkZWNsYXJlZCBpbiBoZWFkZXIgPGlvc2Z3ZD4sIGFuZCBpdCBpc24ndCBkZWNsYXJlZCBoZXJlCisvLyBiZWNhdXNlIEMrKyBsYW5ndWFnZSBydWxlcyBkbyBub3QgYWxsb3cgaXQgdG8gYmUgZGVjbGFyZWQgdHdpY2UuCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitjbGFzcyBiYXNpY19zdHJlYW1idWYgeworICBmcmllbmQgY2xhc3MgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OworICBmcmllbmQgY2xhc3MgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OworCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR5cGVkZWZzLgorICB0eXBlZGVmIF9DaGFyVCAgICAgICAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjppbnRfdHlwZSBpbnRfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpwb3NfdHlwZSBwb3NfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpvZmZfdHlwZSBvZmZfdHlwZTsKKyAgdHlwZWRlZiBfVHJhaXRzICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdHlwZTsKKworcHJpdmF0ZTogICAgICAgICAgICAgICAgICAgICAgICAvLyBEYXRhIG1lbWJlcnMuCisKKyAgY2hhcl90eXBlKiBfTV9nYmVnaW47ICAgICAgICAgLy8gQmVnaW5uaW5nIG9mIGdldCBhcmVhCisgIGNoYXJfdHlwZSogX01fZ25leHQ7ICAgICAgICAgIC8vIEN1cnJlbnQgcG9zaXRpb24gd2l0aGluIHRoZSBnZXQgYXJlYQorICBjaGFyX3R5cGUqIF9NX2dlbmQ7ICAgICAgICAgICAvLyBFbmQgb2YgZ2V0IGFyZWEKKworICBjaGFyX3R5cGUqIF9NX3BiZWdpbjsgICAgICAgICAvLyBCZWdpbm5pbmcgb2YgcHV0IGFyZWEKKyAgY2hhcl90eXBlKiBfTV9wbmV4dDsgICAgICAgICAgLy8gQ3VycmVudCBwb3NpdGlvbiB3aXRoaW4gdGhlIHB1dCBhcmVhCisgIGNoYXJfdHlwZSogX01fcGVuZDsgICAgICAgICAgIC8vIEVuZCBvZiBwdXQgYXJlYQorCisgIGxvY2FsZSBfTV9sb2NhbGU7ICAgICAgICAgICAgIC8vIFRoZSBzdHJlYW1idWYncyBsb2NhbGUgb2JqZWN0CisKKy8vcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFeHRlbnNpb246IGxvY2tpbmcsIGZvciB0aHJlYWQgc2FmZXR5LgorLy8gIF9TVExQX211dGV4IF9NX2xvY2s7CisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVzdHJ1Y3Rvci4KKyAgdmlydHVhbCB+YmFzaWNfc3RyZWFtYnVmKCk7CisKK3Byb3RlY3RlZDogICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGRlZmF1bHQgY29uc3RydWN0b3IuCisgIGJhc2ljX3N0cmVhbWJ1ZigpCisjaWYgZGVmaW5lZCAoX1NUTFBfTVNWQykgJiYgKF9TVExQX01TVkMgPCAxMzAwKSAmJiBkZWZpbmVkIChfU1RMUF9VU0VfU1RBVElDX0xJQikKKyAgICAvL1dlIG1ha2UgaXQgaW5saW5lIHRvIGF2b2lkIHVucmVzb2x2ZWQgc3ltYm9sLgorICAgIDogX01fZ2JlZ2luKDApLCBfTV9nbmV4dCgwKSwgX01fZ2VuZCgwKSwKKyAgICAgIF9NX3BiZWdpbigwKSwgX01fcG5leHQoMCksIF9NX3BlbmQoMCksCisgICAgICBfTV9sb2NhbGUoKQorICB7fQorI2Vsc2UKKyAgOworI2VuZGlmCisKK3Byb3RlY3RlZDogICAgICAgICAgICAgICAgICAgICAgLy8gUHJvdGVjdGVkIGludGVyZmFjZSB0byB0aGUgZ2V0IGFyZWEuCisgIGNoYXJfdHlwZSogZWJhY2soKSBjb25zdCB7IHJldHVybiBfTV9nYmVnaW47IH0gLy8gQmVnaW5uaW5nCisgIGNoYXJfdHlwZSogZ3B0cigpICBjb25zdCB7IHJldHVybiBfTV9nbmV4dDsgfSAgLy8gQ3VycmVudCBwb3NpdGlvbgorICBjaGFyX3R5cGUqIGVncHRyKCkgY29uc3QgeyByZXR1cm4gX01fZ2VuZDsgfSAgIC8vIEVuZAorCisgIHZvaWQgZ2J1bXAoaW50IF9fbikgeyBfTV9nbmV4dCArPSBfX247IH0KKyAgdm9pZCBzZXRnKGNoYXJfdHlwZSogX19nYmVnaW4sIGNoYXJfdHlwZSogX19nbmV4dCwgY2hhcl90eXBlKiBfX2dlbmQpIHsKKyAgICBfTV9nYmVnaW4gPSBfX2diZWdpbjsKKyAgICBfTV9nbmV4dCAgPSBfX2duZXh0OworICAgIF9NX2dlbmQgICA9IF9fZ2VuZDsKKyAgfQorCitwdWJsaWM6CisgIC8vIEFuIGFsdGVybmF0ZSBwdWJsaWMgaW50ZXJmYWNlIHRvIHRoZSBhYm92ZSBmdW5jdGlvbnMKKyAgLy8gd2hpY2ggYWxsb3dzIHVzIHRvIGF2b2lkIHVzaW5nIHRlbXBsYXRlZCBmcmllbmRzIHdoaWNoCisgIC8vIGFyZSBub3Qgc3VwcG9ydGVkIG9uIHNvbWUgY29tcGlsZXJzLgorICBjaGFyX3R5cGUqIF9NX2ViYWNrKCkgY29uc3QgeyByZXR1cm4gZWJhY2soKTsgfQorICBjaGFyX3R5cGUqIF9NX2dwdHIoKSAgY29uc3QgeyByZXR1cm4gZ3B0cigpOyB9CisgIGNoYXJfdHlwZSogX01fZWdwdHIoKSBjb25zdCB7IHJldHVybiBlZ3B0cigpOyB9CisgIHZvaWQgX01fZ2J1bXAoaW50IF9fbikgICAgICB7IGdidW1wKF9fbik7IH0KKyAgdm9pZCBfTV9zZXRnKGNoYXJfdHlwZSogX19nYmVnaW4sIGNoYXJfdHlwZSogX19nbmV4dCwgY2hhcl90eXBlKiBfX2dlbmQpCisgIHsgdGhpcy0+c2V0ZyhfX2diZWdpbiwgX19nbmV4dCwgX19nZW5kKTsgfQorCitwcm90ZWN0ZWQ6ICAgICAgICAgICAgICAgICAgICAgIC8vIFByb3RlY3RlZCBpbnRlcmZhY2UgdG8gdGhlIHB1dCBhcmVhCisKKyAgY2hhcl90eXBlKiBwYmFzZSgpIGNvbnN0IHsgcmV0dXJuIF9NX3BiZWdpbjsgfSAvLyBCZWdpbm5pbmcKKyAgY2hhcl90eXBlKiBwcHRyKCkgIGNvbnN0IHsgcmV0dXJuIF9NX3BuZXh0OyB9ICAvLyBDdXJyZW50IHBvc2l0aW9uCisgIGNoYXJfdHlwZSogZXBwdHIoKSBjb25zdCB7IHJldHVybiBfTV9wZW5kOyB9ICAgLy8gRW5kCisKKyAgdm9pZCBwYnVtcChpbnQgX19uKSB7IF9NX3BuZXh0ICs9IF9fbjsgfQorICB2b2lkIHNldHAoY2hhcl90eXBlKiBfX3BiZWdpbiwgY2hhcl90eXBlKiBfX3BlbmQpIHsKKyAgICBfTV9wYmVnaW4gPSBfX3BiZWdpbjsKKyAgICBfTV9wbmV4dCAgPSBfX3BiZWdpbjsKKyAgICBfTV9wZW5kICAgPSBfX3BlbmQ7CisgIH0KKworcHJvdGVjdGVkOiAgICAgICAgICAgICAgICAgICAgICAvLyBWaXJ0dWFsIGJ1ZmZlciBtYW5hZ2VtZW50IGZ1bmN0aW9ucy4KKworICB2aXJ0dWFsIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBzZXRidWYoY2hhcl90eXBlKiwgc3RyZWFtc2l6ZSk7CisKKyAgLy8gQWx0ZXJzIHRoZSBzdHJlYW0gcG9zaXRpb24sIHVzaW5nIGFuIGludGVnZXIgb2Zmc2V0LiAgSW4gdGhpcworICAvLyBjbGFzcyBzZWVrb2ZmIGRvZXMgbm90aGluZzsgc3ViY2xhc3NlcyBhcmUgZXhwZWN0ZWQgdG8gb3ZlcnJpZGUgaXQuCisgIHZpcnR1YWwgcG9zX3R5cGUgc2Vla29mZihvZmZfdHlwZSwgaW9zX2Jhc2U6OnNlZWtkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6b3Blbm1vZGUgPSBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0KTsKKworICAvLyBBbHRlcnMgdGhlIHN0cmVhbSBwb3NpdGlvbiwgdXNpbmcgYSBwcmV2aW91c2x5IG9idGFpbmVkIHN0cmVhbXBvcy4gIEluCisgIC8vIHRoaXMgY2xhc3Mgc2Vla3BvcyBkb2VzIG5vdGhpbmc7IHN1YmNsYXNzZXMgYXJlIGV4cGVjdGVkIHRvIG92ZXJyaWRlIGl0LgorICB2aXJ0dWFsIHBvc190eXBlCisgIHNlZWtwb3MocG9zX3R5cGUsIGlvc19iYXNlOjpvcGVubW9kZSA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpOworCisgIC8vIFN5bmNocm9uaXplcyAoaS5lLiBmbHVzaGVzKSB0aGUgYnVmZmVyLiAgQWxsIHN1YmNsYXNzZXMgYXJlIGV4cGVjdGVkIHRvCisgIC8vIG92ZXJyaWRlIHRoaXMgdmlydHVhbCBtZW1iZXIgZnVuY3Rpb24uCisgIHZpcnR1YWwgaW50IHN5bmMoKTsKKworCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJ1ZmZlciBtYW5hZ2VtZW50LgorICBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogcHVic2V0YnVmKGNoYXJfdHlwZSogX19zLCBzdHJlYW1zaXplIF9fbikKKyAgeyByZXR1cm4gdGhpcy0+c2V0YnVmKF9fcywgX19uKTsgfQorCisgIHBvc190eXBlIHB1YnNlZWtvZmYob2ZmX3R5cGUgX19vZmZzZXQsIGlvc19iYXNlOjpzZWVrZGlyIF9fd2F5LAorICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZCA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpCisgIHsgcmV0dXJuIHRoaXMtPnNlZWtvZmYoX19vZmZzZXQsIF9fd2F5LCBfX21vZCk7IH0KKworICBwb3NfdHlwZSBwdWJzZWVrcG9zKHBvc190eXBlIF9fc3AsCisgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kID0gaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6Om91dCkKKyAgeyByZXR1cm4gdGhpcy0+c2Vla3BvcyhfX3NwLCBfX21vZCk7IH0KKworICBpbnQgcHVic3luYygpIHsgcmV0dXJuIHRoaXMtPnN5bmMoKTsgfQorCitwcm90ZWN0ZWQ6ICAgICAgICAgICAgICAgICAgICAgIC8vIFZpcnR1YWwgZ2V0IGFyZWEgZnVuY3Rpb25zLCBhcyBkZWZpbmVkIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDE3LjUuMi40LjMgYW5kIDE3LjUuMi40LjQgb2YgdGhlIHN0YW5kYXJkLgorICAvLyBSZXR1cm5zIGEgbG93ZXIgYm91bmQgb24gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgd2UgY2FuIHJlYWQsCisgIC8vIHdpdGggdW5kZXJmbG93LCBiZWZvcmUgcmVhY2hpbmcgZW5kIG9mIGZpbGUuICAoLTEgaXMgYSBzcGVjaWFsIHZhbHVlOgorICAvLyBpdCBtZWFucyB0aGF0IHVuZGVyZmxvdyB3aWxsIGZhaWwuKSAgTW9zdCBzdWJjbGFzc2VzIHNob3VsZCBwcm9iYWJseQorICAvLyBvdmVycmlkZSB0aGlzIHZpcnR1YWwgbWVtYmVyIGZ1bmN0aW9uLgorICB2aXJ0dWFsIHN0cmVhbXNpemUgc2hvd21hbnljKCk7CisKKyAgLy8gUmVhZHMgdXAgdG8gX19uIGNoYXJhY3RlcnMuICBSZXR1cm4gdmFsdWUgaXMgdGhlIG51bWJlciBvZgorICAvLyBjaGFyYWN0ZXJzIHJlYWQuCisgIHZpcnR1YWwgc3RyZWFtc2l6ZSB4c2dldG4oY2hhcl90eXBlKiBfX3MsIHN0cmVhbXNpemUgX19uKTsKKworICAvLyBDYWxsZWQgd2hlbiB0aGVyZSBpcyBubyByZWFkIHBvc2l0aW9uLCBpLmUuIHdoZW4gZ3B0cigpIGlzIG51bGwKKyAgLy8gb3Igd2hlbiBncHRyKCkgPj0gZWdwdHIoKS4gIFN1YmNsYXNzZXMgYXJlIGV4cGVjdGVkIHRvIG92ZXJyaWRlCisgIC8vIHRoaXMgdmlydHVhbCBtZW1iZXIgZnVuY3Rpb24uCisgIHZpcnR1YWwgaW50X3R5cGUgdW5kZXJmbG93KCk7CisKKyAgLy8gU2ltaWxhciB0byB1bmRlcmZsb3coKSwgYnV0IHVzZWQgZm9yIHVuYnVmZmVyZWQgaW5wdXQuICBNb3N0CisgIC8vIHN1YmNsYXNzZXMgc2hvdWxkIHByb2JhYmx5IG92ZXJyaWRlIHRoaXMgdmlydHVhbCBtZW1iZXIgZnVuY3Rpb24uCisgIHZpcnR1YWwgaW50X3R5cGUgdWZsb3coKTsKKworICAvLyBDYWxsZWQgd2hlbiB0aGVyZSBpcyBubyBwdXRiYWNrIHBvc2l0aW9uLCBpLmUuIHdoZW4gZ3B0cigpIGlzIG51bGwKKyAgLy8gb3Igd2hlbiBncHRyKCkgPT0gZWJhY2soKS4gIEFsbCBzdWJjbGFzc2VzIGFyZSBleHBlY3RlZCB0byBvdmVycmlkZQorICAvLyB0aGlzIHZpcnR1YWwgbWVtYmVyIGZ1bmN0aW9uLgorICB2aXJ0dWFsIGludF90eXBlIHBiYWNrZmFpbChpbnRfdHlwZSA9IHRyYWl0c190eXBlOjplb2YoKSk7CisKK3Byb3RlY3RlZDogICAgICAgICAgICAgICAgICAgICAgLy8gVmlydHVhbCBwdXQgYXJlYSBmdW5jdGlvbnMsIGFzIGRlZmluZWQgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMjcuNS4yLjQuNSBvZiB0aGUgc3RhbmRhcmQuCisKKyAgLy8gV3JpdGVzIHVwIHRvIF9fbiBjaGFyYWN0ZXJzLiAgUmV0dXJuIHZhbHVlIGlzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycworICAvLyB3cml0dGVuLgorICB2aXJ0dWFsIHN0cmVhbXNpemUgeHNwdXRuKGNvbnN0IGNoYXJfdHlwZSogX19zLCBzdHJlYW1zaXplIF9fbik7CisKKyAgLy8gRXh0ZW5zaW9uOiB3cml0ZXMgdXAgdG8gX19uIGNvcGllcyBvZiBfX2MuICBSZXR1cm4gdmFsdWUgaXMgdGhlIG51bWJlcgorICAvLyBvZiBjaGFyYWN0ZXJzIHdyaXR0ZW4uCisgIHZpcnR1YWwgc3RyZWFtc2l6ZSBfTV94c3B1dG5jKGNoYXJfdHlwZSBfX2MsIHN0cmVhbXNpemUgX19uKTsKKworICAvLyBDYWxsZWQgd2hlbiB0aGVyZSBpcyBubyB3cml0ZSBwb3NpdGlvbi4gIEFsbCBzdWJjbGFzc2VzIGFyZSBleHBlY3RlZCB0bworICAvLyBvdmVycmlkZSB0aGlzIHZpcnR1YWwgbWVtYmVyIGZ1bmN0aW9uLgorICB2aXJ0dWFsIGludF90eXBlIG92ZXJmbG93KGludF90eXBlID0gdHJhaXRzX3R5cGU6OmVvZigpKTsKKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQdWJsaWMgbWVtYmVycyBmb3Igd3JpdGluZyBjaGFyYWN0ZXJzLgorICAvLyBXcml0ZSBhIHNpbmdsZSBjaGFyYWN0ZXIuCisgIGludF90eXBlIHNwdXRjKGNoYXJfdHlwZSBfX2MpIHsKKyAgICByZXR1cm4gKChfTV9wbmV4dCA8IF9NX3BlbmQpID8gX1RyYWl0czo6dG9faW50X3R5cGUoKl9NX3BuZXh0KysgPSBfX2MpCisgICAgICA6IHRoaXMtPm92ZXJmbG93KF9UcmFpdHM6OnRvX2ludF90eXBlKF9fYykpKTsKKyAgfQorCisgIC8vIFdyaXRlIF9fbiBjaGFyYWN0ZXJzLgorICBzdHJlYW1zaXplIHNwdXRuKGNvbnN0IGNoYXJfdHlwZSogX19zLCBzdHJlYW1zaXplIF9fbikKKyAgeyByZXR1cm4gdGhpcy0+eHNwdXRuKF9fcywgX19uKTsgfQorCisgIC8vIEV4dGVuc2lvbjogd3JpdGUgX19uIGNvcGllcyBvZiBfX2MuCisgIHN0cmVhbXNpemUgX01fc3B1dG5jKGNoYXJfdHlwZSBfX2MsIHN0cmVhbXNpemUgX19uKQorICB7IHJldHVybiB0aGlzLT5fTV94c3B1dG5jKF9fYywgX19uKTsgfQorCitwcml2YXRlOiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhlbHBlciBmdW5jdGlvbnMuCisgIGludF90eXBlIF9NX3NuZXh0Y19hdXgoKTsKKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQdWJsaWMgbWVtYmVycyBmb3IgcmVhZGluZyBjaGFyYWN0ZXJzLgorICBzdHJlYW1zaXplIGluX2F2YWlsKCkgeworICAgIHJldHVybiAoX01fZ25leHQgPCBfTV9nZW5kKSA/IChfTV9nZW5kIC0gX01fZ25leHQpIDogdGhpcy0+c2hvd21hbnljKCk7CisgIH0KKworICAvLyBBZHZhbmNlIHRvIHRoZSBuZXh0IGNoYXJhY3RlciBhbmQgcmV0dXJuIGl0LgorICBpbnRfdHlwZSBzbmV4dGMoKSB7CisgIHJldHVybiAoIF9NX2dlbmQgLSBfTV9nbmV4dCA+IDEgPworICAgICAgICAgICAgIF9UcmFpdHM6OnRvX2ludF90eXBlKCorK19NX2duZXh0KSA6CisgICAgICAgICAgICAgdGhpcy0+X01fc25leHRjX2F1eCgpKTsKKyAgfQorCisgIC8vIFJldHVybiB0aGUgY3VycmVudCBjaGFyYWN0ZXIgYW5kIGFkdmFuY2UgdG8gdGhlIG5leHQuCisgIGludF90eXBlIHNidW1wYygpIHsKKyAgICByZXR1cm4gX01fZ25leHQgPCBfTV9nZW5kID8gX1RyYWl0czo6dG9faW50X3R5cGUoKl9NX2duZXh0KyspCisgICAgICA6IHRoaXMtPnVmbG93KCk7CisgIH0KKworICAvLyBSZXR1cm4gdGhlIGN1cnJlbnQgY2hhcmFjdGVyIHdpdGhvdXQgYWR2YW5jaW5nIHRvIHRoZSBuZXh0LgorICBpbnRfdHlwZSBzZ2V0YygpIHsKKyAgICByZXR1cm4gX01fZ25leHQgPCBfTV9nZW5kID8gX1RyYWl0czo6dG9faW50X3R5cGUoKl9NX2duZXh0KQorICAgICAgOiB0aGlzLT51bmRlcmZsb3coKTsKKyAgfQorCisgIHN0cmVhbXNpemUgc2dldG4oY2hhcl90eXBlKiBfX3MsIHN0cmVhbXNpemUgX19uKQorICB7IHJldHVybiB0aGlzLT54c2dldG4oX19zLCBfX24pOyB9CisKKyAgaW50X3R5cGUgc3B1dGJhY2tjKGNoYXJfdHlwZSBfX2MpIHsKKyAgICByZXR1cm4gKChfTV9nYmVnaW4gPCBfTV9nbmV4dCkgJiYgX1RyYWl0czo6ZXEoX19jLCAqKF9NX2duZXh0IC0gMSkpKQorICAgICAgPyBfVHJhaXRzOjp0b19pbnRfdHlwZSgqLS1fTV9nbmV4dCkKKyAgICAgIDogdGhpcy0+cGJhY2tmYWlsKF9UcmFpdHM6OnRvX2ludF90eXBlKF9fYykpOworICB9CisKKyAgaW50X3R5cGUgc3VuZ2V0YygpIHsKKyAgICByZXR1cm4gKF9NX2diZWdpbiA8IF9NX2duZXh0KQorICAgICAgPyBfVHJhaXRzOjp0b19pbnRfdHlwZSgqLS1fTV9nbmV4dCkKKyAgICAgIDogdGhpcy0+cGJhY2tmYWlsKCk7CisgIH0KKworcHJvdGVjdGVkOiAgICAgICAgICAgICAgICAgICAgICAvLyBWaXJ0dWFsIGxvY2FsZSBmdW5jdGlvbnMuCisKKyAgLy8gVGhpcyBpcyBhIGhvb2ssIGNhbGxlZCBieSBwdWJpbWJ1ZSgpIGp1c3QgYmVmb3JlIHB1YmltYnVlKCkKKyAgLy8gc2V0cyB0aGUgc3RyZWFtYnVmJ3MgbG9jYWxlIHRvIF9fbG9jLiAgTm90ZSB0aGF0IGltYnVlIHNob3VsZAorICAvLyBub3QgKGFuZCBjYW5ub3QsIHNpbmNlIGl0IGhhcyBubyBhY2Nlc3MgdG8gc3RyZWFtYnVmJ3MgcHJpdmF0ZQorICAvLyBtZW1iZXJzKSBzZXQgdGhlIHN0cmVhbWJ1ZidzIGxvY2FsZSBpdHNlbGYuCisgIHZpcnR1YWwgdm9pZCBpbWJ1ZShjb25zdCBsb2NhbGUmKTsKKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMb2NhbGUtcmVsYXRlZCBmdW5jdGlvbnMuCisgIGxvY2FsZSBwdWJpbWJ1ZShjb25zdCBsb2NhbGUmKTsKKyAgbG9jYWxlIGdldGxvYygpIGNvbnN0IHsgcmV0dXJuIF9NX2xvY2FsZTsgfQorCisjaWYgIWRlZmluZWQgKF9TVExQX05PX0FOQUNIUk9OSVNNUykKKyAgdm9pZCBzdG9zc2MoKSB7IHRoaXMtPnNidW1wYygpOyB9CisjZW5kaWYKKyNpZiBkZWZpbmVkIChfX01WU19fKSB8fCBkZWZpbmVkIChfX09TNDAwX18pCitwcml2YXRlOiAvLyBEYXRhIG1lbWJlcnMuCisKKyAgY2hhcl90eXBlKiBfTV9nYmVnaW47IC8vIEJlZ2lubmluZyBvZiBnZXQgYXJlYQorICBjaGFyX3R5cGUqIF9NX2duZXh0OyAvLyBDdXJyZW50IHBvc2l0aW9uIHdpdGhpbiB0aGUgZ2V0IGFyZWEKKyAgY2hhcl90eXBlKiBfTV9nZW5kOyAvLyBFbmQgb2YgZ2V0IGFyZWEKKworICBjaGFyX3R5cGUqIF9NX3BiZWdpbjsgLy8gQmVnaW5uaW5nIG9mIHB1dCBhcmVhCisgIGNoYXJfdHlwZSogX01fcG5leHQ7IC8vIEN1cnJlbnQgcG9zaXRpb24gd2l0aGluIHRoZSBwdXQgYXJlYQorICBjaGFyX3R5cGUqIF9NX3BlbmQ7IC8vIEVuZCBvZiBwdXQgYXJlYQorI2VuZGlmCit9OworCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCkKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBiYXNpY19zdHJlYW1idWY8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPjsKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQorX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIGJhc2ljX3N0cmVhbWJ1Zjx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+OworIyAgZW5kaWYgLy8gX1NUTFBfTk9fV0NIQVJfVAorI2VuZGlmIC8vIF9TVExQX1VTRV9URU1QTEFURV9FWFBPUlQKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjaWYgZGVmaW5lZCAoX1NUTFBfRVhQT1NFX1NUUkVBTV9JTVBMRU1FTlRBVElPTikgJiYgIWRlZmluZWQgKF9TVExQX0xJTktfVElNRV9JTlNUQU5USUFUSU9OKQorIyAgaW5jbHVkZSA8c3RsL19zdHJlYW1idWYuYz4KKyNlbmRpZgorCisjZW5kaWYKKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9fc3RyaW5nLmMgYi9zdGwvX3N0cmluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkYmM2MjgKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvX3N0cmluZy5jCkBAIC0wLDAgKzEsNjkxIEBACisvKgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisjaWZuZGVmIF9TVExQX1NUUklOR19DCisjZGVmaW5lIF9TVExQX1NUUklOR19DCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfU1RSSU5HX0gKKyMgIGluY2x1ZGUgPHN0bC9fc3RyaW5nLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DVFJBSVRTX0ZVTkNUSU9OU19ICisjICBpbmNsdWRlIDxzdGwvX2N0cmFpdHNfZm5zLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9NU1ZDNl9NRU1fVF9CVUdfV09SS0FST1VORCkKKyMgIGRlZmluZSBiYXNpY19zdHJpbmcgX1NUTFBfTk9fTUVNX1RfTkFNRShzdHIpCisjZWxpZiBkZWZpbmVkIChfU1RMUF9ERUJVRykKKyMgIGRlZmluZSBiYXNpY19zdHJpbmcgX1NUTFBfTk9OX0RCR19OQU1FKHN0cikKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfTkVTVEVEX1RZUEVfUEFSQU1fQlVHKQorIyAgZGVmaW5lIF9fc2l6ZV90eXBlX18gc2l6ZV90CisjICBkZWZpbmUgc2l6ZV90eXBlIHNpemVfdAorIyAgZGVmaW5lIGl0ZXJhdG9yIF9DaGFyVCoKKyNlbHNlCisjICBkZWZpbmUgX19zaXplX3R5cGVfXyBfU1RMUF9UWVBFTkFNRV9PTl9SRVRVUk5fVFlQRSBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPjo6c2l6ZV90eXBlCisjZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKworLy8gQSBoZWxwZXIgY2xhc3MgdG8gdXNlIGEgY2hhcl90cmFpdHMgYXMgYSBmdW5jdGlvbiBvYmplY3QuCit0ZW1wbGF0ZSA8Y2xhc3MgX1RyYWl0cz4KK3N0cnVjdCBfTm90X3dpdGhpbl90cmFpdHMgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248dHlwZW5hbWUgX1RyYWl0czo6Y2hhcl90eXBlLCBib29sPiB7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6Y2hhcl90eXBlIF9DaGFyVDsKKyAgY29uc3QgX0NoYXJUKiBfTV9maXJzdDsKKyAgY29uc3QgX0NoYXJUKiBfTV9sYXN0OworCisgIF9Ob3Rfd2l0aGluX3RyYWl0cyhjb25zdCBfQ2hhclQqIF9fZiwgY29uc3QgX0NoYXJUKiBfX2wpCisgICAgOiBfTV9maXJzdChfX2YpLCBfTV9sYXN0KF9fbCkge30KKworICBib29sIG9wZXJhdG9yKCkoY29uc3QgX0NoYXJUJiBfX3gpIGNvbnN0IHsKKyAgICByZXR1cm4gZmluZF9pZihfTV9maXJzdCwgX01fbGFzdCwKKyAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9FcV9jaGFyX2JvdW5kPF9UcmFpdHM+KF9feCkpID09IF9NX2xhc3Q7CisgIH0KK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTm9uLWlubGluZSBkZWNsYXJhdGlvbnMuCisKKyNpZiAhZGVmaW5lZCAoYmFzaWNfc3RyaW5nKQorX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisjZW5kaWYKKworLy8gQ2hhbmdlIHRoZSBzdHJpbmcncyBjYXBhY2l0eSBzbyB0aGF0IGl0IGlzIGxhcmdlIGVub3VnaCB0byBob2xkCisvLyAgYXQgbGVhc3QgX19yZXNfYXJnIGVsZW1lbnRzLCBwbHVzIHRoZSB0ZXJtaW5hdGluZyBfQ2hhclQoKS4gIE5vdGUgdGhhdCwKKy8vICBpZiBfX3Jlc19hcmcgPCBjYXBhY2l0eSgpLCB0aGlzIG1lbWJlciBmdW5jdGlvbiBtYXkgYWN0dWFsbHkgZGVjcmVhc2UKKy8vICB0aGUgc3RyaW5nJ3MgY2FwYWNpdHkuCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+Cit2b2lkIGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+OjpyZXNlcnZlKHNpemVfdHlwZSBfX3Jlc19hcmcpIHsKKyAgaWYgKF9fcmVzX2FyZyA+IG1heF9zaXplKCkpCisgICAgdGhpcy0+X01fdGhyb3dfbGVuZ3RoX2Vycm9yKCk7CisKKyAgc2l6ZV90eXBlIF9fbiA9IChtYXgpKF9fcmVzX2FyZywgc2l6ZSgpKSArIDE7CisgIGlmIChfX24gPD0gY2FwYWNpdHkoKSArIDEpCisgICAgcmV0dXJuOworCisgIHBvaW50ZXIgX19uZXdfc3RhcnQgPSB0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5hbGxvY2F0ZShfX24sIF9fbik7CisgIHBvaW50ZXIgX19uZXdfZmluaXNoID0gX19uZXdfc3RhcnQ7CisKKyAgX1NUTFBfVFJZIHsKKyAgICBfX25ld19maW5pc2ggPSBfU1RMUF9QUklWIF9fdWNvcHkodGhpcy0+X01fU3RhcnQoKSwgdGhpcy0+X01fRmluaXNoKCksIF9fbmV3X3N0YXJ0KTsKKyAgICBfTV9jb25zdHJ1Y3RfbnVsbChfX25ld19maW5pc2gpOworICB9CisgIF9TVExQX1VOV0lORCgoX1NUTFBfU1REOjpfRGVzdHJveV9SYW5nZShfX25ld19zdGFydCwgX19uZXdfZmluaXNoKSwKKyAgICAgICAgICAgICAgICB0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5kZWFsbG9jYXRlKF9fbmV3X3N0YXJ0LCBfX24pKSkKKworICB0aGlzLT5fTV9kZXN0cm95X3JhbmdlKCk7CisgIHRoaXMtPl9NX2RlYWxsb2NhdGVfYmxvY2soKTsKKyAgdGhpcy0+X01fcmVzZXQoX19uZXdfc3RhcnQsIF9fbmV3X2ZpbmlzaCwgX19uZXdfc3RhcnQgKyBfX24pOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CitiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiYKK2Jhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+OjphcHBlbmQoc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYykgeworICBpZiAoX19uID4gbWF4X3NpemUoKSB8fCBzaXplKCkgPiBtYXhfc2l6ZSgpIC0gX19uKQorICAgIHRoaXMtPl9NX3Rocm93X2xlbmd0aF9lcnJvcigpOworICBpZiAoc2l6ZSgpICsgX19uID4gY2FwYWNpdHkoKSkKKyAgICByZXNlcnZlKHNpemUoKSArIChtYXgpKHNpemUoKSwgX19uKSk7CisgIGlmIChfX24gPiAwKSB7CisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1NIT1JUX1NUUklOR19PUFRJTSkKKyAgICBpZiAodGhpcy0+X01fdXNpbmdfc3RhdGljX2J1ZigpKQorICAgICAgX1RyYWl0czo6YXNzaWduKHRoaXMtPl9NX2ZpbmlzaCArIDEsIF9fbiAtIDEsIF9fYyk7CisgICAgZWxzZQorI2VuZGlmIC8qIF9TVExQX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0gKi8KKyAgICBfU1RMUF9QUklWIF9fdW5pbml0aWFsaXplZF9maWxsX24odGhpcy0+X01fZmluaXNoICsgMSwgX19uIC0gMSwgX19jKTsKKyAgICBfU1RMUF9UUlkgeworICAgICAgX01fY29uc3RydWN0X251bGwodGhpcy0+X01fZmluaXNoICsgX19uKTsKKyAgICB9CisgICAgX1NUTFBfVU5XSU5EKHRoaXMtPl9NX2Rlc3Ryb3lfcHRyX3JhbmdlKHRoaXMtPl9NX2ZpbmlzaCArIDEsIHRoaXMtPl9NX2ZpbmlzaCArIF9fbikpCisgICAgX1RyYWl0czo6YXNzaWduKCplbmQoKSwgX19jKTsKKyAgICB0aGlzLT5fTV9maW5pc2ggKz0gX19uOworICB9CisgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46Ol9NX2FwcGVuZChjb25zdCBfQ2hhclQqIF9fZmlyc3QsIGNvbnN0IF9DaGFyVCogX19sYXN0KSB7CisgIGlmIChfX2ZpcnN0ICE9IF9fbGFzdCkgeworICAgIGNvbnN0IHNpemVfdHlwZSBfX29sZF9zaXplID0gc2l6ZSgpOworICAgIHB0cmRpZmZfdCBfX24gPSBfX2xhc3QgLSBfX2ZpcnN0OworICAgIGlmICgoc2l6ZV90eXBlKV9fbiA+IG1heF9zaXplKCkgfHwgX19vbGRfc2l6ZSA+IG1heF9zaXplKCkgLSBfX24pCisgICAgICB0aGlzLT5fTV90aHJvd19sZW5ndGhfZXJyb3IoKTsKKyAgICBpZiAoX19vbGRfc2l6ZSArIF9fbiA+IGNhcGFjaXR5KCkpIHsKKyAgICAgIHNpemVfdHlwZSBfX2xlbiA9IF9fb2xkX3NpemUgKyAobWF4KShfX29sZF9zaXplLCAoc2l6ZV90KSBfX24pICsgMTsKKyAgICAgIHBvaW50ZXIgX19uZXdfc3RhcnQgPSB0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5hbGxvY2F0ZShfX2xlbiwgX19sZW4pOworICAgICAgcG9pbnRlciBfX25ld19maW5pc2ggPSBfX25ld19zdGFydDsKKyAgICAgIF9TVExQX1RSWSB7CisgICAgICAgIF9fbmV3X2ZpbmlzaCA9IF9TVExQX1BSSVYgX191Y29weSh0aGlzLT5fTV9TdGFydCgpLCB0aGlzLT5fTV9GaW5pc2goKSwgX19uZXdfc3RhcnQpOworICAgICAgICBfX25ld19maW5pc2ggPSBfU1RMUF9QUklWIF9fdWNvcHkoX19maXJzdCwgX19sYXN0LCBfX25ld19maW5pc2gpOworICAgICAgICBfTV9jb25zdHJ1Y3RfbnVsbChfX25ld19maW5pc2gpOworICAgICAgfQorICAgICAgX1NUTFBfVU5XSU5EKChfU1RMUF9TVEQ6Ol9EZXN0cm95X1JhbmdlKF9fbmV3X3N0YXJ0LF9fbmV3X2ZpbmlzaCksCisgICAgICAgICAgICAgICAgICAgIHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLmRlYWxsb2NhdGUoX19uZXdfc3RhcnQsX19sZW4pKSkKKyAgICAgIHRoaXMtPl9NX2Rlc3Ryb3lfcmFuZ2UoKTsKKyAgICAgIHRoaXMtPl9NX2RlYWxsb2NhdGVfYmxvY2soKTsKKyAgICAgIHRoaXMtPl9NX3Jlc2V0KF9fbmV3X3N0YXJ0LCBfX25ld19maW5pc2gsIF9fbmV3X3N0YXJ0ICsgX19sZW4pOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGNvbnN0IF9DaGFyVCogX19mMSA9IF9fZmlyc3Q7CisgICAgICArK19fZjE7CisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1NIT1JUX1NUUklOR19PUFRJTSkKKyAgICAgIGlmICh0aGlzLT5fTV91c2luZ19zdGF0aWNfYnVmKCkpCisgICAgICAgIF9NX2NvcHkoX19mMSwgX19sYXN0LCB0aGlzLT5fTV9GaW5pc2goKSArIDEpOworICAgICAgZWxzZQorI2VuZGlmIC8qIF9TVExQX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0gKi8KKyAgICAgIF9TVExQX1BSSVYgX191Y29weShfX2YxLCBfX2xhc3QsIHRoaXMtPl9NX2ZpbmlzaCArIDEpOworICAgICAgX1NUTFBfVFJZIHsKKyAgICAgICAgX01fY29uc3RydWN0X251bGwodGhpcy0+X01fZmluaXNoICsgX19uKTsKKyAgICAgIH0KKyAgICAgIF9TVExQX1VOV0lORCh0aGlzLT5fTV9kZXN0cm95X3B0cl9yYW5nZSh0aGlzLT5fTV9maW5pc2ggKyAxLCB0aGlzLT5fTV9maW5pc2ggKyBfX24pKQorICAgICAgX1RyYWl0czo6YXNzaWduKCplbmQoKSwgKl9fZmlyc3QpOworICAgICAgdGhpcy0+X01fZmluaXNoICs9IF9fbjsKKyAgICB9CisgIH0KKyAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CitiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiYKK2Jhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+Ojphc3NpZ24oc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYykgeworICBpZiAoX19uIDw9IHNpemUoKSkgeworICAgIF9UcmFpdHM6OmFzc2lnbih0aGlzLT5fTV9TdGFydCgpLCBfX24sIF9fYyk7CisgICAgZXJhc2UoYmVnaW4oKSArIF9fbiwgZW5kKCkpOworICB9CisgIGVsc2UgeworICAgIGlmIChfX24gPCBjYXBhY2l0eSgpKSB7CisgICAgICBfVHJhaXRzOjphc3NpZ24odGhpcy0+X01fU3RhcnQoKSwgc2l6ZSgpLCBfX2MpOworICAgICAgYXBwZW5kKF9fbiAtIHNpemUoKSwgX19jKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBfU2VsZiBfX3N0cihfX24sIF9fYyk7CisgICAgICB0aGlzLT5zd2FwKF9fc3RyKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CitiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiYKK2Jhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+OjpfTV9hc3NpZ24oY29uc3QgX0NoYXJUKiBfX2YsIGNvbnN0IF9DaGFyVCogX19sKSB7CisgIHB0cmRpZmZfdCBfX24gPSBfX2wgLSBfX2Y7CisgIGlmIChfX1NUQVRJQ19DQVNUKHNpemVfdHlwZSwgX19uKSA8PSBzaXplKCkpIHsKKyAgICBfVHJhaXRzOjpjb3B5KHRoaXMtPl9NX1N0YXJ0KCksIF9fZiwgX19uKTsKKyAgICBlcmFzZShiZWdpbigpICsgX19uLCBlbmQoKSk7CisgIH0KKyAgZWxzZSB7CisgICAgX1RyYWl0czo6Y29weSh0aGlzLT5fTV9TdGFydCgpLCBfX2YsIHNpemUoKSk7CisgICAgX01fYXBwZW5kKF9fZiArIHNpemUoKSwgX19sKTsKKyAgfQorICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK19DaGFyVCogYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz4gOjpfTV9pbnNlcnRfYXV4KF9DaGFyVCogX19wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NoYXJUIF9fYykgeworICBwb2ludGVyIF9fbmV3X3BvcyA9IF9fcDsKKyAgaWYgKHRoaXMtPl9NX2ZpbmlzaCArIDEgPCB0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5fTV9kYXRhKSB7CisgICAgX01fY29uc3RydWN0X251bGwodGhpcy0+X01fZmluaXNoICsgMSk7CisgICAgX1RyYWl0czo6bW92ZShfX3AgKyAxLCBfX3AsIHRoaXMtPl9NX2ZpbmlzaCAtIF9fcCk7CisgICAgX1RyYWl0czo6YXNzaWduKCpfX3AsIF9fYyk7CisgICAgKyt0aGlzLT5fTV9maW5pc2g7CisgIH0KKyAgZWxzZSB7CisgICAgY29uc3Qgc2l6ZV90eXBlIF9fb2xkX2xlbiA9IHNpemUoKTsKKyAgICBzaXplX3R5cGUgX19sZW4gPSBfX29sZF9sZW4gKyAobWF4KShfX29sZF9sZW4sIF9fU1RBVElDX0NBU1Qoc2l6ZV90eXBlLDEpKSArIDE7CisgICAgcG9pbnRlciBfX25ld19zdGFydCA9IHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLmFsbG9jYXRlKF9fbGVuLCBfX2xlbik7CisgICAgcG9pbnRlciBfX25ld19maW5pc2ggPSBfX25ld19zdGFydDsKKyAgICBfU1RMUF9UUlkgeworICAgICAgX19uZXdfcG9zID0gX1NUTFBfUFJJViBfX3Vjb3B5KHRoaXMtPl9NX1N0YXJ0KCksIF9fcCwgX19uZXdfc3RhcnQpOworICAgICAgX0NvcHlfQ29uc3RydWN0KF9fbmV3X3BvcywgX19jKTsKKyAgICAgIF9fbmV3X2ZpbmlzaCA9IF9fbmV3X3BvcyArIDE7CisgICAgICBfX25ld19maW5pc2ggPSBfU1RMUF9QUklWIF9fdWNvcHkoX19wLCB0aGlzLT5fTV9maW5pc2gsIF9fbmV3X2ZpbmlzaCk7CisgICAgICBfTV9jb25zdHJ1Y3RfbnVsbChfX25ld19maW5pc2gpOworICAgIH0KKyAgICBfU1RMUF9VTldJTkQoKF9TVExQX1NURDo6X0Rlc3Ryb3lfUmFuZ2UoX19uZXdfc3RhcnQsX19uZXdfZmluaXNoKSwKKyAgICAgICAgICAgICAgICAgIHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLmRlYWxsb2NhdGUoX19uZXdfc3RhcnQsX19sZW4pKSkKKyAgICB0aGlzLT5fTV9kZXN0cm95X3JhbmdlKCk7CisgICAgdGhpcy0+X01fZGVhbGxvY2F0ZV9ibG9jaygpOworICAgIHRoaXMtPl9NX3Jlc2V0KF9fbmV3X3N0YXJ0LCBfX25ld19maW5pc2gsIF9fbmV3X3N0YXJ0ICsgX19sZW4pOworICB9CisgIHJldHVybiBfX25ld19wb3M7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK3ZvaWQgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz46Omluc2VydChpdGVyYXRvciBfX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgX19uLCBfQ2hhclQgX19jKSB7CisgIGlmIChfX24gIT0gMCkgeworICAgIGlmIChzaXplX3R5cGUodGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuX01fZGF0YSAtIHRoaXMtPl9NX2ZpbmlzaCkgPj0gX19uICsgMSkgeworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fZWxlbXNfYWZ0ZXIgPSB0aGlzLT5fTV9maW5pc2ggLSBfX3BvczsKKyAgICAgIHBvaW50ZXIgX19vbGRfZmluaXNoID0gdGhpcy0+X01fZmluaXNoOworICAgICAgaWYgKF9fZWxlbXNfYWZ0ZXIgPj0gX19uKSB7CisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1NIT1JUX1NUUklOR19PUFRJTSkKKyAgICAgICAgaWYgKHRoaXMtPl9NX3VzaW5nX3N0YXRpY19idWYoKSkKKyAgICAgICAgICBfTV9jb3B5KCh0aGlzLT5fTV9maW5pc2ggLSBfX24pICsgMSwgdGhpcy0+X01fZmluaXNoICsgMSwgdGhpcy0+X01fZmluaXNoICsgMSk7CisgICAgICAgIGVsc2UKKyNlbmRpZiAvKiBfU1RMUF9VU0VfU0hPUlRfU1RSSU5HX09QVElNICovCisgICAgICAgIF9TVExQX1BSSVYgX191Y29weSgodGhpcy0+X01fZmluaXNoIC0gX19uKSArIDEsIHRoaXMtPl9NX2ZpbmlzaCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5fTV9maW5pc2ggKyAxKTsKKyAgICAgICAgdGhpcy0+X01fZmluaXNoICs9IF9fbjsKKyAgICAgICAgX1RyYWl0czo6bW92ZShfX3BvcyArIF9fbiwgX19wb3MsIChfX2VsZW1zX2FmdGVyIC0gX19uKSArIDEpOworICAgICAgICBfVHJhaXRzOjphc3NpZ24oX19wb3MsIF9fbiwgX19jKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0pCisgICAgICAgIGlmICh0aGlzLT5fTV91c2luZ19zdGF0aWNfYnVmKCkpCisgICAgICAgICAgX1RyYWl0czo6YXNzaWduKHRoaXMtPl9NX2ZpbmlzaCArIDEsIF9fbiAtIF9fZWxlbXNfYWZ0ZXIgLSAxLCBfX2MpOworICAgICAgICBlbHNlCisjZW5kaWYgLyogX1NUTFBfVVNFX1NIT1JUX1NUUklOR19PUFRJTSAqLworICAgICAgICBfU1RMUF9QUklWIF9fdW5pbml0aWFsaXplZF9maWxsX24odGhpcy0+X01fZmluaXNoICsgMSwgX19uIC0gX19lbGVtc19hZnRlciAtIDEsIF9fYyk7CisgICAgICAgIHRoaXMtPl9NX2ZpbmlzaCArPSBfX24gLSBfX2VsZW1zX2FmdGVyOworICAgICAgICBfU1RMUF9UUlkgeworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0pCisgICAgICAgICAgaWYgKHRoaXMtPl9NX3VzaW5nX3N0YXRpY19idWYoKSkKKyAgICAgICAgICAgIF9NX2NvcHkoX19wb3MsIF9fb2xkX2ZpbmlzaCArIDEsIHRoaXMtPl9NX2ZpbmlzaCk7CisgICAgICAgICAgZWxzZQorI2VuZGlmIC8qIF9TVExQX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0gKi8KKyAgICAgICAgICBfU1RMUF9QUklWIF9fdWNvcHkoX19wb3MsIF9fb2xkX2ZpbmlzaCArIDEsIHRoaXMtPl9NX2ZpbmlzaCk7CisgICAgICAgICAgdGhpcy0+X01fZmluaXNoICs9IF9fZWxlbXNfYWZ0ZXI7CisgICAgICAgIH0KKyAgICAgICAgX1NUTFBfVU5XSU5EKChfU1RMUF9TVEQ6Ol9EZXN0cm95X1JhbmdlKF9fb2xkX2ZpbmlzaCArIDEsIHRoaXMtPl9NX2ZpbmlzaCksCisgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+X01fZmluaXNoID0gX19vbGRfZmluaXNoKSkKKyAgICAgICAgX1RyYWl0czo6YXNzaWduKF9fcG9zLCBfX2VsZW1zX2FmdGVyICsgMSwgX19jKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICBjb25zdCBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IHNpemUoKTsKKyAgICAgIHNpemVfdHlwZSBfX2xlbiA9IF9fb2xkX3NpemUgKyAobWF4KShfX29sZF9zaXplLCBfX24pICsgMTsKKyAgICAgIHBvaW50ZXIgX19uZXdfc3RhcnQgPSB0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5hbGxvY2F0ZShfX2xlbiwgX19sZW4pOworICAgICAgcG9pbnRlciBfX25ld19maW5pc2ggPSBfX25ld19zdGFydDsKKyAgICAgIF9TVExQX1RSWSB7CisgICAgICAgIF9fbmV3X2ZpbmlzaCA9IF9TVExQX1BSSVYgX191Y29weSh0aGlzLT5fTV9TdGFydCgpLCBfX3BvcywgX19uZXdfc3RhcnQpOworICAgICAgICBfX25ld19maW5pc2ggPSBfU1RMUF9QUklWIF9fdW5pbml0aWFsaXplZF9maWxsX24oX19uZXdfZmluaXNoLCBfX24sIF9fYyk7CisgICAgICAgIF9fbmV3X2ZpbmlzaCA9IF9TVExQX1BSSVYgX191Y29weShfX3BvcywgdGhpcy0+X01fZmluaXNoLCBfX25ld19maW5pc2gpOworICAgICAgICBfTV9jb25zdHJ1Y3RfbnVsbChfX25ld19maW5pc2gpOworICAgICAgfQorICAgICAgX1NUTFBfVU5XSU5EKChfU1RMUF9TVEQ6Ol9EZXN0cm95X1JhbmdlKF9fbmV3X3N0YXJ0LF9fbmV3X2ZpbmlzaCksCisgICAgICAgICAgICAgICAgICAgIHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLmRlYWxsb2NhdGUoX19uZXdfc3RhcnQsX19sZW4pKSkKKyAgICAgIHRoaXMtPl9NX2Rlc3Ryb3lfcmFuZ2UoKTsKKyAgICAgIHRoaXMtPl9NX2RlYWxsb2NhdGVfYmxvY2soKTsKKyAgICAgIHRoaXMtPl9NX3Jlc2V0KF9fbmV3X3N0YXJ0LCBfX25ld19maW5pc2gsIF9fbmV3X3N0YXJ0ICsgX19sZW4pOworICAgIH0KKyAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+Cit2b2lkIGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+OjpfTV9pbnNlcnQoaXRlcmF0b3IgX19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0NoYXJUKiBfX2ZpcnN0LCBjb25zdCBfQ2hhclQqIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIF9fc2VsZl9yZWYpIHsKKyAgLy90aGlzIHZlcnNpb24gaGFzIHRvIHRha2UgY2FyZSBhYm91dCB0aGUgYXV0byByZWZlcmVuY2luZworICBpZiAoX19maXJzdCAhPSBfX2xhc3QpIHsKKyAgICBjb25zdCBwdHJkaWZmX3QgX19uID0gX19sYXN0IC0gX19maXJzdDsKKyAgICBpZiAodGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuX01fZGF0YSAtIHRoaXMtPl9NX2ZpbmlzaCA+PSBfX24gKyAxKSB7CisgICAgICBjb25zdCBwdHJkaWZmX3QgX19lbGVtc19hZnRlciA9IHRoaXMtPl9NX2ZpbmlzaCAtIF9fcG9zOworICAgICAgcG9pbnRlciBfX29sZF9maW5pc2ggPSB0aGlzLT5fTV9maW5pc2g7CisgICAgICBpZiAoX19lbGVtc19hZnRlciA+PSBfX24pIHsKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfU0hPUlRfU1RSSU5HX09QVElNKQorICAgICAgICBpZiAodGhpcy0+X01fdXNpbmdfc3RhdGljX2J1ZigpKQorICAgICAgICAgIF9NX2NvcHkoKHRoaXMtPl9NX2ZpbmlzaCAtIF9fbikgKyAxLCB0aGlzLT5fTV9maW5pc2ggKyAxLCB0aGlzLT5fTV9maW5pc2ggKyAxKTsKKyAgICAgICAgZWxzZQorI2VuZGlmIC8qIF9TVExQX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0gKi8KKyAgICAgICAgX1NUTFBfUFJJViBfX3Vjb3B5KCh0aGlzLT5fTV9maW5pc2ggLSBfX24pICsgMSwgdGhpcy0+X01fZmluaXNoICsgMSwgdGhpcy0+X01fZmluaXNoICsgMSk7CisgICAgICAgIHRoaXMtPl9NX2ZpbmlzaCArPSBfX247CisgICAgICAgIF9UcmFpdHM6Om1vdmUoX19wb3MgKyBfX24sIF9fcG9zLCAoX19lbGVtc19hZnRlciAtIF9fbikgKyAxKTsKKyAgICAgICAgaWYgKCFfX3NlbGZfcmVmIHx8IF9fbGFzdCA8IF9fcG9zKSB7CisgICAgICAgICAgX01fY29weShfX2ZpcnN0LCBfX2xhc3QsIF9fcG9zKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAvL1dlIGhhdmUgdG8gY2hlY2sgdGhhdCB0aGUgc291cmNlIGJ1ZmZlciBoYXNuJ3QgbW92ZQorICAgICAgICAgIGlmIChfX2ZpcnN0ID49IF9fcG9zKSB7CisgICAgICAgICAgICAvL1RoZSBzb3VyY2UgYnVmZmVyIGhhcyBtb3ZlCisgICAgICAgICAgICBfX2ZpcnN0ICs9IF9fbjsKKyAgICAgICAgICAgIF9fbGFzdCArPSBfX247CisgICAgICAgICAgICBfTV9jb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19wb3MpOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vVGhlIHNvdXJjZSBidWZmZXIgaGFzbid0IG1vdmUsIGl0IGhhcyBiZWVuIGR1cGxpY2F0ZWQKKyAgICAgICAgICAgIF9NX21vdmUoX19maXJzdCwgX19sYXN0LCBfX3Bvcyk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgY29uc3RfaXRlcmF0b3IgX19taWQgPSBfX2ZpcnN0OworICAgICAgICBfX21pZCArPSBfX2VsZW1zX2FmdGVyICsgMTsKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfU0hPUlRfU1RSSU5HX09QVElNKQorICAgICAgICBpZiAodGhpcy0+X01fdXNpbmdfc3RhdGljX2J1ZigpKQorICAgICAgICAgIF9NX2NvcHkoX19taWQsIF9fbGFzdCwgdGhpcy0+X01fZmluaXNoICsgMSk7CisgICAgICAgIGVsc2UKKyNlbmRpZiAvKiBfU1RMUF9VU0VfU0hPUlRfU1RSSU5HX09QVElNICovCisgICAgICAgIF9TVExQX1BSSVYgX191Y29weShfX21pZCwgX19sYXN0LCB0aGlzLT5fTV9maW5pc2ggKyAxKTsKKyAgICAgICAgdGhpcy0+X01fZmluaXNoICs9IF9fbiAtIF9fZWxlbXNfYWZ0ZXI7CisgICAgICAgIF9TVExQX1RSWSB7CisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1NIT1JUX1NUUklOR19PUFRJTSkKKyAgICAgICAgICBpZiAodGhpcy0+X01fdXNpbmdfc3RhdGljX2J1ZigpKQorICAgICAgICAgICAgX01fY29weShfX3BvcywgX19vbGRfZmluaXNoICsgMSwgdGhpcy0+X01fZmluaXNoKTsKKyAgICAgICAgICBlbHNlCisjZW5kaWYgLyogX1NUTFBfVVNFX1NIT1JUX1NUUklOR19PUFRJTSAqLworICAgICAgICAgIF9TVExQX1BSSVYgX191Y29weShfX3BvcywgX19vbGRfZmluaXNoICsgMSwgdGhpcy0+X01fZmluaXNoKTsKKyAgICAgICAgICB0aGlzLT5fTV9maW5pc2ggKz0gX19lbGVtc19hZnRlcjsKKyAgICAgICAgfQorICAgICAgICBfU1RMUF9VTldJTkQoKF9TVExQX1NURDo6X0Rlc3Ryb3lfUmFuZ2UoX19vbGRfZmluaXNoICsgMSwgdGhpcy0+X01fZmluaXNoKSwKKyAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5fTV9maW5pc2ggPSBfX29sZF9maW5pc2gpKQorICAgICAgICBpZiAoIV9fc2VsZl9yZWYpCisgICAgICAgICAgX01fY29weShfX2ZpcnN0LCBfX21pZCwgX19wb3MpOworICAgICAgICBlbHNlCisgICAgICAgICAgX01fbW92ZShfX2ZpcnN0LCBfX21pZCwgX19wb3MpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX29sZF9zaXplID0gc2l6ZSgpOworICAgICAgc2l6ZV90eXBlIF9fbGVuID0gX19vbGRfc2l6ZSArIChtYXgpKF9fb2xkX3NpemUsIF9fU1RBVElDX0NBU1QoY29uc3Qgc2l6ZV90eXBlLF9fbikpICsgMTsKKyAgICAgIHBvaW50ZXIgX19uZXdfc3RhcnQgPSB0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5hbGxvY2F0ZShfX2xlbiwgX19sZW4pOworICAgICAgcG9pbnRlciBfX25ld19maW5pc2ggPSBfX25ld19zdGFydDsKKyAgICAgIF9TVExQX1RSWSB7CisgICAgICAgIF9fbmV3X2ZpbmlzaCA9IF9TVExQX1BSSVYgX191Y29weSh0aGlzLT5fTV9TdGFydCgpLCBfX3BvcywgX19uZXdfc3RhcnQpOworICAgICAgICBfX25ld19maW5pc2ggPSBfU1RMUF9QUklWIF9fdWNvcHkoX19maXJzdCwgX19sYXN0LCBfX25ld19maW5pc2gpOworICAgICAgICBfX25ld19maW5pc2ggPSBfU1RMUF9QUklWIF9fdWNvcHkoX19wb3MsIHRoaXMtPl9NX2ZpbmlzaCwgX19uZXdfZmluaXNoKTsKKyAgICAgICAgX01fY29uc3RydWN0X251bGwoX19uZXdfZmluaXNoKTsKKyAgICAgIH0KKyAgICAgIF9TVExQX1VOV0lORCgoX1NUTFBfU1REOjpfRGVzdHJveV9SYW5nZShfX25ld19zdGFydCxfX25ld19maW5pc2gpLAorICAgICAgICAgICAgICAgICAgICB0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5kZWFsbG9jYXRlKF9fbmV3X3N0YXJ0LF9fbGVuKSkpCisgICAgICB0aGlzLT5fTV9kZXN0cm95X3JhbmdlKCk7CisgICAgICB0aGlzLT5fTV9kZWFsbG9jYXRlX2Jsb2NrKCk7CisgICAgICB0aGlzLT5fTV9yZXNldChfX25ld19zdGFydCwgX19uZXdfZmluaXNoLCBfX25ld19zdGFydCArIF9fbGVuKTsKKyAgICB9CisgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz4mCitiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiA6OnJlcGxhY2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MpIHsKKyAgc2l6ZV90eXBlIF9fbGVuID0gKHNpemVfdHlwZSkoX19sYXN0IC0gX19maXJzdCk7CisKKyAgaWYgKF9fbGVuID49IF9fbikgeworICAgIF9UcmFpdHM6OmFzc2lnbihfX2ZpcnN0LCBfX24sIF9fYyk7CisgICAgZXJhc2UoX19maXJzdCArIF9fbiwgX19sYXN0KTsKKyAgfQorICBlbHNlIHsKKyAgICBfVHJhaXRzOjphc3NpZ24oX19maXJzdCwgX19sZW4sIF9fYyk7CisgICAgaW5zZXJ0KF9fbGFzdCwgX19uIC0gX19sZW4sIF9fYyk7CisgIH0KKyAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CitiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiYKK2Jhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+IDo6X01fcmVwbGFjZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0NoYXJUKiBfX2YsIGNvbnN0IF9DaGFyVCogX19sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgX19zZWxmX3JlZikgeworICBjb25zdCBwdHJkaWZmX3QgICAgICAgX19uID0gX19sIC0gX19mOworICBjb25zdCBkaWZmZXJlbmNlX3R5cGUgX19sZW4gPSBfX2xhc3QgLSBfX2ZpcnN0OworICBpZiAoX19sZW4gPj0gX19uKSB7CisgICAgaWYgKCFfX3NlbGZfcmVmIHx8IF9fbCA8IF9fZmlyc3QgfHwgX19mID49IF9fbGFzdCkKKyAgICAgIF9NX2NvcHkoX19mLCBfX2wsIF9fZmlyc3QpOworICAgIGVsc2UKKyAgICAgIF9NX21vdmUoX19mLCBfX2wsIF9fZmlyc3QpOworICAgIGVyYXNlKF9fZmlyc3QgKyBfX24sIF9fbGFzdCk7CisgIH0KKyAgZWxzZSB7CisgICAgaWYgKCFfX3NlbGZfcmVmIHx8IChfX2YgPj0gX19sYXN0KSB8fCAoX19sIDw9IF9fZmlyc3QpKSB7CisgICAgICAvL25vIG92ZXJsYXA6CisgICAgICBjb25zdF9pdGVyYXRvciBfX20gPSBfX2YgKyBfX2xlbjsKKyAgICAgIF9NX2NvcHkoX19mLCBfX20sIF9fZmlyc3QpOworICAgICAgX01faW5zZXJ0KF9fbGFzdCwgX19tLCBfX2wsIGZhbHNlICk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgLy93ZSBoYXZlIHRvIHRha2UgY2FyZSBvZiBvdmVybGFwaW5nCisgICAgICBpZiAoX19mIDwgX19maXJzdCkgeworICAgICAgICBjb25zdF9pdGVyYXRvciBfX20gPSBfX2YgKyBfX2xlbjsKKyAgICAgICAgLy9XZSBoYXZlIHRvIGRlYWwgd2l0aCBwb3NzaWJsZSByZWFsbG9jYXRpb24gYmVjYXVzZSB3ZSBkbyBpbnNlcnQgZmlyc3QuCisgICAgICAgIGNvbnN0IGRpZmZlcmVuY2VfdHlwZSBfX29mZl9kZXN0ID0gX19maXJzdCAtIHRoaXMtPmJlZ2luKCk7CisgICAgICAgIGNvbnN0IGRpZmZlcmVuY2VfdHlwZSBfX29mZl9zcmMgPSBfX2YgLSB0aGlzLT5iZWdpbigpOworICAgICAgICBfTV9pbnNlcnQoX19sYXN0LCBfX20sIF9fbCwgdHJ1ZSk7CisgICAgICAgIF9UcmFpdHM6Om1vdmUoYmVnaW4oKSArIF9fb2ZmX2Rlc3QsIGJlZ2luKCkgKyBfX29mZl9zcmMsIF9fbGVuKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBjb25zdF9pdGVyYXRvciBfX20gPSBfX2YgKyBfX2xlbjsKKyAgICAgICAgX1RyYWl0czo6bW92ZShfX2ZpcnN0LCBfX2YsIF9fbGVuKTsKKyAgICAgICAgX01faW5zZXJ0KF9fbGFzdCwgX19tLCBfX2wsIHRydWUpOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4gX19zaXplX3R5cGVfXworYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz4gOjpmaW5kKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fbikgY29uc3QgeworICBjb25zdCBzaXplX3QgX19sZW4gPSBzaXplKCk7CisgIGlmIChfX3BvcyA+PSBfX2xlbiB8fCBfX3BvcyArIF9fbiA+IF9fbGVuKQorICAgIHJldHVybiBucG9zOworICBlbHNlIHsKKyAgICBjb25zdF9wb2ludGVyIF9fcmVzdWx0ID0KKyAgICAgIF9TVExQX1NURDo6c2VhcmNoKHRoaXMtPl9NX1N0YXJ0KCkgKyBfX3BvcywgdGhpcy0+X01fRmluaXNoKCksCisgICAgICAgICAgICAgICAgICAgICAgICBfX3MsIF9fcyArIF9fbiwgX1NUTFBfUFJJViBfRXFfdHJhaXRzPF9UcmFpdHM+KCkpOworICAgIHJldHVybiBfX3Jlc3VsdCAhPSB0aGlzLT5fTV9GaW5pc2goKSA/IF9fcmVzdWx0IC0gdGhpcy0+X01fU3RhcnQoKSA6IG5wb3M7CisgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPiBfX3NpemVfdHlwZV9fCitiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiA6OmZpbmQoX0NoYXJUIF9fYywgc2l6ZV90eXBlIF9fcG9zKSBjb25zdCB7CisgIGlmIChfX3BvcyA+PSBzaXplKCkpIC8qX19wb3MgKyAxID4gc2l6ZSgpKi8KKyAgICByZXR1cm4gbnBvczsKKyAgZWxzZSB7CisgICAgY29uc3RfcG9pbnRlciBfX3Jlc3VsdCA9CisgICAgICBfU1RMUF9TVEQ6OmZpbmRfaWYodGhpcy0+X01fU3RhcnQoKSArIF9fcG9zLCB0aGlzLT5fTV9GaW5pc2goKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9FcV9jaGFyX2JvdW5kPF9UcmFpdHM+KF9fYykpOworICAgIHJldHVybiBfX3Jlc3VsdCAhPSB0aGlzLT5fTV9GaW5pc2goKSA/IF9fcmVzdWx0IC0gdGhpcy0+X01fU3RhcnQoKSA6IG5wb3M7CisgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorX19zaXplX3R5cGVfXworYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz46OnJmaW5kKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIGNvbnN0Cit7CisgIGNvbnN0IHNpemVfdHlwZSBfX2xlbiA9IHNpemUoKTsKKyAgaWYgKCBfX2xlbiA8IF9fbiApIHsKKyAgICByZXR1cm4gbnBvczsKKyAgfQorICBjb25zdF9wb2ludGVyIF9fbGFzdCA9IHRoaXMtPl9NX1N0YXJ0KCkgKyAobWluKSggX19sZW4gLSBfX24sIF9fcG9zKSArIF9fbjsKKyAgY29uc3RfcG9pbnRlciBfX3Jlc3VsdCA9IGZpbmRfZW5kKHRoaXMtPl9NX1N0YXJ0KCksIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcywgX19zICsgX19uLCBfU1RMUF9QUklWIF9FcV90cmFpdHM8X1RyYWl0cz4oKSk7CisgIHJldHVybiBfX3Jlc3VsdCAhPSBfX2xhc3QgPyBfX3Jlc3VsdCAtIHRoaXMtPl9NX1N0YXJ0KCkgOiBucG9zOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CitfX3NpemVfdHlwZV9fCitiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPjo6cmZpbmQoX0NoYXJUIF9fYywgc2l6ZV90eXBlIF9fcG9zKSBjb25zdAoreworICBjb25zdCBzaXplX3R5cGUgX19sZW4gPSBzaXplKCk7CisgIGlmICggX19sZW4gPCAxICkgeworICAgIHJldHVybiBucG9zOworICB9CisgIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCA9IGJlZ2luKCkgKyAobWluKShfX2xlbiAtIDEsIF9fcG9zKSArIDE7CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgX19ycmVzdWx0ID0KKyAgICBfU1RMUF9TVEQ6OmZpbmRfaWYoY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihfX2xhc3QpLCByZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX0VxX2NoYXJfYm91bmQ8X1RyYWl0cz4oX19jKSk7CisgIHJldHVybiBfX3JyZXN1bHQgIT0gcmVuZCgpID8gKF9fcnJlc3VsdC5iYXNlKCkgLSAxKSAtIGJlZ2luKCkgOiBucG9zOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+IF9fc2l6ZV90eXBlX18KK2Jhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+IDo6ZmluZF9maXJzdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX24pIGNvbnN0IHsKKyAgaWYgKF9fcG9zID49IHNpemUoKSkgLypfX3BvcyArIDEgPiBzaXplKCkqLworICAgIHJldHVybiBucG9zOworICBlbHNlIHsKKyAgICBjb25zdF9pdGVyYXRvciBfX3Jlc3VsdCA9IF9TVExQX1BSSVYgX19maW5kX2ZpcnN0X29mKGJlZ2luKCkgKyBfX3BvcywgZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3MsIF9fcyArIF9fbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX0VxX3RyYWl0czxfVHJhaXRzPigpKTsKKyAgICByZXR1cm4gX19yZXN1bHQgIT0gZW5kKCkgPyBfX3Jlc3VsdCAtIGJlZ2luKCkgOiBucG9zOworICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KKyBfX3NpemVfdHlwZV9fCitiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiA6OmZpbmRfbGFzdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fbikgY29uc3QKK3sKKyAgY29uc3Qgc2l6ZV90eXBlIF9fbGVuID0gc2l6ZSgpOworICBpZiAoIF9fbGVuIDwgMSApIHsKKyAgICByZXR1cm4gbnBvczsKKyAgfQorICBjb25zdCBjb25zdF9pdGVyYXRvciBfX2xhc3QgPSBiZWdpbigpICsgKG1pbikoX19sZW4gLSAxLCBfX3BvcykgKyAxOworICBjb25zdCBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIF9fcnJlc3VsdCA9CisgICAgX1NUTFBfUFJJViBfX2ZpbmRfZmlyc3Rfb2YoY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihfX2xhc3QpLCByZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19zLCBfX3MgKyBfX24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9FcV90cmFpdHM8X1RyYWl0cz4oKSk7CisgIHJldHVybiBfX3JyZXN1bHQgIT0gcmVuZCgpID8gKF9fcnJlc3VsdC5iYXNlKCkgLSAxKSAtIGJlZ2luKCkgOiBucG9zOworfQorCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4gX19zaXplX3R5cGVfXworYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz4gOjpmaW5kX2ZpcnN0X25vdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uKSBjb25zdCB7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6Y2hhcl90eXBlIF9DaGFyVHlwZTsKKyAgaWYgKF9fcG9zID49IHNpemUoKSkgLypfX3BvcyArIDEgPj0gc2l6ZSgpKi8KKyAgICByZXR1cm4gbnBvczsKKyAgZWxzZSB7CisgICAgY29uc3RfcG9pbnRlciBfX3Jlc3VsdCA9IF9TVExQX1NURDo6ZmluZF9pZih0aGlzLT5fTV9TdGFydCgpICsgX19wb3MsIHRoaXMtPl9NX0ZpbmlzaCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfTm90X3dpdGhpbl90cmFpdHM8X1RyYWl0cz4oX19DT05TVF9DQVNUKGNvbnN0IF9DaGFyVHlwZSosIF9fcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19DT05TVF9DQVNUKGNvbnN0IF9DaGFyVHlwZSosIF9fcykgKyBfX24pKTsKKyAgICByZXR1cm4gX19yZXN1bHQgIT0gdGhpcy0+X01fZmluaXNoID8gX19yZXN1bHQgLSB0aGlzLT5fTV9TdGFydCgpIDogbnBvczsKKyAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+IF9fc2l6ZV90eXBlX18KK2Jhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+IDo6ZmluZF9maXJzdF9ub3Rfb2YoX0NoYXJUIF9fYywgc2l6ZV90eXBlIF9fcG9zKSBjb25zdCB7CisgIGlmICgxID4gc2l6ZSgpKQorICAgIHJldHVybiBucG9zOworICBlbHNlIHsKKyAgICBjb25zdF9wb2ludGVyIF9fcmVzdWx0ID0gX1NUTFBfU1REOjpmaW5kX2lmKHRoaXMtPl9NX1N0YXJ0KCkgKyBfX3BvcywgdGhpcy0+X01fRmluaXNoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9OZXFfY2hhcl9ib3VuZDxfVHJhaXRzPihfX2MpKTsKKyAgICByZXR1cm4gX19yZXN1bHQgIT0gdGhpcy0+X01fZmluaXNoID8gX19yZXN1bHQgLSB0aGlzLT5fTV9TdGFydCgpIDogbnBvczsKKyAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CitfX3NpemVfdHlwZV9fCitiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPjo6ZmluZF9sYXN0X25vdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdAoreworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OmNoYXJfdHlwZSBfQ2hhclR5cGU7CisgIGNvbnN0IHNpemVfdHlwZSBfX2xlbiA9IHNpemUoKTsKKyAgaWYgKCBfX2xlbiA8IDEgKSB7CisgICAgcmV0dXJuIG5wb3M7CisgIH0KKyAgY29uc3RfaXRlcmF0b3IgX19sYXN0ID0gYmVnaW4oKSArIChtaW4pKF9fbGVuIC0gMSwgX19wb3MpICsgMTsKKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciBfX3JsYXN0ID0gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihfX2xhc3QpOworICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIF9fcnJlc3VsdCA9CisgICAgX1NUTFBfU1REOjpmaW5kX2lmKF9fcmxhc3QsIHJlbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfTm90X3dpdGhpbl90cmFpdHM8X1RyYWl0cz4oKGNvbnN0IF9DaGFyVHlwZSopX19zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgX0NoYXJUeXBlKilfX3MgKyBfX24pKTsKKyAgcmV0dXJuIF9fcnJlc3VsdCAhPSByZW5kKCkgPyAoX19ycmVzdWx0LmJhc2UoKSAtIDEpIC0gYmVnaW4oKSA6IG5wb3M7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK19fc2l6ZV90eXBlX18KK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OmZpbmRfbGFzdF9ub3Rfb2YoX0NoYXJUIF9fYywgc2l6ZV90eXBlIF9fcG9zKSBjb25zdAoreworICBjb25zdCBzaXplX3R5cGUgX19sZW4gPSBzaXplKCk7CisgIGlmICggX19sZW4gPCAxICkgeworICAgIHJldHVybiBucG9zOworICB9CisgIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCA9IGJlZ2luKCkgKyAobWluKShfX2xlbiAtIDEsIF9fcG9zKSArIDE7CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgX19ybGFzdCA9IGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoX19sYXN0KTsKKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciBfX3JyZXN1bHQgPQorICAgIF9TVExQX1NURDo6ZmluZF9pZihfX3JsYXN0LCByZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX05lcV9jaGFyX2JvdW5kPF9UcmFpdHM+KF9fYykpOworICByZXR1cm4gX19ycmVzdWx0ICE9IHJlbmQoKSA/IChfX3JyZXN1bHQuYmFzZSgpIC0gMSkgLSBiZWdpbigpIDogbnBvczsKK30KKworI2lmICFkZWZpbmVkIChiYXNpY19zdHJpbmcpCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgordm9pZCBfU1RMUF9DQUxMIF9TX3N0cmluZ19jb3B5KGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+JiBfX3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NoYXJUKiBfX2J1Ziwgc2l6ZV90IF9fbikgeworICBpZiAoX19uID4gMCkgeworICAgIF9fbiA9IChtaW4pIChfX24gLSAxLCBfX3Muc2l6ZSgpKTsKKyAgICBfU1RMUF9TVEQ6OmNvcHkoX19zLmJlZ2luKCksIF9fcy5iZWdpbigpICsgX19uLCBfX2J1Zik7CisgICAgX19idWZbX19uXSA9IF9DaGFyVCgpOworICB9Cit9CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNpbmNsdWRlIDxzdGwvX3JhbmdlX2Vycm9ycy5oPgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCisvLyBfU3RyaW5nX2Jhc2UgbWV0aG9kcwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgordm9pZCBfU3RyaW5nX2Jhc2U8X1RwLF9BbGxvYz46Ol9NX3Rocm93X2xlbmd0aF9lcnJvcigpIGNvbnN0Cit7IF9fc3RsX3Rocm93X2xlbmd0aF9lcnJvcigiYmFzaWNfc3RyaW5nIik7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgordm9pZCBfU3RyaW5nX2Jhc2U8X1RwLCBfQWxsb2M+OjpfTV90aHJvd19vdXRfb2ZfcmFuZ2UoKSBjb25zdAoreyBfX3N0bF90aHJvd19vdXRfb2ZfcmFuZ2UoImJhc2ljX3N0cmluZyIpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK3ZvaWQgX1N0cmluZ19iYXNlPF9UcCwgX0FsbG9jPjo6X01fYWxsb2NhdGVfYmxvY2soc2l6ZV90IF9fbikgeworICBpZiAoKF9fbiA8PSAobWF4X3NpemUoKSArIDEpKSAmJiAoX19uID4gMCkpIHsKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfU0hPUlRfU1RSSU5HX09QVElNKQorICAgIGlmIChfX24gPiBfREVGQVVMVF9TSVpFKSB7CisgICAgICB0aGlzLT5fTV9idWZmZXJzLl9NX2R5bmFtaWNfYnVmID0gX01fZW5kX29mX3N0b3JhZ2UuYWxsb2NhdGUoX19uLCBfX24pOworICAgICAgdGhpcy0+X01fZmluaXNoID0gdGhpcy0+X01fYnVmZmVycy5fTV9keW5hbWljX2J1ZjsKKyAgICAgIHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLl9NX2RhdGEgPSB0aGlzLT5fTV9maW5pc2ggKyBfX247CisgICAgfQorI2Vsc2UKKyAgICB0aGlzLT5fTV9zdGFydCAgPSBfTV9lbmRfb2Zfc3RvcmFnZS5hbGxvY2F0ZShfX24sIF9fbik7CisgICAgdGhpcy0+X01fZmluaXNoID0gdGhpcy0+X01fc3RhcnQ7CisgICAgdGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuX01fZGF0YSA9IHRoaXMtPl9NX2ZpbmlzaCArIF9fbjsKKyNlbmRpZiAvKl9TVExQX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0gICovCisgIH0gZWxzZSB7CisgICAgdGhpcy0+X01fdGhyb3dfbGVuZ3RoX2Vycm9yKCk7CisgIH0KK30KKworI2lmICFkZWZpbmVkIChiYXNpY19zdHJpbmcpCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OmJhc2ljX3N0cmluZyhjb25zdCBfQ2hhclQqIF9fcykKKyAgOiBfU1RMUF9QUklWIF9TdHJpbmdfYmFzZTxfQ2hhclQsX0FsbG9jPihhbGxvY2F0b3JfdHlwZSgpKSB7CisgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgIF9NX3JhbmdlX2luaXRpYWxpemUoX19zLCBfX3MgKyB0cmFpdHNfdHlwZTo6bGVuZ3RoKF9fcykpOworfQorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OmJhc2ljX3N0cmluZyhjb25zdCBfQ2hhclQqIF9fcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICA6IF9TVExQX1BSSVYgX1N0cmluZ19iYXNlPF9DaGFyVCxfQWxsb2M+KF9fYSkgeworICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKQorICBfTV9yYW5nZV9pbml0aWFsaXplKF9fcywgX19zICsgdHJhaXRzX3R5cGU6Omxlbmd0aChfX3MpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6YmFzaWNfc3RyaW5nKGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4gJiBfX3MpCisgIDogX1NUTFBfUFJJViBfU3RyaW5nX2Jhc2U8X0NoYXJULF9BbGxvYz4oX19zLmdldF9hbGxvY2F0b3IoKSkKK3sgX01fcmFuZ2VfaW5pdGlhbGl6ZShfX3MuX01fU3RhcnQoKSwgX19zLl9NX0ZpbmlzaCgpKTsgfQorCisjaWYgZGVmaW5lZCAoYmFzaWNfc3RyaW5nKQorX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisjICB1bmRlZiBiYXNpY19zdHJpbmcKKyNlbHNlCisvKiBJZiBiYXNpY19zdHJpbmcgaXMgZGVmaW5lZCBpdCBtZWFucyB0aGF0IGl0IHdvbid0IGJlIHRoZSBiYXNpY19zdHJpbmcgY2xhc3MKKyAqIGV4cG9zZWQgdG8gU1RMcG9ydCB1c2VycyBzbyBucG9zIGRvIG5vdCBuZWVkIGV4dGVybmFsIGxpbmthZ2UuCisgKi8KKyMgIGlmICFkZWZpbmVkIChfU1RMUF9TVEFUSUNfQ09OU1RfSU5JVF9CVUcpCisjICAgIGlmICFkZWZpbmVkIChfX0dOVUNfXykgfHwgKF9fR05VQ19fICE9IDIpIHx8IChfX0dOVUNfTUlOT1JfXyAhPSA5NikKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK2NvbnN0IHNpemVfdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjpucG9zOworIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyN1bmRlZiBfX3NpemVfdHlwZV9fCisjaWYgZGVmaW5lZCAoX1NUTFBfTkVTVEVEX1RZUEVfUEFSQU1fQlVHKQorIyAgdW5kZWYgc2l6ZV90eXBlCisjICB1bmRlZiBpdGVyYXRvcgorI2VuZGlmCisKKyNlbmRpZiAvKiAgX1NUTFBfU1RSSU5HX0MgKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9fc3RyaW5nLmggYi9zdGwvX3N0cmluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyOGRlZGQKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvX3N0cmluZy5oCkBAIC0wLDAgKzEsMTQxNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5Ny0xOTk5CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX1NUUklOR19ICisjZGVmaW5lIF9TVExQX0lOVEVSTkFMX1NUUklOR19ICisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQUxMT0NfSAorIyAgaW5jbHVkZSA8c3RsL19hbGxvYy5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfU1RSSU5HX0ZXRF9ICisjICBpbmNsdWRlIDxzdGwvX3N0cmluZ19md2QuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0ZVTkNUSU9OX0JBU0VfSAorIyAgaW5jbHVkZSA8c3RsL19mdW5jdGlvbl9iYXNlLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9BTEdPQkFTRV9ICisjICBpbmNsdWRlIDxzdGwvX2FsZ29iYXNlLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9JVEVSQVRPUl9ICisjICBpbmNsdWRlIDxzdGwvX2l0ZXJhdG9yLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9VTklOSVRJQUxJWkVEX0gKKyMgIGluY2x1ZGUgPHN0bC9fdW5pbml0aWFsaXplZC5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfVEVNUExBVEVfRVhQUkVTU0lPTikKKyMgIGluY2x1ZGUgPHN0bC9fc3RyaW5nX3N1bS5oPgorI2VuZGlmIC8qIF9TVExQX1VTRV9URU1QTEFURV9FWFBSRVNTSU9OICovCisKKyNpZiBkZWZpbmVkIChfX01XRVJLU19fKSAmJiAhIGRlZmluZWQgKF9TVExQX1VTRV9PV05fTkFNRVNQQUNFKQorCisvLyBNU0wgaW1wbGVtZW50YXRpb24gY2xhc3NlcyBleHBlY3QgdG8gc2VlIHRoZSBkZWZpbml0aW9uIG9mIHN0cmVhbXBvcworLy8gd2hlbiB0aGlzIGhlYWRlciBpcyBpbmNsdWRlZC4gV2UgZXhwZWN0IHRoaXMgdG8gYmUgZml4ZWQgaW4gbGF0ZXIgTVNMCisvLyBpbXBsZW1lbnRhdGlvbnMKKyMgIGlmICFkZWZpbmVkKCBfX01TTF9DUFBfXyApIHx8IF9fTVNMX0NQUF9fIDwgMHg0MTA1CisjICAgIGluY2x1ZGUgPHN0bC9tc2xfc3RyaW5nLmg+CisjICBlbmRpZgorI2VuZGlmIC8vIF9fTVdFUktTX18KKworLyoKKyAqIFN0YW5kYXJkIEMrKyBzdHJpbmcgY2xhc3MuICBUaGlzIGNsYXNzIGhhcyBwZXJmb3JtYW5jZQorICogY2hhcmFjdGVyaXN0aWNzIHZlcnkgbXVjaCBsaWtlIHZlY3Rvcjw+LCBtZWFuaW5nLCBmb3IgZXhhbXBsZSwgdGhhdAorICogaXQgZG9lcyBub3QgcGVyZm9ybSByZWZlcmVuY2UtY291bnQgb3IgY29weS1vbi13cml0ZSwgYW5kIHRoYXQKKyAqIGNvbmNhdGVuYXRpb24gb2YgdHdvIHN0cmluZ3MgaXMgYW4gTyhOKSBvcGVyYXRpb24uCisKKyAqIFRoZXJlIGFyZSB0aHJlZSByZWFzb25zIHdoeSBiYXNpY19zdHJpbmcgaXMgbm90IGlkZW50aWNhbCB0bworICogdmVjdG9yLgorICogRmlyc3QsIGJhc2ljX3N0cmluZyBjYW4gYWx3YXlzIHN0b3JlcyBhIG51bGwgY2hhcmFjdGVyCisgKiBhdCB0aGUgZW5kIChtYWNybyBkZXBlbmRlbnQpOyB0aGlzIG1ha2VzIGl0IHBvc3NpYmxlIGZvciBjX3N0ciB0bworICogYmUgYSBmYXN0IG9wZXJhdGlvbi4KKyAqIFNlY29uZCwgdGhlIEMrKyBzdGFuZGFyZCByZXF1aXJlcyBiYXNpY19zdHJpbmcgdG8gY29weSBlbGVtZW50cworICogdXNpbmcgY2hhcl90cmFpdHM8Pjo6YXNzaWduLCBjaGFyX3RyYWl0czw+Ojpjb3B5LCBhbmQKKyAqIGNoYXJfdHJhaXRzPD46Om1vdmUuICBUaGlzIG1lYW5zIHRoYXQgYWxsIG9mIHZlY3Rvcjw+J3MgbG93LWxldmVsCisgKiBvcGVyYXRpb25zIG11c3QgYmUgcmV3cml0dGVuLiAgVGhpcmQsIGJhc2ljX3N0cmluZzw+IGhhcyBhIGxvdCBvZgorICogZXh0cmEgZnVuY3Rpb25zIGluIGl0cyBpbnRlcmZhY2UgdGhhdCBhcmUgY29udmVuaWVudCBidXQsIHN0cmljdGx5CisgKiBzcGVha2luZywgcmVkdW5kYW50LgorCisgKiBBZGRpdGlvbmFsbHksIHRoZSBDKysgc3RhbmRhcmQgaW1wb3NlcyBhIG1ham9yIHJlc3RyaWN0aW9uOiBhY2NvcmRpbmcKKyAqIHRvIHRoZSBzdGFuZGFyZCwgdGhlIGNoYXJhY3RlciB0eXBlIF9DaGFyVCBtdXN0IGJlIGEgUE9EIHR5cGUuICBUaGlzCisgKiBpbXBsZW1lbnRhdGlvbiB3ZWFrZW5zIHRoYXQgcmVzdHJpY3Rpb24sIGFuZCBhbGxvd3MgX0NoYXJUIHRvIGJlIGEKKyAqIGEgdXNlci1kZWZpbmVkIG5vbi1QT0QgdHlwZS4gIEhvd2V2ZXIsIF9DaGFyVCBtdXN0IHN0aWxsIGhhdmUgYQorICogZGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAqLworCisjaW5jbHVkZSA8c3RsL19zdHJpbmdfYmFzZS5oPgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDbGFzcyBiYXNpY19zdHJpbmcuCisKKy8vIENsYXNzIGludmFyaWFudHM6CisvLyAoMSkgW3N0YXJ0LCBmaW5pc2gpIGlzIGEgdmFsaWQgcmFuZ2UuCisvLyAoMikgRWFjaCBpdGVyYXRvciBpbiBbc3RhcnQsIGZpbmlzaCkgcG9pbnRzIHRvIGEgdmFsaWQgb2JqZWN0CisvLyAgICAgb2YgdHlwZSB2YWx1ZV90eXBlLgorLy8gKDMpICpmaW5pc2ggaXMgYSB2YWxpZCBvYmplY3Qgb2YgdHlwZSB2YWx1ZV90eXBlOyB3aGVuCisvLyAgICAgdmFsdWVfdHlwZSBpcyBub3QgYSBQT0QgaXQgaXMgdmFsdWVfdHlwZSgpLgorLy8gKDQpIFtmaW5pc2ggKyAxLCBlbmRfb2Zfc3RvcmFnZSkgaXMgYSB2YWxpZCByYW5nZS4KKy8vICg1KSBFYWNoIGl0ZXJhdG9yIGluIFtmaW5pc2ggKyAxLCBlbmRfb2Zfc3RvcmFnZSkgcG9pbnRzIHRvCisvLyAgICAgdW5pbmluaXRpYWxpemVkIG1lbW9yeS4KKworLy8gTm90ZSBvbmUgaW1wb3J0YW50IGNvbnNlcXVlbmNlOiBhIHN0cmluZyBvZiBsZW5ndGggbiBtdXN0IG1hbmFnZQorLy8gYSBibG9jayBvZiBtZW1vcnkgd2hvc2Ugc2l6ZSBpcyBhdCBsZWFzdCBuICsgMS4KKworc3RydWN0IF9TdHJpbmdfcmVzZXJ2ZV90IHt9OworCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX01TVkM2X01FTV9UX0JVR19XT1JLQVJPVU5EKQorIyAgZGVmaW5lIGJhc2ljX3N0cmluZyBfU1RMUF9OT19NRU1fVF9OQU1FKHN0cikKKyNlbGlmIGRlZmluZWQgKF9TVExQX0RFQlVHKQorIyAgZGVmaW5lIGJhc2ljX3N0cmluZyBfU1RMUF9OT05fREJHX05BTUUoc3RyKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChiYXNpY19zdHJpbmcpCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorY2xhc3MgYmFzaWNfc3RyaW5nIDogcHJvdGVjdGVkIF9TVExQX1BSSVYgX1N0cmluZ19iYXNlPF9DaGFyVCxfQWxsb2M+CisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EKSAmJiAhZGVmaW5lZCAoYmFzaWNfc3RyaW5nKQorICAgICAgICAgICAgICAgICAgICwgcHVibGljIF9fc3RscG9ydF9jbGFzczxiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+ID4KKyNlbmRpZgoreworcHJvdGVjdGVkOiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByb3RlY3RlZCBtZW1iZXJzIGluaGVyaXRlZCBmcm9tIGJhc2UuCisgIHR5cGVkZWYgX1NUTFBfUFJJViBfU3RyaW5nX2Jhc2U8X0NoYXJULF9BbGxvYz4gX0Jhc2U7CisgIHR5cGVkZWYgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiBfU2VsZjsKKyAgLy8gZmJwIDogdXNlZCB0byBvcHRpbWl6ZSBjaGFyL3djaGFyX3QgY2FzZXMsIGFuZCB0byBzaW1wbGlmeQorICAvLyBfU1RMUF9ERUZfQ09OU1RfUExDVF9ORVdfQlVHIHByb2JsZW0gd29ya2Fyb3VuZAorICB0eXBlZGVmIHR5cGVuYW1lIF9Jc0ludGVncmFsPF9DaGFyVD46Ol9SZXQgX0NoYXJfSXNfSW50ZWdyYWw7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0lzUE9EPF9DaGFyVD46Ol9UeXBlIF9DaGFyX0lzX1BPRDsKKyAgdHlwZWRlZiByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyByX2FfaV90OworCitwdWJsaWM6CisgIHR5cGVkZWYgX0NoYXJUIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgX1RyYWl0cyB0cmFpdHNfdHlwZTsKKworICB0eXBlZGVmIHZhbHVlX3R5cGUqIHBvaW50ZXI7CisgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSogY29uc3RfcG9pbnRlcjsKKyAgdHlwZWRlZiB2YWx1ZV90eXBlJiByZWZlcmVuY2U7CisgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSYgY29uc3RfcmVmZXJlbmNlOworICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpzaXplX3R5cGUgc2l6ZV90eXBlOworICB0eXBlZGVmIHB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7CisgIHR5cGVkZWYgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgX0l0ZXJhdG9yX2NhdGVnb3J5OworCisgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSogY29uc3RfaXRlcmF0b3I7CisgIHR5cGVkZWYgdmFsdWVfdHlwZSogICAgICAgaXRlcmF0b3I7CisKKyAgX1NUTFBfREVDTEFSRV9SQU5ET01fQUNDRVNTX1JFVkVSU0VfSVRFUkFUT1JTOworCisjaW5jbHVkZSA8c3RsL19zdHJpbmdfbnBvcy5oPgorCisgIHR5cGVkZWYgX1N0cmluZ19yZXNlcnZlX3QgX1Jlc2VydmVfdDsKKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb25zdHJ1Y3RvciwgZGVzdHJ1Y3RvciwgYXNzaWdubWVudC4KKyAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7CisKKyAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0CisgIHsgcmV0dXJuIF9TVExQX0NPTlZFUlRfQUxMT0NBVE9SKChjb25zdCBhbGxvY2F0b3JfdHlwZSYpdGhpcy0+X01fZW5kX29mX3N0b3JhZ2UsIF9DaGFyVCk7IH0KKworI2lmICFkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQorICBleHBsaWNpdCBiYXNpY19zdHJpbmcoY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisjZWxzZQorICBiYXNpY19zdHJpbmcoKQorICAgICAgOiBfU1RMUF9QUklWIF9TdHJpbmdfYmFzZTxfQ2hhclQsX0FsbG9jPihhbGxvY2F0b3JfdHlwZSgpLCBfQmFzZTo6X0RFRkFVTFRfU0laRSkKKyAgeyBfTV90ZXJtaW5hdGVfc3RyaW5nKCk7IH0KKyAgZXhwbGljaXQgYmFzaWNfc3RyaW5nKGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisjZW5kaWYKKyAgICAgIDogX1NUTFBfUFJJViBfU3RyaW5nX2Jhc2U8X0NoYXJULF9BbGxvYz4oX19hLCBfQmFzZTo6X0RFRkFVTFRfU0laRSkKKyAgeyBfTV90ZXJtaW5hdGVfc3RyaW5nKCk7IH0KKworI2lmICFkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQorICBiYXNpY19zdHJpbmcoX1Jlc2VydmVfdCwgc2l6ZV90IF9fbiwKKyAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorI2Vsc2UKKyAgYmFzaWNfc3RyaW5nKF9SZXNlcnZlX3QsIHNpemVfdCBfX24pCisgICAgOiBfU1RMUF9QUklWIF9TdHJpbmdfYmFzZTxfQ2hhclQsX0FsbG9jPihhbGxvY2F0b3JfdHlwZSgpLCBfX24gKyAxKQorICB7IF9NX3Rlcm1pbmF0ZV9zdHJpbmcoKTsgfQorICBiYXNpY19zdHJpbmcoX1Jlc2VydmVfdCwgc2l6ZV90IF9fbiwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyNlbmRpZgorICAgIDogX1NUTFBfUFJJViBfU3RyaW5nX2Jhc2U8X0NoYXJULF9BbGxvYz4oX19hLCBfX24gKyAxKQorICB7IF9NX3Rlcm1pbmF0ZV9zdHJpbmcoKTsgfQorCisgIGJhc2ljX3N0cmluZyhjb25zdCBfU2VsZiYpOworCisjaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCisgIGJhc2ljX3N0cmluZyhjb25zdCBfU2VsZiYgX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24gPSBucG9zLAorICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisjZWxzZQorICBiYXNpY19zdHJpbmcoY29uc3QgX1NlbGYmIF9fcywgc2l6ZV90eXBlIF9fcG9zKQorICAgIDogX1NUTFBfUFJJViBfU3RyaW5nX2Jhc2U8X0NoYXJULF9BbGxvYz4oYWxsb2NhdG9yX3R5cGUoKSkgeworICAgIGlmIChfX3BvcyA+IF9fcy5zaXplKCkpCisgICAgICB0aGlzLT5fTV90aHJvd19vdXRfb2ZfcmFuZ2UoKTsKKyAgICBlbHNlCisgICAgICBfTV9yYW5nZV9pbml0aWFsaXplKF9fcy5fTV9TdGFydCgpICsgX19wb3MsIF9fcy5fTV9GaW5pc2goKSk7CisgIH0KKyAgYmFzaWNfc3RyaW5nKGNvbnN0IF9TZWxmJiBfX3MsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikKKyAgICA6IF9TVExQX1BSSVYgX1N0cmluZ19iYXNlPF9DaGFyVCxfQWxsb2M+KGFsbG9jYXRvcl90eXBlKCkpIHsKKyAgICBpZiAoX19wb3MgPiBfX3Muc2l6ZSgpKQorICAgICAgdGhpcy0+X01fdGhyb3dfb3V0X29mX3JhbmdlKCk7CisgICAgZWxzZQorICAgICAgX01fcmFuZ2VfaW5pdGlhbGl6ZShfX3MuX01fU3RhcnQoKSArIF9fcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfX3MuX01fU3RhcnQoKSArIF9fcG9zICsgKG1pbikgKF9fbiwgX19zLnNpemUoKSAtIF9fcG9zKSk7CisgIH0KKyAgYmFzaWNfc3RyaW5nKGNvbnN0IF9TZWxmJiBfX3MsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbiwKKyAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisjZW5kaWYKKyAgICA6IF9TVExQX1BSSVYgX1N0cmluZ19iYXNlPF9DaGFyVCxfQWxsb2M+KF9fYSkgeworICAgIGlmIChfX3BvcyA+IF9fcy5zaXplKCkpCisgICAgICB0aGlzLT5fTV90aHJvd19vdXRfb2ZfcmFuZ2UoKTsKKyAgICBlbHNlCisgICAgICBfTV9yYW5nZV9pbml0aWFsaXplKF9fcy5fTV9TdGFydCgpICsgX19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcy5fTV9TdGFydCgpICsgX19wb3MgKyAobWluKSAoX19uLCBfX3Muc2l6ZSgpIC0gX19wb3MpKTsKKyAgfQorCisjaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCisgIGJhc2ljX3N0cmluZyhjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbiwKKyAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorI2Vsc2UKKyAgYmFzaWNfc3RyaW5nKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uKQorICAgIDogX1NUTFBfUFJJViBfU3RyaW5nX2Jhc2U8X0NoYXJULF9BbGxvYz4oYWxsb2NhdG9yX3R5cGUoKSkgeworICAgICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKKyAgICAgIF9NX3JhbmdlX2luaXRpYWxpemUoX19zLCBfX3MgKyBfX24pOworICAgIH0KKyAgYmFzaWNfc3RyaW5nKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorI2VuZGlmCisgICAgOiBfU1RMUF9QUklWIF9TdHJpbmdfYmFzZTxfQ2hhclQsX0FsbG9jPihfX2EpIHsKKyAgICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgICAgICBfTV9yYW5nZV9pbml0aWFsaXplKF9fcywgX19zICsgX19uKTsKKyAgICB9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKKyAgYmFzaWNfc3RyaW5nKGNvbnN0IF9DaGFyVCogX19zLAorICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpOworI2Vsc2UKKyAgYmFzaWNfc3RyaW5nKGNvbnN0IF9DaGFyVCogX19zKTsKKyAgYmFzaWNfc3RyaW5nKGNvbnN0IF9DaGFyVCogX19zLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKTsKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCisgIGJhc2ljX3N0cmluZyhzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jLAorICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisjZWxzZQorICBiYXNpY19zdHJpbmcoc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYykKKyAgICA6IF9TVExQX1BSSVYgX1N0cmluZ19iYXNlPF9DaGFyVCxfQWxsb2M+KGFsbG9jYXRvcl90eXBlKCksIF9fbiArIDEpIHsKKyMgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0pCisgICAgaWYgKHRoaXMtPl9NX3VzaW5nX3N0YXRpY19idWYoKSkgeworICAgICAgX1RyYWl0czo6YXNzaWduKHRoaXMtPl9NX1N0YXJ0KCksIF9fbiwgX19jKTsKKyAgICAgIHRoaXMtPl9NX2ZpbmlzaCA9IHRoaXMtPl9NX1N0YXJ0KCkgKyBfX247CisgICAgfQorICAgIGVsc2UKKyMgIGVuZGlmCisgICAgdGhpcy0+X01fZmluaXNoID0gX1NUTFBfUFJJViBfX3VuaW5pdGlhbGl6ZWRfZmlsbF9uKHRoaXMtPl9NX1N0YXJ0KCksIF9fbiwgX19jKTsKKyAgICBfTV90ZXJtaW5hdGVfc3RyaW5nKCk7CisgIH0KKyAgYmFzaWNfc3RyaW5nKHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisjZW5kaWYKKyAgICA6IF9TVExQX1BSSVYgX1N0cmluZ19iYXNlPF9DaGFyVCxfQWxsb2M+KF9fYSwgX19uICsgMSkgeworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0pCisgICAgaWYgKHRoaXMtPl9NX3VzaW5nX3N0YXRpY19idWYoKSkgeworICAgICAgX1RyYWl0czo6YXNzaWduKHRoaXMtPl9NX1N0YXJ0KCksIF9fbiwgX19jKTsKKyAgICAgIHRoaXMtPl9NX2ZpbmlzaCA9IHRoaXMtPl9NX1N0YXJ0KCkgKyBfX247CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgIHRoaXMtPl9NX2ZpbmlzaCA9IF9TVExQX1BSSVYgX191bmluaXRpYWxpemVkX2ZpbGxfbih0aGlzLT5fTV9TdGFydCgpLCBfX24sIF9fYyk7CisgICAgX01fdGVybWluYXRlX3N0cmluZygpOworICB9CisKKyAgYmFzaWNfc3RyaW5nKF9fbW92ZV9zb3VyY2U8X1NlbGY+IHNyYykKKyAgICA6IF9TVExQX1BSSVYgX1N0cmluZ19iYXNlPF9DaGFyVCxfQWxsb2M+KF9fbW92ZV9zb3VyY2U8X0Jhc2U+KHNyYy5nZXQoKSkpIHt9CisKKyAgLy8gQ2hlY2sgdG8gc2VlIGlmIF9JbnB1dEl0ZXJhdG9yIGlzIGFuIGludGVnZXIgdHlwZS4gIElmIHNvLCB0aGVuCisgIC8vIGl0IGNhbid0IGJlIGFuIGl0ZXJhdG9yLgorI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpICYmICEoZGVmaW5lZCAoX19NUkNfXykgfHwgKGRlZmluZWQoX19TQ19fKSAmJiAhZGVmaW5lZChfX0RNQ19fKSkpIC8vKnR5IDA0LzMwLzIwMDEgLSBtcHcgY29tcGlsZXJzIGNob2tlIG9uIHRoaXMgY3RvcgorIyAgaWYgIWRlZmluZWQgKF9TVExQX1VTRV9NU1ZDNl9NRU1fVF9CVUdfV09SS0FST1VORCkKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICBiYXNpY19zdHJpbmcoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsCisgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSAmIF9fYSBfU1RMUF9BTExPQ0FUT1JfVFlQRV9ERkwpCisgICAgOiBfU1RMUF9QUklWIF9TdHJpbmdfYmFzZTxfQ2hhclQsX0FsbG9jPihfX2EpIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Jc0ludGVncmFsPF9JbnB1dEl0ZXJhdG9yPjo6X1JldCBfSW50ZWdyYWw7CisgICAgX01faW5pdGlhbGl6ZV9kaXNwYXRjaChfX2YsIF9fbCwgX0ludGVncmFsKCkpOworICB9CisjICAgIGlmIGRlZmluZWQgKF9TVExQX05FRURTX0VYVFJBX1RFTVBMQVRFX0NPTlNUUlVDVE9SUykKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICBiYXNpY19zdHJpbmcoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wpCisgICAgOiBfU1RMUF9QUklWIF9TdHJpbmdfYmFzZTxfQ2hhclQsX0FsbG9jPihhbGxvY2F0b3JfdHlwZSgpKSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXNJbnRlZ3JhbDxfSW5wdXRJdGVyYXRvcj46Ol9SZXQgX0ludGVncmFsOworICAgIF9NX2luaXRpYWxpemVfZGlzcGF0Y2goX19mLCBfX2wsIF9JbnRlZ3JhbCgpKTsKKyAgfQorIyAgICBlbmRpZgorIyAgZWxzZQorICAvKiBXZSBuZWVkIGFuIGFkZGl0aW9ubmFsIGNvbnN0cnVjdG9yIHRvIGJ1aWxkIGFuIGVtcHR5IHN0cmluZyB3aXRob3V0CisgICAqIGFueSBhbGxvY2F0aW9uIG9yIHRlcm1pbmF0aW9uIGNoYXIqLworcHJvdGVjdGVkOgorICBzdHJ1Y3QgX0NhbGxlZEZyb21Xb3JrYXJvdW5kX3Qge307CisgIGJhc2ljX3N0cmluZyhfQ2FsbGVkRnJvbVdvcmthcm91bmRfdCwgY29uc3QgYWxsb2NhdG9yX3R5cGUgJl9fYSkKKyAgICA6IF9TdHJpbmdfYmFzZTxfQ2hhclQsX0FsbG9jPihfX2EpIHt9CitwdWJsaWM6CisjICBlbmRpZiAvKiBfU1RMUF9VU0VfTVNWQzZfTUVNX1RfQlVHX1dPUktBUk9VTkQgKi8KKyNlbmRpZiAvKiAhX19NUkNfXyB8fCAoX19TQ19fICYmICFfX0RNQ19fKSAqLworCisjaWYgIShkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKSAmJiAhKGRlZmluZWQgKF9fTVJDX18pIHx8IChkZWZpbmVkIChfX1NDX18pICYmICFkZWZpbmVkIChfX0RNQ19fKSkpKSB8fCBcCisgICAgIWRlZmluZWQgKF9TVExQX05PX01FVEhPRF9TUEVDSUFMSVpBVElPTikgJiYgIWRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpIHx8IFwKKyAgICAgZGVmaW5lZCAoX1NUTFBfVVNFX01TVkM2X01FTV9UX0JVR19XT1JLQVJPVU5EKQorICBiYXNpY19zdHJpbmcoY29uc3QgX0NoYXJUKiBfX2YsIGNvbnN0IF9DaGFyVCogX19sLAorICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSBfU1RMUF9BTExPQ0FUT1JfVFlQRV9ERkwpCisgICAgOiBfU1RMUF9QUklWIF9TdHJpbmdfYmFzZTxfQ2hhclQsX0FsbG9jPihfX2EpIHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19mKSAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fbCkKKyAgICBfTV9yYW5nZV9pbml0aWFsaXplKF9fZiwgX19sKTsKKyAgfQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfTkVFRFNfRVhUUkFfVEVNUExBVEVfQ09OU1RSVUNUT1JTKQorICBiYXNpY19zdHJpbmcoY29uc3QgX0NoYXJUKiBfX2YsIGNvbnN0IF9DaGFyVCogX19sKQorICAgIDogX1NUTFBfUFJJViBfU3RyaW5nX2Jhc2U8X0NoYXJULF9BbGxvYz4oYWxsb2NhdG9yX3R5cGUoKSkgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2YpICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19sKQorICAgIF9NX3JhbmdlX2luaXRpYWxpemUoX19mLCBfX2wpOworICB9CisjICBlbmRpZgorI2VuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKworcHJpdmF0ZToKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXI+CisgIHZvaWQgX01fcmFuZ2VfaW5pdGlhbGl6ZShfSW5wdXRJdGVyIF9fZiwgX0lucHV0SXRlciBfX2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnB1dF9pdGVyYXRvcl90YWcgJl9fdGFnKSB7CisgICAgdGhpcy0+X01fYWxsb2NhdGVfYmxvY2soKTsKKyAgICBfTV9jb25zdHJ1Y3RfbnVsbCh0aGlzLT5fTV9GaW5pc2goKSk7CisgICAgX1NUTFBfVFJZIHsKKyAgICAgIF9NX2FwcGVuZFQoX19mLCBfX2wsIF9fdGFnKTsKKyAgICB9CisgICAgX1NUTFBfVU5XSU5EKHRoaXMtPl9NX2Rlc3Ryb3lfcmFuZ2UoKSkKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXI+CisgIHZvaWQgX01fcmFuZ2VfaW5pdGlhbGl6ZShfRm9yd2FyZEl0ZXIgX19mLCBfRm9yd2FyZEl0ZXIgX19sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9yd2FyZF9pdGVyYXRvcl90YWcgJikgeworICAgIGRpZmZlcmVuY2VfdHlwZSBfX24gPSBkaXN0YW5jZShfX2YsIF9fbCk7CisgICAgdGhpcy0+X01fYWxsb2NhdGVfYmxvY2soX19uICsgMSk7CisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1NIT1JUX1NUUklOR19PUFRJTSkKKyAgICBpZiAodGhpcy0+X01fdXNpbmdfc3RhdGljX2J1ZigpKSB7CisgICAgICBfTV9jb3B5VChfX2YsIF9fbCwgdGhpcy0+X01fU3RhcnQoKSk7CisgICAgICB0aGlzLT5fTV9maW5pc2ggPSB0aGlzLT5fTV9TdGFydCgpICsgX19uOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYgLyogX1NUTFBfVVNFX1NIT1JUX1NUUklOR19PUFRJTSAqLworICAgIHRoaXMtPl9NX2ZpbmlzaCA9IHVuaW5pdGlhbGl6ZWRfY29weShfX2YsIF9fbCwgdGhpcy0+X01fU3RhcnQoKSk7CisgICAgdGhpcy0+X01fdGVybWluYXRlX3N0cmluZygpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXI+CisgIHZvaWQgX01fcmFuZ2VfaW5pdGlhbGl6ZVQoX0lucHV0SXRlciBfX2YsIF9JbnB1dEl0ZXIgX19sKSB7CisgICAgX01fcmFuZ2VfaW5pdGlhbGl6ZShfX2YsIF9fbCwgX1NUTFBfSVRFUkFUT1JfQ0FURUdPUlkoX19mLCBfSW5wdXRJdGVyKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0ludGVnZXI+CisgIHZvaWQgX01faW5pdGlhbGl6ZV9kaXNwYXRjaChfSW50ZWdlciBfX24sIF9JbnRlZ2VyIF9feCwgY29uc3QgX190cnVlX3R5cGUmIC8qX0ludGVncmFsKi8pIHsKKyAgICB0aGlzLT5fTV9hbGxvY2F0ZV9ibG9jayhfX24gKyAxKTsKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfU0hPUlRfU1RSSU5HX09QVElNKQorICAgIGlmICh0aGlzLT5fTV91c2luZ19zdGF0aWNfYnVmKCkpIHsKKyAgICAgIF9UcmFpdHM6OmFzc2lnbih0aGlzLT5fTV9TdGFydCgpLCBfX24sIF9feCk7CisgICAgICB0aGlzLT5fTV9maW5pc2ggPSB0aGlzLT5fTV9TdGFydCgpICsgX19uOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYgLyogX1NUTFBfVVNFX1NIT1JUX1NUUklOR19PUFRJTSAqLworICAgIHRoaXMtPl9NX2ZpbmlzaCA9IF9TVExQX1BSSVYgX191bmluaXRpYWxpemVkX2ZpbGxfbih0aGlzLT5fTV9TdGFydCgpLCBfX24sIF9feCk7CisgICAgdGhpcy0+X01fdGVybWluYXRlX3N0cmluZygpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXI+CisgIHZvaWQgX01faW5pdGlhbGl6ZV9kaXNwYXRjaChfSW5wdXRJdGVyIF9fZiwgX0lucHV0SXRlciBfX2wsIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypfSW50ZWdyYWwqLykgeworICAgIF9NX3JhbmdlX2luaXRpYWxpemVUKF9fZiwgX19sKTsKKyAgfQorCitwdWJsaWM6CisgIH5iYXNpY19zdHJpbmcoKQorICB7IHRoaXMtPl9NX2Rlc3Ryb3lfcmFuZ2UoKTsgfQorCisgIF9TZWxmJiBvcGVyYXRvcj0oY29uc3QgX1NlbGYmIF9fcykgeworICAgIGlmICgmX19zICE9IHRoaXMpCisgICAgICBfTV9hc3NpZ24oX19zLl9NX1N0YXJ0KCksIF9fcy5fTV9GaW5pc2goKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgX1NlbGYmIG9wZXJhdG9yPShjb25zdCBfQ2hhclQqIF9fcykgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgICAgcmV0dXJuIF9NX2Fzc2lnbihfX3MsIF9fcyArIHRyYWl0c190eXBlOjpsZW5ndGgoX19zKSk7CisgIH0KKworICBfU2VsZiYgb3BlcmF0b3I9KF9DaGFyVCBfX2MpCisgIHsgcmV0dXJuIGFzc2lnbihfX1NUQVRJQ19DQVNUKHNpemVfdHlwZSwxKSwgX19jKTsgfQorCitwcm90ZWN0ZWQ6CisKKyAgc3RhdGljIF9DaGFyVCBfU1RMUF9DQUxMIF9NX251bGwoKQorICB7IHJldHVybiBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKF9DaGFyVCk7IH0KKworcHJvdGVjdGVkOiAgICAgICAgICAgICAgICAgICAgIC8vIEhlbHBlciBmdW5jdGlvbnMgdXNlZCBieSBjb25zdHJ1Y3RvcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgZWxzZXdoZXJlLgorICAvLyBmYnAgOiBzaW1wbGlmeSBpbnRlZ2VyIHR5cGVzIChjaGFyLCB3Y2hhcikKKyAgdm9pZCBfTV9jb25zdHJ1Y3RfbnVsbF9hdXgoX0NoYXJUKiBfX3AsIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypfSXNfSW50ZWdyYWwqLykgY29uc3QgeworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0pCisgICAgaWYgKHRoaXMtPl9NX3VzaW5nX3N0YXRpY19idWYoKSkKKyAgICAgIF9UcmFpdHM6OmFzc2lnbigqX19wLCBfTV9udWxsKCkpOworICAgIGVsc2UKKyNlbmRpZiAvKl9TVExQX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0qLworICAgIF9TVExQX1NURDo6X0NvbnN0cnVjdChfX3ApOworICB9CisgIHZvaWQgX01fY29uc3RydWN0X251bGxfYXV4KF9DaGFyVCogX19wLCBjb25zdCBfX3RydWVfdHlwZSYgLypfSXNfSW50ZWdyYWwqLykgY29uc3QKKyAgeyAqX19wID0gMDsgfQorCisgIHZvaWQgX01fZm9yY2VfY29uc3RydWN0X251bGwoX0NoYXJUKiwgY29uc3QgX190cnVlX3R5cGUmIC8qIF9Jc19QT0QgKi8pIGNvbnN0CisgIHsgLypOb3RoaW5nIHRvIGRvKi8gfQorICB2b2lkIF9NX2ZvcmNlX2NvbnN0cnVjdF9udWxsKF9DaGFyVCogX19wLCBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qIF9Jc19QT0QgKi8pIGNvbnN0CisgIHsgX01fY29uc3RydWN0X251bGxfYXV4KF9fcCwgX0NoYXJfSXNfSW50ZWdyYWwoKSk7IH0KKworICB2b2lkIF9NX2NvbnN0cnVjdF9udWxsKF9DaGFyVCogX19wKSBjb25zdCB7CisgICAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgX0Fuc3dlcjsKKworICAgIF9NX2ZvcmNlX2NvbnN0cnVjdF9udWxsKF9fcCwgX0Fuc3dlcigpKTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIC8vIEhlbHBlciBmdW5jdGlvbnMgdXNlZCBieSBjb25zdHJ1Y3RvcnMuICBJdCBpcyBhIHNldmVyZSBlcnJvciBmb3IKKyAgLy8gYW55IG9mIHRoZW0gdG8gYmUgY2FsbGVkIGFueXdoZXJlIGV4Y2VwdCBmcm9tIHdpdGhpbiBjb25zdHJ1Y3RvcnMuCisgIHZvaWQgX01fdGVybWluYXRlX3N0cmluZ19hdXgoY29uc3QgX19mYWxzZV90eXBlJiBfX2lzX2ludGVncmFsKSB7CisgICAgX1NUTFBfVFJZIHsKKyAgICAgIF9NX2NvbnN0cnVjdF9udWxsX2F1eCh0aGlzLT5fTV9GaW5pc2goKSwgX19pc19pbnRlZ3JhbCk7CisgICAgfQorICAgIF9TVExQX1VOV0lORCh0aGlzLT5fTV9kZXN0cm95X3JhbmdlKDAsMCkpCisgIH0KKworICB2b2lkIF9NX3Rlcm1pbmF0ZV9zdHJpbmdfYXV4KGNvbnN0IF9fdHJ1ZV90eXBlJiBfX2lzX2ludGVncmFsKQorICB7IF9NX2NvbnN0cnVjdF9udWxsX2F1eCh0aGlzLT5fTV9GaW5pc2goKSwgX19pc19pbnRlZ3JhbCk7IH0KKworICB2b2lkIF9NX2ZvcmNlX3Rlcm1pbmF0ZV9zdHJpbmcoY29uc3QgX190cnVlX3R5cGUmIC8qIF9Jc19QT0QgKi8pCisgIHsgLypOb3RoaW5nIHRvIGRvKi8gfQorICB2b2lkIF9NX2ZvcmNlX3Rlcm1pbmF0ZV9zdHJpbmcoY29uc3QgX19mYWxzZV90eXBlJiAvKiBfSXNfUE9EICovKQorICB7IF9NX3Rlcm1pbmF0ZV9zdHJpbmdfYXV4KF9DaGFyX0lzX0ludGVncmFsKCkpOyB9CisKKyAgdm9pZCBfTV90ZXJtaW5hdGVfc3RyaW5nKCkgeworICAgIHR5cGVkZWYgX19mYWxzZV90eXBlIF9BbnN3ZXI7CisKKyAgICBfTV9mb3JjZV90ZXJtaW5hdGVfc3RyaW5nKF9BbnN3ZXIoKSk7CisgIH0KKworICBib29sIF9NX2luc2lkZShjb25zdCBfQ2hhclQqIF9fcykgY29uc3QgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgICAgcmV0dXJuIChfX3MgPj0gdGhpcy0+X01fU3RhcnQoKSkgJiYgKF9fcyA8IHRoaXMtPl9NX0ZpbmlzaCgpKTsKKyAgfQorCisgIHZvaWQgX01fcmFuZ2VfaW5pdGlhbGl6ZShjb25zdCBfQ2hhclQqIF9fZiwgY29uc3QgX0NoYXJUKiBfX2wpIHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19mKSBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19sKQorICAgIHB0cmRpZmZfdCBfX24gPSBfX2wgLSBfX2Y7CisgICAgdGhpcy0+X01fYWxsb2NhdGVfYmxvY2soX19uICsgMSk7CisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1NIT1JUX1NUUklOR19PUFRJTSkKKyAgICBpZiAodGhpcy0+X01fdXNpbmdfc3RhdGljX2J1ZigpKSB7CisgICAgICBfTV9jb3B5KF9fZiwgX19sLCB0aGlzLT5fTV9TdGFydCgpKTsKKyAgICAgIHRoaXMtPl9NX2ZpbmlzaCA9IHRoaXMtPl9NX1N0YXJ0KCkgKyBfX247CisgICAgfQorICAgIGVsc2UKKyNlbmRpZiAvKiBfU1RMUF9VU0VfU0hPUlRfU1RSSU5HX09QVElNICovCisgICAgdGhpcy0+X01fZmluaXNoID0gdW5pbml0aWFsaXplZF9jb3B5KF9fZiwgX19sLCB0aGlzLT5fTV9TdGFydCgpKTsKKyAgICBfTV90ZXJtaW5hdGVfc3RyaW5nKCk7CisgIH0KKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJdGVyYXRvcnMuCisgIGl0ZXJhdG9yIGJlZ2luKCkgICAgICAgICAgICAgeyByZXR1cm4gdGhpcy0+X01fU3RhcnQoKTsgfQorICBpdGVyYXRvciBlbmQoKSAgICAgICAgICAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX0ZpbmlzaCgpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gdGhpcy0+X01fU3RhcnQoKTsgfQorICBjb25zdF9pdGVyYXRvciBlbmQoKSAgIGNvbnN0IHsgcmV0dXJuIHRoaXMtPl9NX0ZpbmlzaCgpOyB9CisKKyAgcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKQorICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IodGhpcy0+X01fRmluaXNoKCkpOyB9CisgIHJldmVyc2VfaXRlcmF0b3IgcmVuZCgpCisgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcih0aGlzLT5fTV9TdGFydCgpKTsgfQorICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0CisgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcih0aGlzLT5fTV9GaW5pc2goKSk7IH0KKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgICBjb25zdAorICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IodGhpcy0+X01fU3RhcnQoKSk7IH0KKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTaXplLCBjYXBhY2l0eSwgZXRjLgorICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHRoaXMtPl9NX0ZpbmlzaCgpIC0gdGhpcy0+X01fU3RhcnQoKTsgfQorICBzaXplX3R5cGUgbGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gc2l6ZSgpOyB9CisgIHNpemVfdCBtYXhfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9CYXNlOjptYXhfc2l6ZSgpOyB9CisKKyAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYykgeworICAgIGlmIChfX24gPD0gc2l6ZSgpKQorICAgICAgZXJhc2UoYmVnaW4oKSArIF9fbiwgZW5kKCkpOworICAgIGVsc2UKKyAgICAgIGFwcGVuZChfX24gLSBzaXplKCksIF9fYyk7CisgIH0KKworICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgX19uKSB7IHJlc2l6ZShfX24sIF9NX251bGwoKSk7IH0KKworICB2b2lkIHJlc2VydmUoc2l6ZV90eXBlID0gMCk7CisKKyAgc2l6ZV90eXBlIGNhcGFjaXR5KCkgY29uc3QKKyAgeyByZXR1cm4gKHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLl9NX2RhdGEgLSB0aGlzLT5fTV9TdGFydCgpKSAtIDE7IH0KKworICB2b2lkIGNsZWFyKCkgeworICAgIGlmICghZW1wdHkoKSkgeworICAgICAgX1RyYWl0czo6YXNzaWduKCoodGhpcy0+X01fU3RhcnQoKSksIF9NX251bGwoKSk7CisgICAgICB0aGlzLT5fTV9kZXN0cm95X3JhbmdlKDEpOworICAgICAgdGhpcy0+X01fZmluaXNoID0gdGhpcy0+X01fU3RhcnQoKTsKKyAgICB9CisgIH0KKworICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gdGhpcy0+X01fU3RhcnQoKSA9PSB0aGlzLT5fTV9GaW5pc2goKTsgfQorCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVsZW1lbnQgYWNjZXNzLgorCisgIGNvbnN0X3JlZmVyZW5jZSBvcGVyYXRvcltdKHNpemVfdHlwZSBfX24pIGNvbnN0CisgIHsgcmV0dXJuICoodGhpcy0+X01fU3RhcnQoKSArIF9fbik7IH0KKyAgcmVmZXJlbmNlIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fbikKKyAgeyByZXR1cm4gKih0aGlzLT5fTV9TdGFydCgpICsgX19uKTsgfQorCisgIGNvbnN0X3JlZmVyZW5jZSBhdChzaXplX3R5cGUgX19uKSBjb25zdCB7CisgICAgaWYgKF9fbiA+PSBzaXplKCkpCisgICAgICB0aGlzLT5fTV90aHJvd19vdXRfb2ZfcmFuZ2UoKTsKKyAgICByZXR1cm4gKih0aGlzLT5fTV9TdGFydCgpICsgX19uKTsKKyAgfQorCisgIHJlZmVyZW5jZSBhdChzaXplX3R5cGUgX19uKSB7CisgICAgaWYgKF9fbiA+PSBzaXplKCkpCisgICAgICB0aGlzLT5fTV90aHJvd19vdXRfb2ZfcmFuZ2UoKTsKKyAgICByZXR1cm4gKih0aGlzLT5fTV9TdGFydCgpICsgX19uKTsKKyAgfQorCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFwcGVuZCwgb3BlcmF0b3IrPSwgcHVzaF9iYWNrLgorCisgIF9TZWxmJiBvcGVyYXRvcis9KGNvbnN0IF9TZWxmJiBfX3MpIHsgcmV0dXJuIGFwcGVuZChfX3MpOyB9CisgIF9TZWxmJiBvcGVyYXRvcis9KGNvbnN0IF9DaGFyVCogX19zKSB7IF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpIHJldHVybiBhcHBlbmQoX19zKTsgfQorICBfU2VsZiYgb3BlcmF0b3IrPShfQ2hhclQgX19jKSB7IHB1c2hfYmFjayhfX2MpOyByZXR1cm4gKnRoaXM7IH0KKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisjICBpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX01TVkM2X01FTV9UX0JVR19XT1JLQVJPVU5EKQorcHJpdmF0ZTogLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgYXBwZW5kLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcj4KKyAgX1NlbGYmIF9NX2FwcGVuZFQoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5wdXRfaXRlcmF0b3JfdGFnICYpIHsKKyAgICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0IDsgKytfX2ZpcnN0KQorICAgICAgcHVzaF9iYWNrKCpfX2ZpcnN0KTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyPgorICBfU2VsZiYgX01fYXBwZW5kVChfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9yd2FyZF9pdGVyYXRvcl90YWcgJikgeworICAgIGlmIChfX2ZpcnN0ICE9IF9fbGFzdCkgeworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSB0aGlzLT5zaXplKCk7CisgICAgICBkaWZmZXJlbmNlX3R5cGUgX19uID0gZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KTsKKyAgICAgIGlmIChfX1NUQVRJQ19DQVNUKHNpemVfdHlwZSxfX24pID4gdGhpcy0+bWF4X3NpemUoKSB8fCBfX29sZF9zaXplID4gdGhpcy0+bWF4X3NpemUoKSAtIF9fU1RBVElDX0NBU1Qoc2l6ZV90eXBlLF9fbikpCisgICAgICAgIHRoaXMtPl9NX3Rocm93X2xlbmd0aF9lcnJvcigpOworICAgICAgaWYgKF9fb2xkX3NpemUgKyBfX24gPiB0aGlzLT5jYXBhY2l0eSgpKSB7CisgICAgICAgIHNpemVfdHlwZSBfX2xlbiA9IF9fb2xkX3NpemUgKyAobWF4KShfX29sZF9zaXplLCBfX1NUQVRJQ19DQVNUKHNpemVfdHlwZSxfX24pKSArIDE7CisgICAgICAgIHBvaW50ZXIgX19uZXdfc3RhcnQgPSB0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5hbGxvY2F0ZShfX2xlbiwgX19sZW4pOworICAgICAgICBwb2ludGVyIF9fbmV3X2ZpbmlzaCA9IF9fbmV3X3N0YXJ0OworICAgICAgICBfU1RMUF9UUlkgeworICAgICAgICAgIF9fbmV3X2ZpbmlzaCA9IHVuaW5pdGlhbGl6ZWRfY29weSh0aGlzLT5fTV9TdGFydCgpLCB0aGlzLT5fTV9GaW5pc2goKSwgX19uZXdfc3RhcnQpOworICAgICAgICAgIF9fbmV3X2ZpbmlzaCA9IHVuaW5pdGlhbGl6ZWRfY29weShfX2ZpcnN0LCBfX2xhc3QsIF9fbmV3X2ZpbmlzaCk7CisgICAgICAgICAgX01fY29uc3RydWN0X251bGwoX19uZXdfZmluaXNoKTsKKyAgICAgICAgfQorICAgICAgICBfU1RMUF9VTldJTkQoKF9TVExQX1NURDo6X0Rlc3Ryb3lfUmFuZ2UoX19uZXdfc3RhcnQsX19uZXdfZmluaXNoKSwKKyAgICAgICAgICB0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5kZWFsbG9jYXRlKF9fbmV3X3N0YXJ0LCBfX2xlbikpKQorICAgICAgICAgIHRoaXMtPl9NX2Rlc3Ryb3lfcmFuZ2UoKTsKKyAgICAgICAgdGhpcy0+X01fZGVhbGxvY2F0ZV9ibG9jaygpOworICAgICAgICB0aGlzLT5fTV9yZXNldChfX25ld19zdGFydCwgX19uZXdfZmluaXNoLCBfX25ld19zdGFydCArIF9fbGVuKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBfRm9yd2FyZEl0ZXIgX19mMSA9IF9fZmlyc3Q7CisgICAgICAgICsrX19mMTsKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfU0hPUlRfU1RSSU5HX09QVElNKQorICAgICAgICBpZiAodGhpcy0+X01fdXNpbmdfc3RhdGljX2J1ZigpKQorICAgICAgICAgIF9NX2NvcHlUKF9fZjEsIF9fbGFzdCwgdGhpcy0+X01fRmluaXNoKCkgKyAxKTsKKyAgICAgICAgZWxzZQorI2VuZGlmIC8qIF9TVExQX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0gKi8KKyAgICAgICAgICB1bmluaXRpYWxpemVkX2NvcHkoX19mMSwgX19sYXN0LCB0aGlzLT5fTV9GaW5pc2goKSArIDEpOworICAgICAgICBfU1RMUF9UUlkgeworICAgICAgICAgIF9NX2NvbnN0cnVjdF9udWxsKHRoaXMtPl9NX0ZpbmlzaCgpICsgX19uKTsKKyAgICAgICAgfQorICAgICAgICBfU1RMUF9VTldJTkQodGhpcy0+X01fZGVzdHJveV9wdHJfcmFuZ2UodGhpcy0+X01fRmluaXNoKCkgKyAxLCB0aGlzLT5fTV9GaW5pc2goKSArIF9fbikpCisgICAgICAgIF9UcmFpdHM6OmFzc2lnbigqdGhpcy0+X01fZmluaXNoLCAqX19maXJzdCk7CisgICAgICAgIHRoaXMtPl9NX2ZpbmlzaCArPSBfX247CisgICAgICB9CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfSW50ZWdlcj4KKyAgX1NlbGYmIF9NX2FwcGVuZF9kaXNwYXRjaChfSW50ZWdlciBfX24sIF9JbnRlZ2VyIF9feCwgY29uc3QgX190cnVlX3R5cGUmIC8qSW50ZWdyYWwqLykKKyAgeyByZXR1cm4gYXBwZW5kKChzaXplX3R5cGUpIF9fbiwgKF9DaGFyVCkgX194KTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgorICBfU2VsZiYgX01fYXBwZW5kX2Rpc3BhdGNoKF9JbnB1dEl0ZXIgX19mLCBfSW5wdXRJdGVyIF9fbCwgY29uc3QgX19mYWxzZV90eXBlJiAvKkludGVncmFsKi8pCisgIHsgcmV0dXJuIF9NX2FwcGVuZFQoX19mLCBfX2wsIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9fZiwgX0lucHV0SXRlcikpOyB9CisKK3B1YmxpYzoKKyAgLy8gQ2hlY2sgdG8gc2VlIGlmIF9JbnB1dEl0ZXJhdG9yIGlzIGFuIGludGVnZXIgdHlwZS4gIElmIHNvLCB0aGVuCisgIC8vIGl0IGNhbid0IGJlIGFuIGl0ZXJhdG9yLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcj4KKyAgX1NlbGYmIGFwcGVuZChfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0KSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXNJbnRlZ3JhbDxfSW5wdXRJdGVyPjo6X1JldCBfSW50ZWdyYWw7CisgICAgcmV0dXJuIF9NX2FwcGVuZF9kaXNwYXRjaChfX2ZpcnN0LCBfX2xhc3QsIF9JbnRlZ3JhbCgpKTsKKyAgfQorIyAgZW5kaWYKKyNlbmRpZgorCitwcm90ZWN0ZWQ6CisgIF9TZWxmJiBfTV9hcHBlbmQoY29uc3QgX0NoYXJUKiBfX2ZpcnN0LCBjb25zdCBfQ2hhclQqIF9fbGFzdCk7CisKK3B1YmxpYzoKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykgfHwgXAorICAgICFkZWZpbmVkIChfU1RMUF9OT19NRVRIT0RfU1BFQ0lBTElaQVRJT04pICYmICFkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKQorIyAgaWYgIWRlZmluZWQgKF9TVExQX1VTRV9NU1ZDNl9NRU1fVF9CVUdfV09SS0FST1VORCkKKyAgX1NlbGYmIGFwcGVuZChjb25zdCBfQ2hhclQqIF9fZmlyc3QsIGNvbnN0IF9DaGFyVCogX19sYXN0KSB7CisgICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fZmlyc3QpX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fbGFzdCkKKyAgICByZXR1cm4gX01fYXBwZW5kKF9fZmlyc3QsIF9fbGFzdCk7CisgIH0KKyMgIGVuZGlmCisjZW5kaWYKKworICBfU2VsZiYgYXBwZW5kKGNvbnN0IF9TZWxmJiBfX3MpCisgIHsgcmV0dXJuIF9NX2FwcGVuZChfX3MuX01fU3RhcnQoKSwgX19zLl9NX0ZpbmlzaCgpKTsgfQorCisgIF9TZWxmJiBhcHBlbmQoY29uc3QgX1NlbGYmIF9fcywKKyAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIHsKKyAgICBpZiAoX19wb3MgPiBfX3Muc2l6ZSgpKQorICAgICAgdGhpcy0+X01fdGhyb3dfb3V0X29mX3JhbmdlKCk7CisgICAgcmV0dXJuIF9NX2FwcGVuZChfX3MuX01fU3RhcnQoKSArIF9fcG9zLAorICAgICAgICAgICAgICAgICAgICAgX19zLl9NX1N0YXJ0KCkgKyBfX3BvcyArIChtaW4pIChfX24sIF9fcy5zaXplKCkgLSBfX3BvcykpOworICB9CisKKyAgX1NlbGYmIGFwcGVuZChjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbikKKyAgeyBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKSByZXR1cm4gX01fYXBwZW5kKF9fcywgX19zK19fbik7IH0KKyAgX1NlbGYmIGFwcGVuZChjb25zdCBfQ2hhclQqIF9fcykKKyAgeyBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKSByZXR1cm4gX01fYXBwZW5kKF9fcywgX19zICsgdHJhaXRzX3R5cGU6Omxlbmd0aChfX3MpKTsgfQorICBfU2VsZiYgYXBwZW5kKHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MpOworCitwdWJsaWM6CisgIHZvaWQgcHVzaF9iYWNrKF9DaGFyVCBfX2MpIHsKKyAgICBpZiAodGhpcy0+X01fRmluaXNoKCkgKyAxID09IHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLl9NX2RhdGEpCisgICAgICByZXNlcnZlKHNpemUoKSArIChtYXgpKHNpemUoKSwgX19TVEFUSUNfQ0FTVChzaXplX3R5cGUsMSkpKTsKKyAgICBfTV9jb25zdHJ1Y3RfbnVsbCh0aGlzLT5fTV9GaW5pc2goKSArIDEpOworICAgIF9UcmFpdHM6OmFzc2lnbigqKHRoaXMtPl9NX0ZpbmlzaCgpKSwgX19jKTsKKyAgICArK3RoaXMtPl9NX2ZpbmlzaDsKKyAgfQorCisgIHZvaWQgcG9wX2JhY2soKSB7CisgICAgX1RyYWl0czo6YXNzaWduKCoodGhpcy0+X01fRmluaXNoKCkgLSAxKSwgX01fbnVsbCgpKTsKKyAgICB0aGlzLT5fTV9kZXN0cm95X2JhY2soKTsKKyAgICAtLXRoaXMtPl9NX2ZpbmlzaDsKKyAgfQorCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFzc2lnbgorICBfU2VsZiYgYXNzaWduKGNvbnN0IF9TZWxmJiBfX3MpCisgIHsgcmV0dXJuIF9NX2Fzc2lnbihfX3MuX01fU3RhcnQoKSwgX19zLl9NX0ZpbmlzaCgpKTsgfQorCisgIF9TZWxmJiBhc3NpZ24oY29uc3QgX1NlbGYmIF9fcywKKyAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIHsKKyAgICBpZiAoX19wb3MgPiBfX3Muc2l6ZSgpKQorICAgICAgdGhpcy0+X01fdGhyb3dfb3V0X29mX3JhbmdlKCk7CisgICAgcmV0dXJuIF9NX2Fzc2lnbihfX3MuX01fU3RhcnQoKSArIF9fcG9zLAorICAgICAgICAgICAgICAgICAgICAgX19zLl9NX1N0YXJ0KCkgKyBfX3BvcyArIChtaW4pIChfX24sIF9fcy5zaXplKCkgLSBfX3BvcykpOworICB9CisKKyAgX1NlbGYmIGFzc2lnbihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbikKKyAgeyBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKSByZXR1cm4gX01fYXNzaWduKF9fcywgX19zICsgX19uKTsgfQorCisgIF9TZWxmJiBhc3NpZ24oY29uc3QgX0NoYXJUKiBfX3MpCisgIHsgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykgcmV0dXJuIF9NX2Fzc2lnbihfX3MsIF9fcyArIF9UcmFpdHM6Omxlbmd0aChfX3MpKTsgfQorCisgIF9TZWxmJiBhc3NpZ24oc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYyk7CisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorIyAgaWYgIWRlZmluZWQgKF9TVExQX1VTRV9NU1ZDNl9NRU1fVF9CVUdfV09SS0FST1VORCkKK3ByaXZhdGU6ICAgICAgICAgICAgICAgICAgICAgICAgLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgYXNzaWduLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0ludGVnZXI+CisgIF9TZWxmJiBfTV9hc3NpZ25fZGlzcGF0Y2goX0ludGVnZXIgX19uLCBfSW50ZWdlciBfX3gsIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKl9JbnRlZ3JhbCovKQorICB7IHJldHVybiBhc3NpZ24oKHNpemVfdHlwZSkgX19uLCAoX0NoYXJUKSBfX3gpOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXI+CisgIF9TZWxmJiBfTV9hc3NpZ25fZGlzcGF0Y2goX0lucHV0SXRlciBfX2YsIF9JbnB1dEl0ZXIgX19sLCBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qX0ludGVncmFsKi8pIHsKKyAgICBwb2ludGVyIF9fY3VyID0gdGhpcy0+X01fU3RhcnQoKTsKKyAgICB3aGlsZSAoX19mICE9IF9fbCAmJiBfX2N1ciAhPSB0aGlzLT5fTV9GaW5pc2goKSkgeworICAgICAgX1RyYWl0czo6YXNzaWduKCpfX2N1ciwgKl9fZik7CisgICAgICArK19fZjsKKyAgICAgICsrX19jdXI7CisgICAgfQorICAgIGlmIChfX2YgPT0gX19sKQorICAgICAgZXJhc2UoX19jdXIsIHRoaXMtPmVuZCgpKTsKKyAgICBlbHNlCisgICAgICBfTV9hcHBlbmRUKF9fZiwgX19sLCBfU1RMUF9JVEVSQVRPUl9DQVRFR09SWShfX2YsIF9JbnB1dEl0ZXIpKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworcHVibGljOgorICAvLyBDaGVjayB0byBzZWUgaWYgX0lucHV0SXRlcmF0b3IgaXMgYW4gaW50ZWdlciB0eXBlLiAgSWYgc28sIHRoZW4KKyAgLy8gaXQgY2FuJ3QgYmUgYW4gaXRlcmF0b3IuCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgorICBfU2VsZiYgYXNzaWduKF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QpIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Jc0ludGVncmFsPF9JbnB1dEl0ZXI+OjpfUmV0IF9JbnRlZ3JhbDsKKyAgICByZXR1cm4gX01fYXNzaWduX2Rpc3BhdGNoKF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOworICB9CisjICBlbmRpZgorI2VuZGlmCisKK3Byb3RlY3RlZDoKKyAgX1NlbGYmIF9NX2Fzc2lnbihjb25zdCBfQ2hhclQqIF9fZiwgY29uc3QgX0NoYXJUKiBfX2wpOworCitwdWJsaWM6CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykgfHwgXAorICAgICFkZWZpbmVkIChfU1RMUF9OT19NRVRIT0RfU1BFQ0lBTElaQVRJT04pICYmICFkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKQorIyAgaWYgIWRlZmluZWQgKF9TVExQX1VTRV9NU1ZDNl9NRU1fVF9CVUdfV09SS0FST1VORCkKKyAgX1NlbGYmIGFzc2lnbihjb25zdCBfQ2hhclQqIF9fZiwgY29uc3QgX0NoYXJUKiBfX2wpIHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19mKSBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19sKQorICAgIHJldHVybiBfTV9hc3NpZ24oX19mLCBfX2wpOworICB9CisjICBlbmRpZgorI2VuZGlmCisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5zZXJ0CisKKyAgX1NlbGYmIGluc2VydChzaXplX3R5cGUgX19wb3MsIGNvbnN0IF9TZWxmJiBfX3MpIHsKKyAgICBpZiAoX19wb3MgPiBzaXplKCkpCisgICAgICB0aGlzLT5fTV90aHJvd19vdXRfb2ZfcmFuZ2UoKTsKKyAgICBpZiAoc2l6ZSgpID4gbWF4X3NpemUoKSAtIF9fcy5zaXplKCkpCisgICAgICB0aGlzLT5fTV90aHJvd19sZW5ndGhfZXJyb3IoKTsKKyAgICBfTV9pbnNlcnQoYmVnaW4oKSArIF9fcG9zLCBfX3MuX01fU3RhcnQoKSwgX19zLl9NX0ZpbmlzaCgpLCAmX19zID09IHRoaXMpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIF9TZWxmJiBpbnNlcnQoc2l6ZV90eXBlIF9fcG9zLCBjb25zdCBfU2VsZiYgX19zLAorICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX2JlZywgc2l6ZV90eXBlIF9fbikgeworICAgIGlmIChfX3BvcyA+IHNpemUoKSB8fCBfX2JlZyA+IF9fcy5zaXplKCkpCisgICAgICB0aGlzLT5fTV90aHJvd19vdXRfb2ZfcmFuZ2UoKTsKKyAgICBzaXplX3R5cGUgX19sZW4gPSAobWluKSAoX19uLCBfX3Muc2l6ZSgpIC0gX19iZWcpOworICAgIGlmIChzaXplKCkgPiBtYXhfc2l6ZSgpIC0gX19sZW4pCisgICAgICB0aGlzLT5fTV90aHJvd19sZW5ndGhfZXJyb3IoKTsKKyAgICBfTV9pbnNlcnQoYmVnaW4oKSArIF9fcG9zLAorICAgICAgICAgICAgICBfX3MuX01fU3RhcnQoKSArIF9fYmVnLCBfX3MuX01fU3RhcnQoKSArIF9fYmVnICsgX19sZW4sICZfX3MgPT0gdGhpcyk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIF9TZWxmJiBpbnNlcnQoc2l6ZV90eXBlIF9fcG9zLCBjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbikgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgICAgaWYgKF9fcG9zID4gc2l6ZSgpKQorICAgICAgdGhpcy0+X01fdGhyb3dfb3V0X29mX3JhbmdlKCk7CisgICAgaWYgKHNpemUoKSA+IG1heF9zaXplKCkgLSBfX24pCisgICAgICB0aGlzLT5fTV90aHJvd19sZW5ndGhfZXJyb3IoKTsKKyAgICBfTV9pbnNlcnQoYmVnaW4oKSArIF9fcG9zLCBfX3MsIF9fcyArIF9fbiwgX01faW5zaWRlKF9fcykpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIF9TZWxmJiBpbnNlcnQoc2l6ZV90eXBlIF9fcG9zLCBjb25zdCBfQ2hhclQqIF9fcykgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgICAgaWYgKF9fcG9zID4gc2l6ZSgpKQorICAgICAgdGhpcy0+X01fdGhyb3dfb3V0X29mX3JhbmdlKCk7CisgICAgc2l6ZV90eXBlIF9fbGVuID0gX1RyYWl0czo6bGVuZ3RoKF9fcyk7CisgICAgaWYgKHNpemUoKSA+IG1heF9zaXplKCkgLSBfX2xlbikKKyAgICAgIHRoaXMtPl9NX3Rocm93X2xlbmd0aF9lcnJvcigpOworICAgIF9NX2luc2VydCh0aGlzLT5fTV9TdGFydCgpICsgX19wb3MsIF9fcywgX19zICsgX19sZW4sIF9NX2luc2lkZShfX3MpKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBfU2VsZiYgaW5zZXJ0KHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYykgeworICAgIGlmIChfX3BvcyA+IHNpemUoKSkKKyAgICAgIHRoaXMtPl9NX3Rocm93X291dF9vZl9yYW5nZSgpOworICAgIGlmIChzaXplKCkgPiBtYXhfc2l6ZSgpIC0gX19uKQorICAgICAgdGhpcy0+X01fdGhyb3dfbGVuZ3RoX2Vycm9yKCk7CisgICAgaW5zZXJ0KGJlZ2luKCkgKyBfX3BvcywgX19uLCBfX2MpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBfX3AsIF9DaGFyVCBfX2MpIHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19wKQorICAgIGlmIChfX3AgPT0gZW5kKCkpIHsKKyAgICAgIHB1c2hfYmFjayhfX2MpOworICAgICAgcmV0dXJuIHRoaXMtPl9NX0ZpbmlzaCgpIC0gMTsKKyAgICB9CisgICAgZWxzZQorICAgICAgcmV0dXJuIF9NX2luc2VydF9hdXgoX19wLCBfX2MpOworICB9CisKKyAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wLCBzaXplX3QgX19uLCBfQ2hhclQgX19jKTsKKworcHJvdGVjdGVkOiAgLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgaW5zZXJ0LgorCisgIHZvaWQgX01faW5zZXJ0KGl0ZXJhdG9yIF9fcCwgY29uc3QgX0NoYXJUKiBfX2ZpcnN0LCBjb25zdCBfQ2hhclQqIF9fbGFzdCwgYm9vbCBfX3NlbGZfcmVmKTsKKworICBwb2ludGVyIF9NX2luc2VydF9hdXgocG9pbnRlciwgX0NoYXJUKTsKKworICB2b2lkIF9NX2NvcHkoY29uc3QgX0NoYXJUKiBfX2YsIGNvbnN0IF9DaGFyVCogX19sLCBfQ2hhclQqIF9fcmVzKSB7CisgICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fZikgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fbCkKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19yZXMpCisgICAgX1RyYWl0czo6Y29weShfX3JlcywgX19mLCBfX2wgLSBfX2YpOworICB9CisKKyAgdm9pZCBfTV9tb3ZlKGNvbnN0IF9DaGFyVCogX19mLCBjb25zdCBfQ2hhclQqIF9fbCwgX0NoYXJUKiBfX3JlcykgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2YpIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2wpCisgICAgX1RyYWl0czo6bW92ZShfX3JlcywgX19mLCBfX2wgLSBfX2YpOworICB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorIyAgaWYgIWRlZmluZWQgKF9TVExQX1VTRV9NU1ZDNl9NRU1fVF9CVUdfV09SS0FST1VORCkKKyAgdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcj4KKyAgdm9pZCBfTV9pbnNlcnRfb3ZlcmZsb3coaXRlcmF0b3IgX19wb3MsIF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGUgX19uKSB7CisgICAgY29uc3Qgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSB0aGlzLT5zaXplKCk7CisgICAgc2l6ZV90eXBlIF9fbGVuID0gX19vbGRfc2l6ZSArIChtYXgpKF9fb2xkX3NpemUsIF9fU1RBVElDX0NBU1Qoc2l6ZV90eXBlLF9fbikpICsgMTsKKyAgICBwb2ludGVyIF9fbmV3X3N0YXJ0ID0gdGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuYWxsb2NhdGUoX19sZW4sIF9fbGVuKTsKKyAgICBwb2ludGVyIF9fbmV3X2ZpbmlzaCA9IF9fbmV3X3N0YXJ0OworICAgIF9TVExQX1RSWSB7CisgICAgICBfX25ld19maW5pc2ggPSB1bmluaXRpYWxpemVkX2NvcHkodGhpcy0+X01fU3RhcnQoKSwgX19wb3MsIF9fbmV3X3N0YXJ0KTsKKyAgICAgIF9fbmV3X2ZpbmlzaCA9IHVuaW5pdGlhbGl6ZWRfY29weShfX2ZpcnN0LCBfX2xhc3QsIF9fbmV3X2ZpbmlzaCk7CisgICAgICBfX25ld19maW5pc2ggPSB1bmluaXRpYWxpemVkX2NvcHkoX19wb3MsIHRoaXMtPl9NX0ZpbmlzaCgpLCBfX25ld19maW5pc2gpOworICAgICAgX01fY29uc3RydWN0X251bGwoX19uZXdfZmluaXNoKTsKKyAgICB9CisgICAgX1NUTFBfVU5XSU5EKChfU1RMUF9TVEQ6Ol9EZXN0cm95X1JhbmdlKF9fbmV3X3N0YXJ0LF9fbmV3X2ZpbmlzaCksCisgICAgICAgICAgICAgICAgICB0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5kZWFsbG9jYXRlKF9fbmV3X3N0YXJ0LCBfX2xlbikpKQorICAgIHRoaXMtPl9NX2Rlc3Ryb3lfcmFuZ2UoKTsKKyAgICB0aGlzLT5fTV9kZWFsbG9jYXRlX2Jsb2NrKCk7CisgICAgdGhpcy0+X01fcmVzZXQoX19uZXdfc3RhcnQsIF9fbmV3X2ZpbmlzaCwgX19uZXdfc3RhcnQgKyBfX2xlbik7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcj4KKyAgdm9pZCBfTV9pbnNlcnRUKGl0ZXJhdG9yIF9fcCwgX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0X2l0ZXJhdG9yX3RhZyAmKSB7CisgICAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KSB7CisgICAgICBfX3AgPSBpbnNlcnQoX19wLCAqX19maXJzdCk7CisgICAgICArK19fcDsKKyAgICB9CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyPgorICB2b2lkIF9NX2luc2VydFQoaXRlcmF0b3IgX19wb3MsIF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgY29uc3QgZm9yd2FyZF9pdGVyYXRvcl90YWcgJikgeworICAgIGlmIChfX2ZpcnN0ICE9IF9fbGFzdCkgeworICAgICAgZGlmZmVyZW5jZV90eXBlIF9fbiA9IGRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICBpZiAodGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuX01fZGF0YSAtIHRoaXMtPl9NX2ZpbmlzaCA+PSBfX24gKyAxKSB7CisgICAgICAgIGNvbnN0IGRpZmZlcmVuY2VfdHlwZSBfX2VsZW1zX2FmdGVyID0gdGhpcy0+X01fZmluaXNoIC0gX19wb3M7CisgICAgICAgIGlmIChfX2VsZW1zX2FmdGVyID49IF9fbikgeworIyAgICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfU0hPUlRfU1RSSU5HX09QVElNKQorICAgICAgICAgIGlmICh0aGlzLT5fTV91c2luZ19zdGF0aWNfYnVmKCkpCisgICAgICAgICAgICBfTV9jb3B5KCh0aGlzLT5fTV9GaW5pc2goKSAtIF9fbikgKyAxLCB0aGlzLT5fTV9GaW5pc2goKSArIDEsIHRoaXMtPl9NX0ZpbmlzaCgpICsgMSk7CisgICAgICAgICAgZWxzZQorIyAgICBlbmRpZiAvKiBfU1RMUF9VU0VfU0hPUlRfU1RSSU5HX09QVElNICovCisgICAgICAgICAgdW5pbml0aWFsaXplZF9jb3B5KCh0aGlzLT5fTV9GaW5pc2goKSAtIF9fbikgKyAxLCB0aGlzLT5fTV9GaW5pc2goKSArIDEsIHRoaXMtPl9NX0ZpbmlzaCgpICsgMSk7CisgICAgICAgICAgdGhpcy0+X01fZmluaXNoICs9IF9fbjsKKyAgICAgICAgICBfVHJhaXRzOjptb3ZlKF9fcG9zICsgX19uLCBfX3BvcywgKF9fZWxlbXNfYWZ0ZXIgLSBfX24pICsgMSk7CisgICAgICAgICAgX01fY29weVQoX19maXJzdCwgX19sYXN0LCBfX3Bvcyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgcG9pbnRlciBfX29sZF9maW5pc2ggPSB0aGlzLT5fTV9GaW5pc2goKTsKKyAgICAgICAgICBfRm9yd2FyZEl0ZXIgX19taWQgPSBfX2ZpcnN0OworICAgICAgICAgIGFkdmFuY2UoX19taWQsIF9fZWxlbXNfYWZ0ZXIgKyAxKTsKKyMgICAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1NIT1JUX1NUUklOR19PUFRJTSkKKyAgICAgICAgICBpZiAodGhpcy0+X01fdXNpbmdfc3RhdGljX2J1ZigpKQorICAgICAgICAgICAgX01fY29weVQoX19taWQsIF9fbGFzdCwgdGhpcy0+X01fRmluaXNoKCkgKyAxKTsKKyAgICAgICAgICBlbHNlCisjICAgIGVuZGlmIC8qIF9TVExQX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0gKi8KKyAgICAgICAgICB1bmluaXRpYWxpemVkX2NvcHkoX19taWQsIF9fbGFzdCwgdGhpcy0+X01fRmluaXNoKCkgKyAxKTsKKyAgICAgICAgICB0aGlzLT5fTV9maW5pc2ggKz0gX19uIC0gX19lbGVtc19hZnRlcjsKKyAgICAgICAgICBfU1RMUF9UUlkgeworIyAgICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfU0hPUlRfU1RSSU5HX09QVElNKQorICAgICAgICAgICAgaWYgKHRoaXMtPl9NX3VzaW5nX3N0YXRpY19idWYoKSkKKyAgICAgICAgICAgICAgX01fY29weShfX3BvcywgX19vbGRfZmluaXNoICsgMSwgdGhpcy0+X01fRmluaXNoKCkpOworICAgICAgICAgICAgZWxzZQorIyAgICBlbmRpZiAvKiBfU1RMUF9VU0VfU0hPUlRfU1RSSU5HX09QVElNICovCisgICAgICAgICAgICB1bmluaXRpYWxpemVkX2NvcHkoX19wb3MsIF9fb2xkX2ZpbmlzaCArIDEsIHRoaXMtPl9NX0ZpbmlzaCgpKTsKKyAgICAgICAgICAgIHRoaXMtPl9NX2ZpbmlzaCArPSBfX2VsZW1zX2FmdGVyOworICAgICAgICAgIH0KKyAgICAgICAgICBfU1RMUF9VTldJTkQoKHRoaXMtPl9NX2Rlc3Ryb3lfcHRyX3JhbmdlKF9fb2xkX2ZpbmlzaCArIDEsIHRoaXMtPl9NX0ZpbmlzaCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPl9NX2ZpbmlzaCA9IF9fb2xkX2ZpbmlzaCkpCisgICAgICAgICAgX01fY29weVQoX19maXJzdCwgX19taWQsIF9fcG9zKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIF9NX2luc2VydF9vdmVyZmxvdyhfX3BvcywgX19maXJzdCwgX19sYXN0LCBfX24pOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfSW50ZWdlcj4KKyAgdm9pZCBfTV9pbnNlcnRfZGlzcGF0Y2goaXRlcmF0b3IgX19wLCBfSW50ZWdlciBfX24sIF9JbnRlZ2VyIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX190cnVlX3R5cGUmIC8qSW50ZWdyYWwqLykgeworICAgIGluc2VydChfX3AsIChzaXplX3R5cGUpIF9fbiwgKF9DaGFyVCkgX194KTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgorICB2b2lkIF9NX2luc2VydF9kaXNwYXRjaChpdGVyYXRvciBfX3AsIF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypJbnRlZ3JhbCovKSB7CisgICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcCkKKyAgICAvKgorICAgICAqIFdpdGhpbiB0aGUgYmFzaWNfc3RyaW5nIGltcGxlbWVudGF0aW9uIHdlIGFyZSBvbmx5IGdvaW5nIHRvIGNoZWNrIGZvcgorICAgICAqIHNlbGYgcmVmZXJlbmNpbmcgaWYgaXRlcmF0b3JzIGFyZSBzdHJpbmcgaXRlcmF0b3JzIG9yIF9DaGFyVCBwb2ludGVycy4KKyAgICAgKiBBIHVzZXIgY291bGQgZW5jYXBzdWxhdGUgdGhvc2UgaXRlcmF0b3Igd2l0aGluIHRoZWlyIG93biBpdGVyYXRvciBpbnRlcmZhY2UKKyAgICAgKiBhbmQgaW4gdGhpcyBjYXNlIGxlYWQgdG8gYSBiYWQgYmVoYXZpb3IsIHRoaXMgaXMgYSBrbm93biBsaW1pdGF0aW9uLgorICAgICAqLworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FyZVNhbWVVbkNWVHlwZXM8X0lucHV0SXRlciwgaXRlcmF0b3I+OjpfUmV0IF9Jc0l0ZXJhdG9yOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FyZVNhbWVVbkNWVHlwZXM8X0lucHV0SXRlciwgY29uc3RfaXRlcmF0b3I+OjpfUmV0IF9Jc0NvbnN0SXRlcmF0b3I7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfTG9yMjxfSXNJdGVyYXRvciwgX0lzQ29uc3RJdGVyYXRvcj46Ol9SZXQgX0NoZWNrSW5zaWRlOworICAgIF9NX2luc2VydF9hdXgoX19wLCBfX2ZpcnN0LCBfX2xhc3QsIF9DaGVja0luc2lkZSgpKTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tSXRlcj4KKyAgdm9pZCBfTV9pbnNlcnRfYXV4IChpdGVyYXRvciBfX3AsIF9SYW5kb21JdGVyIF9fZmlyc3QsIF9SYW5kb21JdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX3RydWVfdHlwZSYgLypfQ2hlY2tJbnNpZGUqLykgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3ApCisgICAgX01faW5zZXJ0KF9fcCwgJigqX19maXJzdCksICYoKl9fbGFzdCksIF9NX2luc2lkZSgmKCpfX2ZpcnN0KSkpOworICB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcj4KKyAgdm9pZCBfTV9pbnNlcnRfYXV4IChpdGVyYXRvciBfX3AsIF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19mYWxzZV90eXBlJiAvKl9DaGVja0luc2lkZSovKSB7CisgICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcCkKKyAgICBfTV9pbnNlcnRUKF9fcCwgX19maXJzdCwgX19sYXN0LCBfU1RMUF9JVEVSQVRPUl9DQVRFR09SWShfX2ZpcnN0LCBfSW5wdXRJdGVyKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZvaWQgX01fY29weVQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LCBwb2ludGVyIF9fcmVzdWx0KSB7CisgICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcmVzdWx0KQorICAgIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCwgKytfX3Jlc3VsdCkKKyAgICAgIF9UcmFpdHM6OmFzc2lnbigqX19yZXN1bHQsICpfX2ZpcnN0KTsKKyAgfQorCisjICAgIGlmICFkZWZpbmVkIChfU1RMUF9OT19NRVRIT0RfU1BFQ0lBTElaQVRJT04pCisgIHZvaWQgX01fY29weVQoY29uc3QgX0NoYXJUKiBfX2YsIGNvbnN0IF9DaGFyVCogX19sLCBfQ2hhclQqIF9fcmVzKSB7CisgICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fZikgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fbCkKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19yZXMpCisgICAgX1RyYWl0czo6Y29weShfX3JlcywgX19mLCBfX2wgLSBfX2YpOworICB9CisjICAgIGVuZGlmCisKK3B1YmxpYzoKKyAgLy8gQ2hlY2sgdG8gc2VlIGlmIF9JbnB1dEl0ZXJhdG9yIGlzIGFuIGludGVnZXIgdHlwZS4gIElmIHNvLCB0aGVuCisgIC8vIGl0IGNhbid0IGJlIGFuIGl0ZXJhdG9yLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcj4KKyAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wLCBfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0KSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXNJbnRlZ3JhbDxfSW5wdXRJdGVyPjo6X1JldCBfSW50ZWdyYWw7CisgICAgX01faW5zZXJ0X2Rpc3BhdGNoKF9fcCwgX19maXJzdCwgX19sYXN0LCBfSW50ZWdyYWwoKSk7CisgIH0KKyMgIGVuZGlmCisjZW5kaWYKKworcHVibGljOgorCisjaWYgIWRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpIHx8IFwKKyAgICAhZGVmaW5lZCAoX1NUTFBfTk9fTUVUSE9EX1NQRUNJQUxJWkFUSU9OKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKKyAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wLCBjb25zdCBfQ2hhclQqIF9fZiwgY29uc3QgX0NoYXJUKiBfX2wpIHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19mKSBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19sKQorICAgIF9NX2luc2VydChfX3AsIF9fZiwgX19sLCBfTV9pbnNpZGUoX19mKSk7CisgIH0KKyNlbmRpZgorCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVyYXNlLgorCisgIF9TZWxmJiBlcmFzZShzaXplX3R5cGUgX19wb3MgPSAwLCBzaXplX3R5cGUgX19uID0gbnBvcykgeworICAgIGlmIChfX3BvcyA+IHNpemUoKSkKKyAgICAgIHRoaXMtPl9NX3Rocm93X291dF9vZl9yYW5nZSgpOworICAgIGVyYXNlKGJlZ2luKCkgKyBfX3BvcywgYmVnaW4oKSArIF9fcG9zICsgKG1pbikgKF9fbiwgc2l6ZSgpIC0gX19wb3MpKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBfX3BvcykgeworICAgIC8vIFRoZSBtb3ZlIGluY2x1ZGVzIHRoZSB0ZXJtaW5hdGluZyBfQ2hhclQoKS4KKyAgICBfVHJhaXRzOjptb3ZlKF9fcG9zLCBfX3BvcyArIDEsIHRoaXMtPl9NX0ZpbmlzaCgpIC0gX19wb3MpOworICAgIHRoaXMtPl9NX2Rlc3Ryb3lfYmFjaygpOworICAgIC0tdGhpcy0+X01fZmluaXNoOworICAgIHJldHVybiBfX3BvczsKKyAgfQorCisgIGl0ZXJhdG9yIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkgeworICAgIGlmIChfX2ZpcnN0ICE9IF9fbGFzdCkgeworICAgICAgLy8gVGhlIG1vdmUgaW5jbHVkZXMgdGhlIHRlcm1pbmF0aW5nIF9DaGFyVCgpLgorICAgICAgdHJhaXRzX3R5cGU6Om1vdmUoX19maXJzdCwgX19sYXN0LCAodGhpcy0+X01fRmluaXNoKCkgLSBfX2xhc3QpICsgMSk7CisgICAgICBwb2ludGVyIF9fbmV3X2ZpbmlzaCA9IHRoaXMtPl9NX0ZpbmlzaCgpIC0gKF9fbGFzdCAtIF9fZmlyc3QpOworICAgICAgdGhpcy0+X01fZGVzdHJveV9wdHJfcmFuZ2UoX19uZXdfZmluaXNoICsgMSwgdGhpcy0+X01fRmluaXNoKCkgKyAxKTsKKyAgICAgIHRoaXMtPl9NX2ZpbmlzaCA9IF9fbmV3X2ZpbmlzaDsKKyAgICB9CisgICAgcmV0dXJuIF9fZmlyc3Q7CisgIH0KKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXBsYWNlLiAgKENvbmNlcHR1YWxseSBlcXVpdmFsZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGVyYXNlIGZvbGxvd2VkIGJ5IGluc2VydC4pCisgIF9TZWxmJiByZXBsYWNlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbiwgY29uc3QgX1NlbGYmIF9fcykgeworICAgIGlmIChfX3BvcyA+IHNpemUoKSkKKyAgICAgIHRoaXMtPl9NX3Rocm93X291dF9vZl9yYW5nZSgpOworICAgIGNvbnN0IHNpemVfdHlwZSBfX2xlbiA9IChtaW4pIChfX24sIHNpemUoKSAtIF9fcG9zKTsKKyAgICBpZiAoc2l6ZSgpIC0gX19sZW4gPj0gbWF4X3NpemUoKSAtIF9fcy5zaXplKCkpCisgICAgICB0aGlzLT5fTV90aHJvd19sZW5ndGhfZXJyb3IoKTsKKyAgICByZXR1cm4gX01fcmVwbGFjZShiZWdpbigpICsgX19wb3MsIGJlZ2luKCkgKyBfX3BvcyArIF9fbGVuLAorICAgICAgICAgICAgICAgICAgICAgIF9fcy5fTV9TdGFydCgpLCBfX3MuX01fRmluaXNoKCksICZfX3MgPT0gdGhpcyk7CisgIH0KKworICBfU2VsZiYgcmVwbGFjZShzaXplX3R5cGUgX19wb3MxLCBzaXplX3R5cGUgX19uMSwgY29uc3QgX1NlbGYmIF9fcywKKyAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fcG9zMiwgc2l6ZV90eXBlIF9fbjIpIHsKKyAgICBpZiAoX19wb3MxID4gc2l6ZSgpIHx8IF9fcG9zMiA+IF9fcy5zaXplKCkpCisgICAgICB0aGlzLT5fTV90aHJvd19vdXRfb2ZfcmFuZ2UoKTsKKyAgICBjb25zdCBzaXplX3R5cGUgX19sZW4xID0gKG1pbikgKF9fbjEsIHNpemUoKSAtIF9fcG9zMSk7CisgICAgY29uc3Qgc2l6ZV90eXBlIF9fbGVuMiA9IChtaW4pIChfX24yLCBfX3Muc2l6ZSgpIC0gX19wb3MyKTsKKyAgICBpZiAoc2l6ZSgpIC0gX19sZW4xID49IG1heF9zaXplKCkgLSBfX2xlbjIpCisgICAgICB0aGlzLT5fTV90aHJvd19sZW5ndGhfZXJyb3IoKTsKKyAgICByZXR1cm4gX01fcmVwbGFjZShiZWdpbigpICsgX19wb3MxLCBiZWdpbigpICsgX19wb3MxICsgX19sZW4xLAorICAgICAgICAgICAgICAgICAgICAgIF9fcy5fTV9TdGFydCgpICsgX19wb3MyLCBfX3MuX01fU3RhcnQoKSArIF9fcG9zMiArIF9fbGVuMiwgJl9fcyA9PSB0aGlzKTsKKyAgfQorCisgIF9TZWxmJiByZXBsYWNlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbjEsCisgICAgICAgICAgICAgICAgIGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uMikgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgICAgaWYgKF9fcG9zID4gc2l6ZSgpKQorICAgICAgdGhpcy0+X01fdGhyb3dfb3V0X29mX3JhbmdlKCk7CisgICAgY29uc3Qgc2l6ZV90eXBlIF9fbGVuID0gKG1pbikgKF9fbjEsIHNpemUoKSAtIF9fcG9zKTsKKyAgICBpZiAoX19uMiA+IG1heF9zaXplKCkgfHwgc2l6ZSgpIC0gX19sZW4gPj0gbWF4X3NpemUoKSAtIF9fbjIpCisgICAgICB0aGlzLT5fTV90aHJvd19sZW5ndGhfZXJyb3IoKTsKKyAgICByZXR1cm4gX01fcmVwbGFjZShiZWdpbigpICsgX19wb3MsIGJlZ2luKCkgKyBfX3BvcyArIF9fbGVuLAorICAgICAgICAgICAgICAgICAgICAgIF9fcywgX19zICsgX19uMiwgX01faW5zaWRlKF9fcykpOworICB9CisKKyAgX1NlbGYmIHJlcGxhY2Uoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uMSwgY29uc3QgX0NoYXJUKiBfX3MpIHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKQorICAgIGlmIChfX3BvcyA+IHNpemUoKSkKKyAgICAgIHRoaXMtPl9NX3Rocm93X291dF9vZl9yYW5nZSgpOworICAgIGNvbnN0IHNpemVfdHlwZSBfX2xlbiA9IChtaW4pIChfX24xLCBzaXplKCkgLSBfX3Bvcyk7CisgICAgY29uc3Qgc2l6ZV90eXBlIF9fbjIgPSBfVHJhaXRzOjpsZW5ndGgoX19zKTsKKyAgICBpZiAoX19uMiA+IG1heF9zaXplKCkgfHwgc2l6ZSgpIC0gX19sZW4gPj0gbWF4X3NpemUoKSAtIF9fbjIpCisgICAgICB0aGlzLT5fTV90aHJvd19sZW5ndGhfZXJyb3IoKTsKKyAgICByZXR1cm4gX01fcmVwbGFjZShiZWdpbigpICsgX19wb3MsIGJlZ2luKCkgKyBfX3BvcyArIF9fbGVuLAorICAgICAgICAgICAgICAgICAgICAgIF9fcywgX19zICsgX1RyYWl0czo6bGVuZ3RoKF9fcyksIF9NX2luc2lkZShfX3MpKTsKKyAgfQorCisgIF9TZWxmJiByZXBsYWNlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbjEsCisgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX24yLCBfQ2hhclQgX19jKSB7CisgICAgaWYgKF9fcG9zID4gc2l6ZSgpKQorICAgICAgdGhpcy0+X01fdGhyb3dfb3V0X29mX3JhbmdlKCk7CisgICAgY29uc3Qgc2l6ZV90eXBlIF9fbGVuID0gKG1pbikgKF9fbjEsIHNpemUoKSAtIF9fcG9zKTsKKyAgICBpZiAoX19uMiA+IG1heF9zaXplKCkgfHwgc2l6ZSgpIC0gX19sZW4gPj0gbWF4X3NpemUoKSAtIF9fbjIpCisgICAgICB0aGlzLT5fTV90aHJvd19sZW5ndGhfZXJyb3IoKTsKKyAgICByZXR1cm4gcmVwbGFjZShiZWdpbigpICsgX19wb3MsIGJlZ2luKCkgKyBfX3BvcyArIF9fbGVuLCBfX24yLCBfX2MpOworICB9CisKKyAgX1NlbGYmIHJlcGxhY2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0LCBjb25zdCBfU2VsZiYgX19zKSB7CisgICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fZmlyc3QpX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fbGFzdCkKKyAgICByZXR1cm4gX01fcmVwbGFjZShfX2ZpcnN0LCBfX2xhc3QsIF9fcy5fTV9TdGFydCgpLCBfX3MuX01fRmluaXNoKCksICZfX3MgPT0gdGhpcyk7CisgIH0KKworICBfU2VsZiYgcmVwbGFjZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgIGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uKSB7CisgICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fZmlyc3QpX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fbGFzdCkKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKQorICAgIHJldHVybiBfTV9yZXBsYWNlKF9fZmlyc3QsIF9fbGFzdCwgX19zLCBfX3MgKyBfX24sIF9NX2luc2lkZShfX3MpKTsKKyAgfQorCisgIF9TZWxmJiByZXBsYWNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgY29uc3QgX0NoYXJUKiBfX3MpIHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19maXJzdClfU1RMUF9GSVhfTElURVJBTF9CVUcoX19sYXN0KQorICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgICAgcmV0dXJuIF9NX3JlcGxhY2UoX19maXJzdCwgX19sYXN0LCBfX3MsIF9fcyArIF9UcmFpdHM6Omxlbmd0aChfX3MpLCBfTV9pbnNpZGUoX19zKSk7CisgIH0KKworICBfU2VsZiYgcmVwbGFjZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QsIHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MpOworCitwcm90ZWN0ZWQ6ICAgICAgICAgICAgICAgICAgICAgICAgLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgcmVwbGFjZS4KKyAgX1NlbGYmIF9NX3JlcGxhY2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBfQ2hhclQqIF9fZiwgY29uc3QgX0NoYXJUKiBfX2wsIGJvb2wgX19zZWxmX3JlZik7CisKK3B1YmxpYzoKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorIyAgaWYgIWRlZmluZWQgKF9TVExQX1VTRV9NU1ZDNl9NRU1fVF9CVUdfV09SS0FST1VORCkKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnRlZ2VyPgorICBfU2VsZiYgX01fcmVwbGFjZV9kaXNwYXRjaChpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX194LCBjb25zdCBfX3RydWVfdHlwZSYgLypJc0ludGVncmFsKi8pIHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19maXJzdCkgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fbGFzdCkKKyAgICByZXR1cm4gcmVwbGFjZShfX2ZpcnN0LCBfX2xhc3QsIChzaXplX3R5cGUpIF9fbiwgKF9DaGFyVCkgX194KTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgorICBfU2VsZiYgX01fcmVwbGFjZV9kaXNwYXRjaChpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIgX19mLCBfSW5wdXRJdGVyIF9fbCwgY29uc3QgX19mYWxzZV90eXBlJiAvKklzSW50ZWdyYWwqLykgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2ZpcnN0KSBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19sYXN0KQorICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FyZVNhbWVVbkNWVHlwZXM8X0lucHV0SXRlciwgaXRlcmF0b3I+OjpfUmV0IF9Jc0l0ZXJhdG9yOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FyZVNhbWVVbkNWVHlwZXM8X0lucHV0SXRlciwgY29uc3RfaXRlcmF0b3I+OjpfUmV0IF9Jc0NvbnN0SXRlcmF0b3I7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfTG9yMjxfSXNJdGVyYXRvciwgX0lzQ29uc3RJdGVyYXRvcj46Ol9SZXQgX0NoZWNrSW5zaWRlOworICAgIHJldHVybiBfTV9yZXBsYWNlX2F1eChfX2ZpcnN0LCBfX2xhc3QsIF9fZiwgX19sLCBfQ2hlY2tJbnNpZGUoKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUl0ZXI+CisgIF9TZWxmJiBfTV9yZXBsYWNlX2F1eChpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBfUmFuZG9tSXRlciBfX2YsIF9SYW5kb21JdGVyIF9fbCwgX190cnVlX3R5cGUgY29uc3QmIC8qX0NoZWNrSW5zaWRlKi8pIHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19maXJzdCkgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fbGFzdCkKKyAgICByZXR1cm4gX01fcmVwbGFjZShfX2ZpcnN0LCBfX2xhc3QsICYoKl9fZiksICYoKl9fbCksIF9NX2luc2lkZSgmKCpfX2YpKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcj4KKyAgX1NlbGYmIF9NX3JlcGxhY2VfYXV4KGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIgX19mLCBfSW5wdXRJdGVyIF9fbCwgX19mYWxzZV90eXBlIGNvbnN0JiAvKl9DaGVja0luc2lkZSovKSB7CisgICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fZmlyc3QpIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2xhc3QpCisgICAgcmV0dXJuIF9NX3JlcGxhY2VUKF9fZmlyc3QsIF9fbGFzdCwgX19mLCBfX2wsIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9fZiwgX0lucHV0SXRlcikpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXI+CisgIF9TZWxmJiBfTV9yZXBsYWNlVChpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyIF9fZiwgX0lucHV0SXRlciBfX2wsIGNvbnN0IGlucHV0X2l0ZXJhdG9yX3RhZyZfX2l0ZV90YWcpIHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19maXJzdCkgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fbGFzdCkKKyAgICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0ICYmIF9fZiAhPSBfX2w7ICsrX19maXJzdCwgKytfX2YpCisgICAgICBfVHJhaXRzOjphc3NpZ24oKl9fZmlyc3QsICpfX2YpOworICAgIGlmIChfX2YgPT0gX19sKQorICAgICAgZXJhc2UoX19maXJzdCwgX19sYXN0KTsKKyAgICBlbHNlCisgICAgICBfTV9pbnNlcnRUKF9fbGFzdCwgX19mLCBfX2wsIF9faXRlX3RhZyk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcj4KKyAgX1NlbGYmIF9NX3JlcGxhY2VUKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlciBfX2YsIF9Gb3J3YXJkSXRlciBfX2wsIGNvbnN0IGZvcndhcmRfaXRlcmF0b3JfdGFnICZfX2l0ZV90YWcpIHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19maXJzdCkgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fbGFzdCkKKyAgICBkaWZmZXJlbmNlX3R5cGUgX19uID0gZGlzdGFuY2UoX19mLCBfX2wpOworICAgIGNvbnN0IGRpZmZlcmVuY2VfdHlwZSBfX2xlbiA9IF9fbGFzdCAtIF9fZmlyc3Q7CisgICAgaWYgKF9fbGVuID49IF9fbikgeworICAgICAgX01fY29weVQoX19mLCBfX2wsIF9fZmlyc3QpOworICAgICAgZXJhc2UoX19maXJzdCArIF9fbiwgX19sYXN0KTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBfRm9yd2FyZEl0ZXIgX19tID0gX19mOworICAgICAgYWR2YW5jZShfX20sIF9fbGVuKTsKKyAgICAgIF9NX2NvcHlUKF9fZiwgX19tLCBfX2ZpcnN0KTsKKyAgICAgIF9NX2luc2VydFQoX19sYXN0LCBfX20sIF9fbCwgX19pdGVfdGFnKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKK3B1YmxpYzoKKyAgLy8gQ2hlY2sgdG8gc2VlIGlmIF9JbnB1dEl0ZXIgaXMgYW4gaW50ZWdlciB0eXBlLiAgSWYgc28sIHRoZW4KKyAgLy8gaXQgY2FuJ3QgYmUgYW4gaXRlcmF0b3IuCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgorICBfU2VsZiYgcmVwbGFjZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIgX19mLCBfSW5wdXRJdGVyIF9fbCkgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2ZpcnN0KV9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2xhc3QpCisgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXNJbnRlZ3JhbDxfSW5wdXRJdGVyPjo6X1JldCBfSW50ZWdyYWw7CisgICAgcmV0dXJuIF9NX3JlcGxhY2VfZGlzcGF0Y2goX19maXJzdCwgX19sYXN0LCBfX2YsIF9fbCwgIF9JbnRlZ3JhbCgpKTsKKyAgfQorCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykgfHwgXAorICAgICFkZWZpbmVkIChfU1RMUF9OT19NRVRIT0RfU1BFQ0lBTElaQVRJT04pICYmICFkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKQorIyAgaWYgIWRlZmluZWQgKF9TVExQX1VTRV9NU1ZDNl9NRU1fVF9CVUdfV09SS0FST1VORCkKKyAgX1NlbGYmIHJlcGxhY2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICBjb25zdCBfQ2hhclQqIF9fZiwgY29uc3QgX0NoYXJUKiBfX2wpIHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19maXJzdClfU1RMUF9GSVhfTElURVJBTF9CVUcoX19sYXN0KQorICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2YpIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2wpCisgICAgcmV0dXJuIF9NX3JlcGxhY2UoX19maXJzdCwgX19sYXN0LCBfX2YsIF9fbCwgX01faW5zaWRlKF9fZikpOworICB9CisjICBlbmRpZgorI2VuZGlmCisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXIgbW9kaWZpZXIgbWVtYmVyIGZ1bmN0aW9ucy4KKworICBzaXplX3R5cGUgY29weShfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbiwgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgICAgaWYgKF9fcG9zID4gc2l6ZSgpKQorICAgICAgdGhpcy0+X01fdGhyb3dfb3V0X29mX3JhbmdlKCk7CisgICAgY29uc3Qgc2l6ZV90eXBlIF9fbGVuID0gKG1pbikgKF9fbiwgc2l6ZSgpIC0gX19wb3MpOworICAgIF9UcmFpdHM6OmNvcHkoX19zLCB0aGlzLT5fTV9TdGFydCgpICsgX19wb3MsIF9fbGVuKTsKKyAgICByZXR1cm4gX19sZW47CisgIH0KKworICB2b2lkIHN3YXAoX1NlbGYmIF9fcykgeworICAgIHRoaXMtPl9NX1N3YXAoX19zKTsKKyAgfQorCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbnZlcnNpb24gdG8gQyBzdHJpbmcuCisKKyAgY29uc3QgX0NoYXJUKiBjX3N0cigpIGNvbnN0IHsgcmV0dXJuIHRoaXMtPl9NX1N0YXJ0KCk7IH0KKyAgY29uc3QgX0NoYXJUKiBkYXRhKCkgIGNvbnN0IHsgcmV0dXJuIHRoaXMtPl9NX1N0YXJ0KCk7IH0KKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5kLgorCisgIHNpemVfdHlwZSBmaW5kKGNvbnN0IF9TZWxmJiBfX3MsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0CisgICAgeyByZXR1cm4gZmluZChfX3MuX01fU3RhcnQoKSwgX19wb3MsIF9fcy5zaXplKCkpOyB9CisKKyAgc2l6ZV90eXBlIGZpbmQoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0CisgICAgeyBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKSByZXR1cm4gZmluZChfX3MsIF9fcG9zLCBfVHJhaXRzOjpsZW5ndGgoX19zKSk7IH0KKworICBzaXplX3R5cGUgZmluZChjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdDsKKworICAvLyBXSUU6IFZlcnNhbnQgc2NoZW1hIGNvbXBpbGVyIDUuMi4yIElDRSB3b3JrYXJvdW5kCisgIHNpemVfdHlwZSBmaW5kKF9DaGFyVCBfX2MpIGNvbnN0IHsgcmV0dXJuIGZpbmQoX19jLCAwKTsgfQorICBzaXplX3R5cGUgZmluZChfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MgLyogPSAwICovKSBjb25zdDsKKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZmluZC4KKworICBzaXplX3R5cGUgcmZpbmQoY29uc3QgX1NlbGYmIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gbnBvcykgY29uc3QKKyAgICB7IHJldHVybiByZmluZChfX3MuX01fU3RhcnQoKSwgX19wb3MsIF9fcy5zaXplKCkpOyB9CisKKyAgc2l6ZV90eXBlIHJmaW5kKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MgPSBucG9zKSBjb25zdAorICAgIHsgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykgcmV0dXJuIHJmaW5kKF9fcywgX19wb3MsIF9UcmFpdHM6Omxlbmd0aChfX3MpKTsgfQorCisgIHNpemVfdHlwZSByZmluZChjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdDsKKyAgc2l6ZV90eXBlIHJmaW5kKF9DaGFyVCBfX2MsIHNpemVfdHlwZSBfX3BvcyA9IG5wb3MpIGNvbnN0OworCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmRfZmlyc3Rfb2YKKworICBzaXplX3R5cGUgZmluZF9maXJzdF9vZihjb25zdCBfU2VsZiYgX19zLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdAorICAgIHsgcmV0dXJuIGZpbmRfZmlyc3Rfb2YoX19zLl9NX1N0YXJ0KCksIF9fcG9zLCBfX3Muc2l6ZSgpKTsgfQorCisgIHNpemVfdHlwZSBmaW5kX2ZpcnN0X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdAorICAgIHsgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykgcmV0dXJuIGZpbmRfZmlyc3Rfb2YoX19zLCBfX3BvcywgX1RyYWl0czo6bGVuZ3RoKF9fcykpOyB9CisKKyAgc2l6ZV90eXBlIGZpbmRfZmlyc3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fbikgY29uc3Q7CisKKyAgc2l6ZV90eXBlIGZpbmRfZmlyc3Rfb2YoX0NoYXJUIF9fYywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QKKyAgICB7IHJldHVybiBmaW5kKF9fYywgX19wb3MpOyB9CisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmluZF9sYXN0X29mCisKKyAgc2l6ZV90eXBlIGZpbmRfbGFzdF9vZihjb25zdCBfU2VsZiYgX19zLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX3BvcyA9IG5wb3MpIGNvbnN0CisgICAgeyByZXR1cm4gZmluZF9sYXN0X29mKF9fcy5fTV9TdGFydCgpLCBfX3BvcywgX19zLnNpemUoKSk7IH0KKworICBzaXplX3R5cGUgZmluZF9sYXN0X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MgPSBucG9zKSBjb25zdAorICAgIHsgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykgcmV0dXJuIGZpbmRfbGFzdF9vZihfX3MsIF9fcG9zLCBfVHJhaXRzOjpsZW5ndGgoX19zKSk7IH0KKworICBzaXplX3R5cGUgZmluZF9sYXN0X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fbikgY29uc3Q7CisKKyAgc2l6ZV90eXBlIGZpbmRfbGFzdF9vZihfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MgPSBucG9zKSBjb25zdCB7CisgICAgcmV0dXJuIHJmaW5kKF9fYywgX19wb3MpOworICB9CisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmluZF9maXJzdF9ub3Rfb2YKKworICBzaXplX3R5cGUgZmluZF9maXJzdF9ub3Rfb2YoY29uc3QgX1NlbGYmIF9fcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0CisgICAgeyByZXR1cm4gZmluZF9maXJzdF9ub3Rfb2YoX19zLl9NX1N0YXJ0KCksIF9fcG9zLCBfX3Muc2l6ZSgpKTsgfQorCisgIHNpemVfdHlwZSBmaW5kX2ZpcnN0X25vdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QKKyAgeyBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKSByZXR1cm4gZmluZF9maXJzdF9ub3Rfb2YoX19zLCBfX3BvcywgX1RyYWl0czo6bGVuZ3RoKF9fcykpOyB9CisKKyAgc2l6ZV90eXBlIGZpbmRfZmlyc3Rfbm90X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uKSBjb25zdDsKKworICBzaXplX3R5cGUgZmluZF9maXJzdF9ub3Rfb2YoX0NoYXJUIF9fYywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3Q7CisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmluZF9sYXN0X25vdF9vZgorCisgIHNpemVfdHlwZSBmaW5kX2xhc3Rfbm90X29mKGNvbnN0IF9TZWxmJiBfX3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX3BvcyA9IG5wb3MpIGNvbnN0CisgIHsgcmV0dXJuIGZpbmRfbGFzdF9ub3Rfb2YoX19zLl9NX1N0YXJ0KCksIF9fcG9zLCBfX3Muc2l6ZSgpKTsgfQorCisgIHNpemVfdHlwZSBmaW5kX2xhc3Rfbm90X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MgPSBucG9zKSBjb25zdAorICAgIHsgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykgcmV0dXJuIGZpbmRfbGFzdF9ub3Rfb2YoX19zLCBfX3BvcywgX1RyYWl0czo6bGVuZ3RoKF9fcykpOyB9CisKKyAgc2l6ZV90eXBlIGZpbmRfbGFzdF9ub3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fbikgY29uc3Q7CisKKyAgc2l6ZV90eXBlIGZpbmRfbGFzdF9ub3Rfb2YoX0NoYXJUIF9fYywgc2l6ZV90eXBlIF9fcG9zID0gbnBvcykgY29uc3Q7CisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3Vic3RyaW5nLgorICBfU2VsZiBzdWJzdHIoc2l6ZV90eXBlIF9fcG9zID0gMCwgc2l6ZV90eXBlIF9fbiA9IG5wb3MpIGNvbnN0CisgIHsgcmV0dXJuIF9TZWxmKCp0aGlzLCBfX3BvcywgX19uLCBnZXRfYWxsb2NhdG9yKCkpOyB9CisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29tcGFyZQorICBpbnQgY29tcGFyZShjb25zdCBfU2VsZiYgX19zKSBjb25zdAorICB7IHJldHVybiBfTV9jb21wYXJlKHRoaXMtPl9NX1N0YXJ0KCksIHRoaXMtPl9NX0ZpbmlzaCgpLCBfX3MuX01fU3RhcnQoKSwgX19zLl9NX0ZpbmlzaCgpKTsgfQorCisgIGludCBjb21wYXJlKHNpemVfdHlwZSBfX3BvczEsIHNpemVfdHlwZSBfX24xLAorICAgICAgICAgICAgICBjb25zdCBfU2VsZiYgX19zKSBjb25zdCB7CisgICAgaWYgKF9fcG9zMSA+IHNpemUoKSkKKyAgICAgIHRoaXMtPl9NX3Rocm93X291dF9vZl9yYW5nZSgpOworICAgIHJldHVybiBfTV9jb21wYXJlKHRoaXMtPl9NX1N0YXJ0KCkgKyBfX3BvczEsCisgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+X01fU3RhcnQoKSArIF9fcG9zMSArIChtaW4pIChfX24xLCBzaXplKCkgLSBfX3BvczEpLAorICAgICAgICAgICAgICAgICAgICAgIF9fcy5fTV9TdGFydCgpLCBfX3MuX01fRmluaXNoKCkpOworICB9CisKKyAgaW50IGNvbXBhcmUoc2l6ZV90eXBlIF9fcG9zMSwgc2l6ZV90eXBlIF9fbjEsCisgICAgICAgICAgICAgIGNvbnN0IF9TZWxmJiBfX3MsCisgICAgICAgICAgICAgIHNpemVfdHlwZSBfX3BvczIsIHNpemVfdHlwZSBfX24yKSBjb25zdCB7CisgICAgaWYgKF9fcG9zMSA+IHNpemUoKSB8fCBfX3BvczIgPiBfX3Muc2l6ZSgpKQorICAgICAgdGhpcy0+X01fdGhyb3dfb3V0X29mX3JhbmdlKCk7CisgICAgcmV0dXJuIF9NX2NvbXBhcmUodGhpcy0+X01fU3RhcnQoKSArIF9fcG9zMSwKKyAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5fTV9TdGFydCgpICsgX19wb3MxICsgKG1pbikgKF9fbjEsIHNpemUoKSAtIF9fcG9zMSksCisgICAgICAgICAgICAgICAgICAgICAgX19zLl9NX1N0YXJ0KCkgKyBfX3BvczIsCisgICAgICAgICAgICAgICAgICAgICAgX19zLl9NX1N0YXJ0KCkgKyBfX3BvczIgKyAobWluKSAoX19uMiwgX19zLnNpemUoKSAtIF9fcG9zMikpOworICB9CisKKyAgaW50IGNvbXBhcmUoY29uc3QgX0NoYXJUKiBfX3MpIGNvbnN0IHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKQorICAgIHJldHVybiBfTV9jb21wYXJlKHRoaXMtPl9NX1N0YXJ0KCksIHRoaXMtPl9NX0ZpbmlzaCgpLCBfX3MsIF9fcyArIF9UcmFpdHM6Omxlbmd0aChfX3MpKTsKKyAgfQorCisgIGludCBjb21wYXJlKHNpemVfdHlwZSBfX3BvczEsIHNpemVfdHlwZSBfX24xLCBjb25zdCBfQ2hhclQqIF9fcykgY29uc3QgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgICAgaWYgKF9fcG9zMSA+IHNpemUoKSkKKyAgICAgIHRoaXMtPl9NX3Rocm93X291dF9vZl9yYW5nZSgpOworICAgIHJldHVybiBfTV9jb21wYXJlKHRoaXMtPl9NX1N0YXJ0KCkgKyBfX3BvczEsCisgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+X01fU3RhcnQoKSArIF9fcG9zMSArIChtaW4pIChfX24xLCBzaXplKCkgLSBfX3BvczEpLAorICAgICAgICAgICAgICAgICAgICAgIF9fcywgX19zICsgX1RyYWl0czo6bGVuZ3RoKF9fcykpOworICB9CisKKyAgaW50IGNvbXBhcmUoc2l6ZV90eXBlIF9fcG9zMSwgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IF9DaGFyVCogX19zLAorICAgICAgICAgICAgICBzaXplX3R5cGUgX19uMikgY29uc3QgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgICAgaWYgKF9fcG9zMSA+IHNpemUoKSkKKyAgICAgIHRoaXMtPl9NX3Rocm93X291dF9vZl9yYW5nZSgpOworICAgIHJldHVybiBfTV9jb21wYXJlKHRoaXMtPl9NX1N0YXJ0KCkgKyBfX3BvczEsCisgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+X01fU3RhcnQoKSArIF9fcG9zMSArIChtaW4pIChfX24xLCBzaXplKCkgLSBfX3BvczEpLAorICAgICAgICAgICAgICAgICAgICAgIF9fcywgX19zICsgX19uMik7CisgIH0KKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIGNvbXBhcmUuCisKKyAgc3RhdGljIGludCBfU1RMUF9DQUxMIF9NX2NvbXBhcmUoY29uc3QgX0NoYXJUKiBfX2YxLCBjb25zdCBfQ2hhclQqIF9fbDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9DaGFyVCogX19mMiwgY29uc3QgX0NoYXJUKiBfX2wyKSB7CisgICAgY29uc3QgcHRyZGlmZl90IF9fbjEgPSBfX2wxIC0gX19mMTsKKyAgICBjb25zdCBwdHJkaWZmX3QgX19uMiA9IF9fbDIgLSBfX2YyOworICAgIGNvbnN0IGludCBjbXAgPSBfVHJhaXRzOjpjb21wYXJlKF9fZjEsIF9fZjIsIChtaW4pIChfX24xLCBfX24yKSk7CisgICAgcmV0dXJuIGNtcCAhPSAwID8gY21wIDogKF9fbjEgPCBfX24yID8gLTEgOiAoX19uMSA+IF9fbjIgPyAxIDogMCkpOworICB9CisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1RFTVBMQVRFX0VYUFJFU1NJT04pICYmICFkZWZpbmVkIChfU1RMUF9ERUJVRykgJiYgIWRlZmluZWQgKF9TVExQX1VTRV9NU1ZDNl9NRU1fVF9CVUdfV09SS0FST1VORCkKKyMgIGRlZmluZSBfU1RMUF9TVFJJTkdfU1VNX0JBU0UoX19yZXNlcnZlLCBfX3NpemUsIF9fYWxsb2MpIF9TVExQX1BSSVYgX1N0cmluZ19iYXNlPF9DaGFyVCxfQWxsb2M+KF9fYWxsb2MsIF9fc2l6ZSArIDEpCisjICBpbmNsdWRlIDxzdGwvX3N0cmluZ19zdW1fbWV0aG9kcy5oPgorIyAgdW5kZWYgX1NUTFBfU1RSSU5HX1NVTV9CQVNFCisjZW5kaWYgLyogX1NUTFBfVVNFX1RFTVBMQVRFX0VYUFJFU1NJT04gKi8KK307CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfU1RBVElDX0NPTlNUX0lOSVRfQlVHKQorIyAgaWYgZGVmaW5lZCAoX19HTlVDX18pICYmIChfX0dOVUNfXyA9PSAyKSAmJiAoX19HTlVDX01JTk9SX18gPT0gOTYpCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+Citjb25zdCBzaXplX3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6bnBvcyA9IH4oc2l6ZV90KSAwOworIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCkKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBiYXNpY19zdHJpbmc8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4sIGFsbG9jYXRvcjxjaGFyPiA+OworIyAgaWYgZGVmaW5lZCAoX1NUTFBfSEFTX1dDSEFSX1QpCitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgYmFzaWNfc3RyaW5nPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+LCBhbGxvY2F0b3I8d2NoYXJfdD4gPjsKKyMgIGVuZGlmCisjZW5kaWYgLyogX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCAqLworCisjaWYgZGVmaW5lZCAoYmFzaWNfc3RyaW5nKQorX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisjICB1bmRlZiBiYXNpY19zdHJpbmcKKyNlbmRpZgorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfTVNWQzZfTUVNX1RfQlVHX1dPUktBUk9VTkQpCisjICBpbmNsdWRlIDxzdGwvX3N0cmluZ193b3JrYXJvdW5kLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHKQorIyAgaW5jbHVkZSA8c3RsL2RlYnVnL19zdHJpbmcuaD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBOb24tbWVtYmVyIGZ1bmN0aW9ucy4KKy8vIFN3YXAuCisjaWYgZGVmaW5lZCAoX1NUTFBfRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSKQordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgoraW5saW5lIHZvaWQgX1NUTFBfQ0FMTAorc3dhcChiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiYgX194LAorICAgICBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiYgX195KQoreyBfX3guc3dhcChfX3kpOyB9CisjZW5kaWYgLyogX1NUTFBfRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSICovCisKKyNpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorc3RydWN0IF9fbW92ZV90cmFpdHM8YmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiA+IHsKKyAgdHlwZWRlZiBfX3N0bHBfbW92YWJsZSBpbXBsZW1lbnRlZDsKKyAgLy9Db21wbGV0bmVzcyBkZXBlbmRzIG9uIHRoZSBhbGxvY2F0b3I6CisgIHR5cGVkZWYgdHlwZW5hbWUgX19tb3ZlX3RyYWl0czxfQWxsb2M+Ojpjb21wbGV0ZSBjb21wbGV0ZTsKK307CisvKiNlbHNlCisgKiBUaGVyZSBpcyBubyBuZWVkIHRvIHNwZWNpYWxpemUgZm9yIHN0cmluZyBhbmQgd3N0cmluZyBpbiB0aGlzIGNhc2UKKyAqIGFzIHRoZSBkZWZhdWx0IF9fbW92ZV90cmFpdHMgd2lsbCBhbHJlYWR5IHRlbGwgdGhhdCBzdHJpbmcgaXMgbW92YWJsZQorICogYnV0IG5vdCBjb21wbGV0ZS4gV2UgY2Fubm90IGRlZmluZSBpdCBhcyBjb21wbGV0ZSBhcyBub3RoaW5nIGd1YXJhbnR5CisgKiB0aGF0IHRoZSBTVExwb3J0IHVzZXIgaGFzbid0IHNwZWNpYWxpemVkIHN0ZDo6YWxsb2NhdG9yIGZvciBjaGFyIG9yCisgKiB3Y2hhcl90LgorICovCisjZW5kaWYKKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+Cit2b2lkIF9TVExQX0NBTEwgX1Nfc3RyaW5nX2NvcHkoY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz4mIF9fcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ2hhclQqIF9fYnVmLCBzaXplX3QgX19uKTsKKworI2lmIGRlZmluZWQoX1NUTFBfVVNFX1dJREVfSU5URVJGQUNFKQorLy8gQSBjb3VwbGUgb2YgZnVuY3Rpb25zIHRvIHRyYW5zZmVyIGJldHdlZW4gQVNDSUkvVW5pY29kZQord3N0cmluZyBfX0FTQ0lJVG9XaWRlKGNvbnN0IGNoYXIgKmFzY2lpKTsKK3N0cmluZyBfX1dpZGVUb0FTQ0lJKGNvbnN0IHdjaGFyX3QgKndpZGUpOworI2VuZGlmCisKK2lubGluZSBjb25zdCBjaGFyKiBfU1RMUF9DQUxMCitfX2dldF9jX3N0cmluZyhjb25zdCBzdHJpbmcmIF9fc3RyKSB7IHJldHVybiBfX3N0ci5jX3N0cigpOyB9CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNpbmNsdWRlIDxzdGwvX3N0cmluZ19vcGVyYXRvcnMuaD4KKworI2lmIGRlZmluZWQoX1NUTFBfVVNFX05PX0lPU1RSRUFNUykgfHwgXAorICAgIChkZWZpbmVkIChfU1RMUF9FWFBPU0VfU1RSRUFNX0lNUExFTUVOVEFUSU9OKSAmJiAhZGVmaW5lZCAoX1NUTFBfTElOS19USU1FX0lOU1RBTlRJQVRJT04pKQorIyAgaW5jbHVkZSA8c3RsL19zdHJpbmcuYz4KKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfU1RSSU5HX0ggKi8KKworLyoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIG1vZGU6QysrCisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL3N0bC9fc3RyaW5nX2Jhc2UuaCBiL3N0bC9fc3RyaW5nX2Jhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjMwNDlkCi0tLSAvZGV2L251bGwKKysrIGIvc3RsL19zdHJpbmdfYmFzZS5oCkBAIC0wLDAgKzEsMjQ5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk3LTE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzCisgKiBGcmFuY29pcyBEdW1vbnQKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmbmRlZiBfU1RMUF9TVFJJTkdfQkFTRV9ICisjZGVmaW5lIF9TVExQX1NUUklOR19CQVNFX0gKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDbGFzcyBfU3RyaW5nX2Jhc2UuCisKKy8vIF9TdHJpbmdfYmFzZSBpcyBhIGhlbHBlciBjbGFzcyB0aGF0IG1ha2VzIGl0IGl0IGVhc2llciB0byB3cml0ZSBhbgorLy8gZXhjZXB0aW9uLXNhZmUgdmVyc2lvbiBvZiBiYXNpY19zdHJpbmcuICBUaGUgY29uc3RydWN0b3IgYWxsb2NhdGVzLAorLy8gYnV0IGRvZXMgbm90IGluaXRpYWxpemUsIGEgYmxvY2sgb2YgbWVtb3J5LiAgVGhlIGRlc3RydWN0b3IKKy8vIGRlYWxsb2NhdGVzLCBidXQgZG9lcyBub3QgZGVzdHJveSBlbGVtZW50cyB3aXRoaW4sIGEgYmxvY2sgb2YKKy8vIG1lbW9yeS4gIFRoZSBkZXN0cnVjdG9yIGFzc3VtZXMgdGhhdCBfTV9zdGFydCBlaXRoZXIgaXMgbnVsbCwgb3IgZWxzZQorLy8gcG9pbnRzIHRvIGEgYmxvY2sgb2YgbWVtb3J5IHRoYXQgd2FzIGFsbG9jYXRlZCB1c2luZyBfU3RyaW5nX2Jhc2UncworLy8gYWxsb2NhdG9yIGFuZCB3aG9zZSBzaXplIGlzIF9NX2VuZF9vZl9zdG9yYWdlLl9NX2RhdGEgLSBfTV9zdGFydC4KKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKworI2lmbmRlZiBfU1RMUF9TSE9SVF9TVFJJTkdfU1oKKyMgIGRlZmluZSBfU1RMUF9TSE9SVF9TVFJJTkdfU1ogMTYKKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CitjbGFzcyBfU3RyaW5nX2Jhc2UgeworICB0eXBlZGVmIF9TdHJpbmdfYmFzZTxfVHAsIF9BbGxvYz4gX1NlbGY7Citwcm90ZWN0ZWQ6CisgIF9TVExQX0ZPUkNFX0FMTE9DQVRPUlMoX1RwLCBfQWxsb2MpCitwdWJsaWM6CisgIC8vZHVtczogU29tZSBjb21waWxlcihNU1ZDNikgcmVxdWlyZSBpdCB0byBiZSBwdWJsaWMgbm90IHNpbXBseSBwcm90ZWN0ZWQhCisgIGVudW0ge19ERUZBVUxUX1NJWkUgPSBfU1RMUF9TSE9SVF9TVFJJTkdfU1p9OworICAvL1RoaXMgaXMgbmVlZGVkIGJ5IHRoZSBmdWxsIG1vdmUgZnJhbWV3b3JrCisgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jX3RyYWl0czxfVHAsIF9BbGxvYz46OmFsbG9jYXRvcl90eXBlIGFsbG9jYXRvcl90eXBlOworICB0eXBlZGVmIF9TVExQX2FsbG9jX3Byb3h5PF9UcCosIF9UcCwgYWxsb2NhdG9yX3R5cGU+IF9BbGxvY1Byb3h5OworICB0eXBlZGVmIHNpemVfdCBzaXplX3R5cGU7Citwcml2YXRlOgorI2lmIGRlZmluZWQgKF9TVExQX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0pCisgIHVuaW9uIF9CdWZmZXJzIHsKKyAgICBfVHAqICBfTV9keW5hbWljX2J1ZjsKKyAgICBfVHAgICBfTV9zdGF0aWNfYnVmW19ERUZBVUxUX1NJWkVdOworICB9IF9NX2J1ZmZlcnM7CisjZWxzZQorICBfVHAqICAgIF9NX3N0YXJ0OworI2VuZGlmIC8qIF9TVExQX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0gKi8KK3Byb3RlY3RlZDoKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfU0hPUlRfU1RSSU5HX09QVElNKQorICBib29sIF9NX3VzaW5nX3N0YXRpY19idWYoKSBjb25zdCB7CisgICAgcmV0dXJuIChfTV9lbmRfb2Zfc3RvcmFnZS5fTV9kYXRhID09IF9NX2J1ZmZlcnMuX01fc3RhdGljX2J1ZiArIF9ERUZBVUxUX1NJWkUpOworICB9CisgIF9UcCBjb25zdCogX01fU3RhcnQoKSBjb25zdCB7CisgICAgcmV0dXJuIF9NX3VzaW5nX3N0YXRpY19idWYoKT9fTV9idWZmZXJzLl9NX3N0YXRpY19idWY6X01fYnVmZmVycy5fTV9keW5hbWljX2J1ZjsKKyAgfQorICBfVHAqIF9NX1N0YXJ0KCkgeworICAgIHJldHVybiBfTV91c2luZ19zdGF0aWNfYnVmKCk/X01fYnVmZmVycy5fTV9zdGF0aWNfYnVmOl9NX2J1ZmZlcnMuX01fZHluYW1pY19idWY7CisgIH0KKyNlbHNlCisgIF9UcCBjb25zdCogX01fU3RhcnQoKSBjb25zdCB7cmV0dXJuIF9NX3N0YXJ0O30KKyAgX1RwKiBfTV9TdGFydCgpIHtyZXR1cm4gX01fc3RhcnQ7fQorI2VuZGlmIC8qIF9TVExQX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0gKi8KKworICBfVHAqICAgIF9NX2ZpbmlzaDsKKyAgX0FsbG9jUHJveHkgX01fZW5kX29mX3N0b3JhZ2U7CisKKyAgX1RwIGNvbnN0KiBfTV9GaW5pc2goKSBjb25zdCB7cmV0dXJuIF9NX2ZpbmlzaDt9CisgIF9UcCogX01fRmluaXNoKCkge3JldHVybiBfTV9maW5pc2g7fQorCisgIC8vIFByZWNvbmRpdGlvbjogMCA8IF9fbiA8PSBtYXhfc2l6ZSgpLgorICB2b2lkIF9NX2FsbG9jYXRlX2Jsb2NrKHNpemVfdCBfX24gPSBfREVGQVVMVF9TSVpFKTsKKyAgdm9pZCBfTV9kZWFsbG9jYXRlX2Jsb2NrKCkgeworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0pCisgICAgaWYgKCFfTV91c2luZ19zdGF0aWNfYnVmKCkgJiYgKF9NX2J1ZmZlcnMuX01fZHluYW1pY19idWYgIT0gMCkpCisgICAgICBfTV9lbmRfb2Zfc3RvcmFnZS5kZWFsbG9jYXRlKF9NX2J1ZmZlcnMuX01fZHluYW1pY19idWYsIF9NX2VuZF9vZl9zdG9yYWdlLl9NX2RhdGEgLSBfTV9idWZmZXJzLl9NX2R5bmFtaWNfYnVmKTsKKyNlbHNlCisgICAgaWYgKF9NX3N0YXJ0ICE9IDApCisgICAgICBfTV9lbmRfb2Zfc3RvcmFnZS5kZWFsbG9jYXRlKF9NX3N0YXJ0LCBfTV9lbmRfb2Zfc3RvcmFnZS5fTV9kYXRhIC0gX01fc3RhcnQpOworI2VuZGlmIC8qIF9TVExQX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0gKi8KKyAgfQorCisgIHNpemVfdCBtYXhfc2l6ZSgpIGNvbnN0IHsKKyAgICBjb25zdCBzaXplX3R5cGUgX19zdHJpbmdfbWF4X3NpemUgPSBzaXplX3R5cGUoLTEpIC8gc2l6ZW9mKF9UcCk7CisgICAgdHlwZW5hbWUgYWxsb2NhdG9yX3R5cGU6OnNpemVfdHlwZSBfX2FsbG9jX21heF9zaXplID0gX01fZW5kX29mX3N0b3JhZ2UubWF4X3NpemUoKTsKKyAgICByZXR1cm4gKG1pbikoX19hbGxvY19tYXhfc2l6ZSwgX19zdHJpbmdfbWF4X3NpemUpIC0gMTsKKyAgfQorCisgIF9TdHJpbmdfYmFzZShjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorI2lmIGRlZmluZWQgKF9TVExQX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0pCisgICAgOiBfTV9maW5pc2goX01fYnVmZmVycy5fTV9zdGF0aWNfYnVmKSwgX01fZW5kX29mX3N0b3JhZ2UoX19hLCBfTV9idWZmZXJzLl9NX3N0YXRpY19idWYgKyBfREVGQVVMVF9TSVpFKQorI2Vsc2UKKyAgICA6IF9NX3N0YXJ0KDApLCBfTV9maW5pc2goMCksIF9NX2VuZF9vZl9zdG9yYWdlKF9fYSwgKF9UcCopMCkKKyNlbmRpZgorICAgIHt9CisKKyAgX1N0cmluZ19iYXNlKGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EsIHNpemVfdCBfX24pCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1NIT1JUX1NUUklOR19PUFRJTSkKKyAgICA6IF9NX2ZpbmlzaChfTV9idWZmZXJzLl9NX3N0YXRpY19idWYpLCBfTV9lbmRfb2Zfc3RvcmFnZShfX2EsIF9NX2J1ZmZlcnMuX01fc3RhdGljX2J1ZiArIF9ERUZBVUxUX1NJWkUpIHsKKyNlbHNlCisgICAgOiBfTV9zdGFydCgwKSwgX01fZmluaXNoKDApLCBfTV9lbmRfb2Zfc3RvcmFnZShfX2EsIChfVHAqKTApIHsKKyNlbmRpZgorICAgICAgX01fYWxsb2NhdGVfYmxvY2soX19uKTsKKyAgICB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfU0hPUlRfU1RSSU5HX09QVElNKQorICB2b2lkIF9NX21vdmVfc3JjIChfU2VsZiAmc3JjKSB7CisgICAgICBpZiAoc3JjLl9NX3VzaW5nX3N0YXRpY19idWYoKSkgeworICAgICAgICBfTV9idWZmZXJzID0gc3JjLl9NX2J1ZmZlcnM7CisgICAgICAgIF9NX2ZpbmlzaCA9IF9NX2J1ZmZlcnMuX01fc3RhdGljX2J1ZiArIChzcmMuX01fZmluaXNoIC0gc3JjLl9NX2J1ZmZlcnMuX01fc3RhdGljX2J1Zik7CisgICAgICAgIF9NX2VuZF9vZl9zdG9yYWdlLl9NX2RhdGEgPSBfTV9idWZmZXJzLl9NX3N0YXRpY19idWYgKyBfREVGQVVMVF9TSVpFOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIF9NX2J1ZmZlcnMuX01fZHluYW1pY19idWYgPSBzcmMuX01fYnVmZmVycy5fTV9keW5hbWljX2J1ZjsKKyAgICAgICAgX01fZmluaXNoID0gc3JjLl9NX2ZpbmlzaDsKKyAgICAgICAgX01fZW5kX29mX3N0b3JhZ2UuX01fZGF0YSA9IHNyYy5fTV9lbmRfb2Zfc3RvcmFnZS5fTV9kYXRhOworICAgICAgICBzcmMuX01fYnVmZmVycy5fTV9keW5hbWljX2J1ZiA9IDA7CisgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgX1N0cmluZ19iYXNlKF9fbW92ZV9zb3VyY2U8X1NlbGY+IHNyYykKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfU0hPUlRfU1RSSU5HX09QVElNKQorICAgIDogX01fZW5kX29mX3N0b3JhZ2UoX19tb3ZlX3NvdXJjZTxfQWxsb2NQcm94eT4oc3JjLmdldCgpLl9NX2VuZF9vZl9zdG9yYWdlKSkgeworICAgICAgX01fbW92ZV9zcmMoc3JjLmdldCgpKTsKKyNlbHNlCisgICAgOiBfTV9zdGFydChzcmMuZ2V0KCkuX01fc3RhcnQpLCBfTV9maW5pc2goc3JjLmdldCgpLl9NX2ZpbmlzaCksCisgICAgICBfTV9lbmRfb2Zfc3RvcmFnZShfX21vdmVfc291cmNlPF9BbGxvY1Byb3h5PihzcmMuZ2V0KCkuX01fZW5kX29mX3N0b3JhZ2UpKSB7CisgICAgICBzcmMuZ2V0KCkuX01fc3RhcnQgPSAwOworI2VuZGlmCisgICAgfQorCisgIH5fU3RyaW5nX2Jhc2UoKSB7IF9NX2RlYWxsb2NhdGVfYmxvY2soKTsgfQorCisgIHZvaWQgX01fcmVzZXQoX1RwICpfX3N0YXJ0LCBfVHAgKl9fZmluaXNoLCBfVHAgKl9fZW5kX29mX3N0b3JhZ2UpIHsKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfU0hPUlRfU1RSSU5HX09QVElNKQorICAgIF9NX2J1ZmZlcnMuX01fZHluYW1pY19idWYgPSBfX3N0YXJ0OworI2Vsc2UKKyAgICBfTV9zdGFydCA9IF9fc3RhcnQ7CisjZW5kaWYKKyAgICBfTV9maW5pc2ggPSBfX2ZpbmlzaDsKKyAgICBfTV9lbmRfb2Zfc3RvcmFnZS5fTV9kYXRhID0gX19lbmRfb2Zfc3RvcmFnZTsKKyAgfQorCisgIHZvaWQgX01fZGVzdHJveV9iYWNrICgpIHsKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfU0hPUlRfU1RSSU5HX09QVElNKQorICAgIGlmICghX01fdXNpbmdfc3RhdGljX2J1ZigpKQorI2VuZGlmIC8qIF9TVExQX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0gKi8KKyAgICAgIF9TVExQX1NURDo6X0Rlc3Ryb3koX01fZmluaXNoKTsKKyAgfQorCisgIHZvaWQgX01fZGVzdHJveV9yYW5nZShzaXplX3QgX19mcm9tX29mZiA9IDAsIHNpemVfdCBfX3RvX29mZiA9IDEpIHsKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfU0hPUlRfU1RSSU5HX09QVElNKQorICAgIGlmICghX01fdXNpbmdfc3RhdGljX2J1ZigpKQorICAgICAgX1NUTFBfU1REOjpfRGVzdHJveV9SYW5nZShfTV9idWZmZXJzLl9NX2R5bmFtaWNfYnVmICsgX19mcm9tX29mZiwgX01fZmluaXNoICsgX190b19vZmYpOworI2Vsc2UKKyAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95X1JhbmdlKF9NX3N0YXJ0ICsgX19mcm9tX29mZiwgX01fZmluaXNoICsgX190b19vZmYpOworI2VuZGlmIC8qIF9TVExQX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0gKi8KKyAgfQorCisgIHZvaWQgX01fZGVzdHJveV9wdHJfcmFuZ2UoX1RwICpfX2YsIF9UcCAqX19sKSB7CisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1NIT1JUX1NUUklOR19PUFRJTSkKKyAgICBpZiAoIV9NX3VzaW5nX3N0YXRpY19idWYoKSkKKyNlbmRpZiAvKiBfU1RMUF9VU0VfU0hPUlRfU1RSSU5HX09QVElNICovCisgICAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95X1JhbmdlKF9fZiwgX19sKTsKKyAgfQorCisgIHZvaWQgX01fU3dhcChfU2VsZiAmX19zKSB7CisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1NIT1JUX1NUUklOR19PUFRJTSkKKyAgICBpZiAoX01fdXNpbmdfc3RhdGljX2J1ZigpKSB7CisgICAgICBpZiAoX19zLl9NX3VzaW5nX3N0YXRpY19idWYoKSkgeworICAgICAgICBfU1RMUF9TVEQ6OnN3YXAoX01fYnVmZmVycywgX19zLl9NX2J1ZmZlcnMpOworICAgICAgICBfVHAgKl9fdG1wID0gX01fZmluaXNoOworICAgICAgICBfTV9maW5pc2ggPSBfTV9idWZmZXJzLl9NX3N0YXRpY19idWYgKyAoX19zLl9NX2ZpbmlzaCAtIF9fcy5fTV9idWZmZXJzLl9NX3N0YXRpY19idWYpOworICAgICAgICBfX3MuX01fZmluaXNoID0gX19zLl9NX2J1ZmZlcnMuX01fc3RhdGljX2J1ZiArIChfX3RtcCAtIF9NX2J1ZmZlcnMuX01fc3RhdGljX2J1Zik7CisgICAgICAgIC8vV2UgbmVlZCB0byBzd2FwIF9NX2VuZF9vZl9zdG9yYWdlIGZvciBhbGxvY2F0b3JzIHdpdGggc3RhdGU6CisgICAgICAgIF9NX2VuZF9vZl9zdG9yYWdlLnN3YXAoX19zLl9NX2VuZF9vZl9zdG9yYWdlKTsKKyAgICAgICAgX01fZW5kX29mX3N0b3JhZ2UuX01fZGF0YSA9IF9NX2J1ZmZlcnMuX01fc3RhdGljX2J1ZiArIF9ERUZBVUxUX1NJWkU7CisgICAgICAgIF9fcy5fTV9lbmRfb2Zfc3RvcmFnZS5fTV9kYXRhID0gX19zLl9NX2J1ZmZlcnMuX01fc3RhdGljX2J1ZiArIF9ERUZBVUxUX1NJWkU7CisgICAgICB9IGVsc2UgeworICAgICAgICBfX3MuX01fU3dhcCgqdGhpcyk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoX19zLl9NX3VzaW5nX3N0YXRpY19idWYoKSkgeworICAgICAgX1RwICpfX3RtcCA9IF9NX2J1ZmZlcnMuX01fZHluYW1pY19idWY7CisgICAgICBfVHAgKl9fdG1wX2ZpbmlzaCA9IF9NX2ZpbmlzaDsKKyAgICAgIF9UcCAqX190bXBfZW5kX2RhdGEgPSBfTV9lbmRfb2Zfc3RvcmFnZS5fTV9kYXRhOworICAgICAgX01fYnVmZmVycyA9IF9fcy5fTV9idWZmZXJzOworICAgICAgLy9XZSBuZWVkIHRvIHN3YXAgX01fZW5kX29mX3N0b3JhZ2UgZm9yIGFsbG9jYXRvcnMgd2l0aCBzdGF0ZToKKyAgICAgIF9NX2VuZF9vZl9zdG9yYWdlLnN3YXAoX19zLl9NX2VuZF9vZl9zdG9yYWdlKTsKKyAgICAgIF9NX2VuZF9vZl9zdG9yYWdlLl9NX2RhdGEgPSBfTV9idWZmZXJzLl9NX3N0YXRpY19idWYgKyBfREVGQVVMVF9TSVpFOworICAgICAgX01fZmluaXNoID0gX01fYnVmZmVycy5fTV9zdGF0aWNfYnVmICsgKF9fcy5fTV9maW5pc2ggLSBfX3MuX01fYnVmZmVycy5fTV9zdGF0aWNfYnVmKTsKKyAgICAgIF9fcy5fTV9idWZmZXJzLl9NX2R5bmFtaWNfYnVmID0gX190bXA7CisgICAgICBfX3MuX01fZW5kX29mX3N0b3JhZ2UuX01fZGF0YSA9IF9fdG1wX2VuZF9kYXRhOworICAgICAgX19zLl9NX2ZpbmlzaCA9IF9fdG1wX2ZpbmlzaDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBfU1RMUF9TVEQ6OnN3YXAoX01fYnVmZmVycy5fTV9keW5hbWljX2J1ZiwgX19zLl9NX2J1ZmZlcnMuX01fZHluYW1pY19idWYpOworICAgICAgX01fZW5kX29mX3N0b3JhZ2Uuc3dhcChfX3MuX01fZW5kX29mX3N0b3JhZ2UpOworICAgICAgX1NUTFBfU1REOjpzd2FwKF9NX2ZpbmlzaCwgX19zLl9NX2ZpbmlzaCk7CisgICAgfQorI2Vsc2UKKyAgICBfU1RMUF9TVEQ6OnN3YXAoX01fc3RhcnQsIF9fcy5fTV9zdGFydCk7CisgICAgX01fZW5kX29mX3N0b3JhZ2Uuc3dhcChfX3MuX01fZW5kX29mX3N0b3JhZ2UpOworICAgIF9TVExQX1NURDo6c3dhcChfTV9maW5pc2gsIF9fcy5fTV9maW5pc2gpOworI2VuZGlmIC8qIF9TVExQX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0gKi8KKyAgfQorCisgIHZvaWQgX1NUTFBfRlVOQ1RJT05fVEhST1dTIF9NX3Rocm93X2xlbmd0aF9lcnJvcigpIGNvbnN0OworICB2b2lkIF9TVExQX0ZVTkNUSU9OX1RIUk9XUyBfTV90aHJvd19vdXRfb2ZfcmFuZ2UoKSBjb25zdDsKK307CisKKyN1bmRlZiBfU1RMUF9TSE9SVF9TVFJJTkdfU1oKKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9URU1QTEFURV9FWFBPUlQpCitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgX1N0cmluZ19iYXNlPGNoYXIsIGFsbG9jYXRvcjxjaGFyPiA+OworIyAgaWYgZGVmaW5lZCAoX1NUTFBfSEFTX1dDSEFSX1QpCitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgX1N0cmluZ19iYXNlPHdjaGFyX3QsIGFsbG9jYXRvcjx3Y2hhcl90PiA+OworIyAgZW5kaWYKKyNlbmRpZiAvKiBfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUICovCisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNlbmRpZiAvKiBfU1RMUF9TVFJJTkdfQkFTRV9IICovCisKKy8qCisgKiBMb2NhbCBWYXJpYWJsZXM6CisgKiBtb2RlOkMrKworICogRW5kOgorICovCmRpZmYgLS1naXQgYS9zdGwvX3N0cmluZ19md2QuaCBiL3N0bC9fc3RyaW5nX2Z3ZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MjAzMjIKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvX3N0cmluZ19md2QuaApAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX1NUUklOR19GV0RfSAorI2RlZmluZSBfU1RMUF9TVFJJTkdfRldEX0gKKworI2lmbmRlZiBfU1RMUF9JT1NGV0QKKyMgIGluY2x1ZGUgPGlvc2Z3ZD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworI2lmICFkZWZpbmVkIChfU1RMUF9MSU1JVEVEX0RFRkFVTFRfVEVNUExBVEVTKQordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwKKyAgICAgICAgICBjbGFzcyBfVHJhaXRzID0gY2hhcl90cmFpdHM8X0NoYXJUPiwKKyAgICAgICAgICBjbGFzcyBfQWxsb2MgPSBhbGxvY2F0b3I8X0NoYXJUPiA+CitjbGFzcyBiYXNpY19zdHJpbmc7CisjZWxzZQordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwKKyAgICAgICAgICBjbGFzcyBfVHJhaXRzLAorICAgICAgICAgIGNsYXNzIF9BbGxvYz4KK2NsYXNzIGJhc2ljX3N0cmluZzsKKyNlbmRpZiAvKiBfU1RMUF9MSU1JVEVEX0RFRkFVTFRfVEVNUExBVEVTICovCisKK3R5cGVkZWYgYmFzaWNfc3RyaW5nPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+LCBhbGxvY2F0b3I8Y2hhcj4gPiBzdHJpbmc7CisKKyNpZiBkZWZpbmVkIChfU1RMUF9IQVNfV0NIQVJfVCkKK3R5cGVkZWYgYmFzaWNfc3RyaW5nPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+LCBhbGxvY2F0b3I8d2NoYXJfdD4gPiB3c3RyaW5nOworI2VuZGlmCisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKworLy9UaGlzIGZ1bmN0aW9uIGxpbWl0cyBoZWFkZXIgZGVwZW5kZW5jeSBiZXR3ZWVuIGV4Y2VwdGlvbiBhbmQgc3RyaW5nCisvL2ltcGxlbWVudGF0aW9uLiBJdCBpcyBpbXBsZW1lbnRlZCBpbiBfc3RyaW5nLmgKK2NvbnN0IGNoYXIqIF9TVExQX0NBTEwgX19nZXRfY19zdHJpbmcoY29uc3Qgc3RyaW5nJiBfX3N0cik7CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNlbmRpZiAvKiBfU1RMUF9TVFJJTkdfRldEX0ggKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9fc3RyaW5nX2hhc2guaCBiL3N0bC9fc3RyaW5nX2hhc2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWYxMzM5Ci0tLSAvZGV2L251bGwKKysrIGIvc3RsL19zdHJpbmdfaGFzaC5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMTk5OQorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmbmRlZiBfU1RMUF9TVFJJTkdfSEFTSF9ICisjZGVmaW5lIF9TVExQX1NUUklOR19IQVNIX0gKKworI2lmbmRlZiBfU1RMUF9IQVNIX0ZVTl9ICisjIGluY2x1ZGUgPHN0bC9faGFzaF9mdW4uaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX1NUUklOR19ICisjIGluY2x1ZGUgPHN0bC9fc3RyaW5nLmg+CisjZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK19TVExQX0lOTElORV9MT09QIHNpemVfdAorX19zdGxfc3RyaW5nX2hhc2goY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz4mIF9fcykgeworICB1bnNpZ25lZCBsb25nIF9faCA9IDA7CisgIHNpemVfdCBfX2xlbiA9IF9fcy5zaXplKCk7CisgIGNvbnN0IF9DaGFyVCogX19kYXRhID0gX19zLmRhdGEoKTsKKyAgZm9yICggc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fbGVuOyArK19faSkKKyAgICBfX2ggPSAvKiA1ICpfX2ggKi8oX19oIDw8IDIpICsgX19oICsgX19kYXRhW19faV07CisgIHJldHVybiBzaXplX3QoX19oKTsKK30KKworI2lmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK3N0cnVjdCBoYXNoPGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+ID4geworICBzaXplX3Qgb3BlcmF0b3IoKShjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiYgX19zKSBjb25zdAorICAgIHsgcmV0dXJuIF9fc3RsX3N0cmluZ19oYXNoKF9fcyk7IH0KK307CisKKyNlbHNlCisKK19TVExQX1RFTVBMQVRFX05VTEwKK3N0cnVjdCBfU1RMUF9DTEFTU19ERUNMU1BFQyBoYXNoPHN0cmluZz4geworICBzaXplX3Qgb3BlcmF0b3IoKShjb25zdCBzdHJpbmcmIF9fcykgY29uc3QKKyAgICB7IHJldHVybiBfX3N0bF9zdHJpbmdfaGFzaChfX3MpOyB9Cit9OworCisjICBpZiBkZWZpbmVkIChfU1RMUF9IQVNfV0NIQVJfVCkKK19TVExQX1RFTVBMQVRFX05VTEwKK3N0cnVjdCBfU1RMUF9DTEFTU19ERUNMU1BFQyBoYXNoPHdzdHJpbmc+IHsKKyAgc2l6ZV90IG9wZXJhdG9yKCkoY29uc3Qgd3N0cmluZyYgX19zKSBjb25zdAorICAgIHsgcmV0dXJuIF9fc3RsX3N0cmluZ19oYXNoKF9fcyk7IH0KK307CisjICBlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTiAqLworCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3RsL19zdHJpbmdfaW8uYyBiL3N0bC9fc3RyaW5nX2lvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRiMTg3MwotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9fc3RyaW5nX2lvLmMKQEAgLTAsMCArMSwxNzIgQEAKKyNpZm5kZWYgX1NUTFBfU1RSSU5HX0lPX0MKKyNkZWZpbmUgX1NUTFBfU1RSSU5HX0lPX0MKKworI2lmbmRlZiBfU1RMUF9TVFJJTkdfSU9fSAorIyAgaW5jbHVkZSA8c3RsL19zdHJpbmdfaW8uaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NUWVBFX0gKKyMgIGluY2x1ZGUgPHN0bC9fY3R5cGUuaD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jvb2wgX1NUTFBfQ0FMTAorX19zdGxwX3N0cmluZ19maWxsKGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKyAgICAgICAgICAgICAgICAgICBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19idWYsCisgICAgICAgICAgICAgICAgICAgc3RyZWFtc2l6ZSBfX24pIHsKKyAgX0NoYXJUIF9fZiA9IF9fb3MuZmlsbCgpOworICBmb3IgKHN0cmVhbXNpemUgX19pID0gMDsgX19pIDwgX19uOyArK19faSkgeworICAgIGlmIChfVHJhaXRzOjplcV9pbnRfdHlwZShfX2J1Zi0+c3B1dGMoX19mKSwgX1RyYWl0czo6ZW9mKCkpKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX1NUTFBfQ0FMTAorb3BlcmF0b3IgPDwgKGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKyAgICAgICAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiYgX19zKSB7CisgIHR5cGVkZWYgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+IF9fb3N0cmVhbTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjpzaXplX3R5cGUgc2l6ZV90eXBlOworCisgIC8vIFRoZSBoeXBvdGhlc2lzIG9mIHRoaXMgaW1wbGVtZW50YXRpb24gaXMgdGhhdCBzaXplX3R5cGUgaXMgdW5zaWduZWQ6CisgIF9TVExQX1NUQVRJQ19BU1NFUlQoX19TVEFUSUNfQ0FTVChzaXplX3R5cGUsIC0xKSA+IDApCisKKyAgdHlwZW5hbWUgX19vc3RyZWFtOjpzZW50cnkgX19zZW50cnkoX19vcyk7CisgIGJvb2wgX19vayA9IGZhbHNlOworCisgIGlmIChfX3NlbnRyeSkgeworICAgIF9fb2sgPSB0cnVlOworICAgIHNpemVfdHlwZSBfX24gPSBfX3Muc2l6ZSgpOworICAgIGNvbnN0IGJvb2wgX19sZWZ0ID0gKF9fb3MuZmxhZ3MoKSAmIF9fb3N0cmVhbTo6bGVmdCkgIT0gMDsKKyAgICBjb25zdCBzdHJlYW1zaXplIF9fdyA9IF9fb3Mud2lkdGgoMCk7CisgICAgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fYnVmID0gX19vcy5yZGJ1ZigpOworCisgICAgY29uc3QgYm9vbCBfX25lZWRfcGFkID0gKCgoc2l6ZW9mKHN0cmVhbXNpemUpID4gc2l6ZW9mKHNpemVfdCkpICYmIChfX1NUQVRJQ19DQVNUKHN0cmVhbXNpemUsIF9fbikgPCBfX3cpKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHNpemVvZihzdHJlYW1zaXplKSA8PSBzaXplb2Yoc2l6ZV90KSkgJiYgKF9fbiA8IF9fU1RBVElDX0NBU1Qoc2l6ZV90LCBfX3cpKSkpOworICAgIHN0cmVhbXNpemUgX19wYWRfbGVuID0gX19uZWVkX3BhZCA/IF9fdyAtIF9fbiA6IDA7CisKKyAgICBpZiAoIV9fbGVmdCkKKyAgICAgIF9fb2sgPSBfX3N0bHBfc3RyaW5nX2ZpbGwoX19vcywgX19idWYsIF9fcGFkX2xlbik7CisKKyAgICBfX29rID0gX19vayAmJiAoX19idWYtPnNwdXRuKF9fcy5kYXRhKCksIHN0cmVhbXNpemUoX19uKSkgPT0gc3RyZWFtc2l6ZShfX24pKTsKKworICAgIGlmIChfX2xlZnQpCisgICAgICBfX29rID0gX19vayAmJiBfX3N0bHBfc3RyaW5nX2ZpbGwoX19vcywgX19idWYsIF9fcGFkX2xlbik7CisgIH0KKworICBpZiAoIV9fb2spCisgICAgX19vcy5zZXRzdGF0ZShfX29zdHJlYW06OmZhaWxiaXQpOworCisgIHJldHVybiBfX29zOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9TVExQX0NBTEwKK29wZXJhdG9yID4+IChiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisgICAgICAgICAgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLCBfQWxsb2M+JiBfX3MpIHsKKyAgdHlwZWRlZiBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gX19pc3RyZWFtOworICB0eXBlZGVmIHR5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OnNpemVfdHlwZSBzaXplX3R5cGU7CisKKyAgLy8gVGhlIGh5cG90aGVzaXMgb2YgdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyB0aGF0IHNpemVfdHlwZSBpcyB1bnNpZ25lZDoKKyAgX1NUTFBfU1RBVElDX0FTU0VSVChfX1NUQVRJQ19DQVNUKHNpemVfdHlwZSwgLTEpID4gMCkKKworICB0eXBlbmFtZSBfX2lzdHJlYW06OnNlbnRyeSBfX3NlbnRyeShfX2lzKTsKKworICBpZiAoX19zZW50cnkpIHsKKyAgICBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19idWYgPSBfX2lzLnJkYnVmKCk7CisgICAgdHlwZWRlZiBjdHlwZTxfQ2hhclQ+IF9DX3R5cGU7CisKKyAgICBjb25zdCBsb2NhbGUmIF9fbG9jID0gX19pcy5nZXRsb2MoKTsKKyAgICBjb25zdCBfQ190eXBlJiBfQ3R5cGUgPSB1c2VfZmFjZXQ8X0NfdHlwZT4oX19sb2MpOworICAgIF9fcy5jbGVhcigpOworICAgIHN0cmVhbXNpemUgX193aWR0aCA9IF9faXMud2lkdGgoMCk7CisgICAgc2l6ZV90eXBlIF9fbjsKKyAgICBpZiAoX193aWR0aCA8PSAwKQorICAgICAgX19uID0gX19zLm1heF9zaXplKCk7CisgICAgLyogX193aWR0aCBjYW4gb25seSBvdmVyZmxvdyBzaXplX3R5cGUgaWYgc2l6ZW9mKHN0cmVhbXNpemUpID4gc2l6ZW9mKHNpemVfdHlwZSkKKyAgICAgKiBiZWNhdXNlIGhlcmUgd2Uga25vdyB0aGF0IF9fd2lkdGggaXMgcG9zaXRpdmUgYW5kIHRoZSBzdGF0dGljIGFzc2VydGlvbiBjaGVjaworICAgICAqIHRoYXQgc2l6ZV90eXBlIGlzIHVuc2lnbmVkLgorICAgICAqLworICAgIGVsc2UgaWYgKHNpemVvZihzdHJlYW1zaXplKSA+IHNpemVvZihzaXplX3R5cGUpICYmCisgICAgICAgICAgICAgKF9fd2lkdGggPiBfX1NUQVRJQ19DQVNUKHN0cmVhbXNpemUsIF9fcy5tYXhfc2l6ZSgpKSkpCisgICAgICBfX24gPSAwOworICAgIGVsc2UgeworICAgICAgX19uID0gX19TVEFUSUNfQ0FTVChzaXplX3R5cGUsIF9fd2lkdGgpOworICAgICAgX19zLnJlc2VydmUoX19uKTsKKyAgICB9CisKKyAgICB3aGlsZSAoX19uLS0gPiAwKSB7CisgICAgICB0eXBlbmFtZSBfVHJhaXRzOjppbnRfdHlwZSBfX2MxID0gX19idWYtPnNidW1wYygpOworICAgICAgaWYgKF9UcmFpdHM6OmVxX2ludF90eXBlKF9fYzEsIF9UcmFpdHM6OmVvZigpKSkgeworICAgICAgICBfX2lzLnNldHN0YXRlKF9faXN0cmVhbTo6ZW9mYml0KTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgX0NoYXJUIF9fYyA9IF9UcmFpdHM6OnRvX2NoYXJfdHlwZShfX2MxKTsKKworICAgICAgICBpZiAoX0N0eXBlLmlzKF9DX3R5cGU6OnNwYWNlLCBfX2MpKSB7CisgICAgICAgICAgaWYgKF9UcmFpdHM6OmVxX2ludF90eXBlKF9fYnVmLT5zcHV0YmFja2MoX19jKSwgX1RyYWl0czo6ZW9mKCkpKQorICAgICAgICAgICAgX19pcy5zZXRzdGF0ZShfX2lzdHJlYW06OmZhaWxiaXQpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICBfX3MucHVzaF9iYWNrKF9fYyk7CisgICAgICB9CisgICAgfQorCisgICAgLy8gSWYgd2UgaGF2ZSByZWFkIG5vIGNoYXJhY3RlcnMsIHRoZW4gc2V0IGZhaWxiaXQuCisgICAgaWYgKF9fcy5lbXB0eSgpKQorICAgICAgX19pcy5zZXRzdGF0ZShfX2lzdHJlYW06OmZhaWxiaXQpOworICB9CisgIGVsc2UKKyAgICBfX2lzLnNldHN0YXRlKF9faXN0cmVhbTo6ZmFpbGJpdCk7CisKKyAgcmV0dXJuIF9faXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX1NUTFBfQ0FMTAorZ2V0bGluZShiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisgICAgICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+JiBfX3MsCisgICAgICAgIF9DaGFyVCBfX2RlbGltKSB7CisgIHR5cGVkZWYgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+IF9faXN0cmVhbTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjpzaXplX3R5cGUgc2l6ZV90eXBlOworICBzaXplX3R5cGUgX19ucmVhZCA9IDA7CisgIHR5cGVuYW1lIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6c2VudHJ5IF9fc2VudHJ5KF9faXMsIHRydWUpOworICBpZiAoX19zZW50cnkpIHsKKyAgICBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19idWYgPSBfX2lzLnJkYnVmKCk7CisgICAgX19zLmNsZWFyKCk7CisKKyAgICB3aGlsZSAoX19ucmVhZCA8IF9fcy5tYXhfc2l6ZSgpKSB7CisgICAgICBpbnQgX19jMSA9IF9fYnVmLT5zYnVtcGMoKTsKKyAgICAgIGlmIChfVHJhaXRzOjplcV9pbnRfdHlwZShfX2MxLCBfVHJhaXRzOjplb2YoKSkpIHsKKyAgICAgICAgX19pcy5zZXRzdGF0ZShfX2lzdHJlYW06OmVvZmJpdCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgICsrX19ucmVhZDsKKyAgICAgICAgX0NoYXJUIF9fYyA9IF9UcmFpdHM6OnRvX2NoYXJfdHlwZShfX2MxKTsKKyAgICAgICAgaWYgKCFfVHJhaXRzOjplcShfX2MsIF9fZGVsaW0pKQorICAgICAgICAgIF9fcy5wdXNoX2JhY2soX19jKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgLy8gQ2hhcmFjdGVyIGlzIGV4dHJhY3RlZCBidXQgbm90IGFwcGVuZGVkLgorICAgICAgfQorICAgIH0KKyAgfQorICBpZiAoX19ucmVhZCA9PSAwIHx8IF9fbnJlYWQgPj0gX19zLm1heF9zaXplKCkpCisgICAgX19pcy5zZXRzdGF0ZShfX2lzdHJlYW06OmZhaWxiaXQpOworCisgIHJldHVybiBfX2lzOworfQorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNlbmRpZgorCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RsL19zdHJpbmdfaW8uaCBiL3N0bC9fc3RyaW5nX2lvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU1NDlmZQotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9fc3RyaW5nX2lvLmgKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5Ny0xOTk5CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX1NUUklOR19JT19ICisjZGVmaW5lIF9TVExQX1NUUklOR19JT19ICisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfT1NUUkVBTV9ICisjICBpbmNsdWRlIDxzdGwvX29zdHJlYW0uaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0lTVFJFQU0KKyMgIGluY2x1ZGUgPHN0bC9faXN0cmVhbS5oPgorI2VuZGlmCisKKy8vIEkvTy4KK19TVExQX0JFR0lOX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CitiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9TVExQX0NBTEwKK29wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorICAgICAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiYgX19zKTsKKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9URU1QTEFURV9FWFBSRVNTSU9OKQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2MsIGNsYXNzIF9MZWZ0LCBjbGFzcyBfUmlnaHQsIGNsYXNzIF9TdG9yYWdlRGlyPgorYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfU1RMUF9DQUxMCitvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKyAgICAgICAgICAgY29uc3QgX1NUTFBfUFJJViBfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfTGVmdCwgX1JpZ2h0LCBfU3RvcmFnZURpcj4mIF9fc3VtKSB7CisgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4gX190bXAoX19zdW0pOworICByZXR1cm4gX19vcyA8PCBfX3RtcDsKK30KKworI2VuZGlmIC8qIF9TVExQX1VTRV9URU1QTEFURV9FWFBSRVNTSU9OICovCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgIF9TVExQX0NBTEwKK29wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorICAgICAgICAgICBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiYgX19zKTsKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfU1RMUF9DQUxMCitnZXRsaW5lKGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKyAgICAgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz4mIF9fcywKKyAgICAgICAgX0NoYXJUIF9fZGVsaW0pOworCisjaWYgIShkZWZpbmVkIChfX0JPUkxBTkRDX18pICYmICFkZWZpbmVkIChfU1RMUF9VU0VfT1dOX05BTUVTUEFDRSkpCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK2lubGluZSBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9TVExQX0NBTEwKK2dldGxpbmUoYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorICAgICAgICBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiYgX19zKSB7CisgIHJldHVybiBnZXRsaW5lKF9faXMsIF9fcywgX19pcy53aWRlbignXG4nKSk7Cit9CisjZW5kaWYKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjaWYgIWRlZmluZWQgKF9TVExQX0xJTktfVElNRV9JTlNUQU5USUFUSU9OKQorIyAgaW5jbHVkZSA8c3RsL19zdHJpbmdfaW8uYz4KKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfU1RSSU5HX0lPX0ggKi8KZGlmZiAtLWdpdCBhL3N0bC9fc3RyaW5nX25wb3MuaCBiL3N0bC9fc3RyaW5nX25wb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWE5YzYyCi0tLSAvZGV2L251bGwKKysrIGIvc3RsL19zdHJpbmdfbnBvcy5oCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUKKyAqIEZyYW5jb2lzIER1bW9udAorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICovCisKKy8qIFRoaXMgaGVhZGVyIGNvbnRhaW5zIG5wb3MgZGVmaW5pdGlvbiB1c2VkIGluIGJhc2ljX3N0cmluZyBhbmQgcm9wZQorICogaW1wbGVtZW50YXRpb24uIEl0IGRvIG5vdCBoYXZlIHRvIGJlIGd1YXJkZWQgYXMgZmlsZXMgaW5jbHVkaW5nIGl0CisgKiBhcmUgYWxyZWFkeSBndWFyZGVkIGFuZCBpdCBoYXMgc29tZXRpbWVzIHRvIGJlIGluY2x1ZGVkIHNldmVyYWwgdGltZXMuCisgKi8KKworI2lmIGRlZmluZWQgKF9TVExQX1NUQVRJQ19DT05TVF9JTklUX0JVRykKKyAgZW51bSB7IG5wb3MgPSAtMSB9OworI2VsaWYgZGVmaW5lZCAoX19HTlVDX18pICYmIChfX0dOVUNfXyA9PSAyKSAmJiAoX19HTlVDX01JTk9SX18gPT0gOTYpCisgIC8vIGlubGluZSBpbml0aWFsaXplciBjb25mbGljdHMgd2l0aCAnZXh0ZXJuIHRlbXBsYXRlJworICBzdGF0aWMgY29uc3Qgc2l6ZV90IG5wb3M7CisjZWxzZQorICBzdGF0aWMgY29uc3Qgc2l6ZV90IG5wb3MgPSB+KHNpemVfdCkwOworI2VuZGlmCmRpZmYgLS1naXQgYS9zdGwvX3N0cmluZ19vcGVyYXRvcnMuaCBiL3N0bC9fc3RyaW5nX29wZXJhdG9ycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZjEzYWYKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvX3N0cmluZ19vcGVyYXRvcnMuaApAQCAtMCwwICsxLDYwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMworICogRnJhbmNvaXMgRHVtb250CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfU1RSSU5HX09QRVJBVE9SU19ICisjZGVmaW5lIF9TVExQX1NUUklOR19PUEVSQVRPUlNfSAorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworI2lmICFkZWZpbmVkIChfU1RMUF9VU0VfVEVNUExBVEVfRVhQUkVTU0lPTikKKworIyAgaWYgZGVmaW5lZCAoX19HTlVDX18pIHx8IGRlZmluZWQgKF9fTUxDQ1BQX18pCisjICAgIGRlZmluZSBfU1RMUF9JTklUX0FNQklHVUlUWSAxCisjICBlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz4gX1NUTFBfQ0FMTAorb3BlcmF0b3IrKGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+JiBfX3MsCisgICAgICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz4mIF9feSkgeworICB0eXBlZGVmIGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+IF9TdHI7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1N0cjo6X1Jlc2VydmVfdCBfUmVzZXJ2ZV90OworIyAgaWYgZGVmaW5lZCAoX1NUTFBfSU5JVF9BTUJJR1VJVFkpCisgIC8vIGdjYyBjb3VudHMgdGhpcyBhcyBhIGZ1bmN0aW9uCisgIF9TdHIgX19yZXN1bHQgID0gX1N0cihfUmVzZXJ2ZV90KCksIF9fcy5zaXplKCkgKyBfX3kuc2l6ZSgpLCBfX3MuZ2V0X2FsbG9jYXRvcigpKTsKKyMgIGVsc2UKKyAgX1N0ciBfX3Jlc3VsdChfUmVzZXJ2ZV90KCksIF9fcy5zaXplKCkgKyBfX3kuc2l6ZSgpLCBfX3MuZ2V0X2FsbG9jYXRvcigpKTsKKyMgIGVuZGlmCisgIF9fcmVzdWx0LmFwcGVuZChfX3MpOworICBfX3Jlc3VsdC5hcHBlbmQoX195KTsKKyAgcmV0dXJuIF9fcmVzdWx0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz4gX1NUTFBfQ0FMTAorb3BlcmF0b3IrKGNvbnN0IF9DaGFyVCogX19zLAorICAgICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+JiBfX3kpIHsKKyAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKKyAgdHlwZWRlZiBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiBfU3RyOworICB0eXBlZGVmIHR5cGVuYW1lIF9TdHI6Ol9SZXNlcnZlX3QgX1Jlc2VydmVfdDsKKyAgY29uc3Qgc2l6ZV90IF9fbiA9IF9UcmFpdHM6Omxlbmd0aChfX3MpOworIyAgaWYgZGVmaW5lZCAoX1NUTFBfSU5JVF9BTUJJR1VJVFkpCisgIF9TdHIgX19yZXN1bHQgPSBfU3RyKF9SZXNlcnZlX3QoKSwgX19uICsgX195LnNpemUoKSwgX195LmdldF9hbGxvY2F0b3IoKSk7CisjICBlbHNlCisgIF9TdHIgX19yZXN1bHQoX1Jlc2VydmVfdCgpLCBfX24gKyBfX3kuc2l6ZSgpLCBfX3kuZ2V0X2FsbG9jYXRvcigpKTsKKyMgIGVuZGlmCisgIF9fcmVzdWx0LmFwcGVuZChfX3MsIF9fcyArIF9fbik7CisgIF9fcmVzdWx0LmFwcGVuZChfX3kpOworICByZXR1cm4gX19yZXN1bHQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK2lubGluZSBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiBfU1RMUF9DQUxMCitvcGVyYXRvcisoX0NoYXJUIF9fYywKKyAgICAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiYgX195KSB7CisgIHR5cGVkZWYgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz4gX1N0cjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfU3RyOjpfUmVzZXJ2ZV90IF9SZXNlcnZlX3Q7CisjICBpZiBkZWZpbmVkIChfU1RMUF9JTklUX0FNQklHVUlUWSkKKyAgX1N0ciBfX3Jlc3VsdCA9IF9TdHIoX1Jlc2VydmVfdCgpLCAxICsgX195LnNpemUoKSwgX195LmdldF9hbGxvY2F0b3IoKSk7CisjICBlbHNlCisgIF9TdHIgX19yZXN1bHQoX1Jlc2VydmVfdCgpLCAxICsgX195LnNpemUoKSwgX195LmdldF9hbGxvY2F0b3IoKSk7CisjICBlbmRpZgorICBfX3Jlc3VsdC5wdXNoX2JhY2soX19jKTsKKyAgX19yZXN1bHQuYXBwZW5kKF9feSk7CisgIHJldHVybiBfX3Jlc3VsdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgoraW5saW5lIGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+IF9TVExQX0NBTEwKK29wZXJhdG9yKyhjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiYgX194LAorICAgICAgICAgIGNvbnN0IF9DaGFyVCogX19zKSB7CisgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgIHR5cGVkZWYgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz4gX1N0cjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfU3RyOjpfUmVzZXJ2ZV90IF9SZXNlcnZlX3Q7CisgIGNvbnN0IHNpemVfdCBfX24gPSBfVHJhaXRzOjpsZW5ndGgoX19zKTsKKyMgIGlmIGRlZmluZWQgKF9TVExQX0lOSVRfQU1CSUdVSVRZKQorICBfU3RyIF9fcmVzdWx0ID0gX1N0cihfUmVzZXJ2ZV90KCksIF9feC5zaXplKCkgKyBfX24sIF9feC5nZXRfYWxsb2NhdG9yKCkpOworIyAgZWxzZQorICBfU3RyIF9fcmVzdWx0KF9SZXNlcnZlX3QoKSwgX194LnNpemUoKSArIF9fbiwgX194LmdldF9hbGxvY2F0b3IoKSk7CisjICBlbmRpZgorICBfX3Jlc3VsdC5hcHBlbmQoX194KTsKKyAgX19yZXN1bHQuYXBwZW5kKF9fcywgX19zICsgX19uKTsKKyAgcmV0dXJuIF9fcmVzdWx0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz4gX1NUTFBfQ0FMTAorb3BlcmF0b3IrKGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+JiBfX3gsCisgICAgICAgICAgY29uc3QgX0NoYXJUIF9fYykgeworICB0eXBlZGVmIGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+IF9TdHI7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1N0cjo6X1Jlc2VydmVfdCBfUmVzZXJ2ZV90OworIyAgaWYgZGVmaW5lZCAoX1NUTFBfSU5JVF9BTUJJR1VJVFkpCisgIF9TdHIgX19yZXN1bHQgPSBfU3RyKF9SZXNlcnZlX3QoKSwgX194LnNpemUoKSArIDEsIF9feC5nZXRfYWxsb2NhdG9yKCkpOworIyAgZWxzZQorICBfU3RyIF9fcmVzdWx0KF9SZXNlcnZlX3QoKSwgX194LnNpemUoKSArIDEsIF9feC5nZXRfYWxsb2NhdG9yKCkpOworIyAgZW5kaWYKKyAgX19yZXN1bHQuYXBwZW5kKF9feCk7CisgIF9fcmVzdWx0LnB1c2hfYmFjayhfX2MpOworICByZXR1cm4gX19yZXN1bHQ7Cit9CisKKyMgIHVuZGVmIF9TVExQX0lOSVRfQU1CSUdVSVRZCisKKyNlbHNlIC8qIF9TVExQX1VTRV9URU1QTEFURV9FWFBSRVNTSU9OICovCisKKy8vIGFkZGl0aW9uIHdpdGggYmFzaWNfc3RyaW5nCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgX1NUTFBfUFJJViBfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fYnN0cl93cmFwcGVyPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX19ic3RyX3N1bTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX19ic3RyX3dyYXBwZXI8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX19zdW1fc3RvcmFnZV9lbGVtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX19vbl9yaWdodD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX19vbl9yaWdodD4gX1NUTFBfQ0FMTAorb3BlcmF0b3IrKGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+JiBfX2xocywKKyAgICAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiYgX19yaHMpIHsKKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9TVExQX1BSSVYgX19ic3RyX3dyYXBwZXI8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX19zdW1fc3RvcmFnZV9lbGVtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX19vbl9yaWdodD4gX19yb290X3R5cGU7CisgIF9fcm9vdF90eXBlIF9fcm9vdChfX3JocywgX1NUTFBfUFJJViBfX3N1bV9zdG9yYWdlX2VsZW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+KF9fbGhzLmdldF9hbGxvY2F0b3IoKSkpOworICByZXR1cm4gX1NUTFBfUFJJViBfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfU1RMUF9QUklWIF9fYnN0cl93cmFwcGVyPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcm9vdF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fb25fcmlnaHQ+KF9fbGhzLCBfX3Jvb3QpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2MsIGNsYXNzIF9MZWZ0LCBjbGFzcyBfUmlnaHQsIGNsYXNzIF9TdG9yYWdlRGlyPgoraW5saW5lIF9TVExQX1BSSVYgX19ic3RyX3N1bTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfX2JzdHJfd3JhcHBlcjxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9MZWZ0LCBfUmlnaHQsIF9TdG9yYWdlRGlyPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfX29uX3JpZ2h0PiBfU1RMUF9DQUxMCitvcGVyYXRvcisoY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz4mIF9fbGhzLAorICAgICAgICAgIGNvbnN0IF9TVExQX1BSSVYgX19ic3RyX3N1bTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0xlZnQsIF9SaWdodCwgX1N0b3JhZ2VEaXI+JiBfX3JocykgeworICByZXR1cm4gX1NUTFBfUFJJViBfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfU1RMUF9QUklWIF9fYnN0cl93cmFwcGVyPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX19ic3RyX3N1bTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0xlZnQsIF9SaWdodCwgX1N0b3JhZ2VEaXI+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fb25fcmlnaHQ+KF9fbGhzLCBfX3Jocyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYywgY2xhc3MgX0xlZnQsIGNsYXNzIF9SaWdodCwgY2xhc3MgX1N0b3JhZ2VEaXI+CitpbmxpbmUgX1NUTFBfUFJJViBfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9MZWZ0LCBfUmlnaHQsIF9TdG9yYWdlRGlyPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfX2JzdHJfd3JhcHBlcjxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fb25fbGVmdD4gX1NUTFBfQ0FMTAorb3BlcmF0b3IrKGNvbnN0IF9TVExQX1BSSVYgX19ic3RyX3N1bTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0xlZnQsIF9SaWdodCwgX1N0b3JhZ2VEaXI+JiBfX2xocywKKyAgICAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiYgX19yaHMpIHsKKyAgcmV0dXJuIF9TVExQX1BSSVYgX19ic3RyX3N1bTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX1NUTFBfUFJJViBfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfTGVmdCwgX1JpZ2h0LCBfU3RvcmFnZURpcj4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX19ic3RyX3dyYXBwZXI8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfX29uX2xlZnQ+KF9fbGhzLCBfX3Jocyk7Cit9CisKKy8vIGFkZGl0aW9uIHdpdGggQyBzdHJpbmcKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK2lubGluZSBfU1RMUF9QUklWIF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX19ic3RyX3dyYXBwZXI8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfX2NzdHJfd3JhcHBlcjxfQ2hhclQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfX3N1bV9zdG9yYWdlX2VsZW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfX29uX3JpZ2h0PiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfX29uX3JpZ2h0PiBfU1RMUF9DQUxMCitvcGVyYXRvcisoY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz4mIF9feCwKKyAgICAgICAgICBjb25zdCBfQ2hhclQqIF9fcykgeworICBjb25zdCBzaXplX3QgX19uID0gX1RyYWl0czo6bGVuZ3RoKF9fcyk7CisgIHR5cGVkZWYgX1NUTFBfUFJJViBfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfU1RMUF9QUklWIF9fY3N0cl93cmFwcGVyPF9DaGFyVD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fc3VtX3N0b3JhZ2VfZWxlbTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fb25fcmlnaHQ+IF9fcm9vdF90eXBlOworICBfX3Jvb3RfdHlwZSBfX3Jvb3QoX1NUTFBfUFJJViBfX2NzdHJfd3JhcHBlcjxfQ2hhclQ+KF9fcywgX19uKSwgX1NUTFBfUFJJViBfX3N1bV9zdG9yYWdlX2VsZW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+KF9feC5nZXRfYWxsb2NhdG9yKCkpKTsKKyAgcmV0dXJuIF9TVExQX1BSSVYgX19ic3RyX3N1bTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX1NUTFBfUFJJViBfX2JzdHJfd3JhcHBlcjxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3Jvb3RfdHlwZSwgX1NUTFBfUFJJViBfX29uX3JpZ2h0PihfX3gsIF9fcm9vdCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK2lubGluZSBfU1RMUF9QUklWIF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX19jc3RyX3dyYXBwZXI8X0NoYXJUPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfX2JzdHJfd3JhcHBlcjxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfX3N1bV9zdG9yYWdlX2VsZW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfX29uX3JpZ2h0PiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfX29uX3JpZ2h0PiBfU1RMUF9DQUxMCitvcGVyYXRvcisoY29uc3QgX0NoYXJUKiBfX3MsCisgICAgICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz4mIF9feSkgeworICBjb25zdCBzaXplX3QgX19uID0gX1RyYWl0czo6bGVuZ3RoKF9fcyk7CisgIHR5cGVkZWYgX1NUTFBfUFJJViBfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfU1RMUF9QUklWIF9fYnN0cl93cmFwcGVyPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fc3VtX3N0b3JhZ2VfZWxlbTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fb25fcmlnaHQ+IF9fcm9vdF90eXBlOworICBfX3Jvb3RfdHlwZSBfX3Jvb3QoX195LCBfU1RMUF9QUklWIF9fc3VtX3N0b3JhZ2VfZWxlbTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4oX195LmdldF9hbGxvY2F0b3IoKSkpOworICByZXR1cm4gX1NUTFBfUFJJViBfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfU1RMUF9QUklWIF9fY3N0cl93cmFwcGVyPF9DaGFyVD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcm9vdF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fb25fcmlnaHQ+KF9TVExQX1BSSVYgX19jc3RyX3dyYXBwZXI8X0NoYXJUPihfX3MsIF9fbiksIF9fcm9vdCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYywgY2xhc3MgX0xlZnQsIGNsYXNzIF9SaWdodCwgY2xhc3MgX1N0b3JhZ2VEaXI+CitpbmxpbmUgX1NUTFBfUFJJViBfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9MZWZ0LCBfUmlnaHQsIF9TdG9yYWdlRGlyPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfX2NzdHJfd3JhcHBlcjxfQ2hhclQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fb25fbGVmdD4gX1NUTFBfQ0FMTAorb3BlcmF0b3IrKGNvbnN0IF9TVExQX1BSSVYgX19ic3RyX3N1bTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0xlZnQsIF9SaWdodCwgX1N0b3JhZ2VEaXI+JiBfX3gsCisgICAgICAgICAgY29uc3QgX0NoYXJUKiBfX3MpIHsKKyAgY29uc3Qgc2l6ZV90IF9fbiA9IF9UcmFpdHM6Omxlbmd0aChfX3MpOworICByZXR1cm4gX1NUTFBfUFJJViBfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfU1RMUF9QUklWIF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9MZWZ0LCBfUmlnaHQsIF9TdG9yYWdlRGlyPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfX2NzdHJfd3JhcHBlcjxfQ2hhclQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fb25fbGVmdD4oX194LCBfU1RMUF9QUklWIF9fY3N0cl93cmFwcGVyPF9DaGFyVD4oX19zLCBfX24pKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jLCBjbGFzcyBfTGVmdCwgY2xhc3MgX1JpZ2h0LCBjbGFzcyBfU3RvcmFnZURpcj4KK2lubGluZSBfU1RMUF9QUklWIF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX19jc3RyX3dyYXBwZXI8X0NoYXJUPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfTGVmdCwgX1JpZ2h0LCBfU3RvcmFnZURpcj4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX19vbl9yaWdodD4gX1NUTFBfQ0FMTAorb3BlcmF0b3IrKGNvbnN0IF9DaGFyVCogX19zLAorICAgICAgICAgIGNvbnN0IF9TVExQX1BSSVYgX19ic3RyX3N1bTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0xlZnQsIF9SaWdodCwgX1N0b3JhZ2VEaXI+JiBfX3kpIHsKKyAgY29uc3Qgc2l6ZV90IF9fbiA9IF9UcmFpdHM6Omxlbmd0aChfX3MpOworICByZXR1cm4gX1NUTFBfUFJJViBfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfU1RMUF9QUklWIF9fY3N0cl93cmFwcGVyPF9DaGFyVD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX19ic3RyX3N1bTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0xlZnQsIF9SaWdodCwgX1N0b3JhZ2VEaXI+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fb25fcmlnaHQ+KF9TVExQX1BSSVYgX19jc3RyX3dyYXBwZXI8X0NoYXJUPihfX3MsIF9fbiksIF9feSk7Cit9CisKKy8vIGFkZGl0aW9uIHdpdGggY2hhcgordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgoraW5saW5lIF9TVExQX1BSSVYgX19ic3RyX3N1bTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfX2JzdHJfd3JhcHBlcjxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fY2hhcl93cmFwcGVyPF9DaGFyVD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fc3VtX3N0b3JhZ2VfZWxlbTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fb25fcmlnaHQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fb25fcmlnaHQ+IF9TVExQX0NBTEwKK29wZXJhdG9yKyhjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiYgX194LCBjb25zdCBfQ2hhclQgX19jKSB7CisgIHR5cGVkZWYgX1NUTFBfUFJJViBfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfU1RMUF9QUklWIF9fY2hhcl93cmFwcGVyPF9DaGFyVD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fc3VtX3N0b3JhZ2VfZWxlbTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fb25fcmlnaHQ+IF9fcm9vdF90eXBlOworICBfX3Jvb3RfdHlwZSBfX3Jvb3QoX19jLCBfU1RMUF9QUklWIF9fc3VtX3N0b3JhZ2VfZWxlbTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4oX194LmdldF9hbGxvY2F0b3IoKSkpOworICByZXR1cm4gX1NUTFBfUFJJViBfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfU1RMUF9QUklWIF9fYnN0cl93cmFwcGVyPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcm9vdF90eXBlLCBfU1RMUF9QUklWIF9fb25fcmlnaHQ+KF9feCwgX19yb290KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgoraW5saW5lIF9TVExQX1BSSVYgX19ic3RyX3N1bTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfX2NoYXJfd3JhcHBlcjxfQ2hhclQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fYnN0cl93cmFwcGVyPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fc3VtX3N0b3JhZ2VfZWxlbTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fb25fcmlnaHQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fb25fcmlnaHQ+IF9TVExQX0NBTEwKK29wZXJhdG9yKyhjb25zdCBfQ2hhclQgX19jLCBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiYgX194KSB7CisgIHR5cGVkZWYgX1NUTFBfUFJJViBfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfU1RMUF9QUklWIF9fYnN0cl93cmFwcGVyPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fc3VtX3N0b3JhZ2VfZWxlbTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fb25fcmlnaHQ+IF9fcm9vdF90eXBlOworICBfX3Jvb3RfdHlwZSBfX3Jvb3QoX194LCBfU1RMUF9QUklWIF9fc3VtX3N0b3JhZ2VfZWxlbTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4oX194LmdldF9hbGxvY2F0b3IoKSkpOworICByZXR1cm4gX1NUTFBfUFJJViBfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfU1RMUF9QUklWIF9fY2hhcl93cmFwcGVyPF9DaGFyVD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcm9vdF90eXBlLCBfU1RMUF9QUklWIF9fb25fcmlnaHQ+KF9fYywgX19yb290KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jLCBjbGFzcyBfTGVmdCwgY2xhc3MgX1JpZ2h0LCBjbGFzcyBfU3RvcmFnZURpcj4KK2lubGluZSBfU1RMUF9QUklWIF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX19ic3RyX3N1bTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0xlZnQsIF9SaWdodCwgX1N0b3JhZ2VEaXI+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fY2hhcl93cmFwcGVyPF9DaGFyVD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX19vbl9sZWZ0PiBfU1RMUF9DQUxMCitvcGVyYXRvcisoY29uc3QgX1NUTFBfUFJJViBfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfTGVmdCwgX1JpZ2h0LCBfU3RvcmFnZURpcj4mIF9feCwgY29uc3QgX0NoYXJUIF9fYykgeworICByZXR1cm4gX1NUTFBfUFJJViBfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfU1RMUF9QUklWIF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9MZWZ0LCBfUmlnaHQsIF9TdG9yYWdlRGlyPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfX2NoYXJfd3JhcHBlcjxfQ2hhclQ+LCBfU1RMUF9QUklWIF9fb25fbGVmdD4oX194LCBfX2MpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2MsIGNsYXNzIF9MZWZ0LCBjbGFzcyBfUmlnaHQsIGNsYXNzIF9TdG9yYWdlRGlyPgoraW5saW5lIF9TVExQX1BSSVYgX19ic3RyX3N1bTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX1NUTFBfUFJJViBfX2NoYXJfd3JhcHBlcjxfQ2hhclQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfTGVmdCwgX1JpZ2h0LCBfU3RvcmFnZURpcj4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fb25fcmlnaHQ+IF9TVExQX0NBTEwKK29wZXJhdG9yKyhjb25zdCBfQ2hhclQgX19jLCBjb25zdCBfU1RMUF9QUklWIF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9MZWZ0LCBfUmlnaHQsIF9TdG9yYWdlRGlyPiYgX194KSB7CisgIHJldHVybiBfU1RMUF9QUklWIF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9TVExQX1BSSVYgX19jaGFyX3dyYXBwZXI8X0NoYXJUPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfTGVmdCwgX1JpZ2h0LCBfU3RvcmFnZURpcj4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX19vbl9yaWdodD4oX19jLCBfX3gpOworfQorCisjZW5kaWYgLyogX1NUTFBfVVNFX1RFTVBMQVRFX0VYUFJFU1NJT04gKi8KKworLy8gT3BlcmF0b3I9PSBhbmQgb3BlcmF0b3IhPQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMCitvcGVyYXRvcj09KGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+JiBfX3gsCisgICAgICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+JiBfX3kpIHsKKyAgcmV0dXJuIF9feC5zaXplKCkgPT0gX195LnNpemUoKSAmJiBfVHJhaXRzOjpjb21wYXJlKF9feC5kYXRhKCksIF9feS5kYXRhKCksIF9feC5zaXplKCkpID09IDA7Cit9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfVEVNUExBVEVfRVhQUkVTU0lPTikKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYywgY2xhc3MgX0xocywgY2xhc3MgX1JocywgY2xhc3MgX1N0b3JlRGlyPgoraW5saW5lIGJvb2wgX1NUTFBfQ0FMTAorb3BlcmF0b3I9PShjb25zdCBfU1RMUF9QUklWIF9fYnN0cl9zdW08X0NoYXJULF9UcmFpdHMsX0FsbG9jLF9MaHMsX1JocyxfU3RvcmVEaXI+JiBfX3gsCisgICAgICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+JiBfX3kpIHsKKyAgcmV0dXJuIF9feC5zaXplKCkgPT0gX195LnNpemUoKSAmJiBfVHJhaXRzOjpjb21wYXJlKF9feC5kYXRhKCksIF9feS5kYXRhKCksIF9feC5zaXplKCkpID09IDA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYywgY2xhc3MgX0xocywgY2xhc3MgX1JocywgY2xhc3MgX1N0b3JlRGlyPgoraW5saW5lIGJvb2wgX1NUTFBfQ0FMTAorb3BlcmF0b3I9PShjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiYgX194LAorICAgICAgICAgICBjb25zdCBfU1RMUF9QUklWIF9fYnN0cl9zdW08X0NoYXJULF9UcmFpdHMsX0FsbG9jLF9MaHMsX1JocyxfU3RvcmVEaXI+JiBfX3kpIHsKKyAgcmV0dXJuIF9feC5zaXplKCkgPT0gX195LnNpemUoKSAmJiBfVHJhaXRzOjpjb21wYXJlKF9feC5kYXRhKCksIF9feS5kYXRhKCksIF9feC5zaXplKCkpID09IDA7Cit9CisjZW5kaWYgLyogX1NUTFBfVVNFX1RFTVBMQVRFX0VYUFJFU1NJT04gKi8KKworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMCitvcGVyYXRvcj09KGNvbnN0IF9DaGFyVCogX19zLAorICAgICAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiYgX195KSB7CisgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgIHNpemVfdCBfX24gPSBfVHJhaXRzOjpsZW5ndGgoX19zKTsKKyAgcmV0dXJuIF9fbiA9PSBfX3kuc2l6ZSgpICYmIF9UcmFpdHM6OmNvbXBhcmUoX19zLCBfX3kuZGF0YSgpLCBfX24pID09IDA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK2lubGluZSBib29sIF9TVExQX0NBTEwKK29wZXJhdG9yPT0oY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz4mIF9feCwKKyAgICAgICAgICAgY29uc3QgX0NoYXJUKiBfX3MpIHsKKyAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKKyAgc2l6ZV90IF9fbiA9IF9UcmFpdHM6Omxlbmd0aChfX3MpOworICByZXR1cm4gX194LnNpemUoKSA9PSBfX24gJiYgX1RyYWl0czo6Y29tcGFyZShfX3guZGF0YSgpLCBfX3MsIF9fbikgPT0gMDsKK30KKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9URU1QTEFURV9FWFBSRVNTSU9OKQordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jLCBjbGFzcyBfTGhzLCBjbGFzcyBfUmhzLCBjbGFzcyBfU3RvcmVEaXI+CitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMCitvcGVyYXRvcj09KGNvbnN0IF9DaGFyVCogX19zLAorICAgICAgICAgICBjb25zdCBfU1RMUF9QUklWIF9fYnN0cl9zdW08X0NoYXJULF9UcmFpdHMsX0FsbG9jLF9MaHMsX1JocyxfU3RvcmVEaXI+JiBfX3kpIHsKKyAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKKyAgc2l6ZV90IF9fbiA9IF9UcmFpdHM6Omxlbmd0aChfX3MpOworICByZXR1cm4gX19uID09IF9feS5zaXplKCkgJiYgX1RyYWl0czo6Y29tcGFyZShfX3MsIF9feS5kYXRhKCksIF9fbikgPT0gMDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jLCBjbGFzcyBfTGhzLCBjbGFzcyBfUmhzLCBjbGFzcyBfU3RvcmVEaXI+CitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMCitvcGVyYXRvcj09KGNvbnN0IF9TVExQX1BSSVYgX19ic3RyX3N1bTxfQ2hhclQsX1RyYWl0cyxfQWxsb2MsX0xocyxfUmhzLF9TdG9yZURpcj4mIF9feCwKKyAgICAgICAgICAgY29uc3QgX0NoYXJUKiBfX3MpIHsKKyAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKKyAgc2l6ZV90IF9fbiA9IF9UcmFpdHM6Omxlbmd0aChfX3MpOworICByZXR1cm4gX194LnNpemUoKSA9PSBfX24gJiYgX1RyYWl0czo6Y29tcGFyZShfX3guZGF0YSgpLCBfX3MsIF9fbikgPT0gMDsKK30KKyNlbmRpZiAvKiBfU1RMUF9VU0VfVEVNUExBVEVfRVhQUkVTU0lPTiAqLworCisvLyBPcGVyYXRvcjwgKGFuZCBhbHNvID4sIDw9LCBhbmQgPj0pLgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMCitvcGVyYXRvcjwoY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz4mIF9feCwKKyAgICAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiYgX195KSB7CisgIHJldHVybiBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiA6Ol9NX2NvbXBhcmUoX194LmJlZ2luKCksIF9feC5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3kuYmVnaW4oKSwgX195LmVuZCgpKSA8IDA7Cit9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfVEVNUExBVEVfRVhQUkVTU0lPTikKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYywgY2xhc3MgX0xocywgY2xhc3MgX1JocywgY2xhc3MgX1N0b3JlRGlyPgoraW5saW5lIGJvb2wgX1NUTFBfQ0FMTAorb3BlcmF0b3I8KGNvbnN0IF9TVExQX1BSSVYgX19ic3RyX3N1bTxfQ2hhclQsX1RyYWl0cyxfQWxsb2MsX0xocyxfUmhzLF9TdG9yZURpcj4mIF9feCwKKyAgICAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiYgX195KSB7CisgIHJldHVybiBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiA6Ol9NX2NvbXBhcmUoX194LmJlZ2luKCksIF9feC5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3kuYmVnaW4oKSwgX195LmVuZCgpKSA8IDA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYywgY2xhc3MgX0xocywgY2xhc3MgX1JocywgY2xhc3MgX1N0b3JlRGlyPgoraW5saW5lIGJvb2wgX1NUTFBfQ0FMTAorb3BlcmF0b3I8KGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+JiBfX3gsCisgICAgICAgICAgY29uc3QgX1NUTFBfUFJJViBfX2JzdHJfc3VtPF9DaGFyVCxfVHJhaXRzLF9BbGxvYyxfTGhzLF9SaHMsX1N0b3JlRGlyPiYgX195KSB7CisgIHJldHVybiBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiA6Ol9NX2NvbXBhcmUoX194LmJlZ2luKCksIF9feC5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3kuYmVnaW4oKSwgX195LmVuZCgpKSA8IDA7Cit9CisjZW5kaWYgLyogX1NUTFBfVVNFX1RFTVBMQVRFX0VYUFJFU1NJT04gKi8KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgoraW5saW5lIGJvb2wgX1NUTFBfQ0FMTAorb3BlcmF0b3I8KGNvbnN0IF9DaGFyVCogX19zLAorICAgICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+JiBfX3kpIHsKKyAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKKyAgc2l6ZV90IF9fbiA9IF9UcmFpdHM6Omxlbmd0aChfX3MpOworICByZXR1cm4gYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz4gOjpfTV9jb21wYXJlKF9fcywgX19zICsgX19uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9feS5iZWdpbigpLCBfX3kuZW5kKCkpIDwgMDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgoraW5saW5lIGJvb2wgX1NUTFBfQ0FMTAorb3BlcmF0b3I8KGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+JiBfX3gsCisgICAgICAgICAgY29uc3QgX0NoYXJUKiBfX3MpIHsKKyAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKKyAgc2l6ZV90IF9fbiA9IF9UcmFpdHM6Omxlbmd0aChfX3MpOworICByZXR1cm4gYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz4gOjpfTV9jb21wYXJlKF9feC5iZWdpbigpLCBfX3guZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19zLCBfX3MgKyBfX24pIDwgMDsKK30KKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9URU1QTEFURV9FWFBSRVNTSU9OKQordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jLCBjbGFzcyBfTGhzLCBjbGFzcyBfUmhzLCBjbGFzcyBfU3RvcmVEaXI+CitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMCitvcGVyYXRvcjwoY29uc3QgX0NoYXJUKiBfX3MsCisgICAgICAgICAgY29uc3QgX1NUTFBfUFJJViBfX2JzdHJfc3VtPF9DaGFyVCxfVHJhaXRzLF9BbGxvYyxfTGhzLF9SaHMsX1N0b3JlRGlyPiYgX195KSB7CisgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgIHNpemVfdCBfX24gPSBfVHJhaXRzOjpsZW5ndGgoX19zKTsKKyAgcmV0dXJuIGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+IDo6X01fY29tcGFyZShfX3MsIF9fcyArIF9fbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3kuYmVnaW4oKSwgX195LmVuZCgpKSA8IDA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYywgY2xhc3MgX0xocywgY2xhc3MgX1JocywgY2xhc3MgX1N0b3JlRGlyPgoraW5saW5lIGJvb2wgX1NUTFBfQ0FMTAorb3BlcmF0b3I8KGNvbnN0IF9TVExQX1BSSVYgX19ic3RyX3N1bTxfQ2hhclQsX1RyYWl0cyxfQWxsb2MsX0xocyxfUmhzLF9TdG9yZURpcj4mIF9feCwKKyAgICAgICAgICBjb25zdCBfQ2hhclQqIF9fcykgeworICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKQorICBzaXplX3QgX19uID0gX1RyYWl0czo6bGVuZ3RoKF9fcyk7CisgIHJldHVybiBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiA6Ol9NX2NvbXBhcmUoX194LmJlZ2luKCksIF9feC5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3MsIF9fcyArIF9fbikgPCAwOworfQorI2VuZGlmIC8qIF9TVExQX1VTRV9URU1QTEFURV9FWFBSRVNTSU9OICovCisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfU0VQQVJBVEVfUkVMT1BTX05BTUVTUEFDRSkKKworLyogT25seSBkZWZpbmVkIGlmIF9TVExQX1VTRV9TRVBBUkFURV9SRUxPUFNfTkFNRVNQQUNFIGlzIGRlZmluZWQgb3RoZXJ3aXNlCisgKiBpdCBtaWdodCBpbnRyb2R1Y2UgYW1iaWd1aXR5IHdpdGggcHVyZSB0ZW1wbGF0ZSByZWxhdGlvbmFsIG9wZXJhdG9ycworICogZnJvbSByZWxfb3BzIG5hbWVzcGFjZS4KKyAqLwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgoraW5saW5lIGJvb2wgX1NUTFBfQ0FMTAorb3BlcmF0b3IhPShjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiYgX194LAorICAgICAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiYgX195KQoreyByZXR1cm4gIShfX3ggPT0gX195KTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMCitvcGVyYXRvcj4oY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz4mIF9feCwKKyAgICAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiYgX195KQoreyByZXR1cm4gX195IDwgX194OyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK2lubGluZSBib29sIF9TVExQX0NBTEwKK29wZXJhdG9yPD0oY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz4mIF9feCwKKyAgICAgICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz4mIF9feSkKK3sgcmV0dXJuICEoX195IDwgX194KTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMCitvcGVyYXRvcj49KGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+JiBfX3gsCisgICAgICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+JiBfX3kpCit7IHJldHVybiAhKF9feCA8IF9feSk7IH0KKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1RFTVBMQVRFX0VYUFJFU1NJT04pCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2MsIGNsYXNzIF9MaHMsIGNsYXNzIF9SaHMsIGNsYXNzIF9TdG9yZURpcj4KK2lubGluZSBib29sIF9TVExQX0NBTEwKK29wZXJhdG9yIT0oY29uc3QgX1NUTFBfUFJJViBfX2JzdHJfc3VtPF9DaGFyVCxfVHJhaXRzLF9BbGxvYyxfTGhzLF9SaHMsX1N0b3JlRGlyPiYgX194LAorICAgICAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiYgX195KQoreyByZXR1cm4gIShfX3g9PV9feSk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jLCBjbGFzcyBfTGhzLCBjbGFzcyBfUmhzLCBjbGFzcyBfU3RvcmVEaXI+CitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMCitvcGVyYXRvciE9KGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+JiBfX3gsCisgICAgICAgICAgIGNvbnN0IF9TVExQX1BSSVYgX19ic3RyX3N1bTxfQ2hhclQsX1RyYWl0cyxfQWxsb2MsX0xocyxfUmhzLF9TdG9yZURpcj4mIF9feSkKK3sgcmV0dXJuICEoX194PT1fX3kpOyB9CisjICBlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfVVNFX1NFUEFSQVRFX1JFTE9QU19OQU1FU1BBQ0UgKi8KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgoraW5saW5lIGJvb2wgX1NUTFBfQ0FMTAorb3BlcmF0b3IhPShjb25zdCBfQ2hhclQqIF9fcywKKyAgICAgICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz4mIF9feSkgeworICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKQorICByZXR1cm4gIShfX3MgPT0gX195KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgoraW5saW5lIGJvb2wgX1NUTFBfQ0FMTAorb3BlcmF0b3IhPShjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiYgX194LAorICAgICAgICAgICBjb25zdCBfQ2hhclQqIF9fcykgeworICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKQorICByZXR1cm4gIShfX3ggPT0gX19zKTsKK30KKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9URU1QTEFURV9FWFBSRVNTSU9OKQordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jLCBjbGFzcyBfTGhzLCBjbGFzcyBfUmhzLCBjbGFzcyBfU3RvcmVEaXI+CitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMCitvcGVyYXRvciE9KGNvbnN0IF9DaGFyVCogX19zLAorICAgICAgICAgICBjb25zdCBfU1RMUF9QUklWIF9fYnN0cl9zdW08X0NoYXJULF9UcmFpdHMsX0FsbG9jLF9MaHMsX1JocyxfU3RvcmVEaXI+JiBfX3kpIHsKKyAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKKyAgcmV0dXJuICEoX19zID09IF9feSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYywgY2xhc3MgX0xocywgY2xhc3MgX1JocywgY2xhc3MgX1N0b3JlRGlyPgoraW5saW5lIGJvb2wgX1NUTFBfQ0FMTAorb3BlcmF0b3IhPShjb25zdCBfU1RMUF9QUklWIF9fYnN0cl9zdW08X0NoYXJULF9UcmFpdHMsX0FsbG9jLF9MaHMsX1JocyxfU3RvcmVEaXI+JiBfX3gsCisgICAgICAgICAgIGNvbnN0IF9DaGFyVCogX19zKSB7CisgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgIHJldHVybiAhKF9feCA9PSBfX3MpOworfQorI2VuZGlmIC8qIF9TVExQX1VTRV9URU1QTEFURV9FWFBSRVNTSU9OICovCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK2lubGluZSBib29sIF9TVExQX0NBTEwKK29wZXJhdG9yPihjb25zdCBfQ2hhclQqIF9fcywKKyAgICAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiYgX195KSB7CisgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgIHJldHVybiBfX3kgPCBfX3M7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK2lubGluZSBib29sIF9TVExQX0NBTEwKK29wZXJhdG9yPihjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiYgX194LAorICAgICAgICAgIGNvbnN0IF9DaGFyVCogX19zKSB7CisgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgIHJldHVybiBfX3MgPCBfX3g7Cit9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfVEVNUExBVEVfRVhQUkVTU0lPTikKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYywgY2xhc3MgX0xocywgY2xhc3MgX1JocywgY2xhc3MgX1N0b3JlRGlyPgoraW5saW5lIGJvb2wgX1NUTFBfQ0FMTAorb3BlcmF0b3I+KGNvbnN0IF9DaGFyVCogX19zLAorICAgICAgICAgIGNvbnN0IF9TVExQX1BSSVYgX19ic3RyX3N1bTxfQ2hhclQsX1RyYWl0cyxfQWxsb2MsX0xocyxfUmhzLF9TdG9yZURpcj4mIF9feSkgeworICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKQorICByZXR1cm4gX195IDwgX19zOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2MsIGNsYXNzIF9MaHMsIGNsYXNzIF9SaHMsIGNsYXNzIF9TdG9yZURpcj4KK2lubGluZSBib29sIF9TVExQX0NBTEwKK29wZXJhdG9yPihjb25zdCBfU1RMUF9QUklWIF9fYnN0cl9zdW08X0NoYXJULF9UcmFpdHMsX0FsbG9jLF9MaHMsX1JocyxfU3RvcmVEaXI+JiBfX3gsCisgICAgICAgICAgY29uc3QgX0NoYXJUKiBfX3MpIHsKKyAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKKyAgcmV0dXJuIF9fcyA8IF9feDsKK30KKyNlbmRpZiAvKiBfU1RMUF9VU0VfVEVNUExBVEVfRVhQUkVTU0lPTiAqLworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMCitvcGVyYXRvcjw9KGNvbnN0IF9DaGFyVCogX19zLAorICAgICAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiYgX195KSB7CisgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgIHJldHVybiAhKF9feSA8IF9fcyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK2lubGluZSBib29sIF9TVExQX0NBTEwKK29wZXJhdG9yPD0oY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz4mIF9feCwKKyAgICAgICAgICAgY29uc3QgX0NoYXJUKiBfX3MpIHsKKyAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKKyAgcmV0dXJuICEoX19zIDwgX194KTsKK30KKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9URU1QTEFURV9FWFBSRVNTSU9OKQordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jLCBjbGFzcyBfTGhzLCBjbGFzcyBfUmhzLCBjbGFzcyBfU3RvcmVEaXI+CitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMCitvcGVyYXRvcjw9KGNvbnN0IF9DaGFyVCogX19zLAorICAgICAgICAgICBjb25zdCBfU1RMUF9QUklWIF9fYnN0cl9zdW08X0NoYXJULF9UcmFpdHMsX0FsbG9jLF9MaHMsX1JocyxfU3RvcmVEaXI+JiBfX3kpIHsKKyAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKKyAgcmV0dXJuICEoX195IDwgX19zKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jLCBjbGFzcyBfTGhzLCBjbGFzcyBfUmhzLCBjbGFzcyBfU3RvcmVEaXI+CitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMCitvcGVyYXRvcjw9KGNvbnN0IF9TVExQX1BSSVYgX19ic3RyX3N1bTxfQ2hhclQsX1RyYWl0cyxfQWxsb2MsX0xocyxfUmhzLF9TdG9yZURpcj4mIF9feCwKKyAgICAgICAgICAgY29uc3QgX0NoYXJUKiBfX3MpIHsKKyAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKKyAgcmV0dXJuICEoX19zIDwgX194KTsKK30KKyNlbmRpZiAvKiBfU1RMUF9VU0VfVEVNUExBVEVfRVhQUkVTU0lPTiAqLworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMCitvcGVyYXRvcj49KGNvbnN0IF9DaGFyVCogX19zLAorICAgICAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiYgX195KSB7CisgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgIHJldHVybiAhKF9fcyA8IF9feSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK2lubGluZSBib29sIF9TVExQX0NBTEwKK29wZXJhdG9yPj0oY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz4mIF9feCwKKyAgICAgICAgICAgY29uc3QgX0NoYXJUKiBfX3MpIHsKKyAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKKyAgcmV0dXJuICEoX194IDwgX19zKTsKK30KKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9URU1QTEFURV9FWFBSRVNTSU9OKQordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jLCBjbGFzcyBfTGhzLCBjbGFzcyBfUmhzLCBjbGFzcyBfU3RvcmVEaXI+CitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMCitvcGVyYXRvcj49KGNvbnN0IF9DaGFyVCogX19zLAorICAgICAgICAgICBjb25zdCBfU1RMUF9QUklWIF9fYnN0cl9zdW08X0NoYXJULF9UcmFpdHMsX0FsbG9jLF9MaHMsX1JocyxfU3RvcmVEaXI+JiBfX3kpIHsKKyAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKKyAgcmV0dXJuICEoX19zIDwgX195KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jLCBjbGFzcyBfTGhzLCBjbGFzcyBfUmhzLCBjbGFzcyBfU3RvcmVEaXI+CitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMCitvcGVyYXRvcj49KGNvbnN0IF9TVExQX1BSSVYgX19ic3RyX3N1bTxfQ2hhclQsX1RyYWl0cyxfQWxsb2MsX0xocyxfUmhzLF9TdG9yZURpcj4mIF9feCwKKyAgICAgICAgICAgY29uc3QgX0NoYXJUKiBfX3MpIHsKKyAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKKyAgcmV0dXJuICEoX194IDwgX19zKTsKK30KKyNlbmRpZiAvKiBfU1RMUF9VU0VfVEVNUExBVEVfRVhQUkVTU0lPTiAqLworCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNlbmRpZiAvKiBfU1RMUF9TVFJJTkdfT1BFUkFUT1JTX0ggKi8KKwpkaWZmIC0tZ2l0IGEvc3RsL19zdHJpbmdfc3VtLmggYi9zdGwvX3N0cmluZ19zdW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGUxZTMxCi0tLSAvZGV2L251bGwKKysrIGIvc3RsL19zdHJpbmdfc3VtLmgKQEAgLTAsMCArMSw0MTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMKKyAqIEZyYW5jb2lzIER1bW9udAorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX1NUUklOR19TVU1fSAorI2RlZmluZSBfU1RMUF9TVFJJTkdfU1VNX0gKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKworLypjaGFyIHdyYXBwZXIgdG8gc2ltdWxhdGUgYmFzaWNfc3RyaW5nKi8KK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+CitzdHJ1Y3QgX19jaGFyX3dyYXBwZXIgeworICB0eXBlZGVmIGNvbnN0IF9DaGFyVCYgY29uc3RfcmVmZXJlbmNlOworCisgIF9fY2hhcl93cmFwcGVyKF9DaGFyVCBfX3ZhbCkgOiBfVmFsKF9fdmFsKSB7fQorCisgIF9DaGFyVCBnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIF9WYWw7IH0KKyAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiAxOyB9CisKKyAgY29uc3RfcmVmZXJlbmNlIG9wZXJhdG9yW10gKHNpemVfdCBfX24pIGNvbnN0IHsKKyAgICAvL1RvIGF2b2lkIGEgY2hlY2sgb24gX19uIHdlIHVzZSB0aGlzIHN0cmFuZ2UgaW1wbGVtZW50YXRpb24KKyAgICByZXR1cm4gKCZfVmFsKVtfX25dOworICB9CisKK3ByaXZhdGU6CisgIF9DaGFyVCBfVmFsOworfTsKKworLypDIHN0cmluZyB3cmFwcGVyIHRvIHNpbXVsYXRlIGJhc2ljX3N0cmluZyovCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgorc3RydWN0IF9fY3N0cl93cmFwcGVyIHsKKyAgdHlwZWRlZiBjb25zdCBfQ2hhclQmIGNvbnN0X3JlZmVyZW5jZTsKKworICBfX2NzdHJfd3JhcHBlcihjb25zdCBfQ2hhclQgKl9fY3N0ciwgc2l6ZV90IF9fc2l6ZSkgOgorICAgIF9DU3RyKF9fY3N0ciksIF9TaXplKF9fc2l6ZSkge30KKworICBjb25zdCBfQ2hhclQqIGNfc3RyKCkgY29uc3QgeyByZXR1cm4gX0NTdHI7IH0KKworICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9TaXplOyB9CisKKyAgY29uc3RfcmVmZXJlbmNlIG9wZXJhdG9yW10gKHNpemVfdCBfX24pIGNvbnN0IHsgcmV0dXJuIF9DU3RyW19fbl07IH0KKworcHJpdmF0ZToKKyAgY29uc3QgX0NoYXJUICpfQ1N0cjsKKyAgc2l6ZV90IF9TaXplOworfTsKKworLypiYXNpY19zdHJpbmcgd3JhcHBlciB0byBlbnN1cmUgdGhhdCB3ZSBvbmx5IHN0b3JlIGEgcmVmZXJlbmNlIHRvIHRoZSBvcmlnaW5hbCBzdHJpbmcgYW5kIG5vdCBjb3B5IGl0Ki8KK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK3N0cnVjdCBfX2JzdHJfd3JhcHBlciB7CisgIHR5cGVkZWYgY29uc3QgX0NoYXJUJiBjb25zdF9yZWZlcmVuY2U7CisgIHR5cGVkZWYgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiBfQlN0cmluZzsKKworICBfX2JzdHJfd3JhcHBlciAoX0JTdHJpbmcgY29uc3QmIF9fcykgOgorICAgIF9CU3RyKF9fcykge30KKworICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9CU3RyLnNpemUoKTsgfQorCisgIGNvbnN0X3JlZmVyZW5jZSBvcGVyYXRvcltdIChzaXplX3QgX19uKSBjb25zdCB7IHJldHVybiBfQlN0cltfX25dOyB9CisKKyAgX0JTdHJpbmcgY29uc3QmIGJfc3RyKCkgY29uc3QgeyByZXR1cm4gX0JTdHI7IH0KKworcHJpdmF0ZToKKyAgX0JTdHJpbmcgY29uc3QmIF9CU3RyOworfTsKKworc3RydWN0IF9fb25fbGVmdCB7fTsKK3N0cnVjdCBfX29uX3JpZ2h0IHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2MsCisgICAgICAgICAgY2xhc3MgX0xlZnQsIGNsYXNzIF9SaWdodCwKKyAgICAgICAgICBjbGFzcyBfU3RvcmFnZURpcmVjdGlvbj4KK2NsYXNzIF9fYnN0cl9zdW0geworcHVibGljOgorICB0eXBlZGVmIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4gX0JTdHJpbmc7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0JTdHJpbmc6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9yZWZlcmVuY2U7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0JTdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOworICB0eXBlZGVmIHR5cGVuYW1lIF9CU3RyaW5nOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0JTdHJpbmc6OnNpemVfdHlwZSBzaXplX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0JTdHJpbmc6OmFsbG9jYXRvcl90eXBlIGFsbG9jYXRvcl90eXBlOworICB0eXBlZGVmIF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9MZWZ0LCBfUmlnaHQsIF9TdG9yYWdlRGlyZWN0aW9uPiBfU2VsZjsKKworICBfX2JzdHJfc3VtIChfTGVmdCBjb25zdCYgbGhzLCBfUmlnaHQgY29uc3QmIHJocykgOgorICAgIF9saHMobGhzKSwgX3JocyhyaHMpIHt9CisKKyAgX0xlZnQgY29uc3QmIGdldExocygpIGNvbnN0IHsgcmV0dXJuIF9saHM7IH0KKyAgX1JpZ2h0IGNvbnN0JiBnZXRSaHMoKSBjb25zdCB7IHJldHVybiBfcmhzOyB9CisKKyAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IHsgcmV0dXJuIF9NX2dldF9zdG9yYWdlKGZhbHNlKS5nZXRfYWxsb2NhdG9yKCk7IH0KKworICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIF9NX2dldF9zdG9yYWdlKCkuYmVnaW4oKTsgfQorICBjb25zdF9pdGVyYXRvciBlbmQoKSAgIGNvbnN0IHsgcmV0dXJuIF9NX2dldF9zdG9yYWdlKCkuZW5kKCk7IH0KKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSBjb25zdCB7IHJldHVybiBfTV9nZXRfc3RvcmFnZSgpLnJiZWdpbigpOyB9CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpICAgY29uc3QgeyByZXR1cm4gX01fZ2V0X3N0b3JhZ2UoKS5yZW5kKCk7IH0KKworICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9saHMuc2l6ZSgpICsgX3Jocy5zaXplKCk7IH0KKyAgc2l6ZV90eXBlIGxlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIHNpemUoKTsgfQorCisgIHNpemVfdCBtYXhfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX2dldF9zdG9yYWdlKCkubWF4X3NpemUoKTsgfQorICBzaXplX3R5cGUgY2FwYWNpdHkoKSBjb25zdCB7IHJldHVybiBzaXplKCk7IH0KKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIHNpemUoKSA9PSAwOyB9CisKKyAgY29uc3RfcmVmZXJlbmNlIG9wZXJhdG9yW10oc2l6ZV90IF9fbikgY29uc3QKKyAgeyByZXR1cm4gKF9fbiA8IF9saHMuc2l6ZSgpKT9fbGhzW19fbl06X3Joc1tfX24gLSBfbGhzLnNpemUoKV07IH0KKworICBjb25zdF9yZWZlcmVuY2UgYXQoc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgeyByZXR1cm4gX01fZ2V0X3N0b3JhZ2UoKS5hdChfX24pOyB9CisKKyAgLy9vcGVyYXRvciArPQorICB0eXBlZGVmIF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9TZWxmLCBfX2JzdHJfd3JhcHBlcjxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4sIF9fb25fbGVmdD4gX0JTdHJPbkxlZnQ7CisgIF9CU3RyT25MZWZ0IG9wZXJhdG9yICs9IChjb25zdCBfQlN0cmluZyYgX19zKSB7IHJldHVybiBhcHBlbmQoX19zKTsgfQorCisgIHR5cGVkZWYgX19ic3RyX3N1bTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX1NlbGYsIF9fY3N0cl93cmFwcGVyPF9DaGFyVD4sIF9fb25fbGVmdD4gX0NTdHJPbkxlZnQ7CisgIF9DU3RyT25MZWZ0IG9wZXJhdG9yICs9IChjb25zdCBfQ2hhclQqIF9fcykgeyByZXR1cm4gYXBwZW5kKF9fcyk7IH0KKworICB0eXBlZGVmIF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9TZWxmLCBfX2NoYXJfd3JhcHBlcjxfQ2hhclQ+LCBfX29uX2xlZnQ+IF9DaGFyT25MZWZ0OworICBfQ2hhck9uTGVmdCBvcGVyYXRvciArPSAoX0NoYXJUIF9fYykgeyByZXR1cm4gX0NoYXJPbkxlZnQoKnRoaXMsIF9fYyk7IH0KKworICAvL2FwcGVuZAorICBfQlN0ck9uTGVmdCBhcHBlbmQgKGNvbnN0IF9CU3RyaW5nJiBfX3MpCisgIHsgcmV0dXJuIF9CU3RyT25MZWZ0KCp0aGlzLCBfX3MpOyB9CisgIF9CU3RyaW5nJiBhcHBlbmQoY29uc3QgX0JTdHJpbmcmIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKQorICB7IHJldHVybiBfTV9nZXRfc3RvcmFnZSgpLmFwcGVuZChfX3MsIF9fcG9zLCBfX24pOyB9CisgIF9DU3RyT25MZWZ0IGFwcGVuZChjb25zdCBfQ2hhclQqIF9fcykgeworICAgIGNvbnN0IHNpemVfdHlwZSBfX24gPSBfVHJhaXRzOjpsZW5ndGgoX19zKTsKKyAgICByZXR1cm4gX0NTdHJPbkxlZnQoKnRoaXMsIF9fY3N0cl93cmFwcGVyPF9DaGFyVD4oX19zLCBfX24pKTsKKyAgfQorICBfQ1N0ck9uTGVmdCBhcHBlbmQoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX24pCisgIHsgcmV0dXJuIF9DU3RyT25MZWZ0KCp0aGlzLCBfX2NzdHJfd3JhcHBlcjxfQ2hhclQ+KF9fcywgX19uKSk7IH0KKyAgX0JTdHJpbmcmIGFwcGVuZChzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jKQorICB7cmV0dXJuIF9NX2dldF9zdG9yYWdlKCkuYXBwZW5kKF9fbiwgX19jKTt9CisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgorICBfQlN0cmluZyYgYXBwZW5kKF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QpCisgIHtyZXR1cm4gX01fZ2V0X3N0b3JhZ2UoKS5hcHBlbmQoX19maXJzdCwgX19sYXN0KTt9CisKKyAgLy9hc3NpZ24KKyAgX0JTdHJpbmcmIGFzc2lnbihjb25zdCBfQlN0cmluZyYgX19zKSB7cmV0dXJuIF9NX2dldF9zdG9yYWdlKCkuYXNzaWduKF9fcyk7fQorICBfQlN0cmluZyYgYXNzaWduKGNvbnN0IF9CU3RyaW5nJiBfX3MsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikge3JldHVybiBfTV9nZXRfc3RvcmFnZSgpLmFzc2lnbihfX3MsIF9fcG9zLCBfX24pO30KKyAgX0JTdHJpbmcmIGFzc2lnbihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbikge3JldHVybiBfTV9nZXRfc3RvcmFnZSgpLmFzc2lnbihfX3MsIF9fbik7fQorICBfQlN0cmluZyYgYXNzaWduKGNvbnN0IF9DaGFyVCogX19zKSB7cmV0dXJuIF9NX2dldF9zdG9yYWdlKCkuYXNzaWduKF9fcyk7IH0KKyAgX0JTdHJpbmcmIGFzc2lnbihzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jKSB7cmV0dXJuIF9NX2dldF9zdG9yYWdlKCkuYXNzaWduKF9fbiwgX19jKTt9CisKKyAgLy9pbnNlcnQKKyAgX0JTdHJpbmcmIGluc2VydChzaXplX3R5cGUgX19wb3MsIGNvbnN0IF9CU3RyaW5nJiBfX3MpIHtyZXR1cm4gX01fZ2V0X3N0b3JhZ2UoKS5pbnNlcnQoX19wb3MsIF9fcyk7fQorICBfQlN0cmluZyYgaW5zZXJ0KHNpemVfdHlwZSBfX3BvcywgY29uc3QgX0JTdHJpbmcmIF9fcywgc2l6ZV90eXBlIF9fYmVnLCBzaXplX3R5cGUgX19uKQorICB7cmV0dXJuIF9NX2dldF9zdG9yYWdlKCkuaW5zZXJ0KF9fcG9zLCBfX3MsIF9fYmVnLCBfX24pO30KKyAgX0JTdHJpbmcmIGluc2VydChzaXplX3R5cGUgX19wb3MsIGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uKSB7cmV0dXJuIF9NX2dldF9zdG9yYWdlKCkuaW5zZXJ0KF9fcG9zLCBfX3MsIF9fbik7fQorICBfQlN0cmluZyYgaW5zZXJ0KHNpemVfdHlwZSBfX3BvcywgY29uc3QgX0NoYXJUKiBfX3MpIHtyZXR1cm4gX01fZ2V0X3N0b3JhZ2UoKS5pbnNlcnQoX19wb3MsIF9fcyk7fQorICBfQlN0cmluZyYgaW5zZXJ0KHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYykge3JldHVybiBfTV9nZXRfc3RvcmFnZSgpLmluc2VydChfX3BvcywgX19uLCBfX2MpO30KKworICAvL2VyYXNlCisgIF9CU3RyaW5nJiBlcmFzZShzaXplX3R5cGUgX19wb3MgPSAwLCBzaXplX3R5cGUgX19uID1fQlN0cmluZzo6bnBvcykge3JldHVybiBfTV9nZXRfc3RvcmFnZSgpLmVyYXNlKF9fcG9zLCBfX24pO30KKworICAvL3JlcGxhY2UKKyAgX0JTdHJpbmcmIHJlcGxhY2Uoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uLCBjb25zdCBfQlN0cmluZyYgX19zKQorICB7cmV0dXJuIF9NX2dldF9zdG9yYWdlKCkucmVwbGFjZShfX3BvcywgX19uLCBfX3MpO30KKyAgX0JTdHJpbmcmIHJlcGxhY2Uoc2l6ZV90eXBlIF9fcG9zMSwgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IF9CU3RyaW5nJiBfX3MsIHNpemVfdHlwZSBfX3BvczIsIHNpemVfdHlwZSBfX24yKQorICB7cmV0dXJuIF9NX2dldF9zdG9yYWdlKCkucmVwbGFjZShfX3BvczEsIF9fbjEsIF9fcywgX19wb3MyLCBfX24yKTt9CisgIF9CU3RyaW5nJiByZXBsYWNlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uMikKKyAge3JldHVybiBfTV9nZXRfc3RvcmFnZSgpLnJlcGxhY2UoX19wb3MsIF9fbjEsIF9fcywgX19uMik7fQorICBfQlN0cmluZyYgcmVwbGFjZShzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24xLCBjb25zdCBfQ2hhclQqIF9fcykKKyAge3JldHVybiBfTV9nZXRfc3RvcmFnZSgpLnJlcGxhY2UoX19wb3MsIF9fbjEsIF9fcyk7fQorICBfQlN0cmluZyYgcmVwbGFjZShzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24xLCBzaXplX3R5cGUgX19uMiwgX0NoYXJUIF9fYykKKyAge3JldHVybiBfTV9nZXRfc3RvcmFnZSgpLnJlcGxhY2UoX19wb3MsIF9fbjEsIF9fbjIsIF9fYyk7fQorCisgIHNpemVfdHlwZSBjb3B5KF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdAorICB7cmV0dXJuIF9NX2dldF9zdG9yYWdlKCkuY29weShfX3MsIF9fbiwgX19wb3MpO30KKworICB2b2lkIHN3YXAoX0JTdHJpbmcmIF9fcykKKyAge19NX2dldF9zdG9yYWdlKCkuc3dhcChfX3MpO30KKworICBjb25zdCBfQ2hhclQqIGNfc3RyKCkgY29uc3QgeyByZXR1cm4gX01fZ2V0X3N0b3JhZ2UoKS5jX3N0cigpOyB9CisgIGNvbnN0IF9DaGFyVCogZGF0YSgpICBjb25zdCB7IHJldHVybiBfTV9nZXRfc3RvcmFnZSgpLmRhdGEoKTsgfQorCisgIC8vZmluZCBmYW1pbHkKKyAgc2l6ZV90eXBlIGZpbmQoY29uc3QgX0JTdHJpbmcmIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QgeyByZXR1cm4gX01fZ2V0X3N0b3JhZ2UoKS5maW5kKF9fcywgX19wb3MpOyB9CisgIHNpemVfdHlwZSBmaW5kKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdCB7IHJldHVybiBfTV9nZXRfc3RvcmFnZSgpLmZpbmQoX19zLCBfX3Bvcyk7IH0KKyAgc2l6ZV90eXBlIGZpbmQoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgY29uc3QgeyByZXR1cm4gX01fZ2V0X3N0b3JhZ2UoKS5maW5kKF9fcywgX19wb3MsIF9fbik7IH0KKyAgc2l6ZV90eXBlIGZpbmQoX0NoYXJUIF9fYywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QgeyByZXR1cm4gX01fZ2V0X3N0b3JhZ2UoKS5maW5kKF9fYywgX19wb3MpOyB9CisKKyAgc2l6ZV90eXBlIHJmaW5kKGNvbnN0IF9CU3RyaW5nJiBfX3MsIHNpemVfdHlwZSBfX3BvcyA9IF9CU3RyaW5nOjpucG9zKSBjb25zdCB7IHJldHVybiBfTV9nZXRfc3RvcmFnZSgpLnJmaW5kKF9fcywgX19wb3MpOyB9CisgIHNpemVfdHlwZSByZmluZChjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gX0JTdHJpbmc6Om5wb3MpIGNvbnN0IHsgcmV0dXJuIF9NX2dldF9zdG9yYWdlKCkucmZpbmQoX19zLCBfX3Bvcyk7IH0KKyAgc2l6ZV90eXBlIHJmaW5kKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIGNvbnN0IHsgcmV0dXJuIF9NX2dldF9zdG9yYWdlKCkucmZpbmQoX19zLCBfX3BvcywgX19uKTsgfQorICBzaXplX3R5cGUgcmZpbmQoX0NoYXJUIF9fYywgc2l6ZV90eXBlIF9fcG9zID0gX0JTdHJpbmc6Om5wb3MpIGNvbnN0IHsgcmV0dXJuIF9NX2dldF9zdG9yYWdlKCkucmZpbmQoX19jLCBfX3Bvcyk7IH0KKworICBzaXplX3R5cGUgZmluZF9maXJzdF9vZihjb25zdCBfQlN0cmluZyYgX19zLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdAorICB7IHJldHVybiBfTV9nZXRfc3RvcmFnZSgpLmZpbmRfZmlyc3Rfb2YoX19zLCBfX3Bvcyk7IH0KKyAgc2l6ZV90eXBlIGZpbmRfZmlyc3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0CisgIHsgcmV0dXJuIF9NX2dldF9zdG9yYWdlKCkuZmluZF9maXJzdF9vZihfX3MsIF9fcG9zKTsgfQorICBzaXplX3R5cGUgZmluZF9maXJzdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdAorICB7IHJldHVybiBfTV9nZXRfc3RvcmFnZSgpLmZpbmRfZmlyc3Rfb2YoX19zLCBfX3BvcywgX19uKTsgfQorICBzaXplX3R5cGUgZmluZF9maXJzdF9vZihfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdAorICB7IHJldHVybiBfTV9nZXRfc3RvcmFnZSgpLmZpbmQoX19jLCBfX3Bvcyk7IH0KKworICBzaXplX3R5cGUgZmluZF9sYXN0X29mKGNvbnN0IF9CU3RyaW5nJiBfX3MsIHNpemVfdHlwZSBfX3BvcyA9IF9CU3RyaW5nOjpucG9zKSBjb25zdAorICB7IHJldHVybiBfTV9nZXRfc3RvcmFnZSgpLmZpbmRfbGFzdF9vZihfX3MsIF9fcG9zKTsgfQorICBzaXplX3R5cGUgZmluZF9sYXN0X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MgPSBfQlN0cmluZzo6bnBvcykgY29uc3QKKyAgeyByZXR1cm4gX01fZ2V0X3N0b3JhZ2UoKS5maW5kX2xhc3Rfb2YoX19zLCBfX3Bvcyk7IH0KKyAgc2l6ZV90eXBlIGZpbmRfbGFzdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdAorICB7IHJldHVybiBfTV9nZXRfc3RvcmFnZSgpLmZpbmRfbGFzdF9vZihfX3MsIF9fcG9zLCBfX24pOyB9CisgIHNpemVfdHlwZSBmaW5kX2xhc3Rfb2YoX0NoYXJUIF9fYywgc2l6ZV90eXBlIF9fcG9zID0gX0JTdHJpbmc6Om5wb3MpIGNvbnN0CisgIHsgcmV0dXJuIF9NX2dldF9zdG9yYWdlKCkucmZpbmQoX19jLCBfX3Bvcyk7IH0KKworICBzaXplX3R5cGUgZmluZF9maXJzdF9ub3Rfb2YoY29uc3QgX0JTdHJpbmcmIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QKKyAgeyByZXR1cm4gX01fZ2V0X3N0b3JhZ2UoKS5maW5kX2ZpcnN0X25vdF9vZihfX3MsIF9fcG9zKTsgfQorICBzaXplX3R5cGUgZmluZF9maXJzdF9ub3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0CisgIHsgcmV0dXJuIF9NX2dldF9zdG9yYWdlKCkuZmluZF9maXJzdF9ub3Rfb2YoX19zLCBfX3Bvcyk7IH0KKyAgc2l6ZV90eXBlIGZpbmRfZmlyc3Rfbm90X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIGNvbnN0CisgIHsgcmV0dXJuIF9NX2dldF9zdG9yYWdlKCkuZmluZF9maXJzdF9ub3Rfb2YoX19zLCBfX3BvcywgX19uKTsgfQorICBzaXplX3R5cGUgZmluZF9maXJzdF9ub3Rfb2YoX0NoYXJUIF9fYywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QKKyAgeyByZXR1cm4gX01fZ2V0X3N0b3JhZ2UoKS5maW5kX2ZpcnN0X25vdF9vZihfX2MsIF9fcG9zKTsgfQorCisgIHNpemVfdHlwZSBmaW5kX2xhc3Rfbm90X29mKGNvbnN0IF9CU3RyaW5nJiBfX3MsIHNpemVfdHlwZSBfX3BvcyA9IF9CU3RyaW5nOjpucG9zKSBjb25zdAorICB7IHJldHVybiBfTV9nZXRfc3RvcmFnZSgpLmZpbmRfbGFzdF9ub3Rfb2YoX19zLCBfX3Bvcyk7IH0KKyAgc2l6ZV90eXBlIGZpbmRfbGFzdF9ub3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3BvcyA9X0JTdHJpbmc6OiBucG9zKSBjb25zdAorICB7IHJldHVybiBfTV9nZXRfc3RvcmFnZSgpLmZpbmRfbGFzdF9ub3Rfb2YoX19zLCBfX3Bvcyk7IH0KKyAgc2l6ZV90eXBlIGZpbmRfbGFzdF9ub3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgeyByZXR1cm4gX01fZ2V0X3N0b3JhZ2UoKS5maW5kX2xhc3Rfbm90X29mKF9fcywgX19wb3MsIF9fbik7IH0KKyAgc2l6ZV90eXBlIGZpbmRfbGFzdF9ub3Rfb2YoX0NoYXJUIF9fYywgc2l6ZV90eXBlIF9fcG9zID0gX0JTdHJpbmc6Om5wb3MpIGNvbnN0CisgIHsgcmV0dXJuIF9NX2dldF9zdG9yYWdlKCkuZmluZF9sYXN0X25vdF9vZihfX2MsIF9fcG9zKTsgfQorCisgIF9CU3RyaW5nIHN1YnN0cihzaXplX3R5cGUgX19wb3MgPSAwLCBzaXplX3R5cGUgX19uID0gX0JTdHJpbmc6Om5wb3MpIGNvbnN0CisgIHsgcmV0dXJuIF9NX2dldF9zdG9yYWdlKCkuc3Vic3RyKF9fcG9zLCBfX24pOyB9CisKKyAgLy9jb21wYXJlCisgIGludCBjb21wYXJlKGNvbnN0IF9CU3RyaW5nJiBfX3MpIGNvbnN0CisgIHsgcmV0dXJuIF9NX2dldF9zdG9yYWdlKCkuY29tcGFyZShfX3MpOyB9CisgIGludCBjb21wYXJlKHNpemVfdHlwZSBfX3BvczEsIHNpemVfdHlwZSBfX24xLCBjb25zdCBfU2VsZiYgX19zKSBjb25zdAorICB7IHJldHVybiBfTV9nZXRfc3RvcmFnZSgpLmNvbXBhcmUoX19wb3MxLCBfX24xLCBfX3MpOyB9CisgIGludCBjb21wYXJlKHNpemVfdHlwZSBfX3BvczEsIHNpemVfdHlwZSBfX24xLCBjb25zdCBfU2VsZiYgX19zLCBzaXplX3R5cGUgX19wb3MyLCBzaXplX3R5cGUgX19uMikgY29uc3QKKyAgeyByZXR1cm4gX01fZ2V0X3N0b3JhZ2UoKS5jb21wYXJlKF9fcG9zMSwgX19uMSwgX19zLCBfX3BvczIsIF9fbjIpOyB9CisgIGludCBjb21wYXJlKGNvbnN0IF9DaGFyVCogX19zKSBjb25zdAorICB7IHJldHVybiBfTV9nZXRfc3RvcmFnZSgpLmNvbXBhcmUoX19zKTsgfQorICBpbnQgY29tcGFyZShzaXplX3R5cGUgX19wb3MxLCBzaXplX3R5cGUgX19uMSwgY29uc3QgX0NoYXJUKiBfX3MpIGNvbnN0CisgIHsgcmV0dXJuIF9NX2dldF9zdG9yYWdlKCkuY29tcGFyZShfX3BvczEsIF9fbjEsIF9fcyk7IH0KKyAgaW50IGNvbXBhcmUoc2l6ZV90eXBlIF9fcG9zMSwgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uMikgY29uc3QKKyAgeyByZXR1cm4gX01fZ2V0X3N0b3JhZ2UoKS5jb21wYXJlKF9fcG9zMSwgX19uMSwgX19zLCBfX24yKTsgfQorCisgIC8vUmV0dXJucyB0aGUgdW5kZXJseWluZyBiYXNpY19zdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHRlbXBsYXRlIGV4cHJlc3Npb24KKyAgLy9UaGUgbm9uIGNvbnN0IG1ldGhvZCB3aWxsIGFsd2F5cyBpbml0aWFsaXNlIGl0LgorICBfQlN0cmluZyYgX01fZ2V0X3N0b3JhZ2UoKQorICB7IHJldHVybiBfcmhzLl9NX2dldF9zdG9yYWdlKCp0aGlzLCBfU3RvcmFnZURpcmVjdGlvbigpKTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfTGhzLCBjbGFzcyBfUmhzLCBjbGFzcyBfU3RvcmFnZURpcj4KKyAgX0JTdHJpbmcmIF9NX2dldF9zdG9yYWdlKF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9MaHMsIF9SaHMsIF9TdG9yYWdlRGlyPiAgY29uc3QmIF9fcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX19vbl9sZWZ0IGNvbnN0JiAvKlN0b3JhZ2VEaXIqLykKKyAgeyByZXR1cm4gX2xocy5fTV9nZXRfc3RvcmFnZShfX3JlZik7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0xocywgY2xhc3MgX1JocywgY2xhc3MgX1N0b3JhZ2VEaXI+CisgIF9CU3RyaW5nJiBfTV9nZXRfc3RvcmFnZShfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfTGhzLCBfUmhzLCBfU3RvcmFnZURpcj4gIGNvbnN0JiBfX3JlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fb25fcmlnaHQgY29uc3QmIC8qU3RvcmFnZURpciovKQorICB7IHJldHVybiBfcmhzLl9NX2dldF9zdG9yYWdlKF9fcmVmKTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfTGhzLCBjbGFzcyBfUmhzLCBjbGFzcyBfU3RvcmFnZURpcj4KKyAgX0JTdHJpbmcmIF9NX2dldF9zdG9yYWdlKF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9MaHMsIF9SaHMsIF9TdG9yYWdlRGlyPiAgY29uc3QmIF9fcmVmKQorICB7IHJldHVybiBfTV9nZXRfc3RvcmFnZShfX3JlZiwgX1N0b3JhZ2VEaXJlY3Rpb24oKSk7IH0KKworICAvL1RoZSBjb25zdCBtZXRob2QgY2FuIGJlIGludm9rZWQgd2l0aG91dCBpbml0aWFsaXNpbmcgdGhlIGJhc2ljX3N0cmluZyBzbyBhdm9pZGluZyBkeW5hbWljIGFsbG9jYXRpb24uCisgIF9CU3RyaW5nIGNvbnN0JiBfTV9nZXRfc3RvcmFnZShib29sIF9fZG9faW5pdCA9IHRydWUpIGNvbnN0CisgIHsgcmV0dXJuIF9NX2dldF9zdG9yYWdlKCp0aGlzLCBfX2RvX2luaXQsIF9TdG9yYWdlRGlyZWN0aW9uKCkpOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9MaHMsIGNsYXNzIF9SaHMsIGNsYXNzIF9TdG9yYWdlRGlyPgorICBfQlN0cmluZyBjb25zdCYgX01fZ2V0X3N0b3JhZ2UoX19ic3RyX3N1bTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0xocywgX1JocywgX1N0b3JhZ2VEaXI+ICBjb25zdCYgX19yZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIF9fZG9faW5pdCwgX19vbl9sZWZ0IGNvbnN0JiAvKlN0b3JhZ2VEaXIqLykgY29uc3QKKyAgeyByZXR1cm4gX2xocy5fTV9nZXRfc3RvcmFnZShfX3JlZiwgX19kb19pbml0KTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfTGhzLCBjbGFzcyBfUmhzLCBjbGFzcyBfU3RvcmFnZURpcj4KKyAgX0JTdHJpbmcgY29uc3QmIF9NX2dldF9zdG9yYWdlKF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9MaHMsIF9SaHMsIF9TdG9yYWdlRGlyPiAgY29uc3QmIF9fcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBfX2RvX2luaXQsIF9fb25fcmlnaHQgY29uc3QmIC8qU3RvcmFnZURpciovKSBjb25zdAorICB7IHJldHVybiBfcmhzLl9NX2dldF9zdG9yYWdlKF9fcmVmLCBfX2RvX2luaXQpOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9MaHMsIGNsYXNzIF9SaHMsIGNsYXNzIF9TdG9yYWdlRGlyPgorICBfQlN0cmluZyBjb25zdCYgX01fZ2V0X3N0b3JhZ2UoX19ic3RyX3N1bTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0xocywgX1JocywgX1N0b3JhZ2VEaXI+ICBjb25zdCYgX19yZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIF9fZG9faW5pdCkgY29uc3QKKyAgeyByZXR1cm4gX01fZ2V0X3N0b3JhZ2UoX19yZWYsIF9fZG9faW5pdCwgX1N0b3JhZ2VEaXJlY3Rpb24oKSk7IH0KKworcHJpdmF0ZToKKyAgX0xlZnQgIF9saHM7CisgIF9SaWdodCBfcmhzOworfTsKKworLyoKKyAqIEZvciB0aGlzIG9wZXJhdG9yIHdlIGNob29zZSB0byB1c2UgdGhlIHJpZ2h0IHBhcnQgYXMgdGhlIHN0b3JhZ2UgcGFydAorICovCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2MsCisgICAgICAgICAgY2xhc3MgX0xoMSwgY2xhc3MgX1JoMSwgY2xhc3MgX1N0b3JlRGlyMSwKKyAgICAgICAgICBjbGFzcyBfTGgyLCBjbGFzcyBfUmgyLCBjbGFzcyBfU3RvcmVEaXIyPgoraW5saW5lIF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsCisgICAgICAgICAgICAgICAgICBfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfTGgxLCBfUmgxLCBfU3RvcmVEaXIxPiwKKyAgICAgICAgICAgICAgICAgIF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9MaDIsIF9SaDIsIF9TdG9yZURpcjI+LAorICAgICAgICAgICAgICAgICAgX19vbl9yaWdodD4gX1NUTFBfQ0FMTAorb3BlcmF0b3IgKyAoY29uc3QgX19ic3RyX3N1bTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0xoMSwgX1JoMSwgX1N0b3JlRGlyMT4gJl9fbGhzLAorICAgICAgICAgICAgY29uc3QgX19ic3RyX3N1bTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0xoMiwgX1JoMiwgX1N0b3JlRGlyMj4gJl9fcmhzKSB7CisgIHJldHVybiBfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLAorICAgICAgICAgICAgICAgICAgICBfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfTGgxLCBfUmgxLCBfU3RvcmVEaXIxPiwKKyAgICAgICAgICAgICAgICAgICAgX19ic3RyX3N1bTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0xoMiwgX1JoMiwgX1N0b3JlRGlyMj4sCisgICAgICAgICAgICAgICAgICAgIF9fb25fcmlnaHQ+KF9fbGhzLCBfX3Jocyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYywKKyAgICAgICAgICBjbGFzcyBfTGgxLCBjbGFzcyBfUmgxLCBjbGFzcyBfU3RvcmVEaXIxLAorICAgICAgICAgIGNsYXNzIF9MaDIsIGNsYXNzIF9SaDIsIGNsYXNzIF9TdG9yZURpcjI+CitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMCitvcGVyYXRvciA9PSAoY29uc3QgX19ic3RyX3N1bTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0xoMSwgX1JoMSwgX1N0b3JlRGlyMT4gJl9fbGhzLAorICAgICAgICAgICAgIGNvbnN0IF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9MaDIsIF9SaDIsIF9TdG9yZURpcjI+ICZfX3JocykKK3sgcmV0dXJuIChfX2xocy5zaXplKCkgPT0gX19yaHMuc2l6ZSgpKSAmJiAoX19saHMuX01fZ2V0X3N0b3JhZ2UoKSA9PSBfX3Jocy5fTV9nZXRfc3RvcmFnZSgpKTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2MsCisgICAgICAgICAgY2xhc3MgX0xoMSwgY2xhc3MgX1JoMSwgY2xhc3MgX1N0b3JlRGlyMSwKKyAgICAgICAgICBjbGFzcyBfTGgyLCBjbGFzcyBfUmgyLCBjbGFzcyBfU3RvcmVEaXIyPgoraW5saW5lIGJvb2wgX1NUTFBfQ0FMTAorb3BlcmF0b3IgPCAoY29uc3QgX19ic3RyX3N1bTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0xoMSwgX1JoMSwgX1N0b3JlRGlyMT4gJl9fbGhzLAorICAgICAgICAgICAgY29uc3QgX19ic3RyX3N1bTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0xoMiwgX1JoMiwgX1N0b3JlRGlyMj4gJl9fcmhzKQoreyByZXR1cm4gX19saHMuX01fZ2V0X3N0b3JhZ2UoKSA8IF9fcmhzLl9NX2dldF9zdG9yYWdlKCk7IH0KKworI2lmZGVmIF9TVExQX1VTRV9TRVBBUkFURV9SRUxPUFNfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYywKKyAgICAgICAgICBjbGFzcyBfTGgxLCBjbGFzcyBfUmgxLCBjbGFzcyBfU3RvcmVEaXIxLAorICAgICAgICAgIGNsYXNzIF9MaDIsIGNsYXNzIF9SaDIsIGNsYXNzIF9TdG9yZURpcjI+CitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMCitvcGVyYXRvciAhPSAoY29uc3QgX19ic3RyX3N1bTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0xoMSwgX1JoMSwgX1N0b3JlRGlyMT4gJl9fbGhzLAorICAgICAgICAgICAgIGNvbnN0IF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9MaDIsIF9SaDIsIF9TdG9yZURpcjI+ICZfX3JocykKK3sgcmV0dXJuICEoX19saHMgPT0gX19yaHMpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYywKKyAgICAgICAgICBjbGFzcyBfTGgxLCBjbGFzcyBfUmgxLCBjbGFzcyBfU3RvcmVEaXIxLAorICAgICAgICAgIGNsYXNzIF9MaDIsIGNsYXNzIF9SaDIsIGNsYXNzIF9TdG9yZURpcjI+CitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMCitvcGVyYXRvciA+IChjb25zdCBfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfTGgxLCBfUmgxLCBfU3RvcmVEaXIxPiAmX19saHMsCisgICAgICAgICAgICBjb25zdCBfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfTGgyLCBfUmgyLCBfU3RvcmVEaXIyPiAmX19yaHMpCit7IHJldHVybiBfX3JocyA8IF9fbGhzOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYywKKyAgICAgICAgICBjbGFzcyBfTGgxLCBjbGFzcyBfUmgxLCBjbGFzcyBfU3RvcmVEaXIxLAorICAgICAgICAgIGNsYXNzIF9MaDIsIGNsYXNzIF9SaDIsIGNsYXNzIF9TdG9yZURpcjI+CitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMCitvcGVyYXRvciA8PSAoY29uc3QgX19ic3RyX3N1bTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0xoMSwgX1JoMSwgX1N0b3JlRGlyMT4gJl9fbGhzLAorICAgICAgICAgICAgIGNvbnN0IF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9MaDIsIF9SaDIsIF9TdG9yZURpcjI+ICZfX3JocykKK3sgcmV0dXJuICEoX19yaHMgPCBfX2xocyk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jLAorICAgICAgICAgIGNsYXNzIF9MaDEsIGNsYXNzIF9SaDEsIGNsYXNzIF9TdG9yZURpcjEsCisgICAgICAgICAgY2xhc3MgX0xoMiwgY2xhc3MgX1JoMiwgY2xhc3MgX1N0b3JlRGlyMj4KK2lubGluZSBib29sIF9TVExQX0NBTEwKK29wZXJhdG9yID49IChjb25zdCBfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfTGgxLCBfUmgxLCBfU3RvcmVEaXIxPiAmX19saHMsCisgICAgICAgICAgICAgY29uc3QgX19ic3RyX3N1bTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0xoMiwgX1JoMiwgX1N0b3JlRGlyMj4gJl9fcmhzKQoreyByZXR1cm4gIShfX2xocyA8IF9fcmhzKTsgfQorCisjZW5kaWYgLyogX1NUTFBfVVNFX1NFUEFSQVRFX1JFTE9QU19OQU1FU1BBQ0UgKi8KKworCisvKgorICogVGhpcyBjbGFzcyB3aWxsIGJlIHVzZWQgdG8gc2ltdWxhdGUgYSB0ZW1wb3Jhcnkgc3RyaW5nIHRoYXQgaXMgcmVxdWlyZWQgZm9yCisgKiBhIGNhbGwgdG8gdGhlIGNfc3RyIG1ldGhvZCBvbiB0aGUgX19ic3RyX3N1bSBjbGFzcy4KKyAqLworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CitzdHJ1Y3QgX19zdW1fc3RvcmFnZV9lbGVtIHsKKyAgdHlwZWRlZiBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+IF9CU3RyaW5nOworCisgIF9fc3VtX3N0b3JhZ2VfZWxlbShfQWxsb2MgX19hbGxvYykgOiBfTV9pbml0KGZhbHNlKSwgX01fc3RvcmFnZShfX2FsbG9jKQorICB7fQorCisgIHRlbXBsYXRlIDxjbGFzcyBfTGVmdCwgY2xhc3MgX1JpZ2h0LCBjbGFzcyBfU3RvcmFnZURpcj4KKyAgdm9pZCBfTV9Jbml0KF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9MZWZ0LCBfUmlnaHQsIF9TdG9yYWdlRGlyPiAgY29uc3QmIF9fcmVmKSBjb25zdCB7CisgICAgaWYgKCFfTV9pbml0KSB7CisgICAgICBfTV9zdG9yYWdlID0gX19yZWY7CisgICAgICBfTV9pbml0ID0gdHJ1ZTsKKyAgICB9CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0xlZnQsIGNsYXNzIF9SaWdodCwgY2xhc3MgX1N0b3JhZ2VEaXI+CisgIF9CU3RyaW5nIGNvbnN0JiBfTV9nZXRfc3RvcmFnZShfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfTGVmdCwgX1JpZ2h0LCBfU3RvcmFnZURpcj4gIGNvbnN0JiBfX3JlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgX19kb19pbml0KSBjb25zdCB7CisgICAgaWYgKF9fZG9faW5pdCkgeworICAgICAgX01fSW5pdChfX3JlZik7CisgICAgfQorICAgIHJldHVybiBfTV9zdG9yYWdlOworICB9CisgIHRlbXBsYXRlIDxjbGFzcyBfTGVmdCwgY2xhc3MgX1JpZ2h0LCBjbGFzcyBfU3RvcmFnZURpcj4KKyAgX0JTdHJpbmcmIF9NX2dldF9zdG9yYWdlKF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9MZWZ0LCBfUmlnaHQsIF9TdG9yYWdlRGlyPiAgY29uc3QmIF9fcmVmKSB7CisgICAgX01fSW5pdChfX3JlZik7CisgICAgcmV0dXJuIF9NX3N0b3JhZ2U7CisgIH0KKworICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KKyAgX0NoYXJUIGNvbnN0JiBvcGVyYXRvcltdKHNpemVfdCBfX24pIGNvbnN0CisgIHsgcmV0dXJuIF9fU1RBVElDX0NBU1QoX0NoYXJUKiwgMClbX19uXTsgfQorCitwcml2YXRlOgorICBtdXRhYmxlIGJvb2wgX01faW5pdDsKKyAgbXV0YWJsZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+IF9NX3N0b3JhZ2U7Cit9OworCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYgLypfU1RMUF9TVFJJTkdfU1VNX0gqLwpkaWZmIC0tZ2l0IGEvc3RsL19zdHJpbmdfc3VtX21ldGhvZHMuaCBiL3N0bC9fc3RyaW5nX3N1bV9tZXRob2RzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUyY2UxOAotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9fc3RyaW5nX3N1bV9tZXRob2RzLmgKQEAgLTAsMCArMSwxOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMKKyAqIEZyYW5jb2lzIER1bW9udAorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisvKgorICogQWxsIHRoZSBuZWNlc3NhcnkgbWV0aG9kcyB1c2VkIGZvciB0ZW1wbGF0ZSBleHByZXNzaW9ucyB3aXRoIGJhc2ljX3N0cmluZworICogVGhpcyBmaWxlIGRvIG5vdCBoYXZlIHRvIGJlIG1hY3JvIGd1YXJkZWQgYXMgaXQgaXMgb25seSB1c2VkIGluIHRoZSBfc3RyaW5nLmgKKyAqIGZpbGUgYW5kIGl0IGlzIGEgcGFydCBvZiB0aGUgYmFzaWNfc3RyaW5nIGRlZmluaXRpb24uCisgKi8KKworcHVibGljOgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0xlZnQsIGNsYXNzIF9SaWdodCwgY2xhc3MgX1N0b3JhZ2VEaXI+CisgIGJhc2ljX3N0cmluZyhfU1RMUF9QUklWIF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9MZWZ0LCBfUmlnaHQsIF9TdG9yYWdlRGlyPiBjb25zdCYgX19zKQorICAgIDogX1NUTFBfU1RSSU5HX1NVTV9CQVNFKF9SZXNlcnZlX3QoKSwgX19zLnNpemUoKSwgX19zLmdldF9hbGxvY2F0b3IoKSkKKyAgeyBfTV9hcHBlbmRfc3VtKF9fcyk7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0xlZnQsIGNsYXNzIF9SaWdodCwgY2xhc3MgX1N0b3JhZ2VEaXI+CisgIGJhc2ljX3N0cmluZyhfU1RMUF9QUklWIF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9MZWZ0LCBfUmlnaHQsIF9TdG9yYWdlRGlyPiBjb25zdCYgX19zLAorICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uID0gbnBvcywKKyAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX1NUTFBfU1RSSU5HX1NVTV9CQVNFKF9SZXNlcnZlX3QoKSwgKF9fcG9zIDw9IF9fcy5zaXplKCkpID8gKChtaW4pIChfX24sIF9fcy5zaXplKCkgLSBfX3BvcykpIDogMCwgX19hKSB7CisgICAgc2l6ZV90eXBlIF9fc2l6ZSA9IF9fcy5zaXplKCk7CisgICAgaWYgKF9fcG9zID4gX19zaXplKQorICAgICAgdGhpcy0+X01fdGhyb3dfb3V0X29mX3JhbmdlKCk7CisgICAgZWxzZQorICAgICAgX01fYXBwZW5kX3N1bV9wb3MoX19zLCBfX3BvcywgKG1pbikgKF9fbiwgX19zaXplIC0gX19wb3MpKTsKKyAgfQorCitwcml2YXRlOgorICBfQ2hhclQqIF9NX2FwcGVuZF9mYXN0KF9TVExQX1BSSVYgX19jaGFyX3dyYXBwZXI8X0NoYXJUPiBfX2MsIF9DaGFyVCAqX19idWYpIHsKKyAgICBfU1RMUF9TVEQ6Ol9Db3B5X0NvbnN0cnVjdChfX2J1ZiwgX19jLmdldFZhbHVlKCkpOworICAgIHJldHVybiBfX2J1ZiArIDE7CisgIH0KKyAgX0NoYXJUKiBfTV9hcHBlbmRfZmFzdChfQ2hhclQgY29uc3QqIF9fcywgc2l6ZV90eXBlIF9fc19zaXplLCBfQ2hhclQgKl9fYnVmKQorICB7IHJldHVybiB1bmluaXRpYWxpemVkX2NvcHkoX19zLCBfX3MgKyBfX3Nfc2l6ZSwgX19idWYpOyB9CisgIF9DaGFyVCogX01fYXBwZW5kX2Zhc3QoX1NUTFBfUFJJViBfX2NzdHJfd3JhcHBlcjxfQ2hhclQ+IGNvbnN0JiBfX3MsIF9DaGFyVCAqX19idWYpCisgIHsgcmV0dXJuIF9NX2FwcGVuZF9mYXN0KF9fcy5jX3N0cigpLCBfX3Muc2l6ZSgpLCBfX2J1Zik7IH0KKyAgX0NoYXJUKiBfTV9hcHBlbmRfZmFzdChfU1RMUF9QUklWIF9fYnN0cl93cmFwcGVyPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiBfX3MsIF9DaGFyVCAqX19idWYpCisgIHsgcmV0dXJuIF9NX2FwcGVuZF9mYXN0KF9fcy5iX3N0cigpLCBfX2J1Zik7IH0KKyAgX0NoYXJUKiBfTV9hcHBlbmRfZmFzdChfU2VsZiBjb25zdCYgX19zLCBfQ2hhclQgKl9fYnVmKQorICB7IHJldHVybiBfTV9hcHBlbmRfZmFzdChfX3MuZGF0YSgpLCBfX3Muc2l6ZSgpLCBfX2J1Zik7IH0KKyAgX0NoYXJUKiBfTV9hcHBlbmRfZmFzdChfU1RMUF9QUklWIF9fc3VtX3N0b3JhZ2VfZWxlbTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4gY29uc3QmLCBfQ2hhclQgKl9fYnVmKQorICB7IHJldHVybiBfX2J1ZjsgfQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0xlZnQsIGNsYXNzIF9SaWdodCwgY2xhc3MgX1N0b3JhZ2VEaXI+CisgIF9DaGFyVCogX01fYXBwZW5kX2Zhc3QoX1NUTFBfUFJJViBfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfTGVmdCwgX1JpZ2h0LCBfU3RvcmFnZURpcj4gY29uc3QmIF9fcywgX0NoYXJUICpfX2J1ZikKKyAgeyByZXR1cm4gX01fYXBwZW5kX2Zhc3QoX19zLmdldFJocygpLCBfTV9hcHBlbmRfZmFzdChfX3MuZ2V0TGhzKCksIF9fYnVmKSk7IH0KKworICBfQ2hhclQqIF9NX2FwcGVuZF9mYXN0X3BvcyhfU1RMUF9QUklWIF9fY2hhcl93cmFwcGVyPF9DaGFyVD4gX19jLCBfQ2hhclQgKl9fYnVmLCBzaXplX3R5cGUgLypfX3BvcyovLCBzaXplX3R5cGUgX19uKSB7CisgICAgaWYgKF9fbiA9PSAwKQorICAgICAgcmV0dXJuIF9fYnVmOworICAgIF9TVExQX1NURDo6X0NvcHlfQ29uc3RydWN0KF9fYnVmLCBfX2MuZ2V0VmFsdWUoKSk7CisgICAgcmV0dXJuIF9fYnVmICsgMTsKKyAgfQorICBfQ2hhclQqIF9NX2FwcGVuZF9mYXN0X3BvcyhfQ2hhclQgY29uc3QqIF9fcywgc2l6ZV90eXBlIF9fc19zaXplLCBfQ2hhclQgKl9fYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pCisgIHsgcmV0dXJuIHVuaW5pdGlhbGl6ZWRfY29weShfX3MgKyBfX3BvcywgX19zICsgX19wb3MgKyAobWluKShfX24sIF9fc19zaXplIC0gX19wb3MpLCBfX2J1Zik7IH0KKyAgX0NoYXJUKiBfTV9hcHBlbmRfZmFzdF9wb3MoX1NUTFBfUFJJViBfX2NzdHJfd3JhcHBlcjxfQ2hhclQ+IGNvbnN0JiBfX3MsIF9DaGFyVCAqX19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikKKyAgeyByZXR1cm4gX01fYXBwZW5kX2Zhc3RfcG9zKF9fcy5jX3N0cigpLCBfX3Muc2l6ZSgpLCBfX2J1ZiwgX19wb3MsIF9fbik7IH0KKyAgX0NoYXJUKiBfTV9hcHBlbmRfZmFzdF9wb3MoX1NUTFBfUFJJViBfX2JzdHJfd3JhcHBlcjxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4gX19zLCBfQ2hhclQgKl9fYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pCisgIHsgcmV0dXJuIF9NX2FwcGVuZF9mYXN0X3BvcyhfX3MuYl9zdHIoKSwgX19idWYsIF9fcG9zLCBfX24pOyB9CisgIF9DaGFyVCogX01fYXBwZW5kX2Zhc3RfcG9zKF9TZWxmIGNvbnN0JiBfX3MsIF9DaGFyVCAqX19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikKKyAgeyByZXR1cm4gX01fYXBwZW5kX2Zhc3RfcG9zKF9fcy5kYXRhKCksIF9fcy5zaXplKCksIF9fYnVmLCBfX3BvcywgX19uKTsgfQorICBfQ2hhclQqIF9NX2FwcGVuZF9mYXN0X3BvcyhfU1RMUF9QUklWIF9fc3VtX3N0b3JhZ2VfZWxlbTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4gY29uc3QmLCBfQ2hhclQgKl9fYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUsIHNpemVfdHlwZSkKKyAgeyByZXR1cm4gX19idWY7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0xlZnQsIGNsYXNzIF9SaWdodCwgY2xhc3MgX1N0b3JhZ2VEaXI+CisgIF9DaGFyVCogX01fYXBwZW5kX2Zhc3RfcG9zKF9TVExQX1BSSVYgX19ic3RyX3N1bTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0xlZnQsIF9SaWdodCwgX1N0b3JhZ2VEaXI+IGNvbnN0JiBfX3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DaGFyVCAqX19idWYsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgeworICAgIGlmIChfX24gPT0gMCkgeworICAgICAgcmV0dXJuIF9fYnVmOworICAgIH0KKyAgICBzaXplX3R5cGUgX19saHNfc2l6ZSA9IF9fcy5nZXRMaHMoKS5zaXplKCk7CisgICAgaWYgKF9fcG9zIDwgX19saHNfc2l6ZSkgeworICAgICAgaWYgKF9fbiA8IChfX2xoc19zaXplIC0gX19wb3MpKSB7CisgICAgICAgIHJldHVybiBfTV9hcHBlbmRfZmFzdF9wb3MoX19zLmdldExocygpLCBfX2J1ZiwgX19wb3MsIF9fbik7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gX01fYXBwZW5kX2Zhc3RfcG9zKF9fcy5nZXRSaHMoKSwgX01fYXBwZW5kX2Zhc3RfcG9zKF9fcy5nZXRMaHMoKSwgX19idWYsIF9fcG9zLCBfX24pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIF9fbiAtIChfX2xoc19zaXplIC0gX19wb3MpKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIF9NX2FwcGVuZF9mYXN0X3BvcyhfX3MuZ2V0UmhzKCksIF9fYnVmLCBfX3BvcyAtIF9fbGhzX3NpemUsIF9fbik7CisgICAgfQorICB9CisKKyAgLyogTm90ZTogV2UgYWx3YXlzIGZvcmNlIHVzZSBvZiBkeW5hbWljIGJ1ZmZlciBpZiB0aGUgc2hvcnQgc3RyaW5nIG9wdGltIG9wdGlvbiBpcyBhY3RpdmF0ZWQKKyAgICogdG8gYXZvaWQgY29tcGxpY2F0ZWQgY29kZSBpZiB0aGUgYmFzaWNfc3RyaW5nIHdhcyBpbnN0YW5jaWF0ZWQgd2l0aCBhIG5vbiBQT0QgdHlwZS4KKyAgICogSW4gc3VjaCBhIGNhc2Ugd2Ugc2hvdWxkIHVzZSBhc3NpZ25tZW50IGZvciBvYmplY3RzIGluIHRoZSBzdGF0aWMgYXJyYXkgc29tZXRoaW5nIHRoYXQgd2UKKyAgICogZG8gbm90IGRvLgorICAgKi8KKyAgc2l6ZV90eXBlIF9NX2dldF9hZGRpdGlvbmFsX3NpemUoc2l6ZV90eXBlIF9fbmV3X3NpemUsIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypfQ2hhcl9Jc19QT0QqLykgY29uc3QgeworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0pCisgICAgLy9UbyBhdm9pZCBwcm9ibGVtIHdpdGggdGhlIHN0cmluZyBhc3N1bXB0aW9ucywgbmV2ZXIgYWxsb2NhdGUgYSBkeW5hbWljIGJ1ZmZlciBzbWFsbGVyIG9yIGVxdWFsCisgICAgLy90aGFuIHRoZSBzdGF0aWMgb25lOgorICAgIGlmIChfX25ld19zaXplIDwgX0Jhc2U6Ol9ERUZBVUxUX1NJWkUgKyAxKQorICAgICAgcmV0dXJuIChfQmFzZTo6X0RFRkFVTFRfU0laRSArIDEpIC0gX19uZXdfc2l6ZTsKKyNlbmRpZiAvKiBfU1RMUF9VU0VfU0hPUlRfU1RSSU5HX09QVElNICovCisgICAgcmV0dXJuIDA7CisgIH0KKyAgc2l6ZV90eXBlIF9NX2dldF9hZGRpdGlvbmFsX3NpemUoc2l6ZV90eXBlLCBjb25zdCBfX3RydWVfdHlwZSYgLypfQ2hhcl9Jc19QT0QqLykgY29uc3QKKyAgeyByZXR1cm4gMDsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfTGVmdCwgY2xhc3MgX1JpZ2h0LCBjbGFzcyBfU3RvcmFnZURpcj4KKyAgX1NlbGYmIF9NX2FwcGVuZF9zdW0gKF9TVExQX1BSSVYgX19ic3RyX3N1bTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0xlZnQsIF9SaWdodCwgX1N0b3JhZ2VEaXI+IGNvbnN0JiBfX3MpIHsKKyAgICBzaXplX3R5cGUgX19zX3NpemUgPSBfX3Muc2l6ZSgpOworICAgIGlmIChfX3Nfc2l6ZSA9PSAwKQorICAgICAgcmV0dXJuICp0aGlzOworICAgIGNvbnN0IHNpemVfdHlwZSBfX29sZF9zaXplID0gdGhpcy0+c2l6ZSgpOworICAgIGlmIChfX3Nfc2l6ZSA+IHRoaXMtPm1heF9zaXplKCkgfHwgX19vbGRfc2l6ZSA+ICh0aGlzLT5tYXhfc2l6ZSgpIC0gX19zX3NpemUpKQorICAgICAgdGhpcy0+X01fdGhyb3dfbGVuZ3RoX2Vycm9yKCk7CisgICAgc2l6ZV90eXBlIF9fb2Zmc2V0X3NpemUgPSBfTV9nZXRfYWRkaXRpb25hbF9zaXplKF9fb2xkX3NpemUgKyBfX3Nfc2l6ZSwgX0NoYXJfSXNfUE9EKCkpOworICAgIGlmIChfX29sZF9zaXplICsgX19zX3NpemUgKyBfX29mZnNldF9zaXplID4gdGhpcy0+Y2FwYWNpdHkoKSkgeworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fbGVuID0gX19vbGRfc2l6ZSArIF9fb2Zmc2V0X3NpemUgKyAobWF4KShfX29sZF9zaXplLCBfX3Nfc2l6ZSkgKyAxOworICAgICAgcG9pbnRlciBfX25ld19zdGFydCA9IHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLmFsbG9jYXRlKF9fbGVuKTsKKyAgICAgIHBvaW50ZXIgX19uZXdfZmluaXNoID0gX19uZXdfc3RhcnQ7CisgICAgICBfU1RMUF9UUlkgeworICAgICAgICBfX25ld19maW5pc2ggPSB1bmluaXRpYWxpemVkX2NvcHkodGhpcy0+X01fU3RhcnQoKSwgdGhpcy0+X01fRmluaXNoKCksIF9fbmV3X3N0YXJ0KTsKKyAgICAgICAgX19uZXdfZmluaXNoID0gdGhpcy0+X01fYXBwZW5kX2Zhc3QoX19zLCBfX25ld19maW5pc2gpOworICAgICAgICB0aGlzLT5fTV9jb25zdHJ1Y3RfbnVsbChfX25ld19maW5pc2gpOworICAgICAgfQorICAgICAgX1NUTFBfVU5XSU5EKChfU1RMUF9TVEQ6Ol9EZXN0cm95X1JhbmdlKF9fbmV3X3N0YXJ0LF9fbmV3X2ZpbmlzaCksCisgICAgICAgICAgICAgICAgICAgdGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuZGVhbGxvY2F0ZShfX25ld19zdGFydCxfX2xlbikpKQorICAgICAgdGhpcy0+X01fZGVzdHJveV9yYW5nZSgpOworICAgICAgdGhpcy0+X01fZGVhbGxvY2F0ZV9ibG9jaygpOworICAgICAgdGhpcy0+X01fcmVzZXQoX19uZXdfc3RhcnQsIF9fbmV3X2ZpbmlzaCwgX19uZXdfc3RhcnQgKyBfX2xlbik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgX01fYXBwZW5kX3N1bV9ub19vdmVyZmxvdyhfX3MsIDAsIF9fc19zaXplKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9MZWZ0LCBjbGFzcyBfUmlnaHQsIGNsYXNzIF9TdG9yYWdlRGlyPgorICBfU2VsZiYgX01fYXBwZW5kX3N1bV9wb3MoX1NUTFBfUFJJViBfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfTGVmdCwgX1JpZ2h0LCBfU3RvcmFnZURpcj4gY29uc3QmIF9fcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgeworICAgIHNpemVfdHlwZSBfX3Nfc2l6ZSA9IChtaW4pKF9fcy5zaXplKCkgLSBfX3BvcywgX19uKTsKKyAgICBpZiAoX19zX3NpemUgPT0gMCkKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICBjb25zdCBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IHRoaXMtPnNpemUoKTsKKyAgICBpZiAoX19zX3NpemUgPiB0aGlzLT5tYXhfc2l6ZSgpIHx8IF9fb2xkX3NpemUgPiAodGhpcy0+bWF4X3NpemUoKSAtIF9fc19zaXplKSkKKyAgICAgIHRoaXMtPl9NX3Rocm93X2xlbmd0aF9lcnJvcigpOworICAgIHNpemVfdHlwZSBfX29mZnNldF9zaXplID0gX01fZ2V0X2FkZGl0aW9uYWxfc2l6ZShfX29sZF9zaXplICsgX19zX3NpemUsIF9DaGFyX0lzX1BPRCgpKTsKKyAgICBpZiAoX19vbGRfc2l6ZSArIF9fc19zaXplICsgX19vZmZzZXRfc2l6ZSA+IHRoaXMtPmNhcGFjaXR5KCkpIHsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX2xlbiA9IF9fb2xkX3NpemUgKyBfX29mZnNldF9zaXplICsgKG1heCkoX19vbGRfc2l6ZSwgX19zX3NpemUpICsgMTsKKyAgICAgIHBvaW50ZXIgX19uZXdfc3RhcnQgPSB0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5hbGxvY2F0ZShfX2xlbik7CisgICAgICBwb2ludGVyIF9fbmV3X2ZpbmlzaCA9IF9fbmV3X3N0YXJ0OworICAgICAgX1NUTFBfVFJZIHsKKyAgICAgICAgX19uZXdfZmluaXNoID0gdW5pbml0aWFsaXplZF9jb3B5KHRoaXMtPl9NX1N0YXJ0KCksIHRoaXMtPl9NX0ZpbmlzaCgpLCBfX25ld19zdGFydCk7CisgICAgICAgIF9fbmV3X2ZpbmlzaCA9IF9NX2FwcGVuZF9mYXN0X3BvcyhfX3MsIF9fbmV3X2ZpbmlzaCwgX19wb3MsIF9fc19zaXplKTsKKyAgICAgICAgdGhpcy0+X01fY29uc3RydWN0X251bGwoX19uZXdfZmluaXNoKTsKKyAgICAgIH0KKyAgICAgIF9TVExQX1VOV0lORCgoX1NUTFBfU1REOjpfRGVzdHJveV9SYW5nZShfX25ld19zdGFydCxfX25ld19maW5pc2gpLAorICAgICAgICAgICAgICAgICAgIHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLmRlYWxsb2NhdGUoX19uZXdfc3RhcnQsX19sZW4pKSkKKyAgICAgIHRoaXMtPl9NX2Rlc3Ryb3lfcmFuZ2UoKTsKKyAgICAgIHRoaXMtPl9NX2RlYWxsb2NhdGVfYmxvY2soKTsKKyAgICAgIHRoaXMtPl9NX3Jlc2V0KF9fbmV3X3N0YXJ0LCBfX25ld19maW5pc2gsIF9fbmV3X3N0YXJ0ICsgX19sZW4pOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIF9NX2FwcGVuZF9zdW1fbm9fb3ZlcmZsb3coX19zLCBfX3BvcywgX19zX3NpemUpOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0xlZnQsIGNsYXNzIF9SaWdodCwgY2xhc3MgX1N0b3JhZ2VEaXI+CisgIHZvaWQgX01fYXBwZW5kX3N1bV9ub19vdmVyZmxvdyhfU1RMUF9QUklWIF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9MZWZ0LCBfUmlnaHQsIF9TdG9yYWdlRGlyPiBjb25zdCYgX19zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSB7CisgICAgcG9pbnRlciBfX2ZpbmlzaCA9IHRoaXMtPl9NX0ZpbmlzaCgpOworICAgIF9NX2FwcGVuZF9mYXN0X3BvcyhfX3MsIF9fZmluaXNoICsgMSwgX19wb3MgKyAxLCBfX24gLSAxKTsKKyAgICBfU1RMUF9UUlkgeworICAgICAgdGhpcy0+X01fY29uc3RydWN0X251bGwoX19maW5pc2ggKyBfX24pOworICAgIH0KKyAgICBfU1RMUF9VTldJTkQodGhpcy0+X01fZGVzdHJveV9wdHJfcmFuZ2UoX19maW5pc2ggKyAxLCBfX2ZpbmlzaCArIF9fbikpCisgICAgLyogVGhlIGNhbGwgdG8gdGhlIHRyYWl0czo6YXNzaWduIG1ldGhvZCBpcyBvbmx5IGltcG9ydGFudCBmb3Igbm9uIFBPRCB0eXBlcyBiZWNhdXNlIHRoZSBpbnN0YW5jZQorICAgICAqIHBvaW50ZWQgdG8gYnkgX01fZmluaXNoIGhhcyBiZWVuIGNvbnN0cnVjdGVkIChkZWZhdWx0IGNvbnN0cnVjdG9yKSBhbmQgc2hvdWxkIG5vdCBiZSBjb25zdHJ1Y3RlZAorICAgICAqIChjb3B5IGNvbnN0cnVjdG9yKSBvbmNlIGFnYWluLiBGb3IgUE9EIGl0IGlzIGlycmVsZXZhbnQsIHVuaW5pdGlhbGl6ZWRfY29weSBjb3VsZCBiZSBmaW5lLAorICAgICAqIGJ1dCB3ZSBhcmUgbm90IGdvaW5nIHRvIG1ha2UgdHdvIGltcGxlbWVudGF0aW9ucyBqdXN0IGZvciB0aGF0LgorICAgICAqLworICAgIF9UcmFpdHM6OmFzc2lnbigqdGhpcy0+X01fZmluaXNoLCBfX3NbX19wb3NdKTsKKyAgICB0aGlzLT5fTV9maW5pc2ggKz0gX19uOworICB9CmRpZmYgLS1naXQgYS9zdGwvX3N0cmluZ193b3JrYXJvdW5kLmggYi9zdGwvX3N0cmluZ193b3JrYXJvdW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNkNWQzZAotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9fc3RyaW5nX3dvcmthcm91bmQuaApAQCAtMCwwICsxLDczMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNAorICogRnJhbmNvaXMgRHVtb250CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKy8vSW5jbHVkZWQgZnJvbSBfc3RyaW5nLmgsIG5vIG5lZWQgZm9yIG1hY3JvIGd1YXJkaW5nLgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHKQorIyAgZGVmaW5lIGJhc2ljX3N0cmluZyBfU1RMUF9OT05fREJHX05BTUUoc3RyKQorX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorI2VuZGlmCisKKyNkZWZpbmUgX1NUTFBfTk9fTUVNX1RfU1RSSU5HX0JBU0UgX1NUTFBfUFJJViBfU1RMUF9OT19NRU1fVF9OQU1FKHN0cik8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK2NsYXNzIGJhc2ljX3N0cmluZyA6IHB1YmxpYyBfU1RMUF9OT19NRU1fVF9TVFJJTkdfQkFTRQorI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QQVJUSUFMX1NQRUNfV09SS0FST1VORCkgJiYgXAorICAgICFkZWZpbmVkIChiYXNpY19zdHJpbmcpCisgICAgICAgICAgICAgICAgICAgLCBwdWJsaWMgX19zdGxwb3J0X2NsYXNzPGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4gPgorI2VuZGlmCit7Citwcm90ZWN0ZWQ6ICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJvdGVjdGVkIG1lbWJlcnMgaW5oZXJpdGVkIGZyb20gYmFzZS4KKyAgdHlwZWRlZiBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+IF9TZWxmOworICB0eXBlZGVmIF9TVExQX05PX01FTV9UX1NUUklOR19CQVNFIF9CYXNlOworICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpfQ2hhcl9Jc19QT0QgX0NoYXJfSXNfUE9EOworCitwdWJsaWM6CisKKyAgX19JTVBPUlRfV0lUSF9SRVZFUlNFX0lURVJBVE9SUyhfQmFzZSkKKworICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpfSXRlcmF0b3JfY2F0ZWdvcnkgX0l0ZXJhdG9yX2NhdGVnb3J5OworICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjp0cmFpdHNfdHlwZSB0cmFpdHNfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6X1Jlc2VydmVfdCBfUmVzZXJ2ZV90OworCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbnN0cnVjdG9yLCBkZXN0cnVjdG9yLCBhc3NpZ25tZW50LgorICBleHBsaWNpdCBiYXNpY19zdHJpbmcoY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfU1RMUF9OT19NRU1fVF9TVFJJTkdfQkFTRShfX2EpIHt9CisKKyAgYmFzaWNfc3RyaW5nKF9SZXNlcnZlX3QgX19yLCBzaXplX3QgX19uLAorICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfU1RMUF9OT19NRU1fVF9TVFJJTkdfQkFTRShfX3IsIF9fbiwgX19hKSB7fQorCisgIGJhc2ljX3N0cmluZyhjb25zdCBfU2VsZiYgX19zKQorICAgIDogX1NUTFBfTk9fTUVNX1RfU1RSSU5HX0JBU0UoX19zKSB7fQorCisgIGJhc2ljX3N0cmluZyhjb25zdCBfU2VsZiYgX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24gPSBucG9zLAorICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfU1RMUF9OT19NRU1fVF9TVFJJTkdfQkFTRShfX3MsIF9fcG9zLCBfX24sIF9fYSkge30KKworICBiYXNpY19zdHJpbmcoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX24sCisgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9TVExQX05PX01FTV9UX1NUUklOR19CQVNFKF9fcywgX19uLCBfX2EpIHt9CisKKyAgYmFzaWNfc3RyaW5nKGNvbnN0IF9DaGFyVCogX19zLAorICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfU1RMUF9OT19NRU1fVF9TVFJJTkdfQkFTRShfX3MsIF9fYSkge30KKworICBiYXNpY19zdHJpbmcoc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYywKKyAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX1NUTFBfTk9fTUVNX1RfU1RSSU5HX0JBU0UoX19uLCBfX2MsIF9fYSkge30KKworICBiYXNpY19zdHJpbmcoX19tb3ZlX3NvdXJjZTxfU2VsZj4gc3JjKQorICAgIDogX1NUTFBfTk9fTUVNX1RfU1RSSU5HX0JBU0UoX19tb3ZlX3NvdXJjZTxfQmFzZT4oc3JjLmdldCgpKSkge30KKworICAvLyBDaGVjayB0byBzZWUgaWYgX0lucHV0SXRlcmF0b3IgaXMgYW4gaW50ZWdlciB0eXBlLiAgSWYgc28sIHRoZW4KKyAgLy8gaXQgY2FuJ3QgYmUgYW4gaXRlcmF0b3IuCisjaWYgIShkZWZpbmVkKF9fTVJDX18pIHx8IChkZWZpbmVkKF9fU0NfXykgJiYgIWRlZmluZWQoX19ETUNfXykpKSAvLyp0eSAwNC8zMC8yMDAxIC0gbXB3IGNvbXBpbGVycyBjaG9rZSBvbiB0aGlzIGN0b3IKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICBiYXNpY19zdHJpbmcoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsCisgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSAmIF9fYSBfU1RMUF9BTExPQ0FUT1JfVFlQRV9ERkwpCisgICAgOiBfU1RMUF9OT19NRU1fVF9TVFJJTkdfQkFTRShfQmFzZTo6X0NhbGxlZEZyb21Xb3JrYXJvdW5kX3QoKSwgX19hKSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXNJbnRlZ3JhbDxfSW5wdXRJdGVyYXRvcj46Ol9SZXQgX0ludGVncmFsOworICAgIF9NX2luaXRpYWxpemVfZGlzcGF0Y2goX19mLCBfX2wsIF9JbnRlZ3JhbCgpKTsKKyAgfQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfTkVFRFNfRVhUUkFfVEVNUExBVEVfQ09OU1RSVUNUT1JTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIGJhc2ljX3N0cmluZyhfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCkKKyAgICA6IF9TVExQX05PX01FTV9UX1NUUklOR19CQVNFKF9CYXNlOjpfQ2FsbGVkRnJvbVdvcmthcm91bmRfdCgpLCBhbGxvY2F0b3JfdHlwZSgpKSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXNJbnRlZ3JhbDxfSW5wdXRJdGVyYXRvcj46Ol9SZXQgX0ludGVncmFsOworICAgIF9NX2luaXRpYWxpemVfZGlzcGF0Y2goX19mLCBfX2wsIF9JbnRlZ3JhbCgpKTsKKyAgfQorIyAgZW5kaWYKKyNlbmRpZiAvKiAhX19NUkNfXyB8fCAoX19TQ19fICYmICFfX0RNQ19fKSAqLworCisgIF9TZWxmJiBvcGVyYXRvcj0oY29uc3QgX1NlbGYmIF9fcykgeworICAgIF9CYXNlOjpvcGVyYXRvcj0oX19zKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBfU2VsZiYgb3BlcmF0b3I9KGNvbnN0IF9DaGFyVCogX19zKSB7CisgICAgX0Jhc2U6Om9wZXJhdG9yPShfX3MpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIF9TZWxmJiBvcGVyYXRvcj0oX0NoYXJUIF9fYykgeworICAgIF9CYXNlOjpvcGVyYXRvcj0oX19jKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworcHJpdmF0ZToKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXI+CisgIHZvaWQgX01fcmFuZ2VfaW5pdGlhbGl6ZShfSW5wdXRJdGVyIF9fZiwgX0lucHV0SXRlciBfX2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnB1dF9pdGVyYXRvcl90YWcgJl9fdGFnKSB7CisgICAgdGhpcy0+X01fYWxsb2NhdGVfYmxvY2soKTsKKyAgICB0aGlzLT5fTV9jb25zdHJ1Y3RfbnVsbCh0aGlzLT5fTV9GaW5pc2goKSk7CisgICAgX1NUTFBfVFJZIHsKKyAgICAgIF9NX2FwcGVuZFQoX19mLCBfX2wsIF9fdGFnKTsKKyAgICB9CisgICAgX1NUTFBfVU5XSU5EKHRoaXMtPl9NX2Rlc3Ryb3lfcmFuZ2UoKSkKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXI+CisgIHZvaWQgX01fcmFuZ2VfaW5pdGlhbGl6ZShfRm9yd2FyZEl0ZXIgX19mLCBfRm9yd2FyZEl0ZXIgX19sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9yd2FyZF9pdGVyYXRvcl90YWcgJikgeworICAgIGRpZmZlcmVuY2VfdHlwZSBfX24gPSBkaXN0YW5jZShfX2YsIF9fbCk7CisgICAgdGhpcy0+X01fYWxsb2NhdGVfYmxvY2soX19uICsgMSk7CisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1NIT1JUX1NUUklOR19PUFRJTSkKKyAgICBpZiAodGhpcy0+X01fdXNpbmdfc3RhdGljX2J1ZigpKSB7CisgICAgICBfTV9jb3B5VChfX2YsIF9fbCwgdGhpcy0+X01fU3RhcnQoKSk7CisgICAgICB0aGlzLT5fTV9maW5pc2ggPSB0aGlzLT5fTV9TdGFydCgpICsgX19uOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYgLyogX1NUTFBfVVNFX1NIT1JUX1NUUklOR19PUFRJTSAqLworICAgIHRoaXMtPl9NX2ZpbmlzaCA9IHVuaW5pdGlhbGl6ZWRfY29weShfX2YsIF9fbCwgdGhpcy0+X01fU3RhcnQoKSk7CisgICAgdGhpcy0+X01fdGVybWluYXRlX3N0cmluZygpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXI+CisgIHZvaWQgX01fcmFuZ2VfaW5pdGlhbGl6ZVQoX0lucHV0SXRlciBfX2YsIF9JbnB1dEl0ZXIgX19sKSB7CisgICAgX01fcmFuZ2VfaW5pdGlhbGl6ZShfX2YsIF9fbCwgX1NUTFBfSVRFUkFUT1JfQ0FURUdPUlkoX19mLCBfSW5wdXRJdGVyKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0ludGVnZXI+CisgIHZvaWQgX01faW5pdGlhbGl6ZV9kaXNwYXRjaChfSW50ZWdlciBfX24sIF9JbnRlZ2VyIF9feCwgY29uc3QgX190cnVlX3R5cGUmIC8qX0ludGVncmFsKi8pIHsKKyAgICB0aGlzLT5fTV9hbGxvY2F0ZV9ibG9jayhfX24gKyAxKTsKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfU0hPUlRfU1RSSU5HX09QVElNKQorICAgIGlmICh0aGlzLT5fTV91c2luZ19zdGF0aWNfYnVmKCkpIHsKKyAgICAgIF9UcmFpdHM6OmFzc2lnbih0aGlzLT5fTV9TdGFydCgpLCBfX24sIF9feCk7CisgICAgICB0aGlzLT5fTV9maW5pc2ggPSB0aGlzLT5fTV9TdGFydCgpICsgX19uOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYgLyogX1NUTFBfVVNFX1NIT1JUX1NUUklOR19PUFRJTSAqLworICAgIHRoaXMtPl9NX2ZpbmlzaCA9IHVuaW5pdGlhbGl6ZWRfZmlsbF9uKHRoaXMtPl9NX1N0YXJ0KCksIF9fbiwgX194KTsKKyAgICB0aGlzLT5fTV90ZXJtaW5hdGVfc3RyaW5nKCk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcj4KKyAgdm9pZCBfTV9pbml0aWFsaXplX2Rpc3BhdGNoKF9JbnB1dEl0ZXIgX19mLCBfSW5wdXRJdGVyIF9fbCwgY29uc3QgX19mYWxzZV90eXBlJiAvKl9JbnRlZ3JhbCovKSB7CisgICAgX01fcmFuZ2VfaW5pdGlhbGl6ZVQoX19mLCBfX2wpOworICB9CisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXBwZW5kLCBvcGVyYXRvcis9LCBwdXNoX2JhY2suCisgIF9TZWxmJiBvcGVyYXRvcis9KGNvbnN0IF9TZWxmJiBfX3MpIHsKKyAgICBfQmFzZTo6b3BlcmF0b3IrPShfX3MpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBfU2VsZiYgb3BlcmF0b3IrPShjb25zdCBfQ2hhclQqIF9fcykgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgICAgX0Jhc2U6Om9wZXJhdG9yKz0oX19zKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgX1NlbGYmIG9wZXJhdG9yKz0oX0NoYXJUIF9fYykgeworICAgIF9CYXNlOjpvcGVyYXRvcis9KF9fYyk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgX1NlbGYmIGFwcGVuZChjb25zdCBfU2VsZiYgX19zKSB7CisgICAgX0Jhc2U6OmFwcGVuZChfX3MpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIF9TZWxmJiBhcHBlbmQoY29uc3QgX1NlbGYmIF9fcywKKyAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIHsKKyAgICBfQmFzZTo6YXBwZW5kKF9fcywgX19wb3MsIF9fbik7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgX1NlbGYmIGFwcGVuZChjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbikgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgICAgX0Jhc2U6OmFwcGVuZChfX3MsIF9fbik7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIF9TZWxmJiBhcHBlbmQoY29uc3QgX0NoYXJUKiBfX3MpIHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKQorICAgIF9CYXNlOjphcHBlbmQoX19zKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgX1NlbGYmIGFwcGVuZChzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jKSB7CisgICAgX0Jhc2U6OmFwcGVuZChfX24sIF9fYyk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8gQ2hlY2sgdG8gc2VlIGlmIF9JbnB1dEl0ZXJhdG9yIGlzIGFuIGludGVnZXIgdHlwZS4gIElmIHNvLCB0aGVuCisgIC8vIGl0IGNhbid0IGJlIGFuIGl0ZXJhdG9yLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcj4KKyAgX1NlbGYmIGFwcGVuZChfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0KSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXNJbnRlZ3JhbDxfSW5wdXRJdGVyPjo6X1JldCBfSW50ZWdyYWw7CisgICAgcmV0dXJuIF9NX2FwcGVuZF9kaXNwYXRjaChfX2ZpcnN0LCBfX2xhc3QsIF9JbnRlZ3JhbCgpKTsKKyAgfQorCisjaWYgIWRlZmluZWQgKF9TVExQX05PX01FVEhPRF9TUEVDSUFMSVpBVElPTikgJiYgIWRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpCisgIC8vU2VlIGVxdWl2YWxlbnQgYXNzaWduIG1ldGhvZCByZW1hcmsuCisgIF9TZWxmJiBhcHBlbmQoY29uc3QgX0NoYXJUKiBfX2YsIGNvbnN0IF9DaGFyVCogX19sKSB7CisgICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fZilfU1RMUF9GSVhfTElURVJBTF9CVUcoX19sKQorICAgIF9CYXNlOjphcHBlbmQoX19mLCBfX2wpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorI2VuZGlmCisKK3ByaXZhdGU6ICAgICAgICAgICAgICAgICAgICAgICAgLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgYXBwZW5kLgorCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgorICBfU2VsZiYgX01fYXBwZW5kVChfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0X2l0ZXJhdG9yX3RhZyAmKSB7CisgICAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdCA7ICsrX19maXJzdCkKKyAgICAgIF9CYXNlOjpwdXNoX2JhY2soKl9fZmlyc3QpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXI+CisgIF9TZWxmJiBfTV9hcHBlbmRUKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3J3YXJkX2l0ZXJhdG9yX3RhZyAmKSAgeworICAgIGlmIChfX2ZpcnN0ICE9IF9fbGFzdCkgeworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSB0aGlzLT5zaXplKCk7CisgICAgICBkaWZmZXJlbmNlX3R5cGUgX19uID0gZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KTsKKyAgICAgIGlmIChfX1NUQVRJQ19DQVNUKHNpemVfdHlwZSxfX24pID4gbWF4X3NpemUoKSB8fCBfX29sZF9zaXplID4gbWF4X3NpemUoKSAtIF9fU1RBVElDX0NBU1Qoc2l6ZV90eXBlLF9fbikpCisgICAgICAgIHRoaXMtPl9NX3Rocm93X2xlbmd0aF9lcnJvcigpOworICAgICAgaWYgKF9fb2xkX3NpemUgKyBfX24gPiBjYXBhY2l0eSgpKSB7CisgICAgICAgIGNvbnN0IHNpemVfdHlwZSBfX2xlbiA9IF9fb2xkX3NpemUgKworICAgICAgICAgIChtYXgpKF9fb2xkX3NpemUsIF9fU1RBVElDX0NBU1Qoc2l6ZV90eXBlLF9fbikpICsgMTsKKyAgICAgICAgcG9pbnRlciBfX25ld19zdGFydCA9IHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLmFsbG9jYXRlKF9fbGVuKTsKKyAgICAgICAgcG9pbnRlciBfX25ld19maW5pc2ggPSBfX25ld19zdGFydDsKKyAgICAgICAgX1NUTFBfVFJZIHsKKyAgICAgICAgICBfX25ld19maW5pc2ggPSB1bmluaXRpYWxpemVkX2NvcHkodGhpcy0+X01fU3RhcnQoKSwgdGhpcy0+X01fRmluaXNoKCksIF9fbmV3X3N0YXJ0KTsKKyAgICAgICAgICBfX25ld19maW5pc2ggPSB1bmluaXRpYWxpemVkX2NvcHkoX19maXJzdCwgX19sYXN0LCBfX25ld19maW5pc2gpOworICAgICAgICAgIF9NX2NvbnN0cnVjdF9udWxsKF9fbmV3X2ZpbmlzaCk7CisgICAgICAgIH0KKyAgICAgICAgX1NUTFBfVU5XSU5EKChfU1RMUF9TVEQ6Ol9EZXN0cm95X1JhbmdlKF9fbmV3X3N0YXJ0LF9fbmV3X2ZpbmlzaCksCisgICAgICAgICAgdGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuZGVhbGxvY2F0ZShfX25ld19zdGFydCxfX2xlbikpKQorICAgICAgICAgIHRoaXMtPl9NX2Rlc3Ryb3lfcmFuZ2UoKTsKKyAgICAgICAgdGhpcy0+X01fZGVhbGxvY2F0ZV9ibG9jaygpOworICAgICAgICB0aGlzLT5fTV9yZXNldChfX25ld19zdGFydCwgX19uZXdfZmluaXNoLCBfX25ld19zdGFydCArIF9fbGVuKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBfRm9yd2FyZEl0ZXIgX19mMSA9IF9fZmlyc3Q7CisgICAgICAgICsrX19mMTsKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfU0hPUlRfU1RSSU5HX09QVElNKQorICAgICAgICBpZiAodGhpcy0+X01fdXNpbmdfc3RhdGljX2J1ZigpKQorICAgICAgICAgIF9NX2NvcHlUKF9fZjEsIF9fbGFzdCwgdGhpcy0+X01fRmluaXNoKCkgKyAxKTsKKyAgICAgICAgZWxzZQorI2VuZGlmIC8qIF9TVExQX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0gKi8KKyAgICAgICAgICB1bmluaXRpYWxpemVkX2NvcHkoX19mMSwgX19sYXN0LCB0aGlzLT5fTV9GaW5pc2goKSArIDEpOworICAgICAgICBfU1RMUF9UUlkgeworICAgICAgICAgIHRoaXMtPl9NX2NvbnN0cnVjdF9udWxsKHRoaXMtPl9NX0ZpbmlzaCgpICsgX19uKTsKKyAgICAgICAgfQorICAgICAgICBfU1RMUF9VTldJTkQodGhpcy0+X01fZGVzdHJveV9wdHJfcmFuZ2UodGhpcy0+X01fRmluaXNoKCkgKyAxLCB0aGlzLT5fTV9GaW5pc2goKSArIF9fbikpCisgICAgICAgIF9UcmFpdHM6OmFzc2lnbigqdGhpcy0+X01fZmluaXNoLCAqX19maXJzdCk7CisgICAgICAgIHRoaXMtPl9NX2ZpbmlzaCArPSBfX247CisgICAgICB9CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfSW50ZWdlcj4KKyAgX1NlbGYmIF9NX2FwcGVuZF9kaXNwYXRjaChfSW50ZWdlciBfX24sIF9JbnRlZ2VyIF9feCwgY29uc3QgX190cnVlX3R5cGUmIC8qSW50ZWdyYWwqLykgeworICAgIHJldHVybiBhcHBlbmQoKHNpemVfdHlwZSkgX19uLCAoX0NoYXJUKSBfX3gpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXI+CisgIF9TZWxmJiBfTV9hcHBlbmRfZGlzcGF0Y2goX0lucHV0SXRlciBfX2YsIF9JbnB1dEl0ZXIgX19sLCBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qSW50ZWdyYWwqLykgeworICAgIHJldHVybiBfTV9hcHBlbmRUKF9fZiwgX19sLCBfU1RMUF9JVEVSQVRPUl9DQVRFR09SWShfX2YsIF9JbnB1dEl0ZXIpKTsKKyAgfQorCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFzc2lnbgorCisgIF9TZWxmJiBhc3NpZ24oY29uc3QgX1NlbGYmIF9fcykgeworICAgIF9CYXNlOjphc3NpZ24oX19zKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBfU2VsZiYgYXNzaWduKGNvbnN0IF9TZWxmJiBfX3MsCisgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSB7CisgICAgX0Jhc2U6OmFzc2lnbihfX3MsIF9fcG9zLCBfX24pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIF9TZWxmJiBhc3NpZ24oY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX24pIHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKQorICAgIF9CYXNlOjphc3NpZ24oX19zLCBfX24pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIF9TZWxmJiBhc3NpZ24oY29uc3QgX0NoYXJUKiBfX3MpIHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKQorICAgIF9CYXNlOjphc3NpZ24oX19zKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBfU2VsZiYgYXNzaWduKHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MpIHsKKyAgICBfQmFzZTo6YXNzaWduKF9fbiwgX19jKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworcHJpdmF0ZTogICAgICAgICAgICAgICAgICAgICAgICAvLyBIZWxwZXIgZnVuY3Rpb25zIGZvciBhc3NpZ24uCisKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnRlZ2VyPgorICBfU2VsZiYgX01fYXNzaWduX2Rpc3BhdGNoKF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX194LCBjb25zdCBfX3RydWVfdHlwZSYgLypfSW50ZWdyYWwqLykgeworICAgIHJldHVybiBhc3NpZ24oKHNpemVfdHlwZSkgX19uLCAoX0NoYXJUKSBfX3gpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXI+CisgIF9TZWxmJiBfTV9hc3NpZ25fZGlzcGF0Y2goX0lucHV0SXRlciBfX2YsIF9JbnB1dEl0ZXIgX19sLCBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qX0ludGVncmFsKi8pICB7CisgICAgcG9pbnRlciBfX2N1ciA9IHRoaXMtPl9NX1N0YXJ0KCk7CisgICAgd2hpbGUgKF9fZiAhPSBfX2wgJiYgX19jdXIgIT0gdGhpcy0+X01fRmluaXNoKCkpIHsKKyAgICAgIF9UcmFpdHM6OmFzc2lnbigqX19jdXIsICpfX2YpOworICAgICAgKytfX2Y7CisgICAgICArK19fY3VyOworICAgIH0KKyAgICBpZiAoX19mID09IF9fbCkKKyAgICAgIF9CYXNlOjplcmFzZShfX2N1ciwgdGhpcy0+X01fRmluaXNoKCkpOworICAgIGVsc2UKKyAgICAgIF9NX2FwcGVuZFQoX19mLCBfX2wsIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9fZiwgX0lucHV0SXRlcikpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCitwdWJsaWM6CisgIC8vIENoZWNrIHRvIHNlZSBpZiBfSW5wdXRJdGVyYXRvciBpcyBhbiBpbnRlZ2VyIHR5cGUuICBJZiBzbywgdGhlbgorICAvLyBpdCBjYW4ndCBiZSBhbiBpdGVyYXRvci4KKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXI+CisgIF9TZWxmJiBhc3NpZ24oX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCkgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lzSW50ZWdyYWw8X0lucHV0SXRlcj46Ol9SZXQgX0ludGVncmFsOworICAgIHJldHVybiBfTV9hc3NpZ25fZGlzcGF0Y2goX19maXJzdCwgX19sYXN0LCBfSW50ZWdyYWwoKSk7CisgIH0KKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19NRVRIT0RfU1BFQ0lBTElaQVRJT04pICYmICFkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKQorICAvKiBUaGlzIG1ldGhvZCBpcyBub3QgcGFydCBvZiB0aGUgc3RhbmRhcmQgYW5kIGlzIGEgc3BlY2lhbGl6YXRpb24gb2YgdGhlCisgICAqIHRlbXBsYXRlIG1ldGhvZCBhc3NpZ24uIEl0IGlzIG9ubHkgZ3JhbnRlZCBmb3IgY29udmVuaWVuY2UgdG8gY2FsbCBhc3NpZ24KKyAgICogd2l0aCBtaXhlZCBwYXJhbWV0ZXJzIGl0ZXJhdG9yIGFuZCBjb25zdF9pdGVyYXRvci4KKyAgICovCisgIF9TZWxmJiBhc3NpZ24oY29uc3QgX0NoYXJUKiBfX2YsIGNvbnN0IF9DaGFyVCogX19sKSB7CisgICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fZilfU1RMUF9GSVhfTElURVJBTF9CVUcoX19sKQorICAgIF9CYXNlOjphc3NpZ24oX19mLCBfX2wpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorI2VuZGlmCisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5zZXJ0CisKKyAgX1NlbGYmIGluc2VydChzaXplX3R5cGUgX19wb3MsIGNvbnN0IF9TZWxmJiBfX3MpIHsKKyAgICBfQmFzZTo6aW5zZXJ0KF9fcG9zLCBfX3MpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIF9TZWxmJiBpbnNlcnQoc2l6ZV90eXBlIF9fcG9zLCBjb25zdCBfU2VsZiYgX19zLAorICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX2JlZywgc2l6ZV90eXBlIF9fbikgeworICAgIF9CYXNlOjppbnNlcnQoX19wb3MsIF9fcywgX19iZWcsIF9fbik7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIF9TZWxmJiBpbnNlcnQoc2l6ZV90eXBlIF9fcG9zLCBjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbikgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgICAgX0Jhc2U6Omluc2VydChfX3BvcywgX19zLCBfX24pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIF9TZWxmJiBpbnNlcnQoc2l6ZV90eXBlIF9fcG9zLCBjb25zdCBfQ2hhclQqIF9fcykgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgICAgX0Jhc2U6Omluc2VydChfX3BvcywgX19zKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBfU2VsZiYgaW5zZXJ0KHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYykgeworICAgIF9CYXNlOjppbnNlcnQoX19wb3MsIF9fbiwgX19jKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3IgX19wLCBfQ2hhclQgX19jKSB7CisgICAgcmV0dXJuIF9CYXNlOjppbnNlcnQoX19wLCBfX2MpOworICB9CisKKyAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wLCBzaXplX3QgX19uLCBfQ2hhclQgX19jKSB7CisgICAgX0Jhc2U6Omluc2VydChfX3AsIF9fbiwgX19jKTsKKyAgfQorCisgIC8vIENoZWNrIHRvIHNlZSBpZiBfSW5wdXRJdGVyYXRvciBpcyBhbiBpbnRlZ2VyIHR5cGUuICBJZiBzbywgdGhlbgorICAvLyBpdCBjYW4ndCBiZSBhbiBpdGVyYXRvci4KKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXI+CisgIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIF9fcCwgX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCkgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lzSW50ZWdyYWw8X0lucHV0SXRlcj46Ol9SZXQgX0ludGVncmFsOworICAgIF9NX2luc2VydF9kaXNwYXRjaChfX3AsIF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOworICB9CisKK3ByaXZhdGU6ICAvLyBIZWxwZXIgZnVuY3Rpb25zIGZvciBpbnNlcnQuCisKKyAgdm9pZCBfTV9pbnNlcnQoaXRlcmF0b3IgX19wLCBjb25zdCBfQ2hhclQqIF9fZiwgY29uc3QgX0NoYXJUKiBfX2wsIGJvb2wgX19zZWxmX3JlZikgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2YpX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fbCkKKyAgICBfQmFzZTo6X01faW5zZXJ0KF9fcCwgX19mLCBfX2wsIF9fc2VsZl9yZWYpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcj4KKyAgdm9pZCBfTV9pbnNlcnRfb3ZlcmZsb3coaXRlcmF0b3IgX19wb3NpdGlvbiwgX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZSBfX24pIHsKKyAgICBjb25zdCBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IHRoaXMtPnNpemUoKTsKKyAgICBjb25zdCBzaXplX3R5cGUgX19sZW4gPSBfX29sZF9zaXplICsgKG1heCkoX19vbGRfc2l6ZSwgX19TVEFUSUNfQ0FTVChzaXplX3R5cGUsX19uKSkgKyAxOworICAgIHBvaW50ZXIgX19uZXdfc3RhcnQgPSB0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5hbGxvY2F0ZShfX2xlbik7CisgICAgcG9pbnRlciBfX25ld19maW5pc2ggPSBfX25ld19zdGFydDsKKyAgICBfU1RMUF9UUlkgeworICAgICAgX19uZXdfZmluaXNoID0gdW5pbml0aWFsaXplZF9jb3B5KHRoaXMtPl9NX1N0YXJ0KCksIF9fcG9zaXRpb24sIF9fbmV3X3N0YXJ0KTsKKyAgICAgIF9fbmV3X2ZpbmlzaCA9IHVuaW5pdGlhbGl6ZWRfY29weShfX2ZpcnN0LCBfX2xhc3QsIF9fbmV3X2ZpbmlzaCk7CisgICAgICBfX25ld19maW5pc2ggPSB1bmluaXRpYWxpemVkX2NvcHkoX19wb3NpdGlvbiwgdGhpcy0+X01fRmluaXNoKCksIF9fbmV3X2ZpbmlzaCk7CisgICAgICB0aGlzLT5fTV9jb25zdHJ1Y3RfbnVsbChfX25ld19maW5pc2gpOworICAgIH0KKyAgICBfU1RMUF9VTldJTkQoKF9TVExQX1NURDo6X0Rlc3Ryb3lfUmFuZ2UoX19uZXdfc3RhcnQsX19uZXdfZmluaXNoKSwKKyAgICAgICAgICAgICAgICAgIHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLmRlYWxsb2NhdGUoX19uZXdfc3RhcnQsX19sZW4pKSkKKyAgICB0aGlzLT5fTV9kZXN0cm95X3JhbmdlKCk7CisgICAgdGhpcy0+X01fZGVhbGxvY2F0ZV9ibG9jaygpOworICAgIHRoaXMtPl9NX3Jlc2V0KF9fbmV3X3N0YXJ0LCBfX25ld19maW5pc2gsIF9fbmV3X3N0YXJ0ICsgX19sZW4pOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXI+CisgIHZvaWQgX01faW5zZXJ0VChpdGVyYXRvciBfX3AsIF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICBjb25zdCBpbnB1dF9pdGVyYXRvcl90YWcgJikgeworICAgIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkgeworICAgICAgX19wID0gaW5zZXJ0KF9fcCwgKl9fZmlyc3QpOworICAgICAgKytfX3A7CisgICAgfQorICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcj4KKyAgdm9pZCBfTV9pbnNlcnRUKGl0ZXJhdG9yIF9fcG9zaXRpb24sIF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgY29uc3QgZm9yd2FyZF9pdGVyYXRvcl90YWcgJikgeworICAgIGlmIChfX2ZpcnN0ICE9IF9fbGFzdCkgeworICAgICAgZGlmZmVyZW5jZV90eXBlIF9fbiA9IGRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICBpZiAodGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuX01fZGF0YSAtIHRoaXMtPl9NX2ZpbmlzaCA+PSBfX24gKyAxKSB7CisgICAgICAgIGNvbnN0IGRpZmZlcmVuY2VfdHlwZSBfX2VsZW1zX2FmdGVyID0gdGhpcy0+X01fZmluaXNoIC0gX19wb3NpdGlvbjsKKyAgICAgICAgaWYgKF9fZWxlbXNfYWZ0ZXIgPj0gX19uKSB7CisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1NIT1JUX1NUUklOR19PUFRJTSkKKyAgICAgICAgICBpZiAodGhpcy0+X01fdXNpbmdfc3RhdGljX2J1ZigpKQorICAgICAgICAgICAgX0Jhc2U6Ol9NX2NvcHkoKHRoaXMtPl9NX0ZpbmlzaCgpIC0gX19uKSArIDEsIHRoaXMtPl9NX0ZpbmlzaCgpICsgMSwgdGhpcy0+X01fRmluaXNoKCkgKyAxKTsKKyAgICAgICAgICBlbHNlCisjZW5kaWYgLyogX1NUTFBfVVNFX1NIT1JUX1NUUklOR19PUFRJTSAqLworICAgICAgICAgIHVuaW5pdGlhbGl6ZWRfY29weSgodGhpcy0+X01fRmluaXNoKCkgLSBfX24pICsgMSwgdGhpcy0+X01fRmluaXNoKCkgKyAxLCB0aGlzLT5fTV9GaW5pc2goKSArIDEpOworICAgICAgICAgIHRoaXMtPl9NX2ZpbmlzaCArPSBfX247CisgICAgICAgICAgX1RyYWl0czo6bW92ZShfX3Bvc2l0aW9uICsgX19uLCBfX3Bvc2l0aW9uLCAoX19lbGVtc19hZnRlciAtIF9fbikgKyAxKTsKKyAgICAgICAgICBfTV9jb3B5VChfX2ZpcnN0LCBfX2xhc3QsIF9fcG9zaXRpb24pOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIHBvaW50ZXIgX19vbGRfZmluaXNoID0gdGhpcy0+X01fRmluaXNoKCk7CisgICAgICAgICAgX0ZvcndhcmRJdGVyIF9fbWlkID0gX19maXJzdDsKKyAgICAgICAgICBhZHZhbmNlKF9fbWlkLCBfX2VsZW1zX2FmdGVyICsgMSk7CisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1NIT1JUX1NUUklOR19PUFRJTSkKKyAgICAgICAgICBpZiAodGhpcy0+X01fdXNpbmdfc3RhdGljX2J1ZigpKQorICAgICAgICAgICAgX01fY29weVQoX19taWQsIF9fbGFzdCwgdGhpcy0+X01fRmluaXNoKCkgKyAxKTsKKyAgICAgICAgICBlbHNlCisjZW5kaWYgLyogX1NUTFBfVVNFX1NIT1JUX1NUUklOR19PUFRJTSAqLworICAgICAgICAgIHVuaW5pdGlhbGl6ZWRfY29weShfX21pZCwgX19sYXN0LCB0aGlzLT5fTV9GaW5pc2goKSArIDEpOworICAgICAgICAgIHRoaXMtPl9NX2ZpbmlzaCArPSBfX24gLSBfX2VsZW1zX2FmdGVyOworICAgICAgICAgIF9TVExQX1RSWSB7CisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1NIT1JUX1NUUklOR19PUFRJTSkKKyAgICAgICAgICAgIGlmICh0aGlzLT5fTV91c2luZ19zdGF0aWNfYnVmKCkpCisgICAgICAgICAgICAgIF9CYXNlOjpfTV9jb3B5KF9fcG9zaXRpb24sIF9fb2xkX2ZpbmlzaCArIDEsIHRoaXMtPl9NX0ZpbmlzaCgpKTsKKyAgICAgICAgICAgIGVsc2UKKyNlbmRpZiAvKiBfU1RMUF9VU0VfU0hPUlRfU1RSSU5HX09QVElNICovCisgICAgICAgICAgICB1bmluaXRpYWxpemVkX2NvcHkoX19wb3NpdGlvbiwgX19vbGRfZmluaXNoICsgMSwgdGhpcy0+X01fRmluaXNoKCkpOworICAgICAgICAgICAgdGhpcy0+X01fZmluaXNoICs9IF9fZWxlbXNfYWZ0ZXI7CisgICAgICAgICAgfQorICAgICAgICAgIF9TVExQX1VOV0lORCgodGhpcy0+X01fZGVzdHJveV9wdHJfcmFuZ2UoX19vbGRfZmluaXNoICsgMSwgdGhpcy0+X01fRmluaXNoKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+X01fZmluaXNoID0gX19vbGRfZmluaXNoKSkKKyAgICAgICAgICBfTV9jb3B5VChfX2ZpcnN0LCBfX21pZCwgX19wb3NpdGlvbik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBfTV9pbnNlcnRfb3ZlcmZsb3coX19wb3NpdGlvbiwgX19maXJzdCwgX19sYXN0LCBfX24pOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfSW50ZWdlcj4KKyAgdm9pZCBfTV9pbnNlcnRfZGlzcGF0Y2goaXRlcmF0b3IgX19wLCBfSW50ZWdlciBfX24sIF9JbnRlZ2VyIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX190cnVlX3R5cGUmIC8qSW50ZWdyYWwqLykgeworICAgIGluc2VydChfX3AsIChzaXplX3R5cGUpIF9fbiwgKF9DaGFyVCkgX194KTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgorICB2b2lkIF9NX2luc2VydF9kaXNwYXRjaChpdGVyYXRvciBfX3AsIF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypJbnRlZ3JhbCovKSB7CisgICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcCkKKyAgICAvKgorICAgICAqIFdpdGhpbiB0aGUgYmFzaWNfc3RyaW5nIGltcGxlbWVudGF0aW9uIHdlIGFyZSBvbmx5IGdvaW5nIHRvIGNoZWNrIGZvcgorICAgICAqIHNlbGYgcmVmZXJlbmNpbmcgaWYgaXRlcmF0b3JzIGFyZSBzdHJpbmcgaXRlcmF0b3JzIG9yIF9DaGFyVCBwb2ludGVycy4KKyAgICAgKiBBIHVzZXIgY291bGQgZW5jYXBzdWxhdGUgdGhvc2UgaXRlcmF0b3Igd2l0aGluIHRoZWlyIG93biBpdGVyYXRvciBpbnRlcmZhY2UKKyAgICAgKiBhbmQgaW4gdGhpcyBjYXNlIGxlYWQgdG8gYSBiYWQgYmVoYXZpb3IsIHRoaXMgaXMgYSBrbm93biBsaW1pdGF0aW9uLgorICAgICAqLworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FyZVNhbWVVbkNWVHlwZXM8X0lucHV0SXRlciwgaXRlcmF0b3I+OjpfUmV0IF9Jc0l0ZXJhdG9yOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FyZVNhbWVVbkNWVHlwZXM8X0lucHV0SXRlciwgY29uc3RfaXRlcmF0b3I+OjpfUmV0IF9Jc0NvbnN0SXRlcmF0b3I7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfTG9yMjxfSXNJdGVyYXRvciwgX0lzQ29uc3RJdGVyYXRvcj46Ol9SZXQgX0NoZWNrSW5zaWRlOworICAgIF9NX2luc2VydF9hdXgoX19wLCBfX2ZpcnN0LCBfX2xhc3QsIF9DaGVja0luc2lkZSgpKTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tSXRlcj4KKyAgdm9pZCBfTV9pbnNlcnRfYXV4IChpdGVyYXRvciBfX3AsIF9SYW5kb21JdGVyIF9fZmlyc3QsIF9SYW5kb21JdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX3RydWVfdHlwZSYgLypfQ2hlY2tJbnNpZGUqLykgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3ApCisgICAgX01faW5zZXJ0KF9fcCwgJigqX19maXJzdCksICYoKl9fbGFzdCksIF9CYXNlOjpfTV9pbnNpZGUoJigqX19maXJzdCkpKTsKKyAgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXI+CisgIHZvaWQgX01faW5zZXJ0X2F1eCAoaXRlcmF0b3IgX19wLCBfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypfQ2hlY2tJbnNpZGUqLykgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3ApCisgICAgX01faW5zZXJ0VChfX3AsIF9fZmlyc3QsIF9fbGFzdCwgX1NUTFBfSVRFUkFUT1JfQ0FURUdPUlkoX19maXJzdCwgX0lucHV0SXRlcikpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICB2b2lkIF9NX2NvcHlUKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgcG9pbnRlciBfX3Jlc3VsdCkgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3ApCisgICAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0LCArK19fcmVzdWx0KQorICAgICAgX1RyYWl0czo6YXNzaWduKCpfX3Jlc3VsdCwgKl9fZmlyc3QpOworICB9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTUVUSE9EX1NQRUNJQUxJWkFUSU9OKQorICB2b2lkIF9NX2NvcHlUKGNvbnN0IF9DaGFyVCogX19mLCBjb25zdCBfQ2hhclQqIF9fbCwgX0NoYXJUKiBfX3JlcykgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2YpIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2wpIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3JlcykKKyAgICBfQmFzZTo6X01fY29weShfX2YsIF9fbCwgX19yZXMpOworICB9CisjZW5kaWYKKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFcmFzZS4KKworICBfU2VsZiYgZXJhc2Uoc2l6ZV90eXBlIF9fcG9zID0gMCwgc2l6ZV90eXBlIF9fbiA9IG5wb3MpIHsKKyAgICBfQmFzZTo6ZXJhc2UoX19wb3MsIF9fbik7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgaXRlcmF0b3IgZXJhc2UoaXRlcmF0b3IgX19wb3MpIHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19wb3MpCisgICAgcmV0dXJuIF9CYXNlOjplcmFzZShfX3Bvcyk7CisgIH0KKworICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpIHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19maXJzdCkgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fbGFzdCkKKyAgICByZXR1cm4gX0Jhc2U6OmVyYXNlKF9fZmlyc3QsIF9fbGFzdCk7CisgIH0KKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXBsYWNlLiAgKENvbmNlcHR1YWxseSBlcXVpdmFsZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGVyYXNlIGZvbGxvd2VkIGJ5IGluc2VydC4pCisgIF9TZWxmJiByZXBsYWNlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbiwgY29uc3QgX1NlbGYmIF9fcykgeworICAgIF9CYXNlOjpyZXBsYWNlKF9fcG9zLCBfX24sIF9fcyk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgX1NlbGYmIHJlcGxhY2Uoc2l6ZV90eXBlIF9fcG9zMSwgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IF9TZWxmJiBfX3MsCisgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX3BvczIsIHNpemVfdHlwZSBfX24yKSB7CisgICAgX0Jhc2U6OnJlcGxhY2UoX19wb3MxLCBfX24xLCBfX3MsIF9fcG9zMiwgX19uMik7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgX1NlbGYmIHJlcGxhY2Uoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uMSwKKyAgICAgICAgICAgICAgICAgY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX24yKSB7CisgICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKKyAgICBfQmFzZTo6cmVwbGFjZShfX3BvcywgX19uMSwgX19zLCBfX24yKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBfU2VsZiYgcmVwbGFjZShzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24xLCBjb25zdCBfQ2hhclQqIF9fcykgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgICAgX0Jhc2U6OnJlcGxhY2UoX19wb3MsIF9fbjEsIF9fcyk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgX1NlbGYmIHJlcGxhY2Uoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uMSwKKyAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fbjIsIF9DaGFyVCBfX2MpIHsKKyAgICBfQmFzZTo6cmVwbGFjZShfX3BvcywgX19uMSwgX19uMiwgX19jKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBfU2VsZiYgcmVwbGFjZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QsIGNvbnN0IF9TZWxmJiBfX3MpIHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19maXJzdCkgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fbGFzdCkKKyAgICBfQmFzZTo6cmVwbGFjZShfX2ZpcnN0LCBfX2xhc3QsIF9fcyk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgX1NlbGYmIHJlcGxhY2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICBjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbikgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2ZpcnN0KSBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19sYXN0KQorICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgICAgX0Jhc2U6OnJlcGxhY2UoX19maXJzdCwgX19sYXN0LCBfX3MsIF9fbik7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgX1NlbGYmIHJlcGxhY2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICBjb25zdCBfQ2hhclQqIF9fcykgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2ZpcnN0KSBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19sYXN0KQorICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgICAgX0Jhc2U6OnJlcGxhY2UoX19maXJzdCwgX19sYXN0LCBfX3MpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIF9TZWxmJiByZXBsYWNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYykgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2ZpcnN0KSBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19sYXN0KQorICAgIF9CYXNlOjpyZXBsYWNlKF9fZmlyc3QsIF9fbGFzdCwgX19uLCBfX2MpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vIENoZWNrIHRvIHNlZSBpZiBfSW5wdXRJdGVyIGlzIGFuIGludGVnZXIgdHlwZS4gIElmIHNvLCB0aGVuCisgIC8vIGl0IGNhbid0IGJlIGFuIGl0ZXJhdG9yLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcj4KKyAgX1NlbGYmIHJlcGxhY2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyIF9fZiwgX0lucHV0SXRlciBfX2wpIHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19maXJzdClfU1RMUF9GSVhfTElURVJBTF9CVUcoX19sYXN0KQorICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lzSW50ZWdyYWw8X0lucHV0SXRlcj46Ol9SZXQgX0ludGVncmFsOworICAgIHJldHVybiBfTV9yZXBsYWNlX2Rpc3BhdGNoKF9fZmlyc3QsIF9fbGFzdCwgX19mLCBfX2wsICBfSW50ZWdyYWwoKSk7CisgIH0KKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19NRVRIT0RfU1BFQ0lBTElaQVRJT04pICYmICFkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKQorICBfU2VsZiYgcmVwbGFjZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgIGNvbnN0IF9DaGFyVCogX19mLCBjb25zdCBfQ2hhclQqIF9fbCkgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2ZpcnN0KSBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19sYXN0KQorICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2YpIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2wpCisgICAgX0Jhc2U6OnJlcGxhY2UoX19maXJzdCwgX19sYXN0LCBfX2YsIF9fbCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisjZW5kaWYKKworcHJvdGVjdGVkOiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIHJlcGxhY2UuCisgIF9TZWxmJiBfTV9yZXBsYWNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgX0NoYXJUKiBfX2YsIGNvbnN0IF9DaGFyVCogX19sLCBib29sIF9fc2VsZl9yZWYpIHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19maXJzdCkgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fbGFzdCkKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19mKSBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19sKQorICAgIF9CYXNlOjpfTV9yZXBsYWNlKF9fZmlyc3QsIF9fbGFzdCwgX19mLCBfX2wsIF9fc2VsZl9yZWYpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfSW50ZWdlcj4KKyAgX1NlbGYmIF9NX3JlcGxhY2VfZGlzcGF0Y2goaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSW50ZWdlciBfX24sIF9JbnRlZ2VyIF9feCwgY29uc3QgX190cnVlX3R5cGUmIC8qSXNJbnRlZ3JhbCovKSB7CisgICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fZmlyc3QpIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2xhc3QpCisgICAgcmV0dXJuIHJlcGxhY2UoX19maXJzdCwgX19sYXN0LCAoc2l6ZV90eXBlKSBfX24sIChfQ2hhclQpIF9feCk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcj4KKyAgX1NlbGYmIF9NX3JlcGxhY2VfZGlzcGF0Y2goaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyIF9fZiwgX0lucHV0SXRlciBfX2wsIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypJc0ludGVncmFsKi8pIHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19maXJzdCkgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fbGFzdCkKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9BcmVTYW1lVW5DVlR5cGVzPF9JbnB1dEl0ZXIsIGl0ZXJhdG9yPjo6X1JldCBfSXNJdGVyYXRvcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9BcmVTYW1lVW5DVlR5cGVzPF9JbnB1dEl0ZXIsIGNvbnN0X2l0ZXJhdG9yPjo6X1JldCBfSXNDb25zdEl0ZXJhdG9yOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0xvcjI8X0lzSXRlcmF0b3IsIF9Jc0NvbnN0SXRlcmF0b3I+OjpfUmV0IF9DaGVja0luc2lkZTsKKyAgICByZXR1cm4gX01fcmVwbGFjZV9hdXgoX19maXJzdCwgX19sYXN0LCBfX2YsIF9fbCwgX0NoZWNrSW5zaWRlKCkpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21JdGVyPgorICBfU2VsZiYgX01fcmVwbGFjZV9hdXgoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgX1JhbmRvbUl0ZXIgX19mLCBfUmFuZG9tSXRlciBfX2wsIF9fdHJ1ZV90eXBlIGNvbnN0JiAvKl9DaGVja0luc2lkZSovKSB7CisgICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fZmlyc3QpIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2xhc3QpCisgICAgcmV0dXJuIF9NX3JlcGxhY2UoX19maXJzdCwgX19sYXN0LCAmKCpfX2YpLCAmKCpfX2wpLCBfQmFzZTo6X01faW5zaWRlKCYoKl9fZikpKTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgorICBfU2VsZiYgX01fcmVwbGFjZV9hdXgoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlciBfX2YsIF9JbnB1dEl0ZXIgX19sLCBfX2ZhbHNlX3R5cGUgY29uc3QmIC8qX0NoZWNrSW5zaWRlKi8pIHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19maXJzdCkgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fbGFzdCkKKyAgICByZXR1cm4gX01fcmVwbGFjZVQoX19maXJzdCwgX19sYXN0LCBfX2YsIF9fbCwgX1NUTFBfSVRFUkFUT1JfQ0FURUdPUlkoX19mLCBfSW5wdXRJdGVyKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcj4KKyAgX1NlbGYmIF9NX3JlcGxhY2VUKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIgX19mLCBfSW5wdXRJdGVyIF9fbCwgY29uc3QgaW5wdXRfaXRlcmF0b3JfdGFnJl9faXRlX3RhZykgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2ZpcnN0KSBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19sYXN0KQorICAgIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3QgJiYgX19mICE9IF9fbDsgKytfX2ZpcnN0LCArK19fZikKKyAgICAgIF9UcmFpdHM6OmFzc2lnbigqX19maXJzdCwgKl9fZik7CisgICAgaWYgKF9fZiA9PSBfX2wpCisgICAgICBfQmFzZTo6ZXJhc2UoX19maXJzdCwgX19sYXN0KTsKKyAgICBlbHNlCisgICAgICBfTV9pbnNlcnRUKF9fbGFzdCwgX19mLCBfX2wsIF9faXRlX3RhZyk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcj4KKyAgX1NlbGYmIF9NX3JlcGxhY2VUKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlciBfX2YsIF9Gb3J3YXJkSXRlciBfX2wsIGNvbnN0IGZvcndhcmRfaXRlcmF0b3JfdGFnICZfX2l0ZV90YWcpIHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19maXJzdCkgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fbGFzdCkKKyAgICBkaWZmZXJlbmNlX3R5cGUgX19uID0gZGlzdGFuY2UoX19mLCBfX2wpOworICAgIGNvbnN0IGRpZmZlcmVuY2VfdHlwZSBfX2xlbiA9IF9fbGFzdCAtIF9fZmlyc3Q7CisgICAgaWYgKF9fbGVuID49IF9fbikgeworICAgICAgX01fY29weVQoX19mLCBfX2wsIF9fZmlyc3QpOworICAgICAgX0Jhc2U6OmVyYXNlKF9fZmlyc3QgKyBfX24sIF9fbGFzdCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgX0ZvcndhcmRJdGVyIF9fbSA9IF9fZjsKKyAgICAgIGFkdmFuY2UoX19tLCBfX2xlbik7CisgICAgICBfTV9jb3B5VChfX2YsIF9fbSwgX19maXJzdCk7CisgICAgICBfTV9pbnNlcnRUKF9fbGFzdCwgX19tLCBfX2wsIF9faXRlX3RhZyk7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE90aGVyIG1vZGlmaWVyIG1lbWJlciBmdW5jdGlvbnMuCisKKyAgdm9pZCBzd2FwKF9TZWxmJiBfX3MpCisgIHsgX0Jhc2U6OnN3YXAoX19zKTsgfQorCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN1YnN0cmluZy4KKworICBfU2VsZiBzdWJzdHIoc2l6ZV90eXBlIF9fcG9zID0gMCwgc2l6ZV90eXBlIF9fbiA9IG5wb3MpIGNvbnN0CisgIHsgcmV0dXJuIF9TZWxmKCp0aGlzLCBfX3BvcywgX19uLCBnZXRfYWxsb2NhdG9yKCkpOyB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfVEVNUExBVEVfRVhQUkVTU0lPTikgJiYgIWRlZmluZWQgKF9TVExQX0RFQlVHKQorIyAgZGVmaW5lIF9TVExQX1NUUklOR19TVU1fQkFTRSBfU1RMUF9OT19NRU1fVF9TVFJJTkdfQkFTRQorIyAgaW5jbHVkZSA8c3RsL19zdHJpbmdfc3VtX21ldGhvZHMuaD4KKyMgIHVuZGVmIF9TVExQX1NUUklOR19TVU1fQkFTRQorI2VuZGlmCit9OworCisjdW5kZWYgX1NUTFBfTk9fTUVNX1RfU1RSSU5HX0JBU0UKKworI2lmIGRlZmluZWQgKGJhc2ljX3N0cmluZykKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorIyAgdW5kZWYgYmFzaWNfc3RyaW5nCisjZW5kaWYKKworX1NUTFBfRU5EX05BTUVTUEFDRQpkaWZmIC0tZ2l0IGEvc3RsL19zdHJzdHJlYW0uaCBiL3N0bC9fc3Ryc3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUzZDRjMwotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9fc3Ryc3RyZWFtLmgKQEAgLTAsMCArMSwxNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX1NUUlNUUkVBTQorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9TVFJTVFJFQU0KKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9TVFJFQU1CVUYKKyMgIGluY2x1ZGUgPHN0bC9fc3RyZWFtYnVmLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9JU1RSRUFNCisjICBpbmNsdWRlIDxzdGwvX2lzdHJlYW0uaD4gICAgICAgICAgICAgIC8vIEluY2x1ZGVzIDxvc3RyZWFtPiwgPGlvcz4sIDxpb3Nmd2Q+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9TVFJJTkdfSAorIyAgaW5jbHVkZSA8c3RsL19zdHJpbmcuaD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworI2lmbmRlZiBfU1RMUF9VU0VfTkFNRVNQQUNFUworIyAgZGVmaW5lIHN0cnN0cmVhbSBfU1RMUF9zdHJzdHJlYW0KKyMgIGRlZmluZSBvc3Ryc3RyZWFtIF9TVExQX29zdHJzdHJlYW0KKyMgIGRlZmluZSBpc3Ryc3RyZWFtIF9TVExQX2lzdHJzdHJlYW0KKyMgIGRlZmluZSBzdHJzdHJlYW1idWYgX1NUTFBfc3Ryc3RyZWFtYnVmCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDbGFzcyBzdHJzdHJlYW1idWYsIGEgc3RyZWFtYnVmIGNsYXNzIHRoYXQgbWFuYWdlcyBhbiBhcnJheSBvZiBjaGFyLgorLy8gTm90ZSB0aGF0IHRoaXMgY2xhc3MgaXMgbm90IGEgdGVtcGxhdGUuCisKK2NsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIHN0cnN0cmVhbWJ1ZiA6IHB1YmxpYyBiYXNpY19zdHJlYW1idWY8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiB7CitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR5cGVzLgorICB0eXBlZGVmIGNoYXJfdHJhaXRzPGNoYXI+ICAgICAgICAgICAgICBfVHJhaXRzOworICB0eXBlZGVmIGJhc2ljX3N0cmVhbWJ1ZjxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+IF9CYXNlOworICB0eXBlZGVmIHZvaWQqICgqX19hbGxvY19mbikoc2l6ZV90KTsKKyAgdHlwZWRlZiB2b2lkICgqX19mcmVlX2ZuKSh2b2lkKik7CitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbnN0cnVjdG9yLCBkZXN0cnVjdG9yCisKKyAgZXhwbGljaXQgc3Ryc3RyZWFtYnVmKHN0cmVhbXNpemUgX0luaXRpYWxfY2FwYWNpdHkgPSAwKTsKKworICBzdHJzdHJlYW1idWYoX19hbGxvY19mbiwgX19mcmVlX2ZuKTsKKworICBzdHJzdHJlYW1idWYoY2hhciogX19nZXQsIHN0cmVhbXNpemUgX19uLCBjaGFyKiBfX3B1dCA9IDApOworICBzdHJzdHJlYW1idWYoc2lnbmVkIGNoYXIqIF9fZ2V0LCBzdHJlYW1zaXplIF9fbiwgc2lnbmVkIGNoYXIqIF9fcHV0ID0gMCk7CisgIHN0cnN0cmVhbWJ1Zih1bnNpZ25lZCBjaGFyKiBfX2dldCwgc3RyZWFtc2l6ZSBfX24sIHVuc2lnbmVkIGNoYXIqIF9fcHV0PTApOworCisgIHN0cnN0cmVhbWJ1Zihjb25zdCBjaGFyKiBfX2dldCwgc3RyZWFtc2l6ZSBfX24pOworICBzdHJzdHJlYW1idWYoY29uc3Qgc2lnbmVkIGNoYXIqIF9fZ2V0LCBzdHJlYW1zaXplIF9fbik7CisgIHN0cnN0cmVhbWJ1Zihjb25zdCB1bnNpZ25lZCBjaGFyKiBfX2dldCwgc3RyZWFtc2l6ZSBfX24pOworCisgIHZpcnR1YWwgfnN0cnN0cmVhbWJ1ZigpOworCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0cnN0cmVhbWJ1ZiBvcGVyYXRpb25zLgorICB2b2lkIGZyZWV6ZShib29sID0gdHJ1ZSk7CisgIGNoYXIqIHN0cigpOworICBpbnQgcGNvdW50KCkgY29uc3Q7CisKK3Byb3RlY3RlZDogICAgICAgICAgICAgICAgICAgICAgLy8gT3ZlcnJpZGRlbiB2aXJ0dWFsIG1lbWJlciBmdW5jdGlvbnMuCisgIHZpcnR1YWwgaW50X3R5cGUgb3ZlcmZsb3coaW50X3R5cGUgX19jICA9IF9UcmFpdHM6OmVvZigpKTsKKyAgdmlydHVhbCBpbnRfdHlwZSBwYmFja2ZhaWwoaW50X3R5cGUgX19jID0gX1RyYWl0czo6ZW9mKCkpOworICB2aXJ0dWFsIGludF90eXBlIHVuZGVyZmxvdygpOworICB2aXJ0dWFsIF9CYXNlKiBzZXRidWYoY2hhciogX19idWYsIHN0cmVhbXNpemUgX19uKTsKKyAgdmlydHVhbCBwb3NfdHlwZSBzZWVrb2ZmKG9mZl90eXBlIF9fb2ZmLCBpb3NfYmFzZTo6c2Vla2RpciBfX2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0KTsKKyAgdmlydHVhbCBwb3NfdHlwZSBzZWVrcG9zKHBvc190eXBlIF9fcG9zLCBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6Om91dCk7CisKK3ByaXZhdGU6ICAgICAgICAgICAgICAgICAgICAgICAgLy8gSGVscGVyIGZ1bmN0aW9ucy4KKyAgLy8gRHluYW1pYyBhbGxvY2F0aW9uLCBwb3NzaWJseSB1c2luZyBfTV9hbGxvY19mdW4gYW5kIF9NX2ZyZWVfZnVuLgorICBjaGFyKiBfTV9hbGxvYyhzaXplX3QpOworICB2b2lkICBfTV9mcmVlKGNoYXIqKTsKKworICAvLyBIZWxwZXIgZnVuY3Rpb24gdXNlZCBpbiBjb25zdHJ1Y3RvcnMuCisgIHZvaWQgX01fc2V0dXAoY2hhciogX19nZXQsIGNoYXIqIF9fcHV0LCBzdHJlYW1zaXplIF9fbik7Citwcml2YXRlOiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERhdGEgbWVtYmVycy4KKyAgX19hbGxvY19mbiBfTV9hbGxvY19mdW47CisgIF9fZnJlZV9mbiAgX01fZnJlZV9mdW47CisgIGJvb2wgX01fZHluYW1pYyAgOiAxOworICBib29sIF9NX2Zyb3plbiAgIDogMTsKKyAgYm9vbCBfTV9jb25zdGFudCA6IDE7Cit9OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENsYXNzIGlzdHJzdHJlYW0sIGFuIGlzdHJlYW0gdGhhdCBtYW5hZ2VzIGEgc3Ryc3RyZWFtYnVmLgorCitjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBpc3Ryc3RyZWFtIDogcHVibGljIGJhc2ljX2lzdHJlYW08Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiB7CitwdWJsaWM6CisgIGV4cGxpY2l0IGlzdHJzdHJlYW0oY2hhciopOworICBleHBsaWNpdCBpc3Ryc3RyZWFtKGNvbnN0IGNoYXIqKTsKKyAgaXN0cnN0cmVhbShjaGFyKiAsIHN0cmVhbXNpemUpOworICBpc3Ryc3RyZWFtKGNvbnN0IGNoYXIqLCBzdHJlYW1zaXplKTsKKyAgdmlydHVhbCB+aXN0cnN0cmVhbSgpOworCisgIHN0cnN0cmVhbWJ1ZiogcmRidWYoKSBjb25zdDsKKyAgY2hhciogc3RyKCk7CisKK3ByaXZhdGU6CisgIHN0cnN0cmVhbWJ1ZiBfTV9idWY7Cit9OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENsYXNzIG9zdHJzdHJlYW0KKworY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgb3N0cnN0cmVhbSA6IHB1YmxpYyBiYXNpY19vc3RyZWFtPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4KK3sKK3B1YmxpYzoKKyAgb3N0cnN0cmVhbSgpOworICBvc3Ryc3RyZWFtKGNoYXIqLCBpbnQsIGlvc19iYXNlOjpvcGVubW9kZSA9IGlvc19iYXNlOjpvdXQpOworICB2aXJ0dWFsIH5vc3Ryc3RyZWFtKCk7CisKKyAgc3Ryc3RyZWFtYnVmKiByZGJ1ZigpIGNvbnN0OworICB2b2lkIGZyZWV6ZShib29sID0gdHJ1ZSk7CisgIGNoYXIqIHN0cigpOworICBpbnQgcGNvdW50KCkgY29uc3Q7CisKK3ByaXZhdGU6CisgIHN0cnN0cmVhbWJ1ZiBfTV9idWY7Cit9OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENsYXNzIHN0cnN0cmVhbQorCitjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBzdHJzdHJlYW0gOiBwdWJsaWMgYmFzaWNfaW9zdHJlYW08Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiB7CitwdWJsaWM6CisgIHR5cGVkZWYgY2hhciAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKKyAgdHlwZWRlZiBjaGFyX3RyYWl0czxjaGFyPjo6aW50X3R5cGUgaW50X3R5cGU7CisgIHR5cGVkZWYgY2hhcl90cmFpdHM8Y2hhcj46OnBvc190eXBlIHBvc190eXBlOworICB0eXBlZGVmIGNoYXJfdHJhaXRzPGNoYXI+OjpvZmZfdHlwZSBvZmZfdHlwZTsKKworICBzdHJzdHJlYW0oKTsKKyAgc3Ryc3RyZWFtKGNoYXIqLCBpbnQsIGlvc19iYXNlOjpvcGVubW9kZSA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpOworICB2aXJ0dWFsIH5zdHJzdHJlYW0oKTsKKworICBzdHJzdHJlYW1idWYqIHJkYnVmKCkgY29uc3Q7CisgIHZvaWQgZnJlZXplKGJvb2wgPSB0cnVlKTsKKyAgaW50IHBjb3VudCgpIGNvbnN0OworICBjaGFyKiBzdHIoKTsKKworcHJpdmF0ZToKKyAgc3Ryc3RyZWFtYnVmIF9NX2J1ZjsKKworICAvL2V4cGxpY2l0ZWx5IGRlZmluZWQgYXMgcHJpdmF0ZSB0byBhdm9pZCB3YXJuaW5nczoKKyAgc3Ryc3RyZWFtKHN0cnN0cmVhbSBjb25zdCYpOworICBzdHJzdHJlYW0mIG9wZXJhdG9yID0gKHN0cnN0cmVhbSBjb25zdCYpOworfTsKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfU1RSU1RSRUFNICovCmRpZmYgLS1naXQgYS9zdGwvX3RlbXBidWYuYyBiL3N0bC9fdGVtcGJ1Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3OWI0NzIKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvX3RlbXBidWYuYwpAQCAtMCwwICsxLDU3IEBACisvKgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisjaWZuZGVmIF9TVExQX1RFTVBCVUZfQworI2RlZmluZSBfU1RMUF9URU1QQlVGX0MKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9URU1QQlVGX0gKKyMgaW5jbHVkZSA8c3RsL190ZW1wYnVmLmg+CisjZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitwYWlyPF9UcCosIHB0cmRpZmZfdD4gX1NUTFBfQ0FMTAorX19nZXRfdGVtcG9yYXJ5X2J1ZmZlcihwdHJkaWZmX3QgX19sZW4sIF9UcCopCit7CisgIGlmIChfX2xlbiA+IHB0cmRpZmZfdChJTlRfTUFYIC8gc2l6ZW9mKF9UcCkpKQorICAgIF9fbGVuID0gSU5UX01BWCAvIHNpemVvZihfVHApOworCisgIHdoaWxlIChfX2xlbiA+IDApIHsKKyAgICBfVHAqIF9fdG1wID0gKF9UcCopIG1hbGxvYygoc2l6ZV90KV9fbGVuICogc2l6ZW9mKF9UcCkpOworICAgIGlmIChfX3RtcCAhPSAwKQorICAgICAgcmV0dXJuIHBhaXI8X1RwKiwgcHRyZGlmZl90PihfX3RtcCwgX19sZW4pOworICAgIF9fbGVuIC89IDI7CisgIH0KKworICByZXR1cm4gcGFpcjxfVHAqLCBwdHJkaWZmX3Q+KChfVHAqKTAsIDApOworfQorX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYgLyogIF9TVExQX1RFTVBCVUZfQyAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RsL190ZW1wYnVmLmggYi9zdGwvX3RlbXBidWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTBlNmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvc3RsL190ZW1wYnVmLmgKQEAgLTAsMCArMSwxNjcgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisvKiBOT1RFOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBTVEwgaGVhZGVycy4KKyAqICAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuCisgKi8KKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9URU1QQlVGX0gKKyNkZWZpbmUgX1NUTFBfSU5URVJOQUxfVEVNUEJVRl9ICisKKyNpZm5kZWYgX1NUTFBfQ0xJTUlUUworIyAgaW5jbHVkZSA8Y2xpbWl0cz4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NTVERMSUIKKyMgIGluY2x1ZGUgPHN0bC9fY3N0ZGxpYi5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfVU5JTklUSUFMSVpFRF9ICisjICBpbmNsdWRlIDxzdGwvX3VuaW5pdGlhbGl6ZWQuaD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3BhaXI8X1RwKiwgcHRyZGlmZl90PiAgX1NUTFBfQ0FMTAorX19nZXRfdGVtcG9yYXJ5X2J1ZmZlcihwdHJkaWZmX3QgX19sZW4sIF9UcCopOworCisjaWZuZGVmIF9TVExQX05PX0VYUExJQ0lUX0ZVTkNUSU9OX1RNUExfQVJHUworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIHBhaXI8X1RwKiwgcHRyZGlmZl90PiAgX1NUTFBfQ0FMTCBnZXRfdGVtcG9yYXJ5X2J1ZmZlcihwdHJkaWZmX3QgX19sZW4pIHsKKyAgcmV0dXJuIF9fZ2V0X3RlbXBvcmFyeV9idWZmZXIoX19sZW4sIChfVHAqKSAwKTsKK30KKworIyBpZiAhIGRlZmluZWQoX1NUTFBfTk9fRVhURU5TSU9OUykKKy8vIFRoaXMgb3ZlcmxvYWQgaXMgbm90IHJlcXVpcmVkIGJ5IHRoZSBzdGFuZGFyZDsgaXQgaXMgYW4gZXh0ZW5zaW9uLgorLy8gSXQgaXMgc3VwcG9ydGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggdGhlIEhQIFNUTCwgYW5kCisvLyBiZWNhdXNlIG5vdCBhbGwgY29tcGlsZXJzIHN1cHBvcnQgdGhlIGxhbmd1YWdlIGZlYXR1cmUgKGV4cGxpY2l0CisvLyBmdW5jdGlvbiB0ZW1wbGF0ZSBhcmd1bWVudHMpIHRoYXQgaXMgcmVxdWlyZWQgZm9yIHRoZSBzdGFuZGFyZAorLy8gdmVyc2lvbiBvZiBnZXRfdGVtcG9yYXJ5X2J1ZmZlci4KK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgcGFpcjxfVHAqLCBwdHJkaWZmX3Q+ICBfU1RMUF9DQUxMCitnZXRfdGVtcG9yYXJ5X2J1ZmZlcihwdHJkaWZmX3QgX19sZW4sIF9UcCopIHsKKyAgcmV0dXJuIF9fZ2V0X3RlbXBvcmFyeV9idWZmZXIoX19sZW4sIChfVHAqKSAwKTsKK30KKyMgZW5kaWYKKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIHZvaWQgIF9TVExQX0NBTEwgcmV0dXJuX3RlbXBvcmFyeV9idWZmZXIoX1RwKiBfX3ApIHsKKy8vIFN1blBybyBicmFpbiBkYW1hZ2UKKyAgZnJlZSgoY2hhciopX19wKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3IsIGNsYXNzIF9UcD4KK2NsYXNzIF9UZW1wb3JhcnlfYnVmZmVyIHsKK3ByaXZhdGU6CisgIHB0cmRpZmZfdCAgX01fb3JpZ2luYWxfbGVuOworICBwdHJkaWZmX3QgIF9NX2xlbjsKKyAgX1RwKiAgICAgICBfTV9idWZmZXI7CisKKyAgdm9pZCBfTV9hbGxvY2F0ZV9idWZmZXIoKSB7CisgICAgX01fb3JpZ2luYWxfbGVuID0gX01fbGVuOworICAgIF9NX2J1ZmZlciA9IDA7CisKKyAgICBpZiAoX01fbGVuID4gKHB0cmRpZmZfdCkoSU5UX01BWCAvIHNpemVvZihfVHApKSkKKyAgICAgIF9NX2xlbiA9IElOVF9NQVggLyBzaXplb2YoX1RwKTsKKworICAgIHdoaWxlIChfTV9sZW4gPiAwKSB7CisgICAgICBfTV9idWZmZXIgPSAoX1RwKikgbWFsbG9jKF9NX2xlbiAqIHNpemVvZihfVHApKTsKKyAgICAgIGlmIChfTV9idWZmZXIpCisgICAgICAgIGJyZWFrOworICAgICAgX01fbGVuIC89IDI7CisgICAgfQorICB9CisKKyAgdm9pZCBfTV9pbml0aWFsaXplX2J1ZmZlcihjb25zdCBfVHAmLCBjb25zdCBfX3RydWVfdHlwZSYpIHt9CisgIHZvaWQgX01faW5pdGlhbGl6ZV9idWZmZXIoY29uc3QgX1RwJiB2YWwsIGNvbnN0IF9fZmFsc2VfdHlwZSYpIHsKKyAgICB1bmluaXRpYWxpemVkX2ZpbGxfbihfTV9idWZmZXIsIF9NX2xlbiwgdmFsKTsKKyAgfQorCitwdWJsaWM6CisgIHB0cmRpZmZfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gX01fbGVuOyB9CisgIHB0cmRpZmZfdCByZXF1ZXN0ZWRfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX29yaWdpbmFsX2xlbjsgfQorICBfVHAqIGJlZ2luKCkgeyByZXR1cm4gX01fYnVmZmVyOyB9CisgIF9UcCogZW5kKCkgeyByZXR1cm4gX01fYnVmZmVyICsgX01fbGVuOyB9CisKKyAgX1RlbXBvcmFyeV9idWZmZXIoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCkgeworICAgIC8vIFdvcmthcm91bmQgZm9yIGEgX190eXBlX3RyYWl0cyBidWcgaW4gdGhlIHByZS03LjMgY29tcGlsZXIuCisjICAgaWYgZGVmaW5lZChfX3NnaSkgJiYgIWRlZmluZWQoX19HTlVDX18pICYmIF9DT01QSUxFUl9WRVJTSU9OIDwgNzMwCisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3R5cGVfdHJhaXRzPF9UcD46OmlzX1BPRF90eXBlIF9Ucml2aWFsOworIyAgIGVsc2UKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fdHlwZV90cmFpdHM8X1RwPjo6aGFzX3RyaXZpYWxfZGVmYXVsdF9jb25zdHJ1Y3RvciAgX1RyaXZpYWw7CisjICAgZW5kaWYKKyAgICBfU1RMUF9UUlkgeworICAgICAgX01fbGVuID0gZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KTsKKyAgICAgIF9NX2FsbG9jYXRlX2J1ZmZlcigpOworICAgICAgaWYgKF9NX2xlbiA+IDApCisgICAgICAgIF9NX2luaXRpYWxpemVfYnVmZmVyKCpfX2ZpcnN0LCBfVHJpdmlhbCgpKTsKKyAgICB9CisgICAgX1NUTFBfVU5XSU5EKGZyZWUoX01fYnVmZmVyKTsgX01fYnVmZmVyID0gMDsgX01fbGVuID0gMCkKKyAgfQorCisgIH5fVGVtcG9yYXJ5X2J1ZmZlcigpIHsKKyAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95X1JhbmdlKF9NX2J1ZmZlciwgX01fYnVmZmVyICsgX01fbGVuKTsKKyAgICBmcmVlKF9NX2J1ZmZlcik7CisgIH0KKworcHJpdmF0ZToKKyAgLy8gRGlzYWJsZSBjb3B5IGNvbnN0cnVjdG9yIGFuZCBhc3NpZ25tZW50IG9wZXJhdG9yLgorICBfVGVtcG9yYXJ5X2J1ZmZlcihjb25zdCBfVGVtcG9yYXJ5X2J1ZmZlcjxfRm9yd2FyZEl0ZXJhdG9yLCBfVHA+Jikge30KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgX1RlbXBvcmFyeV9idWZmZXI8X0ZvcndhcmRJdGVyYXRvciwgX1RwPiYpIHt9Cit9OworCisjIGlmbmRlZiBfU1RMUF9OT19FWFRFTlNJT05TCisKKy8vIENsYXNzIHRlbXBvcmFyeV9idWZmZXIgaXMgbm90IHBhcnQgb2YgdGhlIHN0YW5kYXJkLiAgSXQgaXMgYW4gZXh0ZW5zaW9uLgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvciwKKyAgICAgICAgICBjbGFzcyBfVHAKKyNpZmRlZiBfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OCisgICAgICAgICAgICAgICAgICAgID0gdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlCisjZW5kaWYgLyogX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTiAqLworICAgICAgICAgPgorc3RydWN0IHRlbXBvcmFyeV9idWZmZXIgOiBwdWJsaWMgX1RlbXBvcmFyeV9idWZmZXI8X0ZvcndhcmRJdGVyYXRvciwgX1RwPgoreworICB0ZW1wb3JhcnlfYnVmZmVyKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpCisgICAgOiBfVGVtcG9yYXJ5X2J1ZmZlcjxfRm9yd2FyZEl0ZXJhdG9yLCBfVHA+KF9fZmlyc3QsIF9fbGFzdCkge30KKyAgfnRlbXBvcmFyeV9idWZmZXIoKSB7fQorfTsKKworIyBlbmRpZiAvKiBfU1RMUF9OT19FWFRFTlNJT05TICovCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworIyBpZm5kZWYgX1NUTFBfTElOS19USU1FX0lOU1RBTlRJQVRJT04KKyMgIGluY2x1ZGUgPHN0bC9fdGVtcGJ1Zi5jPgorIyBlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfVEVNUEJVRl9IICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvX3RocmVhZHMuYyBiL3N0bC9fdGhyZWFkcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNjQxZTgKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvX3RocmVhZHMuYwpAQCAtMCwwICsxLDE3MSBAQAorLyoKKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworI2lmbmRlZiBfU1RMUF9USFJFQURTX0MKKyNkZWZpbmUgX1NUTFBfVEhSRUFEU19DCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfVEhSRUFEU19ICisjICBpbmNsdWRlIDxzdGwvX3RocmVhZHMuaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfRVhQT1NFX0dMT0JBTFNfSU1QTEVNRU5UQVRJT04pCisKKyNpZiBkZWZpbmVkIChfU1RMUF9TR0lfVEhSRUFEUykKKyMgIGluY2x1ZGUgPHRpbWUuaD4KKyNlbGlmIGRlZmluZWQgKF9TVExQX1VOSVgpCisjICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1RJTUUKKyMgICAgaW5jbHVkZSA8c3RsL19jdGltZS5oPgorIyAgZW5kaWYKKyMgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9OQU1FU1BBQ0VTKSAmJiAhZGVmaW5lZCAoX1NUTFBfVkVORE9SX0dMT0JBTF9DU1REKQordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnRpbWVfdDsKKyMgIGVuZGlmCisjICBpbmNsdWRlIDxzeXMvdGltZS5oPgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisjaWYgKF9TVExQX1NUQVRJQ19URU1QTEFURV9EQVRBID4gMCkKKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX0FUT01JQ19TV0FQX01VVEVYKQordGVtcGxhdGU8aW50IF9fMzJiaXRzPgorX1NUTFBfU1RBVElDX01VVEVYCitfQXRvbWljX3N3YXBfc3RydWN0PF9fMzJiaXRzPjo6X1Nfc3dhcF9sb2NrIF9TVExQX01VVEVYX0lOSVRJQUxJWkVSOworIyAgICB1bmRlZiBfU1RMUF9VU0VfQVRPTUlDX1NXQVBfTVVURVgKKyMgIGVuZGlmCisKKyMgIGlmIGRlZmluZWQgKF9TVExQX1RIUkVBRFMpICYmICFkZWZpbmVkIChfU1RMUF9VU0VfUFRIUkVBRF9TUElOTE9DSykKK3RlbXBsYXRlIDxpbnQgX19pbnN0PgordW5zaWduZWQgX1NUTFBfbXV0ZXhfc3BpbjxfX2luc3Q+OjpfX21heCA9IF9TVExQX211dGV4X3NwaW48X19pbnN0Pjo6X19sb3dfbWF4OworCit0ZW1wbGF0ZSA8aW50IF9faW5zdD4KK3Vuc2lnbmVkIF9TVExQX211dGV4X3NwaW48X19pbnN0Pjo6X19sYXN0ID0gMDsKKyMgIGVuZGlmIC8vIF9TVExQX1VTRV9QVEhSRUFEX1NQSU5MT0NLCisKKyNlbHNlIC8qICggX1NUTFBfU1RBVElDX1RFTVBMQVRFX0RBVEEgPiAwICkgKi8KKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX0FUT01JQ19TV0FQX01VVEVYKQorX19ERUNMQVJFX0lOU1RBTkNFKF9TVExQX1NUQVRJQ19NVVRFWCwgX0F0b21pY19zd2FwX3N0cnVjdDxzaXplb2YoX19zdGxfYXRvbWljX3QpID09IHNpemVvZih2b2lkKik+OjpfU19zd2FwX2xvY2ssCisgICAgICAgICAgICAgICAgICAgX1NUTFBfTVVURVhfSU5JVElBTElaRVIgICk7CisjICAgIHVuZGVmIF9TVExQX1VTRV9BVE9NSUNfU1dBUF9NVVRFWAorIyAgZW5kaWYgLyogX1NUTFBfUFRIUkVBRFMgKi8KKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfVEhSRUFEUykgJiYgIWRlZmluZWQgKF9TVExQX1VTRV9QVEhSRUFEX1NQSU5MT0NLKQorX19ERUNMQVJFX0lOU1RBTkNFKHVuc2lnbmVkLCBfU1RMUF9tdXRleF9zcGluPDA+OjpfX21heCwgID0zMCk7CitfX0RFQ0xBUkVfSU5TVEFOQ0UodW5zaWduZWQsIF9TVExQX211dGV4X3NwaW48MD46Ol9fbGFzdCwgPTApOworIyAgZW5kaWYgLy8gX1NUTFBfVVNFX1BUSFJFQURfU1BJTkxPQ0sKKworI2VuZGlmIC8qICggX1NUTFBfU1RBVElDX1RFTVBMQVRFX0RBVEEgPiAwICkgKi8KKworI2lmIGRlZmluZWQgKF9TVExQX1RIUkVBRFMpICYmICFkZWZpbmVkIChfU1RMUF9VU0VfUFRIUkVBRF9TUElOTE9DSykKKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfU1BBUkNfU09MQVJJU19USFJFQURTKQorLy8gdW5kZXJncm91bmQgZnVuY3Rpb24gaW4gbGliYy5zbzsgd2UgZG8gbm90IHdhbnQgZGVwZW5kYW5jZSBvbiBsaWJydAorZXh0ZXJuICJDIiBpbnQgX19uYW5vc2xlZXAoY29uc3Qgc3RydWN0IHRpbWVzcGVjKiwgc3RydWN0IHRpbWVzcGVjKik7CisjICAgIGRlZmluZSBfU1RMUF9OQU5PU0xFRVAgX19uYW5vc2xlZXAKKyMgIGVsc2UKKyMgICAgZGVmaW5lIF9TVExQX05BTk9TTEVFUCBuYW5vc2xlZXAKKyMgIGVuZGlmCisKK3RlbXBsYXRlIDxpbnQgX19pbnN0Pgordm9pZCBfU1RMUF9DQUxMCitfU1RMUF9tdXRleF9zcGluPF9faW5zdD46Ol9TX25zZWNfc2xlZXAoaW50IF9fbG9nX25zZWMpIHsKKyMgIGlmIGRlZmluZWQgKF9TVExQX1dJTjMyVEhSRUFEUykKKyAgaWYgKF9fbG9nX25zZWMgPD0gMjApIHsKKyAgICAvLyBOb3RlIGZyb20gYm9vc3QgKHd3dy5ib29zdC5vcmcpOgorICAgIC8vIENoYW5nZWQgdG8gU2xlZXAoMSkgZnJvbSBTbGVlcCgwKS4KKyAgICAvLyBBY2NvcmRpbmcgdG8gTVNETiwgU2xlZXAoMCkgd2lsbCBuZXZlciB5aWVsZAorICAgIC8vIHRvIGEgbG93ZXItcHJpb3JpdHkgdGhyZWFkLCB3aGVyZWFzIFNsZWVwKDEpCisgICAgLy8gd2lsbC4gUGVyZm9ybWFuY2Ugc2VlbXMgbm90IHRvIGJlIGFmZmVjdGVkLgorICAgIFNsZWVwKDEpOworICB9IGVsc2UgeworICAgIFNsZWVwKDEgPDwgKF9fbG9nX25zZWMgLSAyMCkpOworICB9CisjICBlbGlmIGRlZmluZWQoX1NUTFBfT1MyVEhSRUFEUykKKyAgaWYgKF9fbG9nX25zZWMgPD0gMjApIHsKKyAgICBEb3NTbGVlcCgwKTsKKyAgfSBlbHNlIHsKKyAgICBEb3NTbGVlcCgxIDw8IChfX2xvZ19uc2VjIC0gMjApKTsKKyAgfQorIyAgZWxpZiBkZWZpbmVkIChfU1RMUF9VTklYKQorICB0aW1lc3BlYyBfX3RzOworICAvKiBNYXggc2xlZXAgaXMgMioqMjduc2VjIH4gNjBtc2VjICAgICAgKi8KKyAgX190cy50dl9zZWMgPSAwOworICBfX3RzLnR2X25zZWMgPSAxIDw8IF9fbG9nX25zZWM7CisgIF9TVExQX05BTk9TTEVFUCgmX190cywgMCk7CisjICBlbmRpZgorfQorCit0ZW1wbGF0ZSA8aW50IF9faW5zdD4KK3ZvaWQgIF9TVExQX0NBTEwKK19TVExQX211dGV4X3NwaW48X19pbnN0Pjo6X01fZG9fbG9jayh2b2xhdGlsZSBfX3N0bF9hdG9taWNfdCogX19sb2NrKSB7CisjICBpZiBkZWZpbmVkKF9TVExQX0FUT01JQ19FWENIQU5HRSkKKyAgaWYgKF9BdG9taWNfc3dhcChfX2xvY2ssIDEpKSB7CisgICAgdW5zaWduZWQgX19teV9zcGluX21heCA9IF9TVExQX211dGV4X3NwaW48MD46Ol9fbWF4OworICAgIHVuc2lnbmVkIF9fbXlfbGFzdF9zcGlucyA9IF9TVExQX211dGV4X3NwaW48MD46Ol9fbGFzdDsKKyAgICB2b2xhdGlsZSB1bnNpZ25lZCBfX2p1bmsgPSAxNzsgICAvLyBWYWx1ZSBkb2Vzbid0IG1hdHRlci4KKyAgICB1bnNpZ25lZCAgX19pOworCisgICAgZm9yIChfX2kgPSAwOyBfX2kgPCBfX215X3NwaW5fbWF4OyArK19faSkgeworICAgICAgaWYgKF9faSA8IF9fbXlfbGFzdF9zcGlucy8yIHx8ICpfX2xvY2spIHsKKyAgICAgICAgX19qdW5rICo9IF9fanVuazsgX19qdW5rICo9IF9fanVuazsKKyAgICAgICAgX19qdW5rICo9IF9fanVuazsgX19qdW5rICo9IF9fanVuazsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghX0F0b21pY19zd2FwKF9fbG9jaywgMSkpIHsKKyAgICAgICAgICAvLyBnb3QgaXQhCisgICAgICAgICAgLy8gU3Bpbm5pbmcgd29ya2VkLiAgVGh1cyB3ZSdyZSBwcm9iYWJseSBub3QgYmVpbmcgc2NoZWR1bGVkCisgICAgICAgICAgLy8gYWdhaW5zdCB0aGUgb3RoZXIgcHJvY2VzcyB3aXRoIHdoaWNoIHdlIHdlcmUgY29udGVuZGluZy4KKyAgICAgICAgICAvLyBUaHVzIGl0IG1ha2VzIHNlbnNlIHRvIHNwaW4gbG9uZ2VyIHRoZSBuZXh0IHRpbWUuCisgICAgICAgICAgX1NUTFBfbXV0ZXhfc3BpbjwwPjo6X19sYXN0ID0gX19pOworICAgICAgICAgIF9TVExQX211dGV4X3NwaW48MD46Ol9fbWF4ID0gX1NUTFBfbXV0ZXhfc3BpbjwwPjo6X19oaWdoX21heDsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBXZSBhcmUgcHJvYmFibHkgYmVpbmcgc2NoZWR1bGVkIGFnYWluc3QgdGhlIG90aGVyIHByb2Nlc3MuICBTbGVlcC4KKyAgICBfU1RMUF9tdXRleF9zcGluPDA+OjpfX21heCA9IF9TVExQX211dGV4X3NwaW48MD46Ol9fbG93X21heDsKKworICAgIGZvciAoX19pID0gMCA7OyArK19faSkgeworICAgICAgaW50IF9fbG9nX25zZWMgPSBfX2kgKyA2OworCisgICAgICBpZiAoX19sb2dfbnNlYyA+IDI3KSBfX2xvZ19uc2VjID0gMjc7CisgICAgICBpZiAoIV9BdG9taWNfc3dhcChfX2xvY2ssIDEpKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgX1NfbnNlY19zbGVlcChfX2xvZ19uc2VjKTsKKyAgICB9CisgIH0gLyogZmlyc3QgX0F0b21pY19zd2FwICovCisjICBlbmRpZgorfQorI2VuZGlmIC8vIF9TVExQX1VTRV9QVEhSRUFEX1NQSU5MT0NLCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2VuZGlmIC8qIF9TVExQX0VYUE9TRV9HTE9CQUxTX0lNUExFTUVOVEFUSU9OICovCisjZW5kaWYgLyogIF9TVExQX1RIUkVBRFNfQyAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RsL190aHJlYWRzLmggYi9zdGwvX3RocmVhZHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTk2Y2EyCi0tLSAvZGV2L251bGwKKysrIGIvc3RsL190aHJlYWRzLmgKQEAgLTAsMCArMSw3MDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMTk5OQorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworLy8gV0FSTklORzogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgQysrCisvLyBzdGFuZGFyZCBsaWJyYXJ5IGhlYWRlcnMuICBZb3Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHVzZSB0aGlzIGhlYWRlcgorLy8gZmlsZSBkaXJlY3RseS4KKworCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX1RIUkVBRFNfSAorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9USFJFQURTX0gKKworLy8gU3VwcG9ydGVkIHRocmVhZGluZyBtb2RlbHMgYXJlIG5hdGl2ZSBTR0ksIHB0aHJlYWRzLCB1aXRocmVhZHMKKy8vIChzaW1pbGFyIHRvIHB0aHJlYWRzLCBidXQgYmFzZWQgb24gYW4gZWFybGllciBkcmFmdCBvZiB0aGUgUG9zaXgKKy8vIHRocmVhZHMgc3RhbmRhcmQpLCBhbmQgV2luMzIgdGhyZWFkcy4gIFVpdGhyZWFkIHN1cHBvcnQgYnkgSm9jaGVuCisvLyBTY2hsaWNrLCAxOTk5LCBhbmQgU29sYXJpcyB0aHJlYWRzIGdlbmVyYWxpemVkIHRvIHRoZW0uCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1NURERFRgorIyAgaW5jbHVkZSA8c3RsL19jc3RkZGVmLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DU1RETElCCisjICBpbmNsdWRlIDxzdGwvX2NzdGRsaWIuaD4KKyNlbmRpZgorCisvLyBPbiBTVU4gYW5kIE1hYyBPUyBYIGdjYywgemVyby1pbml0aWFsaXphdGlvbiB3b3JrcyBqdXN0IGZpbmUuLi4KKyNpZiBkZWZpbmVkIChfX3N1bikgfHwgKGRlZmluZWQgKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fQVBQTEVfXykpCisjICBkZWZpbmUgX1NUTFBfTVVURVhfSU5JVElBTElaRVIKKyNlbmRpZgorCisvKiBUaGlzIGhlYWRlciBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgYXRvbWljIG9wZXJhdGlvbiB0aGF0IHBsYXRmb3JtIHNob3VsZAorICogdHJ5IHRvIHN1cHBvcnQgYXMgbXVjaCBhcyBwb3NzaWJsZS4gQXRvbWljIG9wZXJhdGlvbiBhcmUgZXhwb3NlZCBhcyBtYWNybworICogaW4gb3JkZXIgdG8gZWFzaWx5IHRlc3QgZm9yIHRoZWlyIGV4aXN0YW5jZS4gVGhleSBhcmU6CisgKiBfX3N0bF9hdG9taWNfdCBfU1RMUF9BVE9NSUNfSU5DUkVNRU5UKHZvbGF0aWxlIF9fc3RsX2F0b21pY190KiBfX3B0cikgOgorICogaW5jcmVtZW50ICpfX3B0ciBieSAxIGFuZCByZXR1cm5zIHRoZSBuZXcgdmFsdWUKKyAqIF9fc3RsX2F0b21pY190IF9TVExQX0FUT01JQ19ERUNSRU1FTlQodm9sYXRpbGUgX19zdGxfYXRvbWljX3QqIF9fcHRyKSA6CisgKiBkZWNyZW1lbnQgICpfX3B0ciBieSAxIGFuZCByZXR1cm5zIHRoZSBuZXcgdmFsdWUKKyAqIF9fc3RsX2F0b21pY190IF9TVExQX0FUT01JQ19FWENIQU5HRSh2b2xhdGlsZSBfX3N0bF9hdG9taWNfdCogX190YXJnZXQsIF9fc3RsX2F0b21pY190IF9fdmFsKSA6CisgKiBhc3NpZ24gX192YWwgdG8gKl9fdGFyZ2V0IGFuZCByZXR1cm5zIGZvcm1lciAqX190YXJnZXQgdmFsdWUKKyAqIHZvaWQqIF9TVExQX0FUT01JQ19FWENIQU5HRV9QVFIodm9pZCogdm9sYXRpbGUqIF9fdGFyZ2V0LCB2b2lkKiBfX3B0cikgOgorICogYXNzaWduIF9fcHRyIHRvICpfX3RhcmdldCBhbmQgcmV0dXJucyBmb3JtZXIgKl9fdGFyZ2V0IHZhbHVlCisgKiBfX3N0bF9hdG9taWNfdCBfU1RMUF9BVE9NSUNfQUREKHZvbGF0aWxlIF9fc3RsX2F0b21pY190KiBfX3RhcmdldCwgX19zdGxfYXRvbWljX3QgX192YWwpIDoKKyAqIGRvZXMgKl9fdGFyZ2V0ID0gKl9fdGFyZ2V0ICsgX192YWwgYW5kIHJldHVybnMgdGhlIG9sZCAqX190YXJnZXQgdmFsdWUKKyAqLworCisjaWYgZGVmaW5lZCAoX1NUTFBfV0lOMzIpIHx8IGRlZmluZWQgKF9fc2dpKSB8fCBkZWZpbmVkIChfU1RMUF9TUEFSQ19TT0xBUklTX1RIUkVBRFMpCit0eXBlZGVmIGxvbmcgX19zdGxfYXRvbWljX3Q7CisjZWxzZQorLyogRG9uJ3QgaW1wb3J0IHdob2xlIG5hbWVzcGFjZSEhISEgLSBwdHIgKi8KKy8vICMgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX05BTUVTUEFDRVMpICYmICEgZGVmaW5lZCAoX1NUTFBfVkVORE9SX0dMT0JBTF9DU1REKQorLy8gLy8gdXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnNpemVfdDsKKy8vIHVzaW5nIG5hbWVzcGFjZSBfU1RMUF9WRU5ET1JfQ1NURDsKKy8vICMgZW5kaWYKK3R5cGVkZWYgc2l6ZV90IF9fc3RsX2F0b21pY190OworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9USFJFQURTKQorCisjICBpZiBkZWZpbmVkIChfU1RMUF9TR0lfVEhSRUFEUykKKworIyAgICBpbmNsdWRlIDxtdXRleC5oPgorLy8gSGFjayBmb3IgU0dJIG8zMiBjb21waWxlcnMuCisjICAgIGlmICFkZWZpbmVkKF9fYWRkX2FuZF9mZXRjaCkgJiYgXAorICAgICAgICAoX19taXBzIDwgMyB8fCAhKGRlZmluZWQgKF9BQklOMzIpIHx8IGRlZmluZWQoX0FCSTY0KSkpCisjICAgICAgZGVmaW5lIF9fYWRkX2FuZF9mZXRjaChfX2wsX192KSBhZGRfdGhlbl90ZXN0KCh1bnNpZ25lZCBsb25nKilfX2wsX192KQorIyAgICAgIGRlZmluZSBfX3Rlc3RfYW5kX3NldChfX2wsX192KSAgdGVzdF9hbmRfc2V0KF9fbCxfX3YpCisjICAgIGVuZGlmIC8qIG8zMiAqLworCisjICAgIGlmIF9fbWlwcyA8IDMgfHwgIShkZWZpbmVkIChfQUJJTjMyKSB8fCBkZWZpbmVkKF9BQkk2NCkpCisjICAgICAgZGVmaW5lIF9TVExQX0FUT01JQ19FWENIQU5HRShfX3AsIF9fcSkgdGVzdF9hbmRfc2V0KF9fcCwgX19xKQorIyAgICBlbHNlCisjICAgICAgZGVmaW5lIF9TVExQX0FUT01JQ19FWENIQU5HRShfX3AsIF9fcSkgX190ZXN0X2FuZF9zZXQoKHVuc2lnbmVkIGxvbmcqKV9fcCwgKHVuc2lnbmVkIGxvbmcpX19xKQorIyAgICBlbmRpZgorCisjICAgIGRlZmluZSBfU1RMUF9BVE9NSUNfSU5DUkVNRU5UKF9feCkgX19hZGRfYW5kX2ZldGNoKF9feCwgMSkKKyMgICAgZGVmaW5lIF9TVExQX0FUT01JQ19ERUNSRU1FTlQoX194KSBfX2FkZF9hbmRfZmV0Y2goX194LCAoc2l6ZV90KSAtMSkKKworIyAgZWxpZiBkZWZpbmVkIChfU1RMUF9QVEhSRUFEUykKKworIyAgICBpbmNsdWRlIDxwdGhyZWFkLmg+CisjICAgIGlmICFkZWZpbmVkIChfU1RMUF9VU0VfUFRIUkVBRF9TUElOTE9DSykKKyMgICAgICBpZiBkZWZpbmVkIChQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSKSAmJiAhZGVmaW5lZCAoX1NUTFBfTVVURVhfSU5JVElBTElaRVIpICYmIGRlZmluZWQgKF9SRUVOVFJBTlQpCisjICAgICAgICBkZWZpbmUgX1NUTFBfTVVURVhfSU5JVElBTElaRVIgPSB7IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVIgfQorIyAgICAgIGVuZGlmCisvL0hQVVggdmFyaWFudHMgaGF2ZSAob24gc29tZSBwbGF0Zm9ybXMgb3B0aW9uYWwpIG5vbi1zdGFuZGFyZCAiRENFIiBwdGhyZWFkcyBpbXBsCisjICAgICAgaWYgZGVmaW5lZCAoX0RFQ1RIUkVBRFNfKSAmJiAoZGVmaW5lZCAoX1BUSFJFQURfVVNFX0Q0KSB8fCBkZWZpbmVkIChfX2hwdXgpKSAmJiAhZGVmaW5lZCAoX0NNQV9TVVBQUkVTU19FWFRFUk5BTFNfKQorIyAgICAgICAgZGVmaW5lIF9TVExQX1BUSFJFQURfQVRUUl9ERUZBVUxUIHB0aHJlYWRfbXV0ZXhhdHRyX2RlZmF1bHQKKyMgICAgICBlbHNlCisjICAgICAgICBkZWZpbmUgX1NUTFBfUFRIUkVBRF9BVFRSX0RFRkFVTFQgMAorIyAgICAgIGVuZGlmCisjICAgIGVsc2UgLy8gX1NUTFBfVVNFX1BUSFJFQURfU1BJTkxPQ0sKKyMgICAgICBpZiBkZWZpbmVkIChfX09wZW5CU0RfXykKKyMgICAgICAgIGluY2x1ZGUgPHNwaW5sb2NrLmg+CisjICAgICAgZW5kaWYKKyMgICAgZW5kaWYgLy8gX1NUTFBfVVNFX1BUSFJFQURfU1BJTkxPQ0sKKworIyAgICBpZiBkZWZpbmVkIChfX0dOVUNfXykgJiYgZGVmaW5lZCAoX19pMzg2X18pCisKKyMgICAgICBpZiAhZGVmaW5lZCAoX1NUTFBfQVRPTUlDX0lOQ1JFTUVOVCkKK2lubGluZSBsb25nIF9TVExQX2F0b21pY19pbmNyZW1lbnRfZ2NjX3g4Nihsb25nIHZvbGF0aWxlKiBwKSB7CisgIGxvbmcgcmVzdWx0OworICBfX2FzbV9fIF9fdm9sYXRpbGVfXworICAgICgibG9jazsgeGFkZGwgICUxLCAlMDsiCisgICAgOiI9bSIgKCpwKSwgIj1yIiAocmVzdWx0KQorICAgIDoibSIgKCpwKSwgICIxIiAgKDEpCisgICAgOiJjYyIpOworICByZXR1cm4gcmVzdWx0ICsgMTsKK30KKyMgICAgICAgIGRlZmluZSBfU1RMUF9BVE9NSUNfSU5DUkVNRU5UKF9feCkgKF9TVExQX2F0b21pY19pbmNyZW1lbnRfZ2NjX3g4NigobG9uZyB2b2xhdGlsZSopX194KSkKKyMgICAgICBlbmRpZgorCisjICAgICAgaWYgIWRlZmluZWQgKF9TVExQX0FUT01JQ19ERUNSRU1FTlQpCitpbmxpbmUgbG9uZyBfU1RMUF9hdG9taWNfZGVjcmVtZW50X2djY194ODYobG9uZyB2b2xhdGlsZSogcCkgeworICBsb25nIHJlc3VsdDsKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18KKyAgICAoImxvY2s7IHhhZGRsICAlMSwgJTA7IgorICAgIDoiPW0iICgqcCksICI9ciIgKHJlc3VsdCkKKyAgICA6Im0iICgqcCksICAiMSIgICgtMSkKKyAgICA6ImNjIik7CisgIHJldHVybiByZXN1bHQgLSAxOworfQorIyAgICAgICAgZGVmaW5lIF9TVExQX0FUT01JQ19ERUNSRU1FTlQoX194KSAoX1NUTFBfYXRvbWljX2RlY3JlbWVudF9nY2NfeDg2KChsb25nIHZvbGF0aWxlKilfX3gpKQorIyAgICAgIGVuZGlmCisKKyMgICAgICBpZiAhZGVmaW5lZCAoX1NUTFBfQVRPTUlDX0FERCkKK2lubGluZSBsb25nIF9TVExQX2F0b21pY19hZGRfZ2NjX3g4Nihsb25nIHZvbGF0aWxlKiBwLCBsb25nIGFkZGVuZCkgeworICBsb25nIHJlc3VsdDsKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18KKyAgICAoImxvY2s7IHhhZGRsICUxLCAlMDsiCisgICAgOiI9bSIgKCpwKSwgIj1yIiAocmVzdWx0KQorICAgIDoibSIgICgqcCksICIxIiAgKGFkZGVuZCkKKyAgICA6ImNjIik7CisgcmV0dXJuIHJlc3VsdCArIGFkZGVuZDsKK30KKyMgICAgICAgIGRlZmluZSBfU1RMUF9BVE9NSUNfQUREKF9fZHN0LCBfX3ZhbCkgIChfU1RMUF9hdG9taWNfYWRkX2djY194ODYoKGxvbmcgdm9sYXRpbGUqKV9fZHN0LCAobG9uZylfX3ZhbCkpCisjICAgICAgZW5kaWYKKworIyAgICBlbmRpZiAvKiBpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9faTM4Nl9fKSAqLworCisjICBlbGlmIGRlZmluZWQgKF9TVExQX1dJTjMyVEhSRUFEUykKKworIyAgICBpZiAhZGVmaW5lZCAoX1NUTFBfQVRPTUlDX0lOQ1JFTUVOVCkKKyMgICAgICBpZiAhZGVmaW5lZCAoX1NUTFBfTkVXX1BMQVRGT1JNX1NESykKKyMgICAgICAgIGRlZmluZSBfU1RMUF9BVE9NSUNfSU5DUkVNRU5UKF9feCkgICAgICAgICAgIEludGVybG9ja2VkSW5jcmVtZW50KF9fQ09OU1RfQ0FTVChsb25nKiwgX194KSkKKyMgICAgICAgIGRlZmluZSBfU1RMUF9BVE9NSUNfREVDUkVNRU5UKF9feCkgICAgICAgICAgIEludGVybG9ja2VkRGVjcmVtZW50KF9fQ09OU1RfQ0FTVChsb25nKiwgX194KSkKKyMgICAgICAgIGRlZmluZSBfU1RMUF9BVE9NSUNfRVhDSEFOR0UoX194LCBfX3kpICAgICAgIEludGVybG9ja2VkRXhjaGFuZ2UoX19DT05TVF9DQVNUKGxvbmcqLCBfX3gpLCBfX3kpCisjICAgICAgZWxzZQorIyAgICAgICAgZGVmaW5lIF9TVExQX0FUT01JQ19JTkNSRU1FTlQoX194KSAgICAgICAgICAgSW50ZXJsb2NrZWRJbmNyZW1lbnQoX194KQorIyAgICAgICAgZGVmaW5lIF9TVExQX0FUT01JQ19ERUNSRU1FTlQoX194KSAgICAgICAgICAgSW50ZXJsb2NrZWREZWNyZW1lbnQoX194KQorIyAgICAgICAgZGVmaW5lIF9TVExQX0FUT01JQ19FWENIQU5HRShfX3gsIF9feSkgICAgICAgSW50ZXJsb2NrZWRFeGNoYW5nZShfX3gsIF9feSkKKyMgICAgICBlbmRpZgorIyAgICAgIGRlZmluZSBfU1RMUF9BVE9NSUNfRVhDSEFOR0VfUFRSKF9feCwgX195KSAgICAgU1RMUEludGVybG9ja2VkRXhjaGFuZ2VQb2ludGVyKF9feCwgX195KQorLyoKKyAqIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25uYWxpdHkgaXMgb25seSBhdmFpbGFibGUgc2luY2UgV2luZG93cyA5OCwgdGhvc2UgdGhhdCBhcmUgdGFyZ2V0aW5nIHByZXZpb3VzIE9TZXMKKyAqIHNob3VsZCBkZWZpbmUgX1dJTjMyX1dJTkRPV1MgdG8gYSB2YWx1ZSBsb3dlciB0aGF0IHRoZSBvbmUgb2YgV2luIDk4LCBzZWUgUGxhdGZvcm0gU0RLIGRvY3VtZW50YXRpb24gZm9yCisgKiBtb3JlIGluZm9ybWF0aW9uczoKKyAqLworIyAgICAgIGlmIGRlZmluZWQgKF9TVExQX05FV19QTEFURk9STV9TREspICYmICghZGVmaW5lZCAoX1NUTFBfV0lOMzJfVkVSU0lPTikgfHwgKF9TVExQX1dJTjMyX1ZFUlNJT04gPj0gMHgwNDEwKSkKKyMgICAgICAgIGRlZmluZSBfU1RMUF9BVE9NSUNfQUREKF9fZHN0LCBfX3ZhbCkgSW50ZXJsb2NrZWRFeGNoYW5nZUFkZChfX2RzdCwgX192YWwpCisjICAgICAgZW5kaWYKKyMgICAgZW5kaWYKKworIyAgZWxpZiBkZWZpbmVkIChfX0RFQ0MpIHx8IGRlZmluZWQgKF9fREVDQ1hYKQorCisjICAgIGluY2x1ZGUgPG1hY2hpbmUvYnVpbHRpbnMuaD4KKyMgICAgZGVmaW5lIF9TVExQX0FUT01JQ19FWENIQU5HRSBfX0FUT01JQ19FWENIX0xPTkcKKyMgICAgZGVmaW5lIF9TVExQX0FUT01JQ19JTkNSRU1FTlQoX194KSBfX0FUT01JQ19BRERfTE9ORyhfX3gsIDEpCisjICAgIGRlZmluZSBfU1RMUF9BVE9NSUNfREVDUkVNRU5UKF9feCkgX19BVE9NSUNfQUREX0xPTkcoX194LCAtMSkKKworIyAgZWxpZiBkZWZpbmVkKF9TVExQX1NQQVJDX1NPTEFSSVNfVEhSRUFEUykKKworIyAgICBpbmNsdWRlIDxzdGwvX3NwYXJjX2F0b21pYy5oPgorCisjICBlbGlmIGRlZmluZWQgKF9TVExQX1VJVEhSRUFEUykKKworLy8gdGhpcyBpbmNsdXNpb24gaXMgcG90ZW50aWFsIGhhemFyZCB0byBicmluZyB1cCBhbGwgc29ydHMKKy8vIG9mIG9sZC1zdHlsZSBoZWFkZXJzLiBMZXQncyBhc3N1bWUgdmVuZG9yIGFscmVhZHkga25vdyBob3cKKy8vIHRvIGRlYWwgd2l0aCB0aGF0LgorIyAgICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1RJTUUKKyMgICAgICBpbmNsdWRlIDxzdGwvX2N0aW1lLmg+CisjICAgIGVuZGlmCisjICAgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9OQU1FU1BBQ0VTKSAmJiAhIGRlZmluZWQgKF9TVExQX1ZFTkRPUl9HTE9CQUxfQ1NURCkKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjp0aW1lX3Q7CisjICAgIGVuZGlmCisjICAgIGluY2x1ZGUgPHN5bmNoLmg+CisjICAgIGluY2x1ZGUgPGNzdGRpbz4KKyMgICAgaW5jbHVkZSA8Y3djaGFyPgorCisjICBlbGlmIGRlZmluZWQgKF9TVExQX0JFVEhSRUFEUykKKworIyAgICBpbmNsdWRlIDxPUy5oPgorIyAgICBpbmNsdWRlIDxjYXNzZXJ0PgorIyAgICBpbmNsdWRlIDxzdGRpby5oPgorIyAgICBkZWZpbmUgX1NUTFBfTVVURVhfSU5JVElBTElaRVIgPSB7IDAgfQorCisjICBlbGlmIGRlZmluZWQgKF9TVExQX05XVEhSRUFEUykKKworIyAgICBpbmNsdWRlIDxud3RocmVhZC5oPgorIyAgICBpbmNsdWRlIDxud3NlbWFwaC5oPgorCisjICBlbGlmIGRlZmluZWQoX1NUTFBfT1MyVEhSRUFEUykKKworIyAgICBpZiBkZWZpbmVkIChfX0dOVUNfXykKKyMgICAgICBkZWZpbmUgSU5DTF9ET1NTRU1BUEhPUkVTCisjICAgICAgaW5jbHVkZSA8b3MyLmg+CisjICAgIGVsc2UKKy8vIFRoaXMgc2VjdGlvbiBzZXJ2ZXMgdG8gcmVwbGFjZSBvczIuaCBmb3IgVmlzdWFsQWdlIEMrKworICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgVUxPTkc7CisjICAgICAgaWYgIWRlZmluZWQgKF9fSEVWX18pICAvKiBJTkNMX1NFTUFQSE9SRSBtYXkgYWxzbyBkZWZpbmUgSEVWICovCisjICAgICAgICBkZWZpbmUgX19IRVZfXworICB0eXBlZGVmIFVMT05HIEhFVjsKKyAgdHlwZWRlZiBIRVYqICBQSEVWOworIyAgICAgIGVuZGlmCisgIHR5cGVkZWYgVUxPTkcgQVBJUkVUOworICB0eXBlZGVmIFVMT05HIEhNVFg7CisgIHR5cGVkZWYgSE1UWCogIFBITVRYOworICB0eXBlZGVmIGNvbnN0IGNoYXIqICBQQ1NaOworICB0eXBlZGVmIFVMT05HIEJPT0wzMjsKKyAgQVBJUkVUIF9TeXN0ZW0gRG9zQ3JlYXRlTXV0ZXhTZW0oUENTWiBwc3pOYW1lLCBQSEVWIHBoZXYsIFVMT05HIGZsQXR0ciwgQk9PTDMyIGZTdGF0ZSk7CisgIEFQSVJFVCBfU3lzdGVtIERvc1JlcXVlc3RNdXRleFNlbShITVRYIGhtdHgsIFVMT05HIHVsVGltZW91dCk7CisgIEFQSVJFVCBfU3lzdGVtIERvc1JlbGVhc2VNdXRleFNlbShITVRYIGhtdHgpOworICBBUElSRVQgX1N5c3RlbSBEb3NDbG9zZU11dGV4U2VtKEhNVFggaG10eCk7CisjICAgICAgZGVmaW5lIF9TVExQX01VVEVYX0lOSVRJQUxJWkVSID0geyAwIH0KKyMgICAgZW5kaWYgLyogR05VQyAqLworCisjICBlbmRpZgorCisjZWxzZQorLyogbm8gdGhyZWFkcyAqLworIyAgZGVmaW5lIF9TVExQX0FUT01JQ19JTkNSRU1FTlQoX194KSArKygqX194KQorIyAgZGVmaW5lIF9TVExQX0FUT01JQ19ERUNSRU1FTlQoX194KSAtLSgqX194KQorLyogV2UgZG8gbm90IGdyYW50IG90aGVyIGF0b21pYyBvcGVyYXRpb25zIGFzIHRoZXkgYXJlIHVzZWxlc3MgaWYgU1RMcG9ydCBkbyBub3QgaGF2ZQorICogdG8gYmUgdGhyZWFkIHNhZmUKKyAqLworI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTVVURVhfSU5JVElBTElaRVIpCisjICBpZiBkZWZpbmVkKF9TVExQX0FUT01JQ19FWENIQU5HRSkKKyMgICAgZGVmaW5lIF9TVExQX01VVEVYX0lOSVRJQUxJWkVSID0geyAwIH0KKyMgIGVsaWYgZGVmaW5lZChfU1RMUF9VSVRIUkVBRFMpCisjICAgIGRlZmluZSBfU1RMUF9NVVRFWF9JTklUSUFMSVpFUiA9IHsgREVGQVVMVE1VVEVYIH0KKyMgIGVsc2UKKyMgICAgZGVmaW5lIF9TVExQX01VVEVYX0lOSVRJQUxJWkVSCisjICBlbmRpZgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisjaWYgZGVmaW5lZCAoX1NUTFBfVEhSRUFEUykgJiYgIWRlZmluZWQgKF9TVExQX1VTRV9QVEhSRUFEX1NQSU5MT0NLKQorLy8gSGVscGVyIHN0cnVjdC4gIFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciB2YXJpb3VzIGNvbXBpbGVycyB0aGF0IGRvbid0CisvLyBoYW5kbGUgc3RhdGljIHZhcmlhYmxlcyBpbiBpbmxpbmUgZnVuY3Rpb25zIHByb3Blcmx5LgordGVtcGxhdGUgPGludCBfX2luc3Q+CitzdHJ1Y3QgX1NUTFBfbXV0ZXhfc3BpbiB7CisgIGVudW0geyBfX2xvd19tYXggPSAzMCwgX19oaWdoX21heCA9IDEwMDAgfTsKKyAgLy8gTG93IGlmIHdlIHN1c3BlY3QgdW5pcHJvY2Vzc29yLCBoaWdoIGZvciBtdWx0aXByb2Nlc3Nvci4KKyAgc3RhdGljIHVuc2lnbmVkIF9fbWF4OworICBzdGF0aWMgdW5zaWduZWQgX19sYXN0OworICBzdGF0aWMgdm9pZCBfU1RMUF9DQUxMIF9NX2RvX2xvY2sodm9sYXRpbGUgX19zdGxfYXRvbWljX3QqIF9fbG9jayk7CisgIHN0YXRpYyB2b2lkIF9TVExQX0NBTEwgX1NfbnNlY19zbGVlcChpbnQgX19sb2dfbnNlYyk7Cit9OworI2VuZGlmIC8vICFfU1RMUF9VU0VfUFRIUkVBRF9TUElOTE9DSworCisvLyBMb2NraW5nIGNsYXNzLiAgTm90ZSB0aGF0IHRoaXMgY2xhc3MgKmRvZXMgbm90IGhhdmUgYSBjb25zdHJ1Y3RvciouCisvLyBJdCBtdXN0IGJlIGluaXRpYWxpemVkIGVpdGhlciBzdGF0aWNhbGx5LCB3aXRoIF9TVExQX01VVEVYX0lOSVRJQUxJWkVSLAorLy8gb3IgZHluYW1pY2FsbHksIGJ5IGV4cGxpY2l0bHkgY2FsbGluZyB0aGUgX01faW5pdGlhbGl6ZSBtZW1iZXIgZnVuY3Rpb24uCisvLyAoVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSB3YXlzIHRoYXQgYSBwdGhyZWFkcyBtdXRleCBjYW4gYmUgaW5pdGlhbGl6ZWQuKQorLy8gVGhlcmUgYXJlIGV4cGxpY2l0IG1lbWJlciBmdW5jdGlvbnMgZm9yIGFjcXVpcmluZyBhbmQgcmVsZWFzaW5nIHRoZSBsb2NrLgorCisvLyBUaGVyZSBpcyBubyBjb25zdHJ1Y3RvciBiZWNhdXNlIHN0YXRpYyBpbml0aWFsaXphdGlvbiBpcyBlc3NlbnRpYWwgZm9yCisvLyBzb21lIHVzZXMsIGFuZCBvbmx5IGEgY2xhc3MgYWdncmVnYXRlIChzZWUgc2VjdGlvbiA4LjUuMSBvZiB0aGUgQysrCisvLyBzdGFuZGFyZCkgY2FuIGJlIGluaXRpYWxpemVkIHRoYXQgd2F5LiAgVGhhdCBtZWFucyB3ZSBtdXN0IGhhdmUgbm8KKy8vIGNvbnN0cnVjdG9ycywgbm8gYmFzZSBjbGFzc2VzLCBubyB2aXJ0dWFsIGZ1bmN0aW9ucywgYW5kIG5vIHByaXZhdGUgb3IKKy8vIHByb3RlY3RlZCBtZW1iZXJzLgorCisvLyBGb3Igbm9uLXN0YXRpYyBjYXNlcywgY2xpZW50cyBzaG91bGQgdXNlICBfU1RMUF9tdXRleC4KKworc3RydWN0IF9TVExQX0NMQVNTX0RFQ0xTUEVDIF9TVExQX211dGV4X2Jhc2UgeworI2lmIGRlZmluZWQgKF9TVExQX0FUT01JQ19FWENIQU5HRSkgfHwgZGVmaW5lZCAoX1NUTFBfU0dJX1RIUkVBRFMpCisgIC8vIEl0IHNob3VsZCBiZSByZWxhdGl2ZWx5IGVhc3kgdG8gZ2V0IHRoaXMgdG8gd29yayBvbiBhbnkgbW9kZXJuIFVuaXguCisgIHZvbGF0aWxlIF9fc3RsX2F0b21pY190IF9NX2xvY2s7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX1RIUkVBRFMpCisjICBpZiBkZWZpbmVkIChfU1RMUF9BVE9NSUNfRVhDSEFOR0UpCisgIGlubGluZSB2b2lkIF9NX2luaXRpYWxpemUoKSB7IF9NX2xvY2sgPSAwOyB9CisgIGlubGluZSB2b2lkIF9NX2Rlc3Ryb3koKSB7fQorCisgIHZvaWQgX01fYWNxdWlyZV9sb2NrKCkgeworICAgIF9TVExQX211dGV4X3NwaW48MD46Ol9NX2RvX2xvY2soJl9NX2xvY2spOworICB9CisKKyAgaW5saW5lIHZvaWQgX01fcmVsZWFzZV9sb2NrKCkgeworICAgIHZvbGF0aWxlIF9fc3RsX2F0b21pY190KiBfX2xvY2sgPSAmX01fbG9jazsKKyMgICAgaWYgZGVmaW5lZChfU1RMUF9TR0lfVEhSRUFEUykgJiYgZGVmaW5lZChfX0dOVUNfXykgJiYgX19taXBzID49IDMKKyAgICBhc20oInN5bmMiKTsKKyAgICAqX19sb2NrID0gMDsKKyMgICAgZWxpZiBkZWZpbmVkKF9TVExQX1NHSV9USFJFQURTKSAmJiBfX21pcHMgPj0gMyAmJiBcCisgICAgICAgICAoZGVmaW5lZCAoX0FCSU4zMikgfHwgZGVmaW5lZChfQUJJNjQpKQorICAgIF9fbG9ja19yZWxlYXNlKF9fbG9jayk7CisjICAgIGVsaWYgZGVmaW5lZCAoX1NUTFBfU1BBUkNfU09MQVJJU19USFJFQURTKQorIyAgICAgIGlmIGRlZmluZWQgKF9fV09SRDY0KSB8fCBkZWZpbmVkIChfX2FyY2g2NF9fKSB8fCBkZWZpbmVkIChfX3NwYXJjdjkpIHx8IGRlZmluZWQgKF9fc3BhcmN2OHBsdXMpCisgICAgYXNtKCJtZW1iYXIgI1N0b3JlU3RvcmUgOyBtZW1iYXIgI0xvYWRTdG9yZSIpOworIyAgICAgIGVsc2UKKyAgICBhc20oIiBzdGJhciAiKTsKKyMgICAgICBlbmRpZgorICAgICpfX2xvY2sgPSAwOworIyAgICBlbHNlCisgICAgKl9fbG9jayA9IDA7CisgICAgLy8gVGhpcyBpcyBub3Qgc3VmZmljaWVudCBvbiBtYW55IG11bHRpcHJvY2Vzc29ycywgc2luY2UKKyAgICAvLyB3cml0ZXMgdG8gcHJvdGVjdGVkIHZhcmlhYmxlcyBhbmQgdGhlIGxvY2sgbWF5IGJlIHJlb3JkZXJlZC4KKyMgICAgZW5kaWYKKyAgfQorIyAgZWxpZiBkZWZpbmVkIChfU1RMUF9QVEhSRUFEUykKKyMgICAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BUSFJFQURfU1BJTkxPQ0spCisjICAgICAgaWYgIWRlZmluZWQgKF9fT3BlbkJTRF9fKQorICBwdGhyZWFkX3NwaW5sb2NrX3QgX01fbG9jazsKKyAgaW5saW5lIHZvaWQgX01faW5pdGlhbGl6ZSgpIHsgcHRocmVhZF9zcGluX2luaXQoICZfTV9sb2NrLCAwICk7IH0KKyAgaW5saW5lIHZvaWQgX01fZGVzdHJveSgpIHsgcHRocmVhZF9zcGluX2Rlc3Ryb3koICZfTV9sb2NrICk7IH0KKworICAvLyBzb3JyeSwgYnV0IG5vIHN0YXRpYyBpbml0aWFsaXplciBmb3IgcHRocmVhZF9zcGlubG9ja190OworICAvLyB0aGlzIHdpbGwgbm90IHdvcmsgZm9yIGNvbXBpbGVycyB0aGF0IGhhcyBwcm9ibGVtcyB3aXRoIGNhbGwKKyAgLy8gY29uc3RydWN0b3Igb2Ygc3RhdGljIG9iamVjdC4uLgorCisgIC8vIF9TVExQX211dGV4X2Jhc2UoKQorICAvLyAgIHsgcHRocmVhZF9zcGluX2luaXQoICZfTV9sb2NrLCAwICk7IH0KKworICAvLyB+X1NUTFBfbXV0ZXhfYmFzZSgpCisgIC8vICAgeyBwdGhyZWFkX3NwaW5fZGVzdHJveSggJl9NX2xvY2sgKTsgfQorCisgIGlubGluZSB2b2lkIF9NX2FjcXVpcmVfbG9jaygpIHsgcHRocmVhZF9zcGluX2xvY2soICZfTV9sb2NrICk7IH0KKyAgaW5saW5lIHZvaWQgX01fcmVsZWFzZV9sb2NrKCkgeyBwdGhyZWFkX3NwaW5fdW5sb2NrKCAmX01fbG9jayApOyB9CisjICAgICAgZWxzZSAvLyBfX09wZW5CU0RfXworICBzcGlubG9ja190IF9NX2xvY2s7CisgIGlubGluZSB2b2lkIF9NX2luaXRpYWxpemUoKSB7IF9TUElOTE9DS19JTklUKCAmX01fbG9jayApOyB9CisgIGlubGluZSB2b2lkIF9NX2Rlc3Ryb3koKSB7IH0KKyAgaW5saW5lIHZvaWQgX01fYWNxdWlyZV9sb2NrKCkgeyBfU1BJTkxPQ0soICZfTV9sb2NrICk7IH0KKyAgaW5saW5lIHZvaWQgX01fcmVsZWFzZV9sb2NrKCkgeyBfU1BJTlVOTE9DSyggJl9NX2xvY2sgKTsgfQorIyAgICAgIGVuZGlmIC8vIF9fT3BlbkJTRF9fCisjICAgIGVsc2UgLy8gIV9TVExQX1VTRV9QVEhSRUFEX1NQSU5MT0NLCisgIHB0aHJlYWRfbXV0ZXhfdCBfTV9sb2NrOworICBpbmxpbmUgdm9pZCBfTV9pbml0aWFsaXplKCkKKyAgeyBwdGhyZWFkX211dGV4X2luaXQoJl9NX2xvY2ssX1NUTFBfUFRIUkVBRF9BVFRSX0RFRkFVTFQpOyB9CisgIGlubGluZSB2b2lkIF9NX2Rlc3Ryb3koKQorICB7IHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmX01fbG9jayk7IH0KKyAgaW5saW5lIHZvaWQgX01fYWNxdWlyZV9sb2NrKCkgeworIyAgICAgIGlmIGRlZmluZWQgKCBfX2hwdXggKSAmJiAhIGRlZmluZWQgKFBUSFJFQURfTVVURVhfSU5JVElBTElaRVIpCisgICAgaWYgKCFfTV9sb2NrLmZpZWxkMSkgIF9NX2luaXRpYWxpemUoKTsKKyMgICAgICBlbmRpZgorICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmX01fbG9jayk7CisgIH0KKyAgaW5saW5lIHZvaWQgX01fcmVsZWFzZV9sb2NrKCkgeyBwdGhyZWFkX211dGV4X3VubG9jaygmX01fbG9jayk7IH0KKyMgICAgZW5kaWYgLy8gIV9TVExQX1VTRV9QVEhSRUFEX1NQSU5MT0NLCisKKyMgIGVsaWYgZGVmaW5lZCAoX1NUTFBfVUlUSFJFQURTKQorICBtdXRleF90IF9NX2xvY2s7CisgIGlubGluZSB2b2lkIF9NX2luaXRpYWxpemUoKQorICB7IG11dGV4X2luaXQoJl9NX2xvY2ssIDAsIE5VTEwpOyB9CisgIGlubGluZSB2b2lkIF9NX2Rlc3Ryb3koKQorICB7IG11dGV4X2Rlc3Ryb3koJl9NX2xvY2spOyB9CisgIGlubGluZSB2b2lkIF9NX2FjcXVpcmVfbG9jaygpIHsgbXV0ZXhfbG9jaygmX01fbG9jayk7IH0KKyAgaW5saW5lIHZvaWQgX01fcmVsZWFzZV9sb2NrKCkgeyBtdXRleF91bmxvY2soJl9NX2xvY2spOyB9CisKKyMgIGVsaWYgZGVmaW5lZCAoX1NUTFBfT1MyVEhSRUFEUykKKyAgSE1UWCBfTV9sb2NrOworICBpbmxpbmUgdm9pZCBfTV9pbml0aWFsaXplKCkgeyBEb3NDcmVhdGVNdXRleFNlbShOVUxMLCAmX01fbG9jaywgMCwgZmFsc2UpOyB9CisgIGlubGluZSB2b2lkIF9NX2Rlc3Ryb3koKSB7IERvc0Nsb3NlTXV0ZXhTZW0oX01fbG9jayk7IH0KKyAgaW5saW5lIHZvaWQgX01fYWNxdWlyZV9sb2NrKCkgeworICAgIGlmICghX01fbG9jaykgX01faW5pdGlhbGl6ZSgpOworICAgIERvc1JlcXVlc3RNdXRleFNlbShfTV9sb2NrLCBTRU1fSU5ERUZJTklURV9XQUlUKTsKKyAgfQorICBpbmxpbmUgdm9pZCBfTV9yZWxlYXNlX2xvY2soKSB7IERvc1JlbGVhc2VNdXRleFNlbShfTV9sb2NrKTsgfQorIyAgZWxpZiBkZWZpbmVkIChfU1RMUF9CRVRIUkVBRFMpCisgIHNlbV9pZCBzZW07CisgIGlubGluZSB2b2lkIF9NX2luaXRpYWxpemUoKSB7CisgICAgc2VtID0gY3JlYXRlX3NlbSgxLCAiU1RMUG9ydCIpOworICAgIGFzc2VydChzZW0gPiAwKTsKKyAgfQorICBpbmxpbmUgdm9pZCBfTV9kZXN0cm95KCkgeworICAgIGludCB0ID0gZGVsZXRlX3NlbShzZW0pOworICAgIGFzc2VydCh0ID09IEJfTk9fRVJST1IpOworICB9CisgIGlubGluZSB2b2lkIF9NX2FjcXVpcmVfbG9jaygpOworICBpbmxpbmUgdm9pZCBfTV9yZWxlYXNlX2xvY2soKSB7CisgICAgc3RhdHVzX3QgdCA9IHJlbGVhc2Vfc2VtKHNlbSk7CisgICAgYXNzZXJ0KHQgPT0gQl9OT19FUlJPUik7CisgIH0KKyMgIGVsaWYgZGVmaW5lZCAoX1NUTFBfTldUSFJFQURTKQorICBMT05HIF9NX2xvY2s7CisgIGlubGluZSB2b2lkIF9NX2luaXRpYWxpemUoKQorICB7IF9NX2xvY2sgPSBPcGVuTG9jYWxTZW1hcGhvcmUoMSk7IH0KKyAgaW5saW5lIHZvaWQgX01fZGVzdHJveSgpCisgIHsgQ2xvc2VMb2NhbFNlbWFwaG9yZShfTV9sb2NrKTsgfQorICBpbmxpbmUgdm9pZCBfTV9hY3F1aXJlX2xvY2soKQorICB7IFdhaXRPbkxvY2FsU2VtYXBob3JlKF9NX2xvY2spOyB9CisgIGlubGluZSB2b2lkIF9NX3JlbGVhc2VfbG9jaygpIHsgU2lnbmFsTG9jYWxTZW1hcGhvcmUoX01fbG9jayk7IH0KKyMgIGVsc2UgICAgICAvLyp0eSAxMS8yNC8yMDAxIC0gYWRkZWQgY29uZmlndXJhdGlvbiBjaGVjaworIyAgICBlcnJvciAiVW5rbm93biB0aHJlYWQgZmFjaWxpdHkgY29uZmlndXJhdGlvbiIKKyMgIGVuZGlmCisjZWxzZSAvKiBObyB0aHJlYWRzICovCisgIGlubGluZSB2b2lkIF9NX2luaXRpYWxpemUoKSB7fQorICBpbmxpbmUgdm9pZCBfTV9kZXN0cm95KCkge30KKyAgaW5saW5lIHZvaWQgX01fYWNxdWlyZV9sb2NrKCkge30KKyAgaW5saW5lIHZvaWQgX01fcmVsZWFzZV9sb2NrKCkge30KKyNlbmRpZiAvLyBfU1RMUF9QVEhSRUFEUworfTsKKworLy8gTG9ja2luZyBjbGFzcy4gIFRoZSBjb25zdHJ1Y3RvciBpbml0aWFsaXplcyB0aGUgbG9jaywgdGhlIGRlc3RydWN0b3IgZGVzdHJveXMgaXQuCisvLyBXZWxsIC0gYmVoYXZpbmcgY2xhc3MsIGRvZXMgbm90IG5lZWQgc3RhdGljIGluaXRpYWxpemVyCisKK2NsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIF9TVExQX211dGV4IDogcHVibGljIF9TVExQX211dGV4X2Jhc2UgeworICBwdWJsaWM6CisgICAgaW5saW5lIF9TVExQX211dGV4ICgpIHsgX01faW5pdGlhbGl6ZSgpOyB9CisgICAgaW5saW5lIH5fU1RMUF9tdXRleCAoKSB7IF9NX2Rlc3Ryb3koKTsgfQorICBwcml2YXRlOgorICAgIF9TVExQX211dGV4KGNvbnN0IF9TVExQX211dGV4Jik7CisgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgX1NUTFBfbXV0ZXgmKTsKK307CisKKy8vIEEgbG9ja2luZyBjbGFzcyB0aGF0IHVzZXMgX1NUTFBfU1RBVElDX01VVEVYLiAgVGhlIGNvbnN0cnVjdG9yIHRha2VzCisvLyBhIHJlZmVyZW5jZSB0byBhbiBfU1RMUF9TVEFUSUNfTVVURVgsIGFuZCBhY3F1aXJlcyBhIGxvY2suICBUaGUgZGVzdHJ1Y3RvcgorLy8gcmVsZWFzZXMgdGhlIGxvY2suCisvLyBJdCdzIG5vdCBjbGVhciB0aGF0IHRoaXMgaXMgZXhhY3RseSB0aGUgcmlnaHQgZnVuY3Rpb25hbGl0eS4KKy8vIEl0IHdpbGwgcHJvYmFibHkgY2hhbmdlIGluIHRoZSBmdXR1cmUuCisKK3N0cnVjdCBfU1RMUF9DTEFTU19ERUNMU1BFQyBfU1RMUF9hdXRvX2xvY2sgeworICBfU1RMUF9hdXRvX2xvY2soX1NUTFBfU1RBVElDX01VVEVYJiBfX2xvY2spIDogX01fbG9jayhfX2xvY2spCisgIHsgX01fbG9jay5fTV9hY3F1aXJlX2xvY2soKTsgfQorICB+X1NUTFBfYXV0b19sb2NrKCkKKyAgeyBfTV9sb2NrLl9NX3JlbGVhc2VfbG9jaygpOyB9CisKK3ByaXZhdGU6CisgIF9TVExQX1NUQVRJQ19NVVRFWCYgX01fbG9jazsKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgX1NUTFBfYXV0b19sb2NrJik7CisgIF9TVExQX2F1dG9fbG9jayhjb25zdCBfU1RMUF9hdXRvX2xvY2smKTsKK307CisKKy8qCisgKiBDbGFzcyBfUmVmY291bnRfQmFzZSBwcm92aWRlcyBhIHR5cGUsIF9fc3RsX2F0b21pY190LCBhIGRhdGEgbWVtYmVyLAorICogX01fcmVmX2NvdW50LCBhbmQgbWVtYmVyIGZ1bmN0aW9ucyBfTV9pbmNyIGFuZCBfTV9kZWNyLCB3aGljaCBwZXJmb3JtCisgKiBhdG9taWMgcHJlaW5jcmVtZW50L3ByZWRlY3JlbWVudC4gIFRoZSBjb25zdHJ1Y3RvciBpbml0aWFsaXplcworICogX01fcmVmX2NvdW50LgorICovCitjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBfUmVmY291bnRfQmFzZSB7CisgIC8vIFRoZSBkYXRhIG1lbWJlciBfTV9yZWZfY291bnQKKyNpZiBkZWZpbmVkIChfX0RNQ19fKQorcHVibGljOgorI2VuZGlmCisgIF9TVExQX1ZPTEFUSUxFIF9fc3RsX2F0b21pY190IF9NX3JlZl9jb3VudDsKKworI2lmIGRlZmluZWQgKF9TVExQX1RIUkVBRFMpICYmIFwKKyAgICghZGVmaW5lZCAoX1NUTFBfQVRPTUlDX0lOQ1JFTUVOVCkgfHwgIWRlZmluZWQgKF9TVExQX0FUT01JQ19ERUNSRU1FTlQpIHx8IFwKKyAgICAoZGVmaW5lZCAoX1NUTFBfV0lOMzJfVkVSU0lPTikgJiYgKF9TVExQX1dJTjMyX1ZFUlNJT04gPD0gMHgwNDAwKSkpCisjICBkZWZpbmUgX1NUTFBfVVNFX01VVEVYCisgIF9TVExQX211dGV4IF9NX211dGV4OworI2VuZGlmCisKKyAgcHVibGljOgorICAvLyBDb25zdHJ1Y3RvcgorICBfUmVmY291bnRfQmFzZShfX3N0bF9hdG9taWNfdCBfX24pIDogX01fcmVmX2NvdW50KF9fbikge30KKworICAvLyBfTV9pbmNyIGFuZCBfTV9kZWNyCisjaWYgZGVmaW5lZCAoX1NUTFBfVEhSRUFEUykKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9VU0VfTVVURVgpCisgICBfX3N0bF9hdG9taWNfdCBfTV9pbmNyKCkgeyByZXR1cm4gX1NUTFBfQVRPTUlDX0lOQ1JFTUVOVCgmX01fcmVmX2NvdW50KTsgfQorICAgX19zdGxfYXRvbWljX3QgX01fZGVjcigpIHsgcmV0dXJuIF9TVExQX0FUT01JQ19ERUNSRU1FTlQoJl9NX3JlZl9jb3VudCk7IH0KKyMgIGVsc2UKKyMgICAgdW5kZWYgX1NUTFBfVVNFX01VVEVYCisgIF9fc3RsX2F0b21pY190IF9NX2luY3IoKSB7CisgICAgX1NUTFBfYXV0b19sb2NrIGwoX01fbXV0ZXgpOworICAgIHJldHVybiArK19NX3JlZl9jb3VudDsKKyAgfQorICBfX3N0bF9hdG9taWNfdCBfTV9kZWNyKCkgeworICAgIF9TVExQX2F1dG9fbG9jayBsKF9NX211dGV4KTsKKyAgICByZXR1cm4gLS1fTV9yZWZfY291bnQ7CisgIH0KKyMgIGVuZGlmCisjZWxzZSAgLyogTm8gdGhyZWFkcyAqLworICBfX3N0bF9hdG9taWNfdCBfTV9pbmNyKCkgeyByZXR1cm4gKytfTV9yZWZfY291bnQ7IH0KKyAgX19zdGxfYXRvbWljX3QgX01fZGVjcigpIHsgcmV0dXJuIC0tX01fcmVmX2NvdW50OyB9CisjZW5kaWYKK307CisKKy8qIEF0b21pYyBzd2FwIG9uIF9fc3RsX2F0b21pY190CisgKiBUaGlzIGlzIGd1YXJhbnRlZWQgdG8gYmVoYXZlIGFzIHRob3VnaCBpdCB3ZXJlIGF0b21pYyBvbmx5IGlmIGFsbAorICogcG9zc2libHkgY29uY3VycmVudCB1cGRhdGVzIHVzZSBfQXRvbWljX3N3YXAuCisgKiBJbiBzb21lIGNhc2VzIHRoZSBvcGVyYXRpb24gaXMgZW11bGF0ZWQgd2l0aCBhIGxvY2suCisgKiBJZGVtIGZvciBfQXRvbWljX3N3YXBfcHRyCisgKi8KKy8qIEhlbHBlciBzdHJ1Y3QgdG8gaGFuZGxlIGZvbGxvd2luZyBjYXNlczoKKyAqIC0gb24gcGxhdGZvcm1zIHdoZXJlIHNpemVvZihfX3N0bF9hdG9taWNfdCkgPT0gc2l6ZW9mKHZvaWQqKSBhdG9taWMKKyAqICAgZXhjaGFuZ2UgY2FuIGJlIGRvbmUgb24gcG9pbnRlcnMKKyAqIC0gb24gcGxhdGZvcm0gd2l0aG91dCBhdG9taWMgb3BlcmF0aW9uIHN3YXAgaXMgZG9uZSBpbiBhIGNyaXRpY2FsIHNlY3Rpb24sCisgKiAgIHBvcnRhYmxlIGJ1dCBpbmVmZmljaWVudC4KKyAqLwordGVtcGxhdGUgPGludCBfX3VzZV9wdHJfYXRvbWljX3N3YXA+CitjbGFzcyBfQXRvbWljX3N3YXBfc3RydWN0IHsKK3B1YmxpYzoKKyNpZiBkZWZpbmVkIChfU1RMUF9USFJFQURTKSAmJiBcCisgICAgIWRlZmluZWQgKF9TVExQX0FUT01JQ19FWENIQU5HRSkgJiYgXAorICAgIChkZWZpbmVkIChfU1RMUF9QVEhSRUFEUykgfHwgZGVmaW5lZCAoX1NUTFBfVUlUSFJFQURTKSB8fCBkZWZpbmVkIChfU1RMUF9PUzJUSFJFQURTKSB8fCBcCisgICAgIGRlZmluZWQgKF9TVExQX1VTRV9QVEhSRUFEX1NQSU5MT0NLKSB8fCBkZWZpbmVkIChfU1RMUF9OV1RIUkVBRFMpKQorIyAgZGVmaW5lIF9TVExQX1VTRV9BVE9NSUNfU1dBUF9NVVRFWAorICBzdGF0aWMgX1NUTFBfU1RBVElDX01VVEVYIF9TX3N3YXBfbG9jazsKKyNlbmRpZgorCisgIHN0YXRpYyBfX3N0bF9hdG9taWNfdCBfU19zd2FwKF9TVExQX1ZPTEFUSUxFIF9fc3RsX2F0b21pY190KiBfX3AsIF9fc3RsX2F0b21pY190IF9fcSkgeworI2lmIGRlZmluZWQgKF9TVExQX1RIUkVBRFMpCisjICBpZiBkZWZpbmVkIChfU1RMUF9BVE9NSUNfRVhDSEFOR0UpCisgIHJldHVybiBfU1RMUF9BVE9NSUNfRVhDSEFOR0UoX19wLCBfX3EpOworIyAgZWxpZiBkZWZpbmVkIChfU1RMUF9VU0VfQVRPTUlDX1NXQVBfTVVURVgpCisgIF9TX3N3YXBfbG9jay5fTV9hY3F1aXJlX2xvY2soKTsKKyAgX19zdGxfYXRvbWljX3QgX19yZXN1bHQgPSAqX19wOworICAqX19wID0gX19xOworICBfU19zd2FwX2xvY2suX01fcmVsZWFzZV9sb2NrKCk7CisgIHJldHVybiBfX3Jlc3VsdDsKKyMgIGVsc2UKKyMgICAgZXJyb3IgTWlzc2luZyBhdG9taWMgc3dhcCBpbXBsZW1lbnRhdGlvbgorIyAgZW5kaWYKKyNlbHNlCisgIC8qIG5vIHRocmVhZHMgKi8KKyAgX19zdGxfYXRvbWljX3QgX19yZXN1bHQgPSAqX19wOworICAqX19wID0gX19xOworICByZXR1cm4gX19yZXN1bHQ7CisjZW5kaWYgLy8gX1NUTFBfVEhSRUFEUworICB9CisKKyAgc3RhdGljIHZvaWQqIF9TX3N3YXBfcHRyKHZvaWQqIF9TVExQX1ZPTEFUSUxFKiBfX3AsIHZvaWQqIF9fcSkgeworI2lmIGRlZmluZWQgKF9TVExQX1RIUkVBRFMpCisjICBpZiBkZWZpbmVkIChfU1RMUF9BVE9NSUNfRVhDSEFOR0VfUFRSKQorICByZXR1cm4gX1NUTFBfQVRPTUlDX0VYQ0hBTkdFX1BUUihfX3AsIF9fcSk7CisjICBlbGlmIGRlZmluZWQgKF9TVExQX0FUT01JQ19FWENIQU5HRSkKKyAgX1NUTFBfU1RBVElDX0FTU0VSVChzaXplb2YoX19zdGxfYXRvbWljX3QpID09IHNpemVvZih2b2lkKikpCisgIHJldHVybiBfX1JFSU5URVJQUkVUX0NBU1Qodm9pZCosIF9TVExQX0FUT01JQ19FWENIQU5HRShfX1JFSU5URVJQUkVUX0NBU1Qodm9sYXRpbGUgX19zdGxfYXRvbWljX3QqLCBfX3ApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19SRUlOVEVSUFJFVF9DQVNUKF9fc3RsX2F0b21pY190LCBfX3EpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisjICBlbGlmIGRlZmluZWQgKF9TVExQX1VTRV9BVE9NSUNfU1dBUF9NVVRFWCkKKyAgX1Nfc3dhcF9sb2NrLl9NX2FjcXVpcmVfbG9jaygpOworICB2b2lkICpfX3Jlc3VsdCA9ICpfX3A7CisgICpfX3AgPSBfX3E7CisgIF9TX3N3YXBfbG9jay5fTV9yZWxlYXNlX2xvY2soKTsKKyAgcmV0dXJuIF9fcmVzdWx0OworIyAgZWxzZQorIyAgICBlcnJvciBNaXNzaW5nIHBvaW50ZXIgYXRvbWljIHN3YXAgaW1wbGVtZW50YXRpb24KKyMgIGVuZGlmCisjZWxzZQorICAvKiBubyB0aHJlYWQgKi8KKyAgdm9pZCAqX19yZXN1bHQgPSAqX19wOworICAqX19wID0gX19xOworICByZXR1cm4gX19yZXN1bHQ7CisjZW5kaWYKKyAgfQorfTsKKworX1NUTFBfVEVNUExBVEVfTlVMTAorY2xhc3MgX0F0b21pY19zd2FwX3N0cnVjdDwwPiB7CitwdWJsaWM6CisjaWYgZGVmaW5lZCAoX1NUTFBfVEhSRUFEUykgJiYgXAorICAgICghZGVmaW5lZCAoX1NUTFBfQVRPTUlDX0VYQ0hBTkdFKSB8fCAhZGVmaW5lZCAoX1NUTFBfQVRPTUlDX0VYQ0hBTkdFX1BUUikpICYmIFwKKyAgICAoZGVmaW5lZCAoX1NUTFBfUFRIUkVBRFMpIHx8IGRlZmluZWQgKF9TVExQX1VJVEhSRUFEUykgfHwgZGVmaW5lZCAoX1NUTFBfT1MyVEhSRUFEUykgfHwgXAorICAgICBkZWZpbmVkIChfU1RMUF9VU0VfUFRIUkVBRF9TUElOTE9DSykgfHwgZGVmaW5lZCAoX1NUTFBfTldUSFJFQURTKSkKKyMgIGRlZmluZSBfU1RMUF9VU0VfQVRPTUlDX1NXQVBfTVVURVgKKyAgc3RhdGljIF9TVExQX1NUQVRJQ19NVVRFWCBfU19zd2FwX2xvY2s7CisjZW5kaWYKKworICBzdGF0aWMgX19zdGxfYXRvbWljX3QgX1Nfc3dhcChfU1RMUF9WT0xBVElMRSBfX3N0bF9hdG9taWNfdCogX19wLCBfX3N0bF9hdG9taWNfdCBfX3EpIHsKKyNpZiBkZWZpbmVkIChfU1RMUF9USFJFQURTKQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfQVRPTUlDX0VYQ0hBTkdFKQorICByZXR1cm4gX1NUTFBfQVRPTUlDX0VYQ0hBTkdFKF9fcCwgX19xKTsKKyMgIGVsaWYgZGVmaW5lZCAoX1NUTFBfVVNFX0FUT01JQ19TV0FQX01VVEVYKQorICAvKiBUaGlzIHNob3VsZCBiZSBwb3J0YWJsZSwgYnV0IHBlcmZvcm1hbmNlIGlzIGV4cGVjdGVkCisgICAqIHRvIGJlIHF1aXRlIGF3ZnVsLiAgVGhpcyByZWFsbHkgbmVlZHMgcGxhdGZvcm0gc3BlY2lmaWMKKyAgICogY29kZS4KKyAgICovCisgIF9TX3N3YXBfbG9jay5fTV9hY3F1aXJlX2xvY2soKTsKKyAgX19zdGxfYXRvbWljX3QgX19yZXN1bHQgPSAqX19wOworICAqX19wID0gX19xOworICBfU19zd2FwX2xvY2suX01fcmVsZWFzZV9sb2NrKCk7CisgIHJldHVybiBfX3Jlc3VsdDsKKyMgIGVsc2UKKyMgICAgZXJyb3IgTWlzc2luZyBhdG9taWMgc3dhcCBpbXBsZW1lbnRhdGlvbgorIyAgZW5kaWYKKyNlbHNlCisgIC8qIG5vIHRocmVhZHMgKi8KKyAgX19zdGxfYXRvbWljX3QgX19yZXN1bHQgPSAqX19wOworICAqX19wID0gX19xOworICByZXR1cm4gX19yZXN1bHQ7CisjZW5kaWYgLy8gX1NUTFBfVEhSRUFEUworICB9CisKKyAgc3RhdGljIHZvaWQqIF9TX3N3YXBfcHRyKHZvaWQqIF9TVExQX1ZPTEFUSUxFKiBfX3AsIHZvaWQqIF9fcSkgeworI2lmIGRlZmluZWQgKF9TVExQX1RIUkVBRFMpCisjICBpZiBkZWZpbmVkIChfU1RMUF9BVE9NSUNfRVhDSEFOR0VfUFRSKQorICByZXR1cm4gX1NUTFBfQVRPTUlDX0VYQ0hBTkdFX1BUUihfX3AsIF9fcSk7CisjICBlbGlmIGRlZmluZWQgKF9TVExQX0FUT01JQ19FWENIQU5HRSkKKyAgX1NUTFBfU1RBVElDX0FTU0VSVChzaXplb2YoX19zdGxfYXRvbWljX3QpID09IHNpemVvZih2b2lkKikpCisgIHJldHVybiBfX1JFSU5URVJQUkVUX0NBU1Qodm9pZCosIF9TVExQX0FUT01JQ19FWENIQU5HRShfX1JFSU5URVJQUkVUX0NBU1Qodm9sYXRpbGUgX19zdGxfYXRvbWljX3QqLCBfX3ApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19SRUlOVEVSUFJFVF9DQVNUKF9fc3RsX2F0b21pY190LCBfX3EpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisjICBlbGlmIGRlZmluZWQgKF9TVExQX1VTRV9BVE9NSUNfU1dBUF9NVVRFWCkKKyAgX1Nfc3dhcF9sb2NrLl9NX2FjcXVpcmVfbG9jaygpOworICB2b2lkICpfX3Jlc3VsdCA9ICpfX3A7CisgICpfX3AgPSBfX3E7CisgIF9TX3N3YXBfbG9jay5fTV9yZWxlYXNlX2xvY2soKTsKKyAgcmV0dXJuIF9fcmVzdWx0OworIyAgZWxzZQorIyAgICBlcnJvciBNaXNzaW5nIHBvaW50ZXIgYXRvbWljIHN3YXAgaW1wbGVtZW50YXRpb24KKyMgIGVuZGlmCisjZWxzZQorICAvKiBubyB0aHJlYWQgKi8KKyAgdm9pZCAqX19yZXN1bHQgPSAqX19wOworICAqX19wID0gX19xOworICByZXR1cm4gX19yZXN1bHQ7CisjZW5kaWYKKyAgfQorfTsKKworI2lmIGRlZmluZWQgKF9TVExQX01TVkMpICYmIChfU1RMUF9NU1ZDID09IDEzMDApCisjICBwcmFnbWEgd2FybmluZyAocHVzaCkKKyMgIHByYWdtYSB3YXJuaW5nIChkaXNhYmxlIDogNDE4OSkgLy9fX3VzZV9wdHJfYXRvbWljX3N3YXAgaW5pdGlhbGl6ZWQgYnV0IG5vdCB1c2VkCisjZW5kaWYKKworaW5saW5lIF9fc3RsX2F0b21pY190IF9TVExQX0NBTEwgX0F0b21pY19zd2FwKF9TVExQX1ZPTEFUSUxFIF9fc3RsX2F0b21pY190ICogX19wLCBfX3N0bF9hdG9taWNfdCBfX3EpIHsKKyAgY29uc3QgaW50IF9fdXNlX3B0cl9hdG9taWNfc3dhcCA9IHNpemVvZihfX3N0bF9hdG9taWNfdCkgPT0gc2l6ZW9mKHZvaWQqKTsKKyAgcmV0dXJuIF9BdG9taWNfc3dhcF9zdHJ1Y3Q8X191c2VfcHRyX2F0b21pY19zd2FwPjo6X1Nfc3dhcChfX3AsIF9fcSk7Cit9CisKK2lubGluZSB2b2lkKiBfU1RMUF9DQUxMIF9BdG9taWNfc3dhcF9wdHIodm9pZCogX1NUTFBfVk9MQVRJTEUqIF9fcCwgdm9pZCogX19xKSB7CisgIGNvbnN0IGludCBfX3VzZV9wdHJfYXRvbWljX3N3YXAgPSBzaXplb2YoX19zdGxfYXRvbWljX3QpID09IHNpemVvZih2b2lkKik7CisgIHJldHVybiBfQXRvbWljX3N3YXBfc3RydWN0PF9fdXNlX3B0cl9hdG9taWNfc3dhcD46Ol9TX3N3YXBfcHRyKF9fcCwgX19xKTsKK30KKworI2lmIGRlZmluZWQgKF9TVExQX01TVkMpICYmIChfU1RMUF9NU1ZDID09IDEzMDApCisjICBwcmFnbWEgd2FybmluZyAocG9wKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9CRVRIUkVBRFMpCit0ZW1wbGF0ZSA8aW50IF9faW5zdD4KK3N0cnVjdCBfU1RMUF9iZW9zX3N0YXRpY19sb2NrX2RhdGEgeworICBzdGF0aWMgYm9vbCBpc19pbml0OworICBzdHJ1Y3QgbXV0ZXhfdCA6IHB1YmxpYyBfU1RMUF9tdXRleCB7CisgICAgbXV0ZXhfdCgpCisgICAgeyBfU1RMUF9iZW9zX3N0YXRpY19sb2NrX2RhdGE8MD46OmlzX2luaXQgPSB0cnVlOyB9CisgICAgfm11dGV4X3QoKQorICAgIHsgX1NUTFBfYmVvc19zdGF0aWNfbG9ja19kYXRhPDA+Ojppc19pbml0ID0gZmFsc2U7IH0KKyAgfTsKKyAgc3RhdGljIG11dGV4X3QgbXV0OworfTsKKwordGVtcGxhdGUgPGludCBfX2luc3Q+Citib29sIF9TVExQX2Jlb3Nfc3RhdGljX2xvY2tfZGF0YTxfX2luc3Q+Ojppc19pbml0ID0gZmFsc2U7Cit0ZW1wbGF0ZSA8aW50IF9faW5zdD4KK3R5cGVuYW1lIF9TVExQX2Jlb3Nfc3RhdGljX2xvY2tfZGF0YTxfX2luc3Q+OjptdXRleF90IF9TVExQX2Jlb3Nfc3RhdGljX2xvY2tfZGF0YTxfX2luc3Q+OjptdXQ7CisKK2lubGluZSB2b2lkIF9TVExQX211dGV4X2Jhc2U6Ol9NX2FjcXVpcmVfbG9jaygpIHsKKyAgaWYgKHNlbSA9PSAwKSB7CisgICAgLy8gd2UgbmVlZCB0byBpbml0aWFsaXNlIG9uIGRlbWFuZCBoZXJlCisgICAgLy8gdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnMgdXNlIG91ciBnbG9iYWwKKyAgICAvLyBtdXRleCBpZiBpdCdzIGF2YWlsYWJsZToKKyAgICBpZiAoX1NUTFBfYmVvc19zdGF0aWNfbG9ja19kYXRhPDA+Ojppc19pbml0KSB7CisgICAgICBfU1RMUF9hdXRvX2xvY2sgYWwoX1NUTFBfYmVvc19zdGF0aWNfbG9ja19kYXRhPDA+OjptdXQpOworICAgICAgaWYgKHNlbSA9PSAwKSBfTV9pbml0aWFsaXplKCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgLy8gbm8gbG9jayBhdmFpbGFibGUsIHdlIG11c3Qgc3RpbGwgYmUKKyAgICAgIC8vIGluIHN0YXJ0dXAgY29kZSwgVEhFUkUgTVVTVCBCRSBPTkUgVEhSRUFECisgICAgICAvLyBPTkxZIGFjdGl2ZSBhdCB0aGlzIHBvaW50LgorICAgICAgX01faW5pdGlhbGl6ZSgpOworICAgIH0KKyAgfQorICBzdGF0dXNfdCB0OworICB0ID0gYWNxdWlyZV9zZW0oc2VtKTsKKyAgYXNzZXJ0KHQgPT0gQl9OT19FUlJPUik7Cit9CisjZW5kaWYKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjaWYgIWRlZmluZWQgKF9TVExQX0xJTktfVElNRV9JTlNUQU5USUFUSU9OKQorIyAgaW5jbHVkZSA8c3RsL190aHJlYWRzLmM+CisjZW5kaWYKKworI2VuZGlmIC8qIF9TVExQX0lOVEVSTkFMX1RIUkVBRFNfSCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RsL190aW1lX2ZhY2V0cy5jIGIvc3RsL190aW1lX2ZhY2V0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzZjg3ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvX3RpbWVfZmFjZXRzLmMKQEAgLTAsMCArMSw1MDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisjaWZuZGVmIF9TVExQX1RJTUVfRkFDRVRTX0MKKyNkZWZpbmUgX1NUTFBfVElNRV9GQUNFVFNfQworCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX1RJTUVfRkFDRVRTX0gKKyMgIGluY2x1ZGUgPHN0bC9fdGltZV9mYWNldHMuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX05VTV9QVVRfSAorIyAgaW5jbHVkZSA8c3RsL19udW1fcHV0Lmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9OVU1fR0VUX0gKKyMgIGluY2x1ZGUgPHN0bC9fbnVtX2dldC5oPgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERlY2xhcmF0aW9ucyBvZiBzdGF0aWMgdGVtcGxhdGUgbWVtYmVycy4KKyNpZiAoX1NUTFBfU1RBVElDX1RFTVBMQVRFX0RBVEEgPiAwKQorCisjICBpZiAhZGVmaW5lZCAoX19CT1JMQU5EQ19fKQordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0lucHV0SXRlcmF0b3I+Citsb2NhbGU6OmlkIHRpbWVfZ2V0PF9DaGFyVCwgX0lucHV0SXRlcmF0b3I+OjppZDsKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX091dHB1dEl0ZXJhdG9yPgorbG9jYWxlOjppZCB0aW1lX3B1dDxfQ2hhclQsIF9PdXRwdXRJdGVyYXRvcj46OmlkOworIyAgZW5kaWYKKworIyAgaWYgKGRlZmluZWQgKF9fQ1lHV0lOX18pIHx8IGRlZmluZWQgKF9fTUlOR1czMl9fKSkgJiYgXAorICAgICAgIGRlZmluZWQgKF9TVExQX1VTRV9EWU5BTUlDX0xJQikgJiYgIWRlZmluZWQgKF9fQlVJTERJTkdfU1RMUE9SVCkKKy8qCisgKiBVbmRlciBjeWd3aW4sIHdoZW4gU1RMcG9ydCBpcyB1c2VkIGFzIGEgc2hhcmVkIGxpYnJhcnksIHRoZSBpZCBuZWVkcworICogdG8gYmUgc3BlY2lmaWVkIGFzIGltcG9ydGVkIG90aGVyd2lzZSB0aGV5IHdpbGwgYmUgZHVwbGljYXRlZCBpbiB0aGUKKyAqIGNhbGxpbmcgZXhlY3V0YWJsZS4KKyAqLwordGVtcGxhdGUgPD4KK19TVExQX0RFQ0xTUEVDIGxvY2FsZTo6aWQgdGltZV9nZXQ8Y2hhciwgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+ID46OmlkOworLyoKK3RlbXBsYXRlIDw+CitfU1RMUF9ERUNMU1BFQyBsb2NhbGU6OmlkIHRpbWVfZ2V0PGNoYXIsIGNvbnN0IGNoYXIqPjo6aWQ7CisqLworCit0ZW1wbGF0ZSA8PgorX1NUTFBfREVDTFNQRUMgbG9jYWxlOjppZCB0aW1lX3B1dDxjaGFyLCBvc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4gPjo6aWQ7CisvKgordGVtcGxhdGUgPD4KK19TVExQX0RFQ0xTUEVDIGxvY2FsZTo6aWQgdGltZV9wdXQ8Y2hhciwgY2hhcio+OjppZDsKKyovCisKKyMgICAgaWZuZGVmIF9TVExQX05PX1dDSEFSX1QKK3RlbXBsYXRlIDw+CitfU1RMUF9ERUNMU1BFQyBsb2NhbGU6OmlkIHRpbWVfZ2V0PHdjaGFyX3QsIGlzdHJlYW1idWZfaXRlcmF0b3I8d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPiA+OjppZDsKKy8qCit0ZW1wbGF0ZSA8PgorX1NUTFBfREVDTFNQRUMgbG9jYWxlOjppZCB0aW1lX2dldDx3Y2hhcl90LCBjb25zdCB3Y2hhcl90Kj46OmlkOworKi8KKwordGVtcGxhdGUgPD4KK19TVExQX0RFQ0xTUEVDIGxvY2FsZTo6aWQgdGltZV9wdXQ8d2NoYXJfdCwgb3N0cmVhbWJ1Zl9pdGVyYXRvcjx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiA+ID46OmlkOworLyoKK3RlbXBsYXRlIDw+CitfU1RMUF9ERUNMU1BFQyBsb2NhbGU6OmlkIHRpbWVfcHV0PHdjaGFyX3QsIHdjaGFyX3QqPjo6aWQ7CisqLworIyAgICBlbmRpZiAvKiBfU1RMUF9OT19XQ0hBUl9UICovCisjICBlbmRpZiAvKiBfX0NVR1dJTl9fICYmIF9TVExQX1VTRV9EWU5BTUlDX0xJQiAqLworCisjZWxzZSAvKiAoIF9TVExQX1NUQVRJQ19URU1QTEFURV9EQVRBID4gMCApICovCisKKy8vdHlwZWRlZiB0aW1lX2dldDxjaGFyLCBjb25zdCBjaGFyKj4gdGltZV9nZXRfY2hhcjsKK3R5cGVkZWYgdGltZV9nZXQ8Y2hhciwgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+ID4gdGltZV9nZXRfY2hhcl8yOworLy90eXBlZGVmIHRpbWVfcHV0PGNoYXIsIGNoYXIqPiB0aW1lX3B1dF9jaGFyOwordHlwZWRlZiB0aW1lX3B1dDxjaGFyLCBvc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4gPiB0aW1lX3B1dF9jaGFyXzI7CisKKy8vX19ERUNMQVJFX0lOU1RBTkNFKGxvY2FsZTo6aWQsIHRpbWVfZ2V0X2NoYXI6OmlkLCApOworX19ERUNMQVJFX0lOU1RBTkNFKGxvY2FsZTo6aWQsIHRpbWVfZ2V0X2NoYXJfMjo6aWQsICk7CisvL19fREVDTEFSRV9JTlNUQU5DRShsb2NhbGU6OmlkLCB0aW1lX3B1dF9jaGFyOjppZCwgKTsKK19fREVDTEFSRV9JTlNUQU5DRShsb2NhbGU6OmlkLCB0aW1lX3B1dF9jaGFyXzI6OmlkLCApOworCisjICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkKKworLy90eXBlZGVmIHRpbWVfZ2V0PHdjaGFyX3QsIGNvbnN0IHdjaGFyX3QqPiB0aW1lX2dldF93Y2hhcl90OwordHlwZWRlZiB0aW1lX2dldDx3Y2hhcl90LCBpc3RyZWFtYnVmX2l0ZXJhdG9yPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4gPiB0aW1lX2dldF93Y2hhcl90XzI7CisvL3R5cGVkZWYgdGltZV9wdXQ8d2NoYXJfdCwgd2NoYXJfdCo+IHRpbWVfcHV0X3djaGFyX3Q7Cit0eXBlZGVmIHRpbWVfcHV0PHdjaGFyX3QsIG9zdHJlYW1idWZfaXRlcmF0b3I8d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPiA+IHRpbWVfcHV0X3djaGFyX3RfMjsKKworLy9fX0RFQ0xBUkVfSU5TVEFOQ0UobG9jYWxlOjppZCwgdGltZV9nZXRfd2NoYXJfdDo6aWQsICk7CitfX0RFQ0xBUkVfSU5TVEFOQ0UobG9jYWxlOjppZCwgdGltZV9nZXRfd2NoYXJfdF8yOjppZCwgKTsKKy8vX19ERUNMQVJFX0lOU1RBTkNFKGxvY2FsZTo6aWQsIHRpbWVfcHV0X3djaGFyX3Q6OmlkLCApOworX19ERUNMQVJFX0lOU1RBTkNFKGxvY2FsZTo6aWQsIHRpbWVfcHV0X3djaGFyX3RfMjo6aWQsICk7CisKKyMgIGVuZGlmCisKKyNlbmRpZiAvKiAoIF9TVExQX1NUQVRJQ19URU1QTEFURV9EQVRBID4gMCApICovCisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9Jbkl0LCBjbGFzcyBfQ2hhclQ+Citjb25zdCBzdHJpbmcqIF9TVExQX0NBTEwKK19fbWF0Y2goX0luSXQmIF9fZmlyc3QsIF9Jbkl0JiBfX2xhc3QsIGNvbnN0IHN0cmluZyAqX19uYW1lLCBjb25zdCBzdHJpbmcgKl9fbmFtZV9lbmQsCisgICAgICAgIGNvbnN0IGN0eXBlPF9DaGFyVD4mIF9fY3QpIHsKKyAgdHlwZWRlZiBwdHJkaWZmX3QgZGlmZmVyZW5jZV90eXBlOworICBkaWZmZXJlbmNlX3R5cGUgX19uID0gX19uYW1lX2VuZCAtIF9fbmFtZTsKKyAgZGlmZmVyZW5jZV90eXBlIF9faTsKKyAgc2l6ZV90IF9fcG9zID0gMDsKKyAgZGlmZmVyZW5jZV90eXBlIF9fY2hlY2tfY291bnQgPSBfX247CisgIGJvb2wgX19kb19jaGVja1tfTUFYTkFNRVNdOworICBjb25zdCBzdHJpbmcqIF9fbWF0Y2hpbmdfbmFtZVtfTUFYX05BTUVfTEVOR1RIXTsKKworICBmb3IgKF9faSA9IDA7IF9faSA8IF9NQVhOQU1FUzsgKytfX2kpCisgICAgX19kb19jaGVja1tfX2ldID0gdHJ1ZTsKKworICBmb3IgKF9faSA9IDA7IF9faSA8IF9NQVhfTkFNRV9MRU5HVEg7ICsrX19pKQorICAgIF9fbWF0Y2hpbmdfbmFtZVtfX2ldID0gX19uYW1lX2VuZDsKKworICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QpIHsKKyAgICBmb3IgKF9faSA9IDA7IF9faSA8IF9fbjsgKytfX2kpIHsKKyAgICAgIGlmIChfX2RvX2NoZWNrW19faV0pIHsKKyAgICAgICAgaWYgKCpfX2ZpcnN0ID09IF9fY3Qud2lkZW4oX19uYW1lW19faV1bX19wb3NdKSkgeworICAgICAgICAgIGlmIChfX3BvcyA9PSAoX19uYW1lW19faV0uc2l6ZSgpIC0gMSkpIHsKKyAgICAgICAgICAgIF9fZG9fY2hlY2tbX19pXSA9IDA7CisgICAgICAgICAgICBfX21hdGNoaW5nX25hbWVbX19wb3MgKyAxXSA9IF9fbmFtZSArIF9faTsKKyAgICAgICAgICAgIC0tX19jaGVja19jb3VudDsKKyAgICAgICAgICAgIGlmIChfX2NoZWNrX2NvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgKytfX2ZpcnN0OworICAgICAgICAgICAgICByZXR1cm4gX19uYW1lICsgX19pOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICBfX2RvX2NoZWNrW19faV0gPSAwOworICAgICAgICAgIC0tX19jaGVja19jb3VudDsKKyAgICAgICAgICBpZiAoX19jaGVja19jb3VudCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIF9fbWF0Y2hpbmdfbmFtZVtfX3Bvc107CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICArK19fZmlyc3Q7ICsrX19wb3M7CisgIH0KKworICByZXR1cm4gX19tYXRjaGluZ19uYW1lW19fcG9zXTsKK30KKworLy8gX19nZXRfZm9ybWF0dGVkX3RpbWUgcmVhZHMgaW5wdXQgdGhhdCBpcyBhc3N1bWVkIHRvIGJlIGZvcm1hdHRlZAorLy8gYWNjb3JkaW5nIHRvIHRoZSBydWxlcyBmb3IgdGhlIEMgc3RyZnRpbWUgZnVuY3Rpb24gKEMgc3RhbmRhcmQsCisvLyA3LjEyLjMuNSkuICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBkb19nZXRfdGltZQorLy8gYW5kIGRvX2dldF9kYXRlIHZpcnR1YWwgZnVuY3Rpb25zLCB3aGljaCBkZXBlbmQgb24gdGhlIGxvY2FsZQorLy8gc3BlY2lmaWNhdGlvbnMgZm9yIHRoZSB0aW1lIGFuZCBkYXkgZm9ybWF0cyByZXNwZWN0aXZlbHkuCisvLyBOb3RlIHRoZSBjYXRjaGFsbCBkZWZhdWx0IGNhc2UsIGludGVuZGVkIG1haW5seSBmb3IgdGhlICclWicKKy8vIGZvcm1hdCBkZXNpZ25hdG9yLCB3aGljaCBkb2VzIG5vdCBtYWtlIHNlbnNlIGhlcmUgc2luY2UgdGhlCisvLyByZXByZXNlbnRhdGlvbiBvZiB0aW1lem9uZXMgaXMgbm90IHBhcnQgb2YgdGhlIGxvY2FsZS4KKy8vCisvLyBUaGUgY2FzZSBicmFuY2hlcyBhcmUgaW1wbGVtZW50ZWQgZWl0aGVyIGJ5IGRvaW5nIGEgbWF0Y2ggdXNpbmcKKy8vIHRoZSBhcHBvcHJpYXRlIG5hbWUgdGFibGUgb3IgYnkgZG9pbmcgYSBfX2dldF9pbnRlZ2VyX25vZ3JvdXAuCisvLworLy8gJ3knIGZvcm1hdCBpcyBhc3N1bWVkIHRvIG1lYW4gdGhhdCB0aGUgaW5wdXQgcmVwcmVzZW50cyB5ZWFycworLy8gc2luY2UgMTkwMC4gIFRoYXQgaXMsIDIwMDIgc2hvdWxkIGJlIHJlcHJlc2VudGVkIGFzIDEwMi4gIFRoZXJlCisvLyBpcyBubyBjZW50dXJ5LWd1ZXNzaW5nLgorLy8KKy8vIFRoZSBtYXRjaCBpcyBzdWNjZXNzZnVsIGlmIGFuZCBvbmx5IGlmIHRoZSBzZWNvbmQgY29tcG9uZW50IG9mIHRoZQorLy8gcmV0dXJuIHZhbHVlIGlzIGZvcm1hdF9lbmQuCisKKy8vIE5vdGUgdGhhdCB0aGUgYW50ZXBlbnVsdGltYXRlIHBhcmFtZXRlciBpcyBiZWluZyB1c2VkIG9ubHkgdG8gZGV0ZXJtaW5lCisvLyB0aGUgY29ycmVjdCBvdmVybG9hZGluZyBmb3IgdGhlIGNhbGxzIHRvIF9fZ2V0X2ludGVnZXJfbm9ncm91cC4KK3RlbXBsYXRlIDxjbGFzcyBfSW5JdDEsIGNsYXNzIF9DaD4KK3N0cmluZzo6Y29uc3RfaXRlcmF0b3IgX1NUTFBfQ0FMTAorX19nZXRfZm9ybWF0dGVkX3RpbWUgX1NUTFBfV0VBSyAoX0luSXQxIF9fZmlyc3QsICBfSW5JdDEgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nOjpjb25zdF9pdGVyYXRvciBfX2Zvcm1hdCwgc3RyaW5nOjpjb25zdF9pdGVyYXRvciBfX2Zvcm1hdF9lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ2gqLCBjb25zdCBfVGltZV9JbmZvJiBfX3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW9zX2Jhc2UmIF9fcywgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCB0bSogX190KSB7CisgIGNvbnN0IGN0eXBlPF9DaD4mIF9fY3QgPSAqX19TVEFUSUNfQ0FTVChjb25zdCBjdHlwZTxfQ2g+KiwgX19zLl9NX2N0eXBlX2ZhY2V0KCkpOworICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QgJiYgX19mb3JtYXQgIT0gX19mb3JtYXRfZW5kKSB7CisgICAgaWYgKCpfX2Zvcm1hdCA9PSAnJScpIHsKKyAgICAgICsrX19mb3JtYXQ7CisgICAgICBjaGFyIF9fYyA9ICpfX2Zvcm1hdDsKKyAgICAgIGlmIChfX2MgPT0gJyMnKSB7IC8vTVMgZXh0ZW5zaW9uCisgICAgICAgICsrX19mb3JtYXQ7CisgICAgICAgIF9fYyA9ICpfX2Zvcm1hdDsKKyAgICAgIH0KKworICAgICAgc3dpdGNoIChfX2MpIHsKKyAgICAgICAgY2FzZSAnYSc6IHsKKyAgICAgICAgICBjb25zdCBzdHJpbmcqIF9fcHIgPSBfX21hdGNoKF9fZmlyc3QsIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdGFibGUuX01fZGF5bmFtZSArIDAsIF9fdGFibGUuX01fZGF5bmFtZSArIDcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2N0KTsKKyAgICAgICAgICBpZiAoX19wciA9PSBfX3RhYmxlLl9NX2RheW5hbWUgKyA3KQorICAgICAgICAgICAgcmV0dXJuIF9fZm9ybWF0OworICAgICAgICAgIF9fdC0+dG1fd2RheSA9IF9fU1RBVElDX0NBU1QoaW50LCBfX3ByIC0gX190YWJsZS5fTV9kYXluYW1lKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgJ0EnOiB7CisgICAgICAgICAgY29uc3Qgc3RyaW5nKiBfX3ByID0gX19tYXRjaChfX2ZpcnN0LCBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3RhYmxlLl9NX2RheW5hbWUgKyA3LCBfX3RhYmxlLl9NX2RheW5hbWUgKyAxNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fY3QpOworICAgICAgICAgIGlmIChfX3ByID09IF9fdGFibGUuX01fZGF5bmFtZSArIDE0KQorICAgICAgICAgICAgcmV0dXJuIF9fZm9ybWF0OworICAgICAgICAgIF9fdC0+dG1fd2RheSA9IF9fU1RBVElDX0NBU1QoaW50LCBfX3ByIC0gX190YWJsZS5fTV9kYXluYW1lIC0gNyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlICdiJzogeworICAgICAgICAgIGNvbnN0IHN0cmluZyogX19wciA9IF9fbWF0Y2goX19maXJzdCwgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX190YWJsZS5fTV9tb250aG5hbWUgKyAwLCBfX3RhYmxlLl9NX21vbnRobmFtZSArIDEyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19jdCk7CisgICAgICAgICAgaWYgKF9fcHIgPT0gX190YWJsZS5fTV9tb250aG5hbWUgKyAxMikKKyAgICAgICAgICAgIHJldHVybiBfX2Zvcm1hdDsKKyAgICAgICAgICBfX3QtPnRtX21vbiA9IF9fU1RBVElDX0NBU1QoaW50LCBfX3ByIC0gX190YWJsZS5fTV9tb250aG5hbWUpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSAnQic6IHsKKyAgICAgICAgICBjb25zdCBzdHJpbmcqIF9fcHIgPSBfX21hdGNoKF9fZmlyc3QsIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdGFibGUuX01fbW9udGhuYW1lICsgMTIsIF9fdGFibGUuX01fbW9udGhuYW1lICsgMjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2N0KTsKKyAgICAgICAgICBpZiAoX19wciA9PSBfX3RhYmxlLl9NX21vbnRobmFtZSArIDI0KQorICAgICAgICAgICAgcmV0dXJuIF9fZm9ybWF0OworICAgICAgICAgIF9fdC0+dG1fbW9uID0gX19TVEFUSUNfQ0FTVChpbnQsIF9fcHIgLSBfX3RhYmxlLl9NX21vbnRobmFtZSAtIDEyKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgJ2QnOiB7CisgICAgICAgICAgYm9vbCBfX3ByID0gX19nZXRfZGVjaW1hbF9pbnRlZ2VyKF9fZmlyc3QsIF9fbGFzdCwgX190LT50bV9tZGF5LCBfX1NUQVRJQ19DQVNUKF9DaCosIDApKTsKKyAgICAgICAgICBpZiAoIV9fcHIgfHwgX190LT50bV9tZGF5IDwgMSB8fCBfX3QtPnRtX21kYXkgPiAzMSkgeworICAgICAgICAgICAgX19lcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisgICAgICAgICAgICByZXR1cm4gX19mb3JtYXQ7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSAnSCc6IGNhc2UgJ0knOiB7CisgICAgICAgICAgYm9vbCBfX3ByID0gX19nZXRfZGVjaW1hbF9pbnRlZ2VyKF9fZmlyc3QsIF9fbGFzdCwgX190LT50bV9ob3VyLCBfX1NUQVRJQ19DQVNUKF9DaCosIDApKTsKKyAgICAgICAgICBpZiAoIV9fcHIpCisgICAgICAgICAgICByZXR1cm4gX19mb3JtYXQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlICdqJzogeworICAgICAgICAgIGJvb2wgX19wciA9IF9fZ2V0X2RlY2ltYWxfaW50ZWdlcihfX2ZpcnN0LCBfX2xhc3QsIF9fdC0+dG1feWRheSwgX19TVEFUSUNfQ0FTVChfQ2gqLCAwKSk7CisgICAgICAgICAgaWYgKCFfX3ByKQorICAgICAgICAgICAgcmV0dXJuIF9fZm9ybWF0OworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSAnbSc6IHsKKyAgICAgICAgICBib29sIF9fcHIgPSBfX2dldF9kZWNpbWFsX2ludGVnZXIoX19maXJzdCwgX19sYXN0LCBfX3QtPnRtX21vbiwgX19TVEFUSUNfQ0FTVChfQ2gqLCAwKSk7CisgICAgICAgICAgLS1fX3QtPnRtX21vbjsKKyAgICAgICAgICBpZiAoIV9fcHIgfHwgX190LT50bV9tb24gPCAwIHx8IF9fdC0+dG1fbW9uID4gMTEpIHsKKyAgICAgICAgICAgIF9fZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0OworICAgICAgICAgICAgcmV0dXJuIF9fZm9ybWF0OworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgJ00nOiB7CisgICAgICAgICAgYm9vbCBfX3ByID0gX19nZXRfZGVjaW1hbF9pbnRlZ2VyKF9fZmlyc3QsIF9fbGFzdCwgX190LT50bV9taW4sIF9fU1RBVElDX0NBU1QoX0NoKiwgMCkpOworICAgICAgICAgIGlmICghX19wcikKKyAgICAgICAgICAgIHJldHVybiBfX2Zvcm1hdDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgJ3AnOiB7CisgICAgICAgICAgY29uc3Qgc3RyaW5nKiBfX3ByID0gX19tYXRjaChfX2ZpcnN0LCBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3RhYmxlLl9NX2FtX3BtICsgMCwgX190YWJsZS5fTV9hbV9wbSArIDIsIF9fY3QpOworICAgICAgICAgIGlmIChfX3ByID09IF9fdGFibGUuX01fYW1fcG0gKyAyKQorICAgICAgICAgICAgcmV0dXJuIF9fZm9ybWF0OworICAgICAgICAgIC8vIDEyOjAwIFBNIDw9PiAxMjowMCwgMTI6MDAgQU0gPD0+IDAwOjAwCisgICAgICAgICAgaWYgKF9fcHIgPT0gX190YWJsZS5fTV9hbV9wbSArIDEgJiYgX190LT50bV9ob3VyICE9IDEyICkKKyAgICAgICAgICAgIF9fdC0+dG1faG91ciArPSAxMjsKKyAgICAgICAgICBpZiAoX19wciA9PSBfX3RhYmxlLl9NX2FtX3BtICYmIF9fdC0+dG1faG91ciA9PSAxMiApCisgICAgICAgICAgICBfX3QtPnRtX2hvdXIgPSAwOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSAnUyc6IHsKKyAgICAgICAgICBib29sIF9fcHIgPSBfX2dldF9kZWNpbWFsX2ludGVnZXIoX19maXJzdCwgX19sYXN0LCBfX3QtPnRtX3NlYywgX19TVEFUSUNfQ0FTVChfQ2gqLCAwKSk7CisgICAgICAgICAgaWYgKCFfX3ByKQorICAgICAgICAgICAgcmV0dXJuIF9fZm9ybWF0OworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSAneSc6IHsKKyAgICAgICAgICBib29sIF9fcHIgPSBfX2dldF9kZWNpbWFsX2ludGVnZXIoX19maXJzdCwgX19sYXN0LCBfX3QtPnRtX3llYXIsIF9fU1RBVElDX0NBU1QoX0NoKiwgMCkpOworICAgICAgICAgIGlmICghX19wcikKKyAgICAgICAgICAgIHJldHVybiBfX2Zvcm1hdDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgJ1knOiB7CisgICAgICAgICAgYm9vbCBfX3ByID0gX19nZXRfZGVjaW1hbF9pbnRlZ2VyKF9fZmlyc3QsIF9fbGFzdCwgX190LT50bV95ZWFyLCBfX1NUQVRJQ19DQVNUKF9DaCosIDApKTsKKyAgICAgICAgICBfX3QtPnRtX3llYXIgLT0gMTkwMDsKKyAgICAgICAgICBpZiAoIV9fcHIpCisgICAgICAgICAgICByZXR1cm4gX19mb3JtYXQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGlmICgqX19maXJzdCsrICE9IF9fY3Qud2lkZW4oKl9fZm9ybWF0KSkgYnJlYWs7CisgICAgfQorCisgICAgKytfX2Zvcm1hdDsKKyAgfQorCisgIHJldHVybiBfX2Zvcm1hdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9Jbkl0LCBjbGFzcyBfQ2hhclQ+Citib29sIF9TVExQX0NBTEwKK19fZ2V0X3Nob3J0X29yX2xvbmdfZGF5bmFtZShfSW5JdCYgX19maXJzdCwgX0luSXQmIF9fbGFzdCwgY29uc3QgY3R5cGU8X0NoYXJUPiYgX19jdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfVGltZV9JbmZvJiBfX3RhYmxlLCB0bSogX190KSB7CisgIGNvbnN0IHN0cmluZyogX19wciA9CisgICAgX19tYXRjaChfX2ZpcnN0LCBfX2xhc3QsIF9fdGFibGUuX01fZGF5bmFtZSArIDAsIF9fdGFibGUuX01fZGF5bmFtZSArIDE0LCBfX2N0KTsKKyAgX190LT50bV93ZGF5ID0gX19TVEFUSUNfQ0FTVChpbnQsIChfX3ByIC0gX190YWJsZS5fTV9kYXluYW1lKSAlIDcpOworICByZXR1cm4gX19wciAhPSBfX3RhYmxlLl9NX2RheW5hbWUgKyAxNDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9Jbkl0LCBjbGFzcyBfQ2hhclQ+Citib29sIF9TVExQX0NBTEwKK19fZ2V0X3Nob3J0X29yX2xvbmdfbW9udGhuYW1lKF9Jbkl0JiBfX2ZpcnN0LCBfSW5JdCYgX19sYXN0LCBjb25zdCBjdHlwZTxfQ2hhclQ+JiBfX2N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1RpbWVfSW5mbyYgX190YWJsZSwgdG0qIF9fdCkgeworICBjb25zdCBzdHJpbmcqIF9fcHIgPQorICAgIF9fbWF0Y2goX19maXJzdCwgX19sYXN0LCBfX3RhYmxlLl9NX21vbnRobmFtZSArIDAsIF9fdGFibGUuX01fbW9udGhuYW1lICsgMjQsIF9fY3QpOworICBfX3QtPnRtX21vbiA9IF9fU1RBVElDX0NBU1QoaW50LCAoX19wciAtIF9fdGFibGUuX01fbW9udGhuYW1lKSAlIDEyKTsKKyAgcmV0dXJuIF9fcHIgIT0gX190YWJsZS5fTV9tb250aG5hbWUgKyAyNDsKK30KKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQordGVtcGxhdGUgPGNsYXNzIF9PdUl0PgorX091SXQgX1NUTFBfQ0FMTAorX19wdXRfdGltZShjaGFyICogX19maXJzdCwgY2hhciAqIF9fbGFzdCwgX091SXQgX19vdXRfaXRlLAorICAgICAgICAgICBjb25zdCBpb3NfYmFzZSYgX19zLCB3Y2hhcl90KSB7CisgICAgY29uc3QgY3R5cGU8d2NoYXJfdD4mIF9fY3QgPSAqX19TVEFUSUNfQ0FTVChjb25zdCBjdHlwZTx3Y2hhcl90PiosIF9fcy5fTV9jdHlwZV9mYWNldCgpKTsKKyAgICB3Y2hhcl90IF9fd2J1Zls2NF07CisgICAgX19jdC53aWRlbihfX2ZpcnN0LCBfX2xhc3QsIF9fd2J1Zik7CisgICAgcHRyZGlmZl90IF9fbGVuID0gX19sYXN0IC0gX19maXJzdDsKKyAgICB3Y2hhcl90ICogX19lZW5kID0gX193YnVmICsgX19sZW47CisgICAgcmV0dXJuIGNvcHkoKHdjaGFyX3QqKV9fd2J1ZiwgX19lZW5kLCBfX291dF9pdGUpOworfQorI2VuZGlmCisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoLCBjbGFzcyBfSW5JdD4KK19Jbkl0Cit0aW1lX2dldDxfQ2gsIF9Jbkl0Pjo6ZG9fZ2V0X2RhdGUoX0luSXQgX19zLCBfSW5JdCAgX19lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2UmIF9fc3RyLCBpb3NfYmFzZTo6aW9zdGF0ZSYgIF9fZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtKiBfX3QpIGNvbnN0IHsKKyAgdHlwZWRlZiBzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIHN0cmluZ19pdGVyYXRvcjsKKworICBzdHJpbmdfaXRlcmF0b3IgX19mb3JtYXQgPSBfTV90aW1laW5mby5fTV9kYXRlX2Zvcm1hdC5iZWdpbigpOworICBzdHJpbmdfaXRlcmF0b3IgX19mb3JtYXRfZW5kID0gX01fdGltZWluZm8uX01fZGF0ZV9mb3JtYXQuZW5kKCk7CisKKyAgc3RyaW5nX2l0ZXJhdG9yIF9fcmVzdWx0CisgICAgPSBfU1RMUF9QUklWIF9fZ2V0X2Zvcm1hdHRlZF90aW1lKF9fcywgX19lbmQsIF9fZm9ybWF0LCBfX2Zvcm1hdF9lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fU1RBVElDX0NBU1QoX0NoKiwgMCksIF9NX3RpbWVpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3N0ciwgX19lcnIsIF9fdCk7CisgIGlmIChfX3Jlc3VsdCA9PSBfX2Zvcm1hdF9lbmQpCisgICAgX19lcnIgPSBpb3NfYmFzZTo6Z29vZGJpdDsKKyAgZWxzZSB7CisgICAgX19lcnIgPSBpb3NfYmFzZTo6ZmFpbGJpdDsKKyAgICBpZiAoX19zID09IF9fZW5kKQorICAgICAgX19lcnIgfD0gaW9zX2Jhc2U6OmVvZmJpdDsKKyAgfQorICByZXR1cm4gX19zOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoLCBjbGFzcyBfSW5JdD4KK19Jbkl0Cit0aW1lX2dldDxfQ2gsIF9Jbkl0Pjo6ZG9fZ2V0X3RpbWUoX0luSXQgX19zLCBfSW5JdCAgX19lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2UmIF9fc3RyLCBpb3NfYmFzZTo6aW9zdGF0ZSYgIF9fZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtKiBfX3QpIGNvbnN0IHsKKyAgdHlwZWRlZiBzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIHN0cmluZ19pdGVyYXRvcjsKKyAgc3RyaW5nX2l0ZXJhdG9yIF9fZm9ybWF0ID0gX01fdGltZWluZm8uX01fdGltZV9mb3JtYXQuYmVnaW4oKTsKKyAgc3RyaW5nX2l0ZXJhdG9yIF9fZm9ybWF0X2VuZCA9IF9NX3RpbWVpbmZvLl9NX3RpbWVfZm9ybWF0LmVuZCgpOworCisgIHN0cmluZ19pdGVyYXRvciBfX3Jlc3VsdAorICAgID0gX1NUTFBfUFJJViBfX2dldF9mb3JtYXR0ZWRfdGltZShfX3MsIF9fZW5kLCBfX2Zvcm1hdCwgX19mb3JtYXRfZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX1NUQVRJQ19DQVNUKF9DaCosIDApLCBfTV90aW1laW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19zdHIsIF9fZXJyLCBfX3QpOworICBfX2VyciA9IF9fcmVzdWx0ID09IF9fZm9ybWF0X2VuZCA/IGlvc19iYXNlOjpnb29kYml0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaW9zX2Jhc2U6OmZhaWxiaXQ7CisgIGlmIChfX3MgPT0gX19lbmQpCisgICAgX19lcnIgfD0gaW9zX2Jhc2U6OmVvZmJpdDsKKyAgcmV0dXJuIF9fczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaCwgY2xhc3MgX0luSXQ+CitfSW5JdAordGltZV9nZXQ8X0NoLCBfSW5JdD46OmRvX2dldF95ZWFyKF9Jbkl0IF9fcywgX0luSXQgIF9fZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlJiwgaW9zX2Jhc2U6Omlvc3RhdGUmICBfX2VyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bSogX190KSBjb25zdCB7CisgIGlmIChfX3MgPT0gX19lbmQpIHsKKyAgICBfX2VyciA9IGlvc19iYXNlOjpmYWlsYml0IHwgaW9zX2Jhc2U6OmVvZmJpdDsKKyAgICByZXR1cm4gX19zOworICB9CisKKyAgYm9vbCBfX3ByID0gIF9TVExQX1BSSVYgX19nZXRfZGVjaW1hbF9pbnRlZ2VyKF9fcywgX19lbmQsIF9fdC0+dG1feWVhciwgX19TVEFUSUNfQ0FTVChfQ2gqLCAwKSk7CisgIF9fdC0+dG1feWVhciAtPSAxOTAwOworICBfX2VyciA9IF9fcHIgPyBpb3NfYmFzZTo6Z29vZGJpdCA6IGlvc19iYXNlOjpmYWlsYml0OworICBpZiAoX19zID09IF9fZW5kKQorICAgIF9fZXJyIHw9IGlvc19iYXNlOjplb2ZiaXQ7CisKKyAgcmV0dXJuIF9fczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaCwgY2xhc3MgX0luSXQ+CitfSW5JdAordGltZV9nZXQ8X0NoLCBfSW5JdD46OmRvX2dldF93ZWVrZGF5KF9Jbkl0IF9fcywgX0luSXQgIF9fZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlICZfX3N0ciwgaW9zX2Jhc2U6Omlvc3RhdGUgJl9fZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtICpfX3QpIGNvbnN0IHsKKyAgY29uc3QgY3R5cGU8X0NoPiYgX19jdCA9ICpfX1NUQVRJQ19DQVNUKGNvbnN0IGN0eXBlPF9DaD4qLCBfX3N0ci5fTV9jdHlwZV9mYWNldCgpKTsKKyAgYm9vbCBfX3Jlc3VsdCA9CisgICAgX1NUTFBfUFJJViBfX2dldF9zaG9ydF9vcl9sb25nX2RheW5hbWUoX19zLCBfX2VuZCwgX19jdCwgX01fdGltZWluZm8sIF9fdCk7CisgIGlmIChfX3Jlc3VsdCkKKyAgICBfX2VyciA9IGlvc19iYXNlOjpnb29kYml0OworICBlbHNlIHsKKyAgICBfX2VyciA9IGlvc19iYXNlOjpmYWlsYml0OworICAgIGlmIChfX3MgPT0gX19lbmQpCisgICAgICBfX2VyciB8PSBpb3NfYmFzZTo6ZW9mYml0OworICB9CisgIHJldHVybiBfX3M7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2gsIGNsYXNzIF9Jbkl0PgorX0luSXQKK3RpbWVfZ2V0PF9DaCwgX0luSXQ+Ojpkb19nZXRfbW9udGhuYW1lKF9Jbkl0IF9fcywgX0luSXQgIF9fZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2UgJl9fc3RyLCBpb3NfYmFzZTo6aW9zdGF0ZSAmX19lcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bSAqX190KSBjb25zdCB7CisgIGNvbnN0IGN0eXBlPF9DaD4mIF9fY3QgPSAqX19TVEFUSUNfQ0FTVChjb25zdCBjdHlwZTxfQ2g+KiwgX19zdHIuX01fY3R5cGVfZmFjZXQoKSk7CisgIGJvb2wgX19yZXN1bHQgPQorICAgIF9TVExQX1BSSVYgX19nZXRfc2hvcnRfb3JfbG9uZ19tb250aG5hbWUoX19zLCBfX2VuZCwgX19jdCwgX01fdGltZWluZm8sIF9fdCk7CisgIGlmIChfX3Jlc3VsdCkKKyAgICBfX2VyciA9IGlvc19iYXNlOjpnb29kYml0OworICBlbHNlIHsKKyAgICBfX2VyciA9IGlvc19iYXNlOjpmYWlsYml0OworICAgIGlmIChfX3MgPT0gX19lbmQpCisgICAgICBfX2VyciB8PSBpb3NfYmFzZTo6ZW9mYml0OworICB9CisgIHJldHVybiBfX3M7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9DaCwgY2xhc3MgX091dHB1dEl0ZXI+CitfT3V0cHV0SXRlcgordGltZV9wdXQ8X0NoLF9PdXRwdXRJdGVyPjo6cHV0KF9PdXRwdXRJdGVyIF9fcywgaW9zX2Jhc2UmIF9fZiwgX0NoIF9fZmlsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0bSogX190bWIsIGNvbnN0IF9DaCogX19wYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0NoKiBfX3BhdF9lbmQpIGNvbnN0IHsKKyAgLy8gIGxvY2FsZSBfX2xvYyA9IF9fZi5nZXRsb2MoKTsKKyAgLy8gIGNvbnN0IGN0eXBlPF9DaD4mIF9DdCA9IHVzZV9mYWNldDxjdHlwZTxfQ2g+ID4oX19sb2MpOworICBjb25zdCBjdHlwZTxfQ2g+JiBfQ3QgPSAqX19TVEFUSUNfQ0FTVChjb25zdCBjdHlwZTxfQ2g+KiwgX19mLl9NX2N0eXBlX2ZhY2V0KCkpOworICB3aGlsZSAoX19wYXQgIT0gX19wYXRfZW5kKSB7CisgICAgY2hhciBfX2MgPSBfQ3QubmFycm93KCpfX3BhdCwgMCk7CisgICAgaWYgKF9fYyA9PSAnJScpIHsKKyAgICAgIGNoYXIgX19tb2QgPSAwOworICAgICAgKytfX3BhdDsKKyAgICAgIF9fYyA9IF9DdC5uYXJyb3coKl9fcGF0KyssIDApOworICAgICAgaWYgKF9fYyA9PSAnIycpIHsgLy8gTVMgZXh0ZW5zaW9uCisgICAgICAgIF9fbW9kID0gX19jOworICAgICAgICBfX2MgPSBfQ3QubmFycm93KCpfX3BhdCsrLCAwKTsKKyAgICAgIH0KKyAgICAgIF9fcyA9IGRvX3B1dChfX3MsIF9fZiwgX19maWxsLCBfX3RtYiwgX19jLCBfX21vZCk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICpfX3MrKyA9ICpfX3BhdCsrOworICB9CisgIHJldHVybiBfX3M7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9DaCwgY2xhc3MgX091dHB1dEl0ZXI+CitfT3V0cHV0SXRlcgordGltZV9wdXQ8X0NoLF9PdXRwdXRJdGVyPjo6ZG9fcHV0KF9PdXRwdXRJdGVyIF9fcywgaW9zX2Jhc2UmIF9fZiwgX0NoIC8qIF9fZmlsbCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0bSogX190bWIsIGNoYXIgX19mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBfX21vZGlmaWVyICkgY29uc3QgeworICBjaGFyIF9fYnVmWzY0XTsKKyAgY2hhciAqIF9faWVuZCA9IF9TVExQX1BSSVYgX193cml0ZV9mb3JtYXR0ZWRfdGltZShfU1RMUF9BUlJBWV9BTkRfU0laRShfX2J1ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mb3JtYXQsIF9fbW9kaWZpZXIsIF9NX3RpbWVpbmZvLCBfX3RtYik7CisgIC8vICBsb2NhbGUgX19sb2MgPSBfX2YuZ2V0bG9jKCk7CisgIHJldHVybiBfU1RMUF9QUklWIF9fcHV0X3RpbWUoX19idWYsIF9faWVuZCwgX19zLCBfX2YsIF9DaCgpKTsKK30KKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYgLyogX1NUTFBfVElNRV9GQUNFVFNfQyAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RsL190aW1lX2ZhY2V0cy5oIGIvc3RsL190aW1lX2ZhY2V0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MjM4MTgKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvX3RpbWVfZmFjZXRzLmgKQEAgLTAsMCArMSwzNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisvLyBXQVJOSU5HOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBDKysKKy8vIHN0YW5kYXJkIGxpYnJhcnkgaGVhZGVycy4gIFlvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gdXNlIHRoaXMgaGVhZGVyCisvLyBmaWxlIGRpcmVjdGx5LgorCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfVElNRV9GQUNFVFNfSAorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9USU1FX0ZBQ0VUU19ICisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1RJTUUKKyMgIGluY2x1ZGUgPHN0bC9fY3RpbWUuaD4gICAgICAgICAgICAgICAgLy8gTmVlZGVkIChmb3Igc3RydWN0IHRtKSBieSB0aW1lIGZhY2V0cworI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfQ19MT0NBTEVfSAorIyAgaW5jbHVkZSA8c3RsL2NfbG9jYWxlLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JT1NfQkFTRV9ICisjICBpbmNsdWRlIDxzdGwvX2lvc19iYXNlLmg+CisjZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKworLy8gVGVtcGxhdGUgZnVuY3Rpb25zIHVzZWQgYnkgdGltZV9nZXQKKworLy8gTWF0Y2hpbmcgaW5wdXQgYWdhaW5zdCBhIGxpc3Qgb2YgbmFtZXMKKworLy8gQWxwaGFiZXRpYyBpbnB1dCBvZiB0aGUgbmFtZXMgb2YgbW9udGhzIGFuZCB0aGUgbmFtZXMKKy8vIG9mIHdlZWtkYXlzIHJlcXVpcmVzIG1hdGNoaW5nIGlucHV0IGFnYWluc3QgYSBsaXN0IG9mIG5hbWVzLgorLy8gV2UgdXNlIGEgc2ltcGxlIGdlbmVyaWMgYWxnb3JpdGhtIHRvIGFjY29tcGxpc2ggdGhpcy4gIFRoaXMKKy8vIGFsZ29yaXRobSBpcyBub3QgdmVyeSBlZmZpY2llbnQsIGVzcGVjaWFsbHkgZm9yIGxvbmdlciBsaXN0cworLy8gb2YgbmFtZXMsIGJ1dCBpdCBwcm9iYWJseSBkb2VzIG5vdCBtYXR0ZXIgZm9yIHRoZSBpbml0aWFsCisvLyBpbXBsZW1lbnRhdGlvbiBhbmQgaXQgbWF5IG5ldmVyIG1hdHRlciwgc2luY2Ugd2UgZG8gbm90IGV4cGVjdAorLy8gdGhpcyBraW5kIG9mIGlucHV0IHRvIGJlIHVzZWQgdmVyeSBvZnRlbi4gIFRoZSBhbGdvcml0aG0KKy8vIGNvdWxkIGJlIGltcHJvdmVkIGZhaXJseSBzaW1wbHkgYnkgY3JlYXRpbmcgYSBuZXcgbGlzdCBvZgorLy8gbmFtZXMgc3RpbGwgaW4gdGhlIHJ1bm5pbmcgYXQgZWFjaCBpdGVyYXRpb24uICBBIG1vcmUgc29waGlzdGljYXRlZAorLy8gYXBwcm9hY2ggd291bGQgYmUgdG8gYnVpbGQgYSB0cmllIHRvIGRvIHRoZSBtYXRjaGluZy4KKy8vCisvLyBXZSBjb21wYXJlIGVhY2ggY2hhcmFjdGVyIG9mIHRoZSBpbnB1dCB0byB0aGUgY29ycmVzcG9uZGluZworLy8gY2hhcmFjdGVyIG9mIGVhY2ggbmFtZSBvbiB0aGUgbGlzdCB0aGF0IGhhcyBub3QgYmVlbiBlbGltaW5hdGVkLAorLy8gZWl0aGVyIGJlY2F1c2UgZXZlcnkgY2hhcmFjdGVyIGluIHRoZSBuYW1lIGhhcyBhbHJlYWR5IGJlZW4KKy8vIG1hdGNoZWQsIG9yIGJlY2F1c2Ugc29tZSBjaGFyYWN0ZXIgaGFzIG5vdCBiZWVuIG1hdGNoZWQuICBXZQorLy8gY29udGludWUgb25seSBhcyBsb25nIGFzIHRoZXJlIGFyZSBzb21lIG5hbWVzIHRoYXQgaGF2ZSBub3QgYmVlbgorLy8gZWxpbWluYXRlZC4KKworLy8gV2UgZG8gbm90IHJlYWxseSBuZWVkIGEgcmFuZG9tIGFjY2VzcyBpdGVyYXRvciAoYSBmb3J3YXJkIGl0ZXJhdG9yCisvLyB3b3VsZCBkbyksIGJ1dCB0aGUgZXh0cmEgZ2VuZXJhbGl0eSBtYWtlcyB0aGUgbm90YXRpb24gY2x1bXNpZXIsCisvLyBhbmQgd2UgZG9uJ3QgcmVhbGx5IG5lZWQgaXQuCisKKy8vIFdlIGNhbiByZWNvZ25pemUgYSBmYWlsZWQgbWF0Y2ggYnkgdGhlIGZhY3QgdGhhdCB0aGUgc2Vjb25kCisvLyBjb21wb25lbnQgb2YgdGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIF9fbmFtZV9lbmQuCisKKyNkZWZpbmUgX01BWE5BTUVTICAgICAgICA2NAorI2RlZmluZSBfTUFYX05BTUVfTEVOR1RIIDY0CisKKy8vIEJvdGggdGltZV9nZXQgYW5kIHRpbWVfcHV0IG5lZWQgYSBzdHJ1Y3R1cmUgb2YgdHlwZSBfVGltZV9JbmZvCisvLyB0byBwcm92aWRlIG5hbWVzIGFuZCBhYmJyZXZpYXRlZCBuYW1lcyBmb3IgbW9udGhzIGFuZCBkYXlzLAorLy8gYXMgd2VsbCBhcyB0aGUgYW0vcG0gZGVzaWduYXRvci4gIFRoZSBtb250aCBhbmQgd2Vla2RheSB0YWJsZXMKKy8vIGhhdmUgdGhlIGFsbCB0aGUgYWJicmV2aWF0ZWQgbmFtZXMgYmVmb3JlIGFsbCB0aGUgZnVsbCBuYW1lcy4KKy8vIFRoZSBfVGltZV9JbmZvIHRhYmxlcyBhcmUgaW5pdGlhbGl6ZWQgdXNpbmcgdGhlIG5vbi10ZW1wbGF0ZQorLy8gZnVuY3Rpb24gX0luaXRfdGltZWluZm8sIHdoaWNoIGhhcyB0d28gb3ZlcmxvYWRpbmdzOiAgb25lCisvLyB3aXRoIGEgc2luZ2xlIHJlZmVyZW5jZSBwYXJhbWV0ZXIgZm9yIHRoZSB0YWJsZSB0byBiZSBpbml0aWFsaXplZCwKKy8vIGFuZCBvbmUgd2l0aCBhIHNlY29uZCBfTG9jYWxlX3RpbWUgKiBwYXJhbWV0ZXIuICBUaGUgZmlyc3QgZm9ybQorLy8gaXMgY2FsbGVkIGJ5IHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIGFuZCB0aGUgc2Vjb25kIGJ5IGEgc3BlY2lhbAorLy8gY29uc3RydWN0b3IgaW52b2tlZCBmcm9tIHRoZSBfYnluYW1lIHN1YmNsYXNzIGNvbnN0cnVjdG9yIHRvCisvLyBjb25zdHJ1Y3QgdGhlIGJhc2UgY2xhc3MuCisKK2NsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIF9UaW1lX0luZm8geworcHVibGljOgorICBzdHJpbmcgX01fZGF5bmFtZVsxNF07CisgIHN0cmluZyBfTV9tb250aG5hbWVbMjRdOworICBzdHJpbmcgX01fYW1fcG1bMl07CisgIHN0cmluZyBfTV90aW1lX2Zvcm1hdDsKKyAgc3RyaW5nIF9NX2RhdGVfZm9ybWF0OworICBzdHJpbmcgX01fZGF0ZV90aW1lX2Zvcm1hdDsKKyAgc3RyaW5nIF9NX2xvbmdfZGF0ZV9mb3JtYXQ7CisgIHN0cmluZyBfTV9sb25nX2RhdGVfdGltZV9mb3JtYXQ7Cit9OworCit2b2lkIF9TVExQX0NBTEwgX0luaXRfdGltZWluZm8oX1RpbWVfSW5mbyYpOwordm9pZCBfU1RMUF9DQUxMIF9Jbml0X3RpbWVpbmZvKF9UaW1lX0luZm8mLCBfTG9jYWxlX3RpbWUqKTsKKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK2NsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIHRpbWVfYmFzZSB7CitwdWJsaWM6CisgIGVudW0gZGF0ZW9yZGVyIHtub19vcmRlciwgZG15LCBtZHksIHltZCwgeWRtfTsKK307CisKKyNpZiBkZWZpbmVkIChfU1RMUF9MSU1JVEVEX0RFRkFVTFRfVEVNUExBVEVTKQordGVtcGxhdGUgPGNsYXNzIF9DaCwgY2xhc3MgX0luSXQ+CisjZWxzZQordGVtcGxhdGUgPGNsYXNzIF9DaCwgY2xhc3MgX0luSXQgPSBpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaCwgY2hhcl90cmFpdHM8X0NoPiA+ID4KKyNlbmRpZgorY2xhc3MgdGltZV9nZXQgOiBwdWJsaWMgbG9jYWxlOjpmYWNldCwgcHVibGljIHRpbWVfYmFzZSB7CisgIGZyaWVuZCBjbGFzcyBfTG9jYWxlX2ltcGw7CisKK3B1YmxpYzoKKyAgdHlwZWRlZiBfQ2ggICBjaGFyX3R5cGU7CisgIHR5cGVkZWYgX0luSXQgaXRlcl90eXBlOworCisgIGV4cGxpY2l0IHRpbWVfZ2V0KHNpemVfdCBfX3JlZnMgPSAwKSA6IGxvY2FsZTo6ZmFjZXQoX19yZWZzKQorICB7IF9TVExQX1BSSVYgX0luaXRfdGltZWluZm8oX01fdGltZWluZm8pOyB9CisgIGRhdGVvcmRlciBkYXRlX29yZGVyKCkgY29uc3QgeyByZXR1cm4gZG9fZGF0ZV9vcmRlcigpOyB9CisgIGl0ZXJfdHlwZSBnZXRfdGltZShpdGVyX3R5cGUgX19zLCBpdGVyX3R5cGUgIF9fZW5kLCBpb3NfYmFzZSYgIF9fc3RyLAorICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmICBfX2VyciwgdG0qIF9fdCkgY29uc3QKKyAgeyByZXR1cm4gZG9fZ2V0X3RpbWUoX19zLCAgX19lbmQsICBfX3N0ciwgIF9fZXJyLCBfX3QpOyB9CisgIGl0ZXJfdHlwZSBnZXRfZGF0ZShpdGVyX3R5cGUgX19zLCBpdGVyX3R5cGUgIF9fZW5kLCBpb3NfYmFzZSYgIF9fc3RyLAorICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmICBfX2VyciwgdG0qIF9fdCkgY29uc3QKKyAgeyByZXR1cm4gZG9fZ2V0X2RhdGUoX19zLCAgX19lbmQsICBfX3N0ciwgIF9fZXJyLCBfX3QpOyB9CisgIGl0ZXJfdHlwZSBnZXRfd2Vla2RheShpdGVyX3R5cGUgX19zLCBpdGVyX3R5cGUgIF9fZW5kLCBpb3NfYmFzZSYgIF9fc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmICBfX2VyciwgdG0qIF9fdCkgY29uc3QKKyAgeyByZXR1cm4gZG9fZ2V0X3dlZWtkYXkoX19zLCAgX19lbmQsICBfX3N0ciwgIF9fZXJyLCBfX3QpOyB9CisgIGl0ZXJfdHlwZSBnZXRfbW9udGhuYW1lKGl0ZXJfdHlwZSBfX3MsIGl0ZXJfdHlwZSAgX19lbmQsIGlvc19iYXNlJiAgX19zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiAgX19lcnIsIHRtKiBfX3QpIGNvbnN0CisgIHsgcmV0dXJuIGRvX2dldF9tb250aG5hbWUoX19zLCAgX19lbmQsICBfX3N0ciwgIF9fZXJyLCBfX3QpOyB9CisgIGl0ZXJfdHlwZSBnZXRfeWVhcihpdGVyX3R5cGUgX19zLCBpdGVyX3R5cGUgIF9fZW5kLCBpb3NfYmFzZSYgIF9fc3RyLAorICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmICBfX2VyciwgdG0qIF9fdCkgY29uc3QKKyAgeyByZXR1cm4gZG9fZ2V0X3llYXIoX19zLCAgX19lbmQsICBfX3N0ciwgIF9fZXJyLCBfX3QpOyB9CisKKyAgc3RhdGljIF9TVExQX1NUQVRJQ19NRU1CRVJfREVDTFNQRUMgbG9jYWxlOjppZCBpZDsKKworcHJvdGVjdGVkOgorICB0aW1lX2dldChfTG9jYWxlX3RpbWUgKiwgc2l6ZV90IF9fcmVmcykgOiBsb2NhbGU6OmZhY2V0KF9fcmVmcykge30KKworICB+dGltZV9nZXQoKSB7fQorCisgIHZpcnR1YWwgZGF0ZW9yZGVyIGRvX2RhdGVfb3JkZXIoKSBjb25zdCB7cmV0dXJuIG5vX29yZGVyO30KKworICB2aXJ0dWFsIGl0ZXJfdHlwZSBkb19nZXRfdGltZShpdGVyX3R5cGUgX19zLCBpdGVyX3R5cGUgIF9fZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZSYsIGlvc19iYXNlOjppb3N0YXRlJiAgX19lcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtKiBfX3QpIGNvbnN0OworCisgIHZpcnR1YWwgaXRlcl90eXBlIGRvX2dldF9kYXRlKGl0ZXJfdHlwZSBfX3MsIGl0ZXJfdHlwZSAgX19lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlJiwgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bSogX190KSBjb25zdDsKKworICB2aXJ0dWFsIGl0ZXJfdHlwZSBkb19nZXRfd2Vla2RheShpdGVyX3R5cGUgX19zLCBpdGVyX3R5cGUgIF9fZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZSYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG0qIF9fdCkgY29uc3Q7CisgIHZpcnR1YWwgaXRlcl90eXBlIGRvX2dldF9tb250aG5hbWUoaXRlcl90eXBlIF9fcywgaXRlcl90eXBlICBfX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZSYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtKiBfX3QpIGNvbnN0OworCisgIHZpcnR1YWwgaXRlcl90eXBlIGRvX2dldF95ZWFyKGl0ZXJfdHlwZSBfX3MsIGl0ZXJfdHlwZSAgX19lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlJiwgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bSogX190KSBjb25zdDsKKworICBfU1RMUF9QUklWIF9UaW1lX0luZm8gX01fdGltZWluZm87Cit9OworCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RpbWVfYmFzZTo6ZGF0ZW9yZGVyIF9TVExQX0NBTEwgX19nZXRfZGF0ZV9vcmRlcihfTG9jYWxlX3RpbWUqKTsKK19Mb2NhbGVfdGltZSogX1NUTFBfQ0FMTCBfX2FjcXVpcmVfdGltZShjb25zdCBjaGFyKiBfX25hbWUsIF9Mb2NhbGVfbmFtZV9oaW50Kik7Cit2b2lkIF9TVExQX0NBTEwgX19yZWxlYXNlX3RpbWUoX0xvY2FsZV90aW1lKiBfX3RpbWUpOworCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9DaCwgY2xhc3MgX0luSXQ+CitjbGFzcyB0aW1lX2dldF9ieW5hbWU7CisKKyNpZiBkZWZpbmVkIChfX0dOVUNfXykgJiYgKF9fR05VQ19fIDwgMykKK3RlbXBsYXRlIDxjbGFzcyBfQ2gsIGNsYXNzIF9Jbkl0PgorX0xvY2FsZV9uYW1lX2hpbnQqIF9Mb2NhbGVfdGltZV9leHRyYWN0X2hpbnQodGltZV9nZXRfYnluYW1lPF9DaCwgX0luSXQ+Kik7CisjZWxzZQorX0xvY2FsZV9uYW1lX2hpbnQqIF9Mb2NhbGVfdGltZV9leHRyYWN0X2hpbnQodGltZV9nZXRfYnluYW1lPGNoYXIsIGlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4gPiA+Kik7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX0xJTUlURURfREVGQVVMVF9URU1QTEFURVMpCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoLCBjbGFzcyBfSW5JdD4KKyNlbHNlCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoLCBjbGFzcyBfSW5JdCA9IGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoLCBjaGFyX3RyYWl0czxfQ2g+ID4gPgorI2VuZGlmCitjbGFzcyB0aW1lX2dldF9ieW5hbWUgOiBwdWJsaWMgdGltZV9nZXQ8X0NoLCBfSW5JdD4geworcHVibGljOgorICB0eXBlZGVmICB0aW1lX2Jhc2U6OmRhdGVvcmRlciBkYXRlb3JkZXI7CisgIHR5cGVkZWYgX0luSXQgICAgICAgICAgICAgICAgIGl0ZXJfdHlwZTsKKworICBleHBsaWNpdCB0aW1lX2dldF9ieW5hbWUoY29uc3QgY2hhciogX19uYW1lLCBzaXplX3QgX19yZWZzID0gMCwgX0xvY2FsZV9uYW1lX2hpbnQqIF9faGludCA9IDApCisgICAgOiB0aW1lX2dldDxfQ2gsIF9Jbkl0PigoX0xvY2FsZV90aW1lKikgMCwgX19yZWZzKSwKKyAgICAgIF9NX3RpbWUoX1NUTFBfUFJJViBfX2FjcXVpcmVfdGltZShfX25hbWUsIF9faGludCkpCisgIHsgX1NUTFBfUFJJViBfSW5pdF90aW1laW5mbyh0aGlzLT5fTV90aW1laW5mbywgdGhpcy0+X01fdGltZSk7IH0KKworcHJvdGVjdGVkOgorICB+dGltZV9nZXRfYnluYW1lKCkgeyBfU1RMUF9QUklWIF9fcmVsZWFzZV90aW1lKF9NX3RpbWUpOyB9CisgIGRhdGVvcmRlciBkb19kYXRlX29yZGVyKCkgY29uc3QgeyByZXR1cm4gX1NUTFBfUFJJViBfX2dldF9kYXRlX29yZGVyKF9NX3RpbWUpOyB9CisKK3ByaXZhdGU6CisgIF9Mb2NhbGVfdGltZSogX01fdGltZTsKKworICB0eXBlZGVmIHRpbWVfZ2V0X2J5bmFtZTxfQ2gsIF9Jbkl0PiBfU2VsZjsKKyAgLy9leHBsaWNpdGVseSBkZWZpbmVkIGFzIHByaXZhdGUgdG8gYXZvaWQgd2FybmluZ3M6CisgIHRpbWVfZ2V0X2J5bmFtZShfU2VsZiBjb25zdCYpOworICBfU2VsZiYgb3BlcmF0b3IgPSAoX1NlbGYgY29uc3QmKTsKKyNpZiBkZWZpbmVkIChfX0dOVUNfXykgJiYgKF9fR05VQ19fIDwgMykKKyAgZnJpZW5kIF9Mb2NhbGVfbmFtZV9oaW50KiBfTG9jYWxlX3RpbWVfZXh0cmFjdF9oaW50PD4oX1NlbGYqKTsKKyNlbHNlCisgIGZyaWVuZCBfTG9jYWxlX25hbWVfaGludCogX0xvY2FsZV90aW1lX2V4dHJhY3RfaGludCh0aW1lX2dldF9ieW5hbWU8Y2hhciwgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+ID4qKTsKKyNlbmRpZgorfTsKKworLy8gdGltZV9wdXQgZmFjZXQKKworLy8gRm9yIHRoZSBmb3JtYXRzICd4LCAnWCcsIGFuZCAnYycsIGRvX3B1dCBjYWxscyB0aGUgZmlyc3QgZm9ybSBvZgorLy8gcHV0IHdpdGggdGhlIHBhdHRlcm4gb2J0YWluZWQgZnJvbSBfTV90aW1laW5mby5fTV9kYXRlX2Zvcm1hdCBvcgorLy8gX01fdGltZWluZm8uX01fdGltZV9mb3JtYXQuCisKKy8vIEhlbHBlciBmdW5jdGlvbjogIF9fICB0YWtlcyBhIHNpbmdsZS1jaGFyYWN0ZXIKKy8vIGZvcm1hdC4gIEFzIGluZGljYXRlZCBieSB0aGUgZm9yZWdvaW5nIHJlbWFyaywgdGhpcyB3aWxsIG5ldmVyIGJlCisvLyAneCcsICdYJywgb3IgJ2MnLgorCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK2NoYXIgKiBfU1RMUF9DQUxMCitfX3dyaXRlX2Zvcm1hdHRlZF90aW1lKGNoYXIgKl9fYnVmLCBzaXplX3QgX19idWZfc2l6ZSwgY2hhciBfX2Zvcm1hdCwgY2hhciBfX21vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfVGltZV9JbmZvJiBfX3RhYmxlLCBjb25zdCB0bSogX190KTsKKwordGVtcGxhdGUgPGNsYXNzIF9PdUl0PgoraW5saW5lIF9PdUl0IF9TVExQX0NBTEwgX19wdXRfdGltZShjaGFyICogX19maXJzdCwgY2hhciAqIF9fbGFzdCwgX091SXQgX19vdXRfaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpb3NfYmFzZSYgLyogX19sb2MgKi8sIGNoYXIpCit7IHJldHVybiBjb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19vdXRfaXRlKTsgfQorCisjaWYgIWRlZmluZWQgKF9TVExQX05PX1dDSEFSX1QpCit0ZW1wbGF0ZSA8Y2xhc3MgX091SXQ+CitfT3VJdCBfU1RMUF9DQUxMIF9fcHV0X3RpbWUoY2hhciAqIF9fZmlyc3QsIGNoYXIgKiBfX2xhc3QsIF9PdUl0IF9fb3V0X2l0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpb3NfYmFzZSYgX19zLCB3Y2hhcl90KTsKKyNlbmRpZgorCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKworI2lmIGRlZmluZWQgKF9TVExQX0xJTUlURURfREVGQVVMVF9URU1QTEFURVMpCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoLCBjbGFzcyBfT3V0SXQ+CisjZWxzZQordGVtcGxhdGUgPGNsYXNzIF9DaCwgY2xhc3MgX091dEl0ID0gb3N0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2gsIGNoYXJfdHJhaXRzPF9DaD4gPiA+CisjZW5kaWYKK2NsYXNzIHRpbWVfcHV0IDogcHVibGljIGxvY2FsZTo6ZmFjZXQsIHB1YmxpYyB0aW1lX2Jhc2UgeworICBmcmllbmQgY2xhc3MgX0xvY2FsZV9pbXBsOworcHVibGljOgorICB0eXBlZGVmIF9DaCAgICAgIGNoYXJfdHlwZTsKKyAgdHlwZWRlZiBfT3V0SXQgaXRlcl90eXBlOworCisgIGV4cGxpY2l0IHRpbWVfcHV0KHNpemVfdCBfX3JlZnMgPSAwKSA6IGxvY2FsZTo6ZmFjZXQoX19yZWZzKQorICB7IF9TVExQX1BSSVYgX0luaXRfdGltZWluZm8oX01fdGltZWluZm8pOyB9CisKKyAgX091dEl0IHB1dChpdGVyX3R5cGUgX19zLCBpb3NfYmFzZSYgX19mLCBfQ2ggX19maWxsLAorICAgICAgICAgICAgICAgICAgY29uc3QgdG0qIF9fdG1iLAorICAgICAgICAgICAgICAgICAgY29uc3QgX0NoKiBfX3BhdCwgY29uc3QgX0NoKiBfX3BhdF9lbmQpIGNvbnN0OworCisgIF9PdXRJdCBwdXQoaXRlcl90eXBlIF9fcywgaW9zX2Jhc2UmIF9fZiwgX0NoICBfX2ZpbGwsCisgICAgICAgICAgICAgICAgICBjb25zdCB0bSogX190bWIsIGNoYXIgX19mb3JtYXQsIGNoYXIgX19tb2RpZmllciA9IDApIGNvbnN0CisgIHsgcmV0dXJuIGRvX3B1dChfX3MsIF9fZiwgIF9fZmlsbCwgX190bWIsIF9fZm9ybWF0LCBfX21vZGlmaWVyKTsgfQorCisgIHN0YXRpYyBfU1RMUF9TVEFUSUNfTUVNQkVSX0RFQ0xTUEVDIGxvY2FsZTo6aWQgaWQ7CisKK3Byb3RlY3RlZDoKKyAgdGltZV9wdXQoX0xvY2FsZV90aW1lKiAvKl9fdGltZSovLCBzaXplX3QgX19yZWZzKSA6IGxvY2FsZTo6ZmFjZXQoX19yZWZzKQorICB7fSAvL19TVExQX1BSSVYgX0luaXRfdGltZWluZm8oX01fdGltZWluZm8sIF9fdGltZSk7IH0KKworICB+dGltZV9wdXQoKSB7fQorICB2aXJ0dWFsIGl0ZXJfdHlwZSBkb19wdXQoaXRlcl90eXBlIF9fcywgaW9zX2Jhc2UmIF9fZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfdHlwZSAgLyogX19maWxsICovLCBjb25zdCB0bSogX190bWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIF9fZm9ybWF0LCBjaGFyIC8qIF9fbW9kaWZpZXIgKi8pIGNvbnN0OworCisgIF9TVExQX1BSSVYgX1RpbWVfSW5mbyBfTV90aW1laW5mbzsKK307CisKKyNpZiBkZWZpbmVkIChfU1RMUF9MSU1JVEVEX0RFRkFVTFRfVEVNUExBVEVTKQordGVtcGxhdGUgPGNsYXNzIF9DaCwgY2xhc3MgX091dEl0PgorI2Vsc2UKK3RlbXBsYXRlIDxjbGFzcyBfQ2gsIGNsYXNzIF9PdXRJdCA9IG9zdHJlYW1idWZfaXRlcmF0b3I8X0NoLCBjaGFyX3RyYWl0czxfQ2g+ID4gPgorI2VuZGlmCitjbGFzcyB0aW1lX3B1dF9ieW5hbWUgOiBwdWJsaWMgdGltZV9wdXQ8X0NoLCBfT3V0SXQ+IHsKKyAgZnJpZW5kIGNsYXNzIF9Mb2NhbGVfaW1wbDsKK3B1YmxpYzoKKyAgdHlwZWRlZiB0aW1lX2Jhc2U6OmRhdGVvcmRlciBkYXRlb3JkZXI7CisgIHR5cGVkZWYgX091dEl0IGl0ZXJfdHlwZTsKKyAgdHlwZWRlZiBfQ2ggICBjaGFyX3R5cGU7CisKKyAgZXhwbGljaXQgdGltZV9wdXRfYnluYW1lKGNvbnN0IGNoYXIgKiBfX25hbWUsIHNpemVfdCBfX3JlZnMgPSAwLCBfTG9jYWxlX25hbWVfaGludCogX19oaW50ID0gMCkKKyAgICA6IHRpbWVfcHV0PF9DaCwgX091dEl0PigoX0xvY2FsZV90aW1lKikgMCwgX19yZWZzKSwKKyAgICBfTV90aW1lKF9TVExQX1BSSVYgX19hY3F1aXJlX3RpbWUoX19uYW1lLCBfX2hpbnQpKQorICB7IF9TVExQX1BSSVYgX0luaXRfdGltZWluZm8odGhpcy0+X01fdGltZWluZm8sIHRoaXMtPl9NX3RpbWUpOyB9CisKK3Byb3RlY3RlZDoKKyAgfnRpbWVfcHV0X2J5bmFtZSgpIHsgX1NUTFBfUFJJViBfX3JlbGVhc2VfdGltZShfTV90aW1lKTsgfQorCitwcml2YXRlOgorICBfTG9jYWxlX3RpbWUqIF9NX3RpbWU7CisKKyAgdHlwZWRlZiB0aW1lX3B1dF9ieW5hbWU8X0NoLCBfT3V0SXQ+IF9TZWxmOworICAvL2V4cGxpY2l0ZWx5IGRlZmluZWQgYXMgcHJpdmF0ZSB0byBhdm9pZCB3YXJuaW5nczoKKyAgdGltZV9wdXRfYnluYW1lKF9TZWxmIGNvbnN0Jik7CisgIF9TZWxmJiBvcGVyYXRvciA9IChfU2VsZiBjb25zdCYpOworfTsKKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9URU1QTEFURV9FWFBPUlQpCitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgdGltZV9nZXQ8Y2hhciwgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+ID47CitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgdGltZV9wdXQ8Y2hhciwgb3N0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+ID47CisvLyBfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgdGltZV9nZXQ8Y2hhciwgY29uc3QgY2hhcio+OworLy8gX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIHRpbWVfcHV0PGNoYXIsIGNoYXIqPjsKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQorX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIHRpbWVfZ2V0PHdjaGFyX3QsIGlzdHJlYW1idWZfaXRlcmF0b3I8d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPiA+OworX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIHRpbWVfcHV0PHdjaGFyX3QsIG9zdHJlYW1idWZfaXRlcmF0b3I8d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4gPiA+OworLy8gX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIHRpbWVfZ2V0PHdjaGFyX3QsIGNvbnN0IHdjaGFyX3QqPjsKKy8vIF9TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyB0aW1lX3B1dDx3Y2hhcl90LCB3Y2hhcl90Kj47CisjICBlbmRpZgorCisjZW5kaWYKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjaWYgZGVmaW5lZCAoX1NUTFBfRVhQT1NFX1NUUkVBTV9JTVBMRU1FTlRBVElPTikgJiYgIWRlZmluZWQgKF9TVExQX0xJTktfVElNRV9JTlNUQU5USUFUSU9OKQorIyAgaW5jbHVkZSA8c3RsL190aW1lX2ZhY2V0cy5jPgorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9USU1FX0ZBQ0VUU19IICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvX3RyZWUuYyBiL3N0bC9fdHJlZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxOGZjYzQKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvX3RyZWUuYwpAQCAtMCwwICsxLDczMCBAQAorLyoKKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqIE1vZGlmaWVkIENSUCA3LzEwLzAwIGZvciBpbXByb3ZlZCBjb25mb3JtYW5jZSAvIGVmZmljaWVuY3kgb24gaW5zZXJ0X3VuaXF1ZSAvCisgKiBpbnNlcnRfZXF1YWwgd2l0aCB2YWxpZCBoaW50IC0tIGVmZmljaWVuY3kgaXMgaW1wcm92ZWQgYWxsIGFyb3VuZCwgYW5kIGl0IGlzCisgKiBzaG91bGQgbm93IGJlIHN0YW5kYXJkIGNvbmZvcm1pbmcgZm9yIGNvbXBsZXhpdHkgb24gaW5zZXJ0IHBvaW50IGltbWVkaWF0ZWx5CisgKiBhZnRlciBoaW50IChhbW9ydGl6ZWQgY29uc3RhbnQgdGltZSkuCisgKgorICovCisjaWZuZGVmIF9TVExQX1RSRUVfQworI2RlZmluZSBfU1RMUF9UUkVFX0MKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9UUkVFX0gKKyMgIGluY2x1ZGUgPHN0bC9fdHJlZS5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9ERUJVRykKKyMgIGRlZmluZSBfUmJfdHJlZSBfU1RMUF9OT05fREJHX05BTUUoUmJfdHJlZSkKKyNlbmRpZgorCisvLyBmYnA6IHRoZXNlIGRlZmluZXMgYXJlIGZvciBvdXRsaW5lIG1ldGhvZHMgZGVmaW5pdGlvbnMuCisvLyBuZWVkZWQgZm9yIGRlZmluaXRpb25zIHRvIGJlIHBvcnRhYmxlLiBTaG91bGQgbm90IGJlIHVzZWQgaW4gbWV0aG9kIGJvZGllcy4KKyNpZiBkZWZpbmVkIChfU1RMUF9ORVNURURfVFlQRV9QQVJBTV9CVUcpCisjICBkZWZpbmUgX19pdGVyYXRvcl9fICBfUmJfdHJlZV9pdGVyYXRvcjxfVmFsdWUsIF9TVExQX0hFQURFUl9UWVBFTkFNRSBfVHJhaXRzOjpfTm9uQ29uc3RUcmFpdHM+CisjICBkZWZpbmUgX19zaXplX3R5cGVfXyBzaXplX3QKKyMgIGRlZmluZSBpdGVyYXRvciBfX2l0ZXJhdG9yX18KKyNlbHNlCisjICBkZWZpbmUgX19pdGVyYXRvcl9fICBfU1RMUF9UWVBFTkFNRV9PTl9SRVRVUk5fVFlQRSBfUmJfdHJlZTxfS2V5LCBfQ29tcGFyZSwgX1ZhbHVlLCBfS2V5T2ZWYWx1ZSwgX1RyYWl0cywgX0FsbG9jPjo6aXRlcmF0b3IKKyMgIGRlZmluZSBfX3NpemVfdHlwZV9fICBfU1RMUF9UWVBFTkFNRV9PTl9SRVRVUk5fVFlQRSBfUmJfdHJlZTxfS2V5LCBfQ29tcGFyZSwgX1ZhbHVlLCBfS2V5T2ZWYWx1ZSwgX1RyYWl0cywgX0FsbG9jPjo6c2l6ZV90eXBlCisjZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKworI2lmIGRlZmluZWQgKF9TVExQX0VYUE9TRV9HTE9CQUxTX0lNUExFTUVOVEFUSU9OKQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0R1bW15PiB2b2lkIF9TVExQX0NBTEwKK19SYl9nbG9iYWw8X0R1bW15Pjo6X1JvdGF0ZV9sZWZ0KF9SYl90cmVlX25vZGVfYmFzZSogX194LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JiX3RyZWVfbm9kZV9iYXNlKiYgX19yb290KSB7CisgIF9SYl90cmVlX25vZGVfYmFzZSogX195ID0gX194LT5fTV9yaWdodDsKKyAgX194LT5fTV9yaWdodCA9IF9feS0+X01fbGVmdDsKKyAgaWYgKF9feS0+X01fbGVmdCAhPSAwKQorICAgIF9feS0+X01fbGVmdC0+X01fcGFyZW50ID0gX194OworICBfX3ktPl9NX3BhcmVudCA9IF9feC0+X01fcGFyZW50OworCisgIGlmIChfX3ggPT0gX19yb290KQorICAgIF9fcm9vdCA9IF9feTsKKyAgZWxzZSBpZiAoX194ID09IF9feC0+X01fcGFyZW50LT5fTV9sZWZ0KQorICAgIF9feC0+X01fcGFyZW50LT5fTV9sZWZ0ID0gX195OworICBlbHNlCisgICAgX194LT5fTV9wYXJlbnQtPl9NX3JpZ2h0ID0gX195OworICBfX3ktPl9NX2xlZnQgPSBfX3g7CisgIF9feC0+X01fcGFyZW50ID0gX195OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0R1bW15PiB2b2lkIF9TVExQX0NBTEwKK19SYl9nbG9iYWw8X0R1bW15Pjo6X1JvdGF0ZV9yaWdodChfUmJfdHJlZV9ub2RlX2Jhc2UqIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUmJfdHJlZV9ub2RlX2Jhc2UqJiBfX3Jvb3QpIHsKKyAgX1JiX3RyZWVfbm9kZV9iYXNlKiBfX3kgPSBfX3gtPl9NX2xlZnQ7CisgIF9feC0+X01fbGVmdCA9IF9feS0+X01fcmlnaHQ7CisgIGlmIChfX3ktPl9NX3JpZ2h0ICE9IDApCisgICAgX195LT5fTV9yaWdodC0+X01fcGFyZW50ID0gX194OworICBfX3ktPl9NX3BhcmVudCA9IF9feC0+X01fcGFyZW50OworCisgIGlmIChfX3ggPT0gX19yb290KQorICAgIF9fcm9vdCA9IF9feTsKKyAgZWxzZSBpZiAoX194ID09IF9feC0+X01fcGFyZW50LT5fTV9yaWdodCkKKyAgICBfX3gtPl9NX3BhcmVudC0+X01fcmlnaHQgPSBfX3k7CisgIGVsc2UKKyAgICBfX3gtPl9NX3BhcmVudC0+X01fbGVmdCA9IF9feTsKKyAgX195LT5fTV9yaWdodCA9IF9feDsKKyAgX194LT5fTV9wYXJlbnQgPSBfX3k7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfRHVtbXk+IHZvaWQgX1NUTFBfQ0FMTAorX1JiX2dsb2JhbDxfRHVtbXk+OjpfUmViYWxhbmNlKF9SYl90cmVlX25vZGVfYmFzZSogX194LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9SYl90cmVlX25vZGVfYmFzZSomIF9fcm9vdCkgeworICBfX3gtPl9NX2NvbG9yID0gX1NfcmJfdHJlZV9yZWQ7CisgIHdoaWxlIChfX3ggIT0gX19yb290ICYmIF9feC0+X01fcGFyZW50LT5fTV9jb2xvciA9PSBfU19yYl90cmVlX3JlZCkgeworICAgIGlmIChfX3gtPl9NX3BhcmVudCA9PSBfX3gtPl9NX3BhcmVudC0+X01fcGFyZW50LT5fTV9sZWZ0KSB7CisgICAgICBfUmJfdHJlZV9ub2RlX2Jhc2UqIF9feSA9IF9feC0+X01fcGFyZW50LT5fTV9wYXJlbnQtPl9NX3JpZ2h0OworICAgICAgaWYgKF9feSAmJiBfX3ktPl9NX2NvbG9yID09IF9TX3JiX3RyZWVfcmVkKSB7CisgICAgICAgIF9feC0+X01fcGFyZW50LT5fTV9jb2xvciA9IF9TX3JiX3RyZWVfYmxhY2s7CisgICAgICAgIF9feS0+X01fY29sb3IgPSBfU19yYl90cmVlX2JsYWNrOworICAgICAgICBfX3gtPl9NX3BhcmVudC0+X01fcGFyZW50LT5fTV9jb2xvciA9IF9TX3JiX3RyZWVfcmVkOworICAgICAgICBfX3ggPSBfX3gtPl9NX3BhcmVudC0+X01fcGFyZW50OworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGlmIChfX3ggPT0gX194LT5fTV9wYXJlbnQtPl9NX3JpZ2h0KSB7CisgICAgICAgICAgX194ID0gX194LT5fTV9wYXJlbnQ7CisgICAgICAgICAgX1JvdGF0ZV9sZWZ0KF9feCwgX19yb290KTsKKyAgICAgICAgfQorICAgICAgICBfX3gtPl9NX3BhcmVudC0+X01fY29sb3IgPSBfU19yYl90cmVlX2JsYWNrOworICAgICAgICBfX3gtPl9NX3BhcmVudC0+X01fcGFyZW50LT5fTV9jb2xvciA9IF9TX3JiX3RyZWVfcmVkOworICAgICAgICBfUm90YXRlX3JpZ2h0KF9feC0+X01fcGFyZW50LT5fTV9wYXJlbnQsIF9fcm9vdCk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgX1JiX3RyZWVfbm9kZV9iYXNlKiBfX3kgPSBfX3gtPl9NX3BhcmVudC0+X01fcGFyZW50LT5fTV9sZWZ0OworICAgICAgaWYgKF9feSAmJiBfX3ktPl9NX2NvbG9yID09IF9TX3JiX3RyZWVfcmVkKSB7CisgICAgICAgIF9feC0+X01fcGFyZW50LT5fTV9jb2xvciA9IF9TX3JiX3RyZWVfYmxhY2s7CisgICAgICAgIF9feS0+X01fY29sb3IgPSBfU19yYl90cmVlX2JsYWNrOworICAgICAgICBfX3gtPl9NX3BhcmVudC0+X01fcGFyZW50LT5fTV9jb2xvciA9IF9TX3JiX3RyZWVfcmVkOworICAgICAgICBfX3ggPSBfX3gtPl9NX3BhcmVudC0+X01fcGFyZW50OworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGlmIChfX3ggPT0gX194LT5fTV9wYXJlbnQtPl9NX2xlZnQpIHsKKyAgICAgICAgICBfX3ggPSBfX3gtPl9NX3BhcmVudDsKKyAgICAgICAgICBfUm90YXRlX3JpZ2h0KF9feCwgX19yb290KTsKKyAgICAgICAgfQorICAgICAgICBfX3gtPl9NX3BhcmVudC0+X01fY29sb3IgPSBfU19yYl90cmVlX2JsYWNrOworICAgICAgICBfX3gtPl9NX3BhcmVudC0+X01fcGFyZW50LT5fTV9jb2xvciA9IF9TX3JiX3RyZWVfcmVkOworICAgICAgICBfUm90YXRlX2xlZnQoX194LT5fTV9wYXJlbnQtPl9NX3BhcmVudCwgX19yb290KTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgX19yb290LT5fTV9jb2xvciA9IF9TX3JiX3RyZWVfYmxhY2s7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfRHVtbXk+IF9SYl90cmVlX25vZGVfYmFzZSogX1NUTFBfQ0FMTAorX1JiX2dsb2JhbDxfRHVtbXk+OjpfUmViYWxhbmNlX2Zvcl9lcmFzZShfUmJfdHJlZV9ub2RlX2Jhc2UqIF9feiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JiX3RyZWVfbm9kZV9iYXNlKiYgX19yb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUmJfdHJlZV9ub2RlX2Jhc2UqJiBfX2xlZnRtb3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUmJfdHJlZV9ub2RlX2Jhc2UqJiBfX3JpZ2h0bW9zdCkgeworICBfUmJfdHJlZV9ub2RlX2Jhc2UqIF9feSA9IF9fejsKKyAgX1JiX3RyZWVfbm9kZV9iYXNlKiBfX3g7CisgIF9SYl90cmVlX25vZGVfYmFzZSogX194X3BhcmVudDsKKworICBpZiAoX195LT5fTV9sZWZ0ID09IDApICAgICAvLyBfX3ogaGFzIGF0IG1vc3Qgb25lIG5vbi1udWxsIGNoaWxkLiB5ID09IHouCisgICAgX194ID0gX195LT5fTV9yaWdodDsgICAgIC8vIF9feCBtaWdodCBiZSBudWxsLgorICBlbHNlIHsKKyAgICBpZiAoX195LT5fTV9yaWdodCA9PSAwKSAgLy8gX196IGhhcyBleGFjdGx5IG9uZSBub24tbnVsbCBjaGlsZC4geSA9PSB6LgorICAgICAgX194ID0gX195LT5fTV9sZWZ0OyAgICAvLyBfX3ggaXMgbm90IG51bGwuCisgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgIC8vIF9feiBoYXMgdHdvIG5vbi1udWxsIGNoaWxkcmVuLiAgU2V0IF9feSB0bworICAgICAgX195ID0gX1JiX3RyZWVfbm9kZV9iYXNlOjpfU19taW5pbXVtKF9feS0+X01fcmlnaHQpOyAgIC8vICAgX196J3Mgc3VjY2Vzc29yLiAgX194IG1pZ2h0IGJlIG51bGwuCisgICAgICBfX3ggPSBfX3ktPl9NX3JpZ2h0OworICAgIH0KKyAgfQorCisgIGlmIChfX3kgIT0gX196KSB7ICAgICAgICAgIC8vIHJlbGluayB5IGluIHBsYWNlIG9mIHouICB5IGlzIHoncyBzdWNjZXNzb3IKKyAgICBfX3otPl9NX2xlZnQtPl9NX3BhcmVudCA9IF9feTsKKyAgICBfX3ktPl9NX2xlZnQgPSBfX3otPl9NX2xlZnQ7CisgICAgaWYgKF9feSAhPSBfX3otPl9NX3JpZ2h0KSB7CisgICAgICBfX3hfcGFyZW50ID0gX195LT5fTV9wYXJlbnQ7CisgICAgICBpZiAoX194KSBfX3gtPl9NX3BhcmVudCA9IF9feS0+X01fcGFyZW50OworICAgICAgX195LT5fTV9wYXJlbnQtPl9NX2xlZnQgPSBfX3g7ICAgICAgLy8gX195IG11c3QgYmUgYSBjaGlsZCBvZiBfTV9sZWZ0CisgICAgICBfX3ktPl9NX3JpZ2h0ID0gX196LT5fTV9yaWdodDsKKyAgICAgIF9fei0+X01fcmlnaHQtPl9NX3BhcmVudCA9IF9feTsKKyAgICB9CisgICAgZWxzZQorICAgICAgX194X3BhcmVudCA9IF9feTsKKyAgICBpZiAoX19yb290ID09IF9feikKKyAgICAgIF9fcm9vdCA9IF9feTsKKyAgICBlbHNlIGlmIChfX3otPl9NX3BhcmVudC0+X01fbGVmdCA9PSBfX3opCisgICAgICBfX3otPl9NX3BhcmVudC0+X01fbGVmdCA9IF9feTsKKyAgICBlbHNlCisgICAgICBfX3otPl9NX3BhcmVudC0+X01fcmlnaHQgPSBfX3k7CisgICAgX195LT5fTV9wYXJlbnQgPSBfX3otPl9NX3BhcmVudDsKKyAgICBfU1RMUF9TVEQ6OnN3YXAoX195LT5fTV9jb2xvciwgX196LT5fTV9jb2xvcik7CisgICAgX195ID0gX196OworICAgIC8vIF9feSBub3cgcG9pbnRzIHRvIG5vZGUgdG8gYmUgYWN0dWFsbHkgZGVsZXRlZAorICB9CisgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgIC8vIF9feSA9PSBfX3oKKyAgICBfX3hfcGFyZW50ID0gX195LT5fTV9wYXJlbnQ7CisgICAgaWYgKF9feCkgX194LT5fTV9wYXJlbnQgPSBfX3ktPl9NX3BhcmVudDsKKyAgICBpZiAoX19yb290ID09IF9feikKKyAgICAgIF9fcm9vdCA9IF9feDsKKyAgICBlbHNlIHsKKyAgICAgIGlmIChfX3otPl9NX3BhcmVudC0+X01fbGVmdCA9PSBfX3opCisgICAgICAgIF9fei0+X01fcGFyZW50LT5fTV9sZWZ0ID0gX194OworICAgICAgZWxzZQorICAgICAgICBfX3otPl9NX3BhcmVudC0+X01fcmlnaHQgPSBfX3g7CisgICAgfQorCisgICAgaWYgKF9fbGVmdG1vc3QgPT0gX196KSB7CisgICAgICBpZiAoX196LT5fTV9yaWdodCA9PSAwKSAgICAgICAgLy8gX196LT5fTV9sZWZ0IG11c3QgYmUgbnVsbCBhbHNvCisgICAgICAgIF9fbGVmdG1vc3QgPSBfX3otPl9NX3BhcmVudDsKKyAgICAvLyBtYWtlcyBfX2xlZnRtb3N0ID09IF9NX2hlYWRlciBpZiBfX3ogPT0gX19yb290CisgICAgICBlbHNlCisgICAgICAgIF9fbGVmdG1vc3QgPSBfUmJfdHJlZV9ub2RlX2Jhc2U6Ol9TX21pbmltdW0oX194KTsKKyAgICB9CisgICAgaWYgKF9fcmlnaHRtb3N0ID09IF9feikgeworICAgICAgaWYgKF9fei0+X01fbGVmdCA9PSAwKSAgICAgICAgIC8vIF9fei0+X01fcmlnaHQgbXVzdCBiZSBudWxsIGFsc28KKyAgICAgICAgX19yaWdodG1vc3QgPSBfX3otPl9NX3BhcmVudDsKKyAgICAvLyBtYWtlcyBfX3JpZ2h0bW9zdCA9PSBfTV9oZWFkZXIgaWYgX196ID09IF9fcm9vdAorICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAvLyBfX3ggPT0gX196LT5fTV9sZWZ0CisgICAgICAgIF9fcmlnaHRtb3N0ID0gX1JiX3RyZWVfbm9kZV9iYXNlOjpfU19tYXhpbXVtKF9feCk7CisgICAgfQorICB9CisKKyAgaWYgKF9feS0+X01fY29sb3IgIT0gX1NfcmJfdHJlZV9yZWQpIHsKKyAgICB3aGlsZSAoX194ICE9IF9fcm9vdCAmJiAoX194ID09IDAgfHwgX194LT5fTV9jb2xvciA9PSBfU19yYl90cmVlX2JsYWNrKSkKKyAgICAgIGlmIChfX3ggPT0gX194X3BhcmVudC0+X01fbGVmdCkgeworICAgICAgICBfUmJfdHJlZV9ub2RlX2Jhc2UqIF9fdyA9IF9feF9wYXJlbnQtPl9NX3JpZ2h0OworICAgICAgICBpZiAoX193LT5fTV9jb2xvciA9PSBfU19yYl90cmVlX3JlZCkgeworICAgICAgICAgIF9fdy0+X01fY29sb3IgPSBfU19yYl90cmVlX2JsYWNrOworICAgICAgICAgIF9feF9wYXJlbnQtPl9NX2NvbG9yID0gX1NfcmJfdHJlZV9yZWQ7CisgICAgICAgICAgX1JvdGF0ZV9sZWZ0KF9feF9wYXJlbnQsIF9fcm9vdCk7CisgICAgICAgICAgX193ID0gX194X3BhcmVudC0+X01fcmlnaHQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChfX3ctPl9NX2xlZnQgPT0gMCB8fAorICAgICAgICAgICAgIF9fdy0+X01fbGVmdC0+X01fY29sb3IgPT0gX1NfcmJfdHJlZV9ibGFjaykgJiYgKF9fdy0+X01fcmlnaHQgPT0gMCB8fAorICAgICAgICAgICAgIF9fdy0+X01fcmlnaHQtPl9NX2NvbG9yID09IF9TX3JiX3RyZWVfYmxhY2spKSB7CisgICAgICAgICAgX193LT5fTV9jb2xvciA9IF9TX3JiX3RyZWVfcmVkOworICAgICAgICAgIF9feCA9IF9feF9wYXJlbnQ7CisgICAgICAgICAgX194X3BhcmVudCA9IF9feF9wYXJlbnQtPl9NX3BhcmVudDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoX193LT5fTV9yaWdodCA9PSAwIHx8CisgICAgICAgICAgICAgIF9fdy0+X01fcmlnaHQtPl9NX2NvbG9yID09IF9TX3JiX3RyZWVfYmxhY2spIHsKKyAgICAgICAgICAgIGlmIChfX3ctPl9NX2xlZnQpIF9fdy0+X01fbGVmdC0+X01fY29sb3IgPSBfU19yYl90cmVlX2JsYWNrOworICAgICAgICAgICAgX193LT5fTV9jb2xvciA9IF9TX3JiX3RyZWVfcmVkOworICAgICAgICAgICAgX1JvdGF0ZV9yaWdodChfX3csIF9fcm9vdCk7CisgICAgICAgICAgICBfX3cgPSBfX3hfcGFyZW50LT5fTV9yaWdodDsKKyAgICAgICAgICB9CisgICAgICAgICAgX193LT5fTV9jb2xvciA9IF9feF9wYXJlbnQtPl9NX2NvbG9yOworICAgICAgICAgIF9feF9wYXJlbnQtPl9NX2NvbG9yID0gX1NfcmJfdHJlZV9ibGFjazsKKyAgICAgICAgICBpZiAoX193LT5fTV9yaWdodCkgX193LT5fTV9yaWdodC0+X01fY29sb3IgPSBfU19yYl90cmVlX2JsYWNrOworICAgICAgICAgIF9Sb3RhdGVfbGVmdChfX3hfcGFyZW50LCBfX3Jvb3QpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUsIHdpdGggX01fcmlnaHQgPC0+IF9NX2xlZnQuCisgICAgICAgIF9SYl90cmVlX25vZGVfYmFzZSogX193ID0gX194X3BhcmVudC0+X01fbGVmdDsKKyAgICAgICAgaWYgKF9fdy0+X01fY29sb3IgPT0gX1NfcmJfdHJlZV9yZWQpIHsKKyAgICAgICAgICBfX3ctPl9NX2NvbG9yID0gX1NfcmJfdHJlZV9ibGFjazsKKyAgICAgICAgICBfX3hfcGFyZW50LT5fTV9jb2xvciA9IF9TX3JiX3RyZWVfcmVkOworICAgICAgICAgIF9Sb3RhdGVfcmlnaHQoX194X3BhcmVudCwgX19yb290KTsKKyAgICAgICAgICBfX3cgPSBfX3hfcGFyZW50LT5fTV9sZWZ0OworICAgICAgICB9CisgICAgICAgIGlmICgoX193LT5fTV9yaWdodCA9PSAwIHx8CisgICAgICAgICAgICAgX193LT5fTV9yaWdodC0+X01fY29sb3IgPT0gX1NfcmJfdHJlZV9ibGFjaykgJiYgKF9fdy0+X01fbGVmdCA9PSAwIHx8CisgICAgICAgICAgICAgX193LT5fTV9sZWZ0LT5fTV9jb2xvciA9PSBfU19yYl90cmVlX2JsYWNrKSkgeworICAgICAgICAgIF9fdy0+X01fY29sb3IgPSBfU19yYl90cmVlX3JlZDsKKyAgICAgICAgICBfX3ggPSBfX3hfcGFyZW50OworICAgICAgICAgIF9feF9wYXJlbnQgPSBfX3hfcGFyZW50LT5fTV9wYXJlbnQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKF9fdy0+X01fbGVmdCA9PSAwIHx8CisgICAgICAgICAgICAgIF9fdy0+X01fbGVmdC0+X01fY29sb3IgPT0gX1NfcmJfdHJlZV9ibGFjaykgeworICAgICAgICAgICAgaWYgKF9fdy0+X01fcmlnaHQpIF9fdy0+X01fcmlnaHQtPl9NX2NvbG9yID0gX1NfcmJfdHJlZV9ibGFjazsKKyAgICAgICAgICAgIF9fdy0+X01fY29sb3IgPSBfU19yYl90cmVlX3JlZDsKKyAgICAgICAgICAgIF9Sb3RhdGVfbGVmdChfX3csIF9fcm9vdCk7CisgICAgICAgICAgICBfX3cgPSBfX3hfcGFyZW50LT5fTV9sZWZ0OworICAgICAgICAgIH0KKyAgICAgICAgICBfX3ctPl9NX2NvbG9yID0gX194X3BhcmVudC0+X01fY29sb3I7CisgICAgICAgICAgX194X3BhcmVudC0+X01fY29sb3IgPSBfU19yYl90cmVlX2JsYWNrOworICAgICAgICAgIGlmIChfX3ctPl9NX2xlZnQpIF9fdy0+X01fbGVmdC0+X01fY29sb3IgPSBfU19yYl90cmVlX2JsYWNrOworICAgICAgICAgIF9Sb3RhdGVfcmlnaHQoX194X3BhcmVudCwgX19yb290KTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIGlmIChfX3gpIF9feC0+X01fY29sb3IgPSBfU19yYl90cmVlX2JsYWNrOworICB9CisgIHJldHVybiBfX3k7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfRHVtbXk+IF9SYl90cmVlX25vZGVfYmFzZSogX1NUTFBfQ0FMTAorX1JiX2dsb2JhbDxfRHVtbXk+OjpfTV9kZWNyZW1lbnQoX1JiX3RyZWVfbm9kZV9iYXNlKiBfTV9ub2RlKSB7CisgIGlmIChfTV9ub2RlLT5fTV9jb2xvciA9PSBfU19yYl90cmVlX3JlZCAmJiBfTV9ub2RlLT5fTV9wYXJlbnQtPl9NX3BhcmVudCA9PSBfTV9ub2RlKQorICAgIF9NX25vZGUgPSBfTV9ub2RlLT5fTV9yaWdodDsKKyAgZWxzZSBpZiAoX01fbm9kZS0+X01fbGVmdCAhPSAwKSB7CisgICAgX01fbm9kZSA9IF9SYl90cmVlX25vZGVfYmFzZTo6X1NfbWF4aW11bShfTV9ub2RlLT5fTV9sZWZ0KTsKKyAgfQorICBlbHNlIHsKKyAgICBfQmFzZV9wdHIgX195ID0gX01fbm9kZS0+X01fcGFyZW50OworICAgIHdoaWxlIChfTV9ub2RlID09IF9feS0+X01fbGVmdCkgeworICAgICAgX01fbm9kZSA9IF9feTsKKyAgICAgIF9feSA9IF9feS0+X01fcGFyZW50OworICAgIH0KKyAgICBfTV9ub2RlID0gX195OworICB9CisgIHJldHVybiBfTV9ub2RlOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0R1bW15PiBfUmJfdHJlZV9ub2RlX2Jhc2UqIF9TVExQX0NBTEwKK19SYl9nbG9iYWw8X0R1bW15Pjo6X01faW5jcmVtZW50KF9SYl90cmVlX25vZGVfYmFzZSogX01fbm9kZSkgeworICBpZiAoX01fbm9kZS0+X01fcmlnaHQgIT0gMCkgeworICAgIF9NX25vZGUgPSBfUmJfdHJlZV9ub2RlX2Jhc2U6Ol9TX21pbmltdW0oX01fbm9kZS0+X01fcmlnaHQpOworICB9CisgIGVsc2UgeworICAgIF9CYXNlX3B0ciBfX3kgPSBfTV9ub2RlLT5fTV9wYXJlbnQ7CisgICAgd2hpbGUgKF9NX25vZGUgPT0gX195LT5fTV9yaWdodCkgeworICAgICAgX01fbm9kZSA9IF9feTsKKyAgICAgIF9feSA9IF9feS0+X01fcGFyZW50OworICAgIH0KKyAgICAvLyBjaGVjayBzcGVjaWFsIGNhc2U6IFRoaXMgaXMgbmVjZXNzYXJ5IGlmIF9NX25vZGUgaXMgdGhlCisgICAgLy8gX01faGVhZCBhbmQgdGhlIHRyZWUgY29udGFpbnMgb25seSBhIHNpbmdsZSBub2RlIF9feS4gSW4KKyAgICAvLyB0aGF0IGNhc2UgcGFyZW50LCBsZWZ0IGFuZCByaWdodCBhbGwgcG9pbnQgdG8gX195IQorICAgIGlmIChfTV9ub2RlLT5fTV9yaWdodCAhPSBfX3kpCisgICAgICBfTV9ub2RlID0gX195OworICB9CisgIHJldHVybiBfTV9ub2RlOworfQorCisjZW5kaWYgLyogX1NUTFBfRVhQT1NFX0dMT0JBTFNfSU1QTEVNRU5UQVRJT04gKi8KKworCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX0NvbXBhcmUsCisgICAgICAgICAgY2xhc3MgX1ZhbHVlLCBjbGFzcyBfS2V5T2ZWYWx1ZSwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorX1JiX3RyZWU8X0tleSxfQ29tcGFyZSxfVmFsdWUsX0tleU9mVmFsdWUsX1RyYWl0cyxfQWxsb2M+JgorX1JiX3RyZWU8X0tleSxfQ29tcGFyZSxfVmFsdWUsX0tleU9mVmFsdWUsX1RyYWl0cyxfQWxsb2M+IDo6b3BlcmF0b3I9KAorICBjb25zdCBfUmJfdHJlZTxfS2V5LF9Db21wYXJlLF9WYWx1ZSxfS2V5T2ZWYWx1ZSxfVHJhaXRzLF9BbGxvYz4mIF9feCkgeworICBpZiAodGhpcyAhPSAmX194KSB7CisgICAgLy8gTm90ZSB0aGF0IF9LZXkgbWF5IGJlIGEgY29uc3RhbnQgdHlwZS4KKyAgICBjbGVhcigpOworICAgIF9NX25vZGVfY291bnQgPSAwOworICAgIF9NX2tleV9jb21wYXJlID0gX194Ll9NX2tleV9jb21wYXJlOworICAgIGlmIChfX3guX01fcm9vdCgpID09IDApIHsKKyAgICAgIF9NX3Jvb3QoKSA9IDA7CisgICAgICBfTV9sZWZ0bW9zdCgpID0gJnRoaXMtPl9NX2hlYWRlci5fTV9kYXRhOworICAgICAgX01fcmlnaHRtb3N0KCkgPSAmdGhpcy0+X01faGVhZGVyLl9NX2RhdGE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgX01fcm9vdCgpID0gX01fY29weShfX3guX01fcm9vdCgpLCAmdGhpcy0+X01faGVhZGVyLl9NX2RhdGEpOworICAgICAgX01fbGVmdG1vc3QoKSA9IF9TX21pbmltdW0oX01fcm9vdCgpKTsKKyAgICAgIF9NX3JpZ2h0bW9zdCgpID0gX1NfbWF4aW11bShfTV9yb290KCkpOworICAgICAgX01fbm9kZV9jb3VudCA9IF9feC5fTV9ub2RlX2NvdW50OworICAgIH0KKyAgfQorICByZXR1cm4gKnRoaXM7Cit9CisKKy8vIENSUCA3LzEwLzAwIGluc2VydGVkIGFyZ3VtZW50IF9fb25fcmlnaHQsIHdoaWNoIGlzIGFub3RoZXIgaGludCAobWVhbnQgdG8KKy8vIGFjdCBsaWtlIF9fb25fbGVmdCBhbmQgaWdub3JlIGEgcG9ydGlvbiBvZiB0aGUgaWYgY29uZGl0aW9ucyAtLSBzcGVjaWZ5CisvLyBfX29uX3JpZ2h0ICE9IDAgdG8gYnlwYXNzIGNvbXBhcmlzb24gYXMgZmFsc2Ugb3IgX19vbl9sZWZ0ICE9IDAgdG8gYnlwYXNzCisvLyBjb21wYXJpc29uIGFzIHRydWUpCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX0NvbXBhcmUsCisgICAgICAgICAgY2xhc3MgX1ZhbHVlLCBjbGFzcyBfS2V5T2ZWYWx1ZSwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorX19pdGVyYXRvcl9fCitfUmJfdHJlZTxfS2V5LF9Db21wYXJlLF9WYWx1ZSxfS2V5T2ZWYWx1ZSxfVHJhaXRzLF9BbGxvYz4gOjpfTV9pbnNlcnQoX1JiX3RyZWVfbm9kZV9iYXNlICogX19wYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1ZhbHVlJiBfX3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUmJfdHJlZV9ub2RlX2Jhc2UgKiBfX29uX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JiX3RyZWVfbm9kZV9iYXNlICogX19vbl9yaWdodCkgeworICAvLyBXZSBkbyBub3QgY3JlYXRlIHRoZSBub2RlIGhlcmUgYXMsIGRlcGVuZGluZyBvbiB0ZXN0cywgd2UgbWlnaHQgY2FsbAorICAvLyBfTV9rZXlfY29tcGFyZSB0aGF0IGNhbiB0aHJvdyBhbiBleGNlcHRpb24uCisgIF9CYXNlX3B0ciBfX25ld19ub2RlOworCisgIGlmICggX19wYXJlbnQgPT0gJnRoaXMtPl9NX2hlYWRlci5fTV9kYXRhICkgeworICAgIF9fbmV3X25vZGUgPSBfTV9jcmVhdGVfbm9kZShfX3ZhbCk7CisgICAgX1NfbGVmdChfX3BhcmVudCkgPSBfX25ld19ub2RlOyAgIC8vIGFsc28gbWFrZXMgX01fbGVmdG1vc3QoKSA9IF9fbmV3X25vZGUKKyAgICBfTV9yb290KCkgPSBfX25ld19ub2RlOworICAgIF9NX3JpZ2h0bW9zdCgpID0gX19uZXdfbm9kZTsKKyAgfQorICBlbHNlIGlmICggX19vbl9yaWdodCA9PSAwICYmICAgICAvLyBJZiBfX29uX3JpZ2h0ICE9IDAsIHRoZSByZW1haW5kZXIgZmFpbHMgdG8gZmFsc2UKKyAgICAgICAgICAgKCBfX29uX2xlZnQgIT0gMCB8fCAgICAgLy8gSWYgX19vbl9sZWZ0ICE9IDAsIHRoZSByZW1haW5kZXIgc3VjY2VlZHMgdG8gdHJ1ZQorICAgICAgICAgICAgIF9NX2tleV9jb21wYXJlKCBfS2V5T2ZWYWx1ZSgpKF9fdmFsKSwgX1Nfa2V5KF9fcGFyZW50KSApICkgKSB7CisgICAgX19uZXdfbm9kZSA9IF9NX2NyZWF0ZV9ub2RlKF9fdmFsKTsKKyAgICBfU19sZWZ0KF9fcGFyZW50KSA9IF9fbmV3X25vZGU7CisgICAgaWYgKF9fcGFyZW50ID09IF9NX2xlZnRtb3N0KCkpCisgICAgICBfTV9sZWZ0bW9zdCgpID0gX19uZXdfbm9kZTsgICAvLyBtYWludGFpbiBfTV9sZWZ0bW9zdCgpIHBvaW50aW5nIHRvIG1pbiBub2RlCisgIH0KKyAgZWxzZSB7CisgICAgX19uZXdfbm9kZSA9IF9NX2NyZWF0ZV9ub2RlKF9fdmFsKTsKKyAgICBfU19yaWdodChfX3BhcmVudCkgPSBfX25ld19ub2RlOworICAgIGlmIChfX3BhcmVudCA9PSBfTV9yaWdodG1vc3QoKSkKKyAgICAgIF9NX3JpZ2h0bW9zdCgpID0gX19uZXdfbm9kZTsgIC8vIG1haW50YWluIF9NX3JpZ2h0bW9zdCgpIHBvaW50aW5nIHRvIG1heCBub2RlCisgIH0KKyAgX1NfcGFyZW50KF9fbmV3X25vZGUpID0gX19wYXJlbnQ7CisgIF9SYl9nbG9iYWxfaW5zdDo6X1JlYmFsYW5jZShfX25ld19ub2RlLCB0aGlzLT5fTV9oZWFkZXIuX01fZGF0YS5fTV9wYXJlbnQpOworICArK19NX25vZGVfY291bnQ7CisgIHJldHVybiBpdGVyYXRvcihfX25ld19ub2RlKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9Db21wYXJlLAorICAgICAgICAgIGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0tleU9mVmFsdWUsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK19faXRlcmF0b3JfXworX1JiX3RyZWU8X0tleSxfQ29tcGFyZSxfVmFsdWUsX0tleU9mVmFsdWUsX1RyYWl0cyxfQWxsb2M+IDo6aW5zZXJ0X2VxdWFsKGNvbnN0IF9WYWx1ZSYgX192YWwpIHsKKyAgX0Jhc2VfcHRyIF9feSA9ICZ0aGlzLT5fTV9oZWFkZXIuX01fZGF0YTsKKyAgX0Jhc2VfcHRyIF9feCA9IF9NX3Jvb3QoKTsKKyAgd2hpbGUgKF9feCAhPSAwKSB7CisgICAgX195ID0gX194OworICAgIGlmIChfTV9rZXlfY29tcGFyZShfS2V5T2ZWYWx1ZSgpKF9fdmFsKSwgX1Nfa2V5KF9feCkpKSB7CisgICAgICBfX3ggPSBfU19sZWZ0KF9feCk7CisgICAgfQorICAgIGVsc2UKKyAgICAgIF9feCA9IF9TX3JpZ2h0KF9feCk7CisgIH0KKyAgcmV0dXJuIF9NX2luc2VydChfX3ksIF9fdmFsLCBfX3gpOworfQorCisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfQ29tcGFyZSwKKyAgICAgICAgICBjbGFzcyBfVmFsdWUsIGNsYXNzIF9LZXlPZlZhbHVlLCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CitwYWlyPF9faXRlcmF0b3JfXywgYm9vbD4KK19SYl90cmVlPF9LZXksX0NvbXBhcmUsX1ZhbHVlLF9LZXlPZlZhbHVlLF9UcmFpdHMsX0FsbG9jPiA6Omluc2VydF91bmlxdWUoY29uc3QgX1ZhbHVlJiBfX3ZhbCkgeworICBfQmFzZV9wdHIgX195ID0gJnRoaXMtPl9NX2hlYWRlci5fTV9kYXRhOworICBfQmFzZV9wdHIgX194ID0gX01fcm9vdCgpOworICBib29sIF9fY29tcCA9IHRydWU7CisgIHdoaWxlIChfX3ggIT0gMCkgeworICAgIF9feSA9IF9feDsKKyAgICBfX2NvbXAgPSBfTV9rZXlfY29tcGFyZShfS2V5T2ZWYWx1ZSgpKF9fdmFsKSwgX1Nfa2V5KF9feCkpOworICAgIF9feCA9IF9fY29tcCA/IF9TX2xlZnQoX194KSA6IF9TX3JpZ2h0KF9feCk7CisgIH0KKyAgaXRlcmF0b3IgX19qID0gaXRlcmF0b3IoX195KTsKKyAgaWYgKF9fY29tcCkgeworICAgIGlmIChfX2ogPT0gYmVnaW4oKSkKKyAgICAgIHJldHVybiBwYWlyPGl0ZXJhdG9yLGJvb2w+KF9NX2luc2VydChfX3ksIF9fdmFsLCAvKiBfX3gqLyBfX3kpLCB0cnVlKTsKKyAgICBlbHNlCisgICAgICAtLV9fajsKKyAgfQorICBpZiAoX01fa2V5X2NvbXBhcmUoX1Nfa2V5KF9fai5fTV9ub2RlKSwgX0tleU9mVmFsdWUoKShfX3ZhbCkpKSB7CisgICAgcmV0dXJuIHBhaXI8aXRlcmF0b3IsYm9vbD4oX01faW5zZXJ0KF9feSwgX192YWwsIF9feCksIHRydWUpOworICB9CisgIHJldHVybiBwYWlyPGl0ZXJhdG9yLGJvb2w+KF9faiwgZmFsc2UpOworfQorCisvLyBNb2RpZmljYXRpb25zIENSUCA3LzEwLzAwIGFzIG5vdGVkIHRvIGltcHJvdmUgY29uZm9ybWFuY2UgYW5kCisvLyBlZmZpY2llbmN5LgordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9Db21wYXJlLAorICAgICAgICAgIGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0tleU9mVmFsdWUsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK19faXRlcmF0b3JfXworX1JiX3RyZWU8X0tleSxfQ29tcGFyZSxfVmFsdWUsX0tleU9mVmFsdWUsX1RyYWl0cyxfQWxsb2M+IDo6aW5zZXJ0X3VuaXF1ZShpdGVyYXRvciBfX3Bvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfVmFsdWUmIF9fdmFsKSB7CisgIGlmIChfX3Bvc2l0aW9uLl9NX25vZGUgPT0gdGhpcy0+X01faGVhZGVyLl9NX2RhdGEuX01fbGVmdCkgeyAvLyBiZWdpbigpCisKKyAgICAvLyBpZiB0aGUgY29udGFpbmVyIGlzIGVtcHR5LCBmYWxsIGJhY2sgb24gaW5zZXJ0X3VuaXF1ZS4KKyAgICBpZiAoZW1wdHkoKSkKKyAgICAgIHJldHVybiBpbnNlcnRfdW5pcXVlKF9fdmFsKS5maXJzdDsKKworICAgIGlmIChfTV9rZXlfY29tcGFyZShfS2V5T2ZWYWx1ZSgpKF9fdmFsKSwgX1Nfa2V5KF9fcG9zaXRpb24uX01fbm9kZSkpKSB7CisgICAgICByZXR1cm4gX01faW5zZXJ0KF9fcG9zaXRpb24uX01fbm9kZSwgX192YWwsIF9fcG9zaXRpb24uX01fbm9kZSk7CisgICAgfQorICAgIC8vIGZpcnN0IGFyZ3VtZW50IGp1c3QgbmVlZHMgdG8gYmUgbm9uLW51bGwKKyAgICBlbHNlIHsKKyAgICAgIGJvb2wgX19jb21wX3Bvc192ID0gX01fa2V5X2NvbXBhcmUoIF9TX2tleShfX3Bvc2l0aW9uLl9NX25vZGUpLCBfS2V5T2ZWYWx1ZSgpKF9fdmFsKSApOworCisgICAgICBpZiAoX19jb21wX3Bvc192ID09IGZhbHNlKSAgLy8gY29tcGFyZSA+IGFuZCBjb21wYXJlIDwgYm90aCBmYWxzZSBzbyBjb21wYXJlIGVxdWFsCisgICAgICAgIHJldHVybiBfX3Bvc2l0aW9uOworICAgICAgLy9CZWxvdyBfX2NvbXBfcG9zX3YgPT0gdHJ1ZQorCisgICAgICAvLyBTdGFuZGFyZC1jb25mb3JtYW5jZSAtIGRvZXMgdGhlIGluc2VydGlvbiBwb2ludCBmYWxsIGltbWVkaWF0ZWx5IEFGVEVSCisgICAgICAvLyB0aGUgaGludD8KKyAgICAgIGl0ZXJhdG9yIF9fYWZ0ZXIgPSBfX3Bvc2l0aW9uOworICAgICAgKytfX2FmdGVyOworCisgICAgICAvLyBDaGVjayBmb3Igb25seSBvbmUgbWVtYmVyIC0tIGluIHRoYXQgY2FzZSwgX19wb3NpdGlvbiBwb2ludHMgdG8gaXRzZWxmLAorICAgICAgLy8gYW5kIGF0dGVtcHRpbmcgdG8gaW5jcmVtZW50IHdpbGwgY2F1c2UgYW4gaW5maW5pdGUgbG9vcC4KKyAgICAgIGlmIChfX2FmdGVyLl9NX25vZGUgPT0gJnRoaXMtPl9NX2hlYWRlci5fTV9kYXRhKQorICAgICAgICAvLyBDaGVjayBndWFyYW50ZWVzIGV4YWN0bHkgb25lIG1lbWJlciwgc28gY29tcGFyaXNvbiB3YXMgYWxyZWFkeQorICAgICAgICAvLyBwZXJmb3JtZWQgYW5kIHdlIGtub3cgdGhlIHJlc3VsdDsgc2tpcCByZXBlYXRpbmcgaXQgaW4gX01faW5zZXJ0CisgICAgICAgIC8vIGJ5IHNwZWNpZnlpbmcgYSBub24temVybyBmb3VydGggYXJndW1lbnQuCisgICAgICAgIHJldHVybiBfTV9pbnNlcnQoX19wb3NpdGlvbi5fTV9ub2RlLCBfX3ZhbCwgMCwgX19wb3NpdGlvbi5fTV9ub2RlKTsKKworICAgICAgLy8gQWxsIG90aGVyIGNhc2VzOgorCisgICAgICAvLyBPcHRpbWl6YXRpb24gdG8gY2F0Y2ggaW5zZXJ0LWVxdWl2YWxlbnQgLS0gc2F2ZSBjb21wYXJpc29uIHJlc3VsdHMsCisgICAgICAvLyBhbmQgd2UgZ2V0IHRoaXMgZm9yIGZyZWUuCisgICAgICBpZiAoX01fa2V5X2NvbXBhcmUoIF9LZXlPZlZhbHVlKCkoX192YWwpLCBfU19rZXkoX19hZnRlci5fTV9ub2RlKSApKSB7CisgICAgICAgIGlmIChfU19yaWdodChfX3Bvc2l0aW9uLl9NX25vZGUpID09IDApCisgICAgICAgICAgcmV0dXJuIF9NX2luc2VydChfX3Bvc2l0aW9uLl9NX25vZGUsIF9fdmFsLCAwLCBfX3Bvc2l0aW9uLl9NX25vZGUpOworICAgICAgICBlbHNlCisgICAgICAgICAgcmV0dXJuIF9NX2luc2VydChfX2FmdGVyLl9NX25vZGUsIF9fdmFsLCBfX2FmdGVyLl9NX25vZGUpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHJldHVybiBpbnNlcnRfdW5pcXVlKF9fdmFsKS5maXJzdDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoX19wb3NpdGlvbi5fTV9ub2RlID09ICZ0aGlzLT5fTV9oZWFkZXIuX01fZGF0YSkgeyAvLyBlbmQoKQorICAgIGlmIChfTV9rZXlfY29tcGFyZShfU19rZXkoX01fcmlnaHRtb3N0KCkpLCBfS2V5T2ZWYWx1ZSgpKF9fdmFsKSkpIHsKKyAgICAgICAgLy8gcGFzcyBhbG9uZyB0byBfTV9pbnNlcnQgdGhhdCBpdCBjYW4gc2tpcCBjb21wYXJpbmcKKyAgICAgICAgLy8gdiwgS2V5IDsgc2luY2UgY29tcGFyZSBLZXksIHYgd2FzIHRydWUsIGNvbXBhcmUgdiwgS2V5IG11c3QgYmUgZmFsc2UuCisgICAgICAgIHJldHVybiBfTV9pbnNlcnQoX01fcmlnaHRtb3N0KCksIF9fdmFsLCAwLCBfX3Bvc2l0aW9uLl9NX25vZGUpOyAvLyBMYXN0IGFyZ3VtZW50IG9ubHkgbmVlZHMgdG8gYmUgbm9uLW51bGwKKyAgICB9CisgICAgZWxzZQorICAgICAgcmV0dXJuIGluc2VydF91bmlxdWUoX192YWwpLmZpcnN0OworICB9CisgIGVsc2UgeworICAgIGl0ZXJhdG9yIF9fYmVmb3JlID0gX19wb3NpdGlvbjsKKyAgICAtLV9fYmVmb3JlOworCisgICAgYm9vbCBfX2NvbXBfdl9wb3MgPSBfTV9rZXlfY29tcGFyZShfS2V5T2ZWYWx1ZSgpKF9fdmFsKSwgX1Nfa2V5KF9fcG9zaXRpb24uX01fbm9kZSkpOworCisgICAgaWYgKF9fY29tcF92X3BvcworICAgICAgICAmJiBfTV9rZXlfY29tcGFyZSggX1Nfa2V5KF9fYmVmb3JlLl9NX25vZGUpLCBfS2V5T2ZWYWx1ZSgpKF9fdmFsKSApKSB7CisKKyAgICAgIGlmIChfU19yaWdodChfX2JlZm9yZS5fTV9ub2RlKSA9PSAwKQorICAgICAgICByZXR1cm4gX01faW5zZXJ0KF9fYmVmb3JlLl9NX25vZGUsIF9fdmFsLCAwLCBfX2JlZm9yZS5fTV9ub2RlKTsgLy8gTGFzdCBhcmd1bWVudCBvbmx5IG5lZWRzIHRvIGJlIG5vbi1udWxsCisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBfTV9pbnNlcnQoX19wb3NpdGlvbi5fTV9ub2RlLCBfX3ZhbCwgX19wb3NpdGlvbi5fTV9ub2RlKTsKKyAgICAgIC8vIGZpcnN0IGFyZ3VtZW50IGp1c3QgbmVlZHMgdG8gYmUgbm9uLW51bGwKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAvLyBEb2VzIHRoZSBpbnNlcnRpb24gcG9pbnQgZmFsbCBpbW1lZGlhdGVseSBBRlRFUiB0aGUgaGludD8KKyAgICAgIGl0ZXJhdG9yIF9fYWZ0ZXIgPSBfX3Bvc2l0aW9uOworICAgICAgKytfX2FmdGVyOworICAgICAgLy8gT3B0aW1pemF0aW9uIHRvIGNhdGNoIGVxdWl2YWxlbnQgY2FzZXMgYW5kIGF2b2lkIHVubmVjZXNzYXJ5IGNvbXBhcmlzb25zCisgICAgICBib29sIF9fY29tcF9wb3NfdiA9ICFfX2NvbXBfdl9wb3M7ICAvLyBTdG9yZWQgdGhpcyByZXN1bHQgZWFybGllcgorICAgICAgLy8gSWYgdGhlIGVhcmxpZXIgY29tcGFyaXNvbiB3YXMgdHJ1ZSwgdGhpcyBjb21wYXJpc29uIGRvZXNuJ3QgbmVlZCB0byBiZQorICAgICAgLy8gcGVyZm9ybWVkIGJlY2F1c2UgaXQgbXVzdCBiZSBmYWxzZS4gIEhvd2V2ZXIsIGlmIHRoZSBlYXJsaWVyIGNvbXBhcmlzb24KKyAgICAgIC8vIHdhcyBmYWxzZSwgd2UgbmVlZCB0byBwZXJmb3JtIHRoaXMgb25lIGJlY2F1c2UgaW4gdGhlIGVxdWFsIGNhc2UsIGJvdGggd2lsbAorICAgICAgLy8gYmUgZmFsc2UuCisgICAgICBpZiAoIV9fY29tcF92X3BvcykgeworICAgICAgICBfX2NvbXBfcG9zX3YgPSBfTV9rZXlfY29tcGFyZShfU19rZXkoX19wb3NpdGlvbi5fTV9ub2RlKSwgX0tleU9mVmFsdWUoKShfX3ZhbCkpOworICAgICAgfQorCisgICAgICBpZiAoICghX19jb21wX3ZfcG9zKSAvLyBjb21wX3ZfcG9zIHRydWUgaW1wbGllcyBjb21wX3ZfcG9zIGZhbHNlCisgICAgICAgICAgJiYgX19jb21wX3Bvc192CisgICAgICAgICAgJiYgKF9fYWZ0ZXIuX01fbm9kZSA9PSAmdGhpcy0+X01faGVhZGVyLl9NX2RhdGEgfHwKKyAgICAgICAgICAgICAgX01fa2V5X2NvbXBhcmUoIF9LZXlPZlZhbHVlKCkoX192YWwpLCBfU19rZXkoX19hZnRlci5fTV9ub2RlKSApKSkgeworICAgICAgICBpZiAoX1NfcmlnaHQoX19wb3NpdGlvbi5fTV9ub2RlKSA9PSAwKQorICAgICAgICAgIHJldHVybiBfTV9pbnNlcnQoX19wb3NpdGlvbi5fTV9ub2RlLCBfX3ZhbCwgMCwgX19wb3NpdGlvbi5fTV9ub2RlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJldHVybiBfTV9pbnNlcnQoX19hZnRlci5fTV9ub2RlLCBfX3ZhbCwgX19hZnRlci5fTV9ub2RlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFRlc3QgZm9yIGVxdWl2YWxlbnQgY2FzZQorICAgICAgICBpZiAoX19jb21wX3ZfcG9zID09IF9fY29tcF9wb3NfdikKKyAgICAgICAgICByZXR1cm4gX19wb3NpdGlvbjsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJldHVybiBpbnNlcnRfdW5pcXVlKF9fdmFsKS5maXJzdDsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9Db21wYXJlLAorICAgICAgICAgIGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0tleU9mVmFsdWUsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK19faXRlcmF0b3JfXworX1JiX3RyZWU8X0tleSxfQ29tcGFyZSxfVmFsdWUsX0tleU9mVmFsdWUsX1RyYWl0cyxfQWxsb2M+IDo6aW5zZXJ0X2VxdWFsKGl0ZXJhdG9yIF9fcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1ZhbHVlJiBfX3ZhbCkgeworICBpZiAoX19wb3NpdGlvbi5fTV9ub2RlID09IHRoaXMtPl9NX2hlYWRlci5fTV9kYXRhLl9NX2xlZnQpIHsgLy8gYmVnaW4oKQorCisgICAgLy8gQ2hlY2sgZm9yIHplcm8gbWVtYmVycworICAgIGlmIChzaXplKCkgPD0gMCkKKyAgICAgICAgcmV0dXJuIGluc2VydF9lcXVhbChfX3ZhbCk7CisKKyAgICBpZiAoIV9NX2tleV9jb21wYXJlKF9TX2tleShfX3Bvc2l0aW9uLl9NX25vZGUpLCBfS2V5T2ZWYWx1ZSgpKF9fdmFsKSkpCisgICAgICByZXR1cm4gX01faW5zZXJ0KF9fcG9zaXRpb24uX01fbm9kZSwgX192YWwsIF9fcG9zaXRpb24uX01fbm9kZSk7CisgICAgZWxzZSB7CisgICAgICAvLyBDaGVjayBmb3Igb25seSBvbmUgbWVtYmVyCisgICAgICBpZiAoX19wb3NpdGlvbi5fTV9ub2RlLT5fTV9sZWZ0ID09IF9fcG9zaXRpb24uX01fbm9kZSkKKyAgICAgICAgLy8gVW5saWtlIGluc2VydF91bmlxdWUsIGNhbid0IGF2b2lkIGRvaW5nIGEgY29tcGFyaXNvbiBoZXJlLgorICAgICAgICByZXR1cm4gX01faW5zZXJ0KF9fcG9zaXRpb24uX01fbm9kZSwgX192YWwpOworCisgICAgICAvLyBBbGwgb3RoZXIgY2FzZXM6CisgICAgICAvLyBTdGFuZGFyZC1jb25mb3JtYW5jZSAtIGRvZXMgdGhlIGluc2VydGlvbiBwb2ludCBmYWxsIGltbWVkaWF0ZWx5IEFGVEVSCisgICAgICAvLyB0aGUgaGludD8KKyAgICAgIGl0ZXJhdG9yIF9fYWZ0ZXIgPSBfX3Bvc2l0aW9uOworICAgICAgKytfX2FmdGVyOworCisgICAgICAvLyBBbHJlYWR5IGtub3cgdGhhdCBjb21wYXJlKHBvcywgdikgbXVzdCBiZSB0cnVlIQorICAgICAgLy8gVGhlcmVmb3JlLCB3ZSB3YW50IHRvIGtub3cgaWYgY29tcGFyZShhZnRlciwgdikgaXMgZmFsc2UuCisgICAgICAvLyAoaS5lLiwgd2Ugbm93IHBvcyA8IHYsIG5vdyB3ZSB3YW50IHRvIGtub3cgaWYgdiA8PSBhZnRlcikKKyAgICAgIC8vIElmIG5vdCwgaW52YWxpZCBoaW50LgorICAgICAgaWYgKCBfX2FmdGVyLl9NX25vZGUgPT0gJnRoaXMtPl9NX2hlYWRlci5fTV9kYXRhIHx8CisgICAgICAgICAgICFfTV9rZXlfY29tcGFyZSggX1Nfa2V5KF9fYWZ0ZXIuX01fbm9kZSksIF9LZXlPZlZhbHVlKCkoX192YWwpICkgKSB7CisgICAgICAgIGlmIChfU19yaWdodChfX3Bvc2l0aW9uLl9NX25vZGUpID09IDApCisgICAgICAgICAgcmV0dXJuIF9NX2luc2VydChfX3Bvc2l0aW9uLl9NX25vZGUsIF9fdmFsLCAwLCBfX3Bvc2l0aW9uLl9NX25vZGUpOworICAgICAgICBlbHNlCisgICAgICAgICAgcmV0dXJuIF9NX2luc2VydChfX2FmdGVyLl9NX25vZGUsIF9fdmFsLCBfX2FmdGVyLl9NX25vZGUpOworICAgICAgfQorICAgICAgZWxzZSB7IC8vIEludmFsaWQgaGludAorICAgICAgICByZXR1cm4gaW5zZXJ0X2VxdWFsKF9fdmFsKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoX19wb3NpdGlvbi5fTV9ub2RlID09ICZ0aGlzLT5fTV9oZWFkZXIuX01fZGF0YSkgeyAvLyBlbmQoKQorICAgIGlmICghX01fa2V5X2NvbXBhcmUoX0tleU9mVmFsdWUoKShfX3ZhbCksIF9TX2tleShfTV9yaWdodG1vc3QoKSkpKQorICAgICAgcmV0dXJuIF9NX2luc2VydChfTV9yaWdodG1vc3QoKSwgX192YWwsIDAsIF9fcG9zaXRpb24uX01fbm9kZSk7IC8vIExhc3QgYXJndW1lbnQgb25seSBuZWVkcyB0byBiZSBub24tbnVsbAorICAgIGVsc2UgeworICAgICAgcmV0dXJuIGluc2VydF9lcXVhbChfX3ZhbCk7CisgICAgfQorICB9CisgIGVsc2UgeworICAgIGl0ZXJhdG9yIF9fYmVmb3JlID0gX19wb3NpdGlvbjsKKyAgICAtLV9fYmVmb3JlOworICAgIC8vIHN0b3JlIHRoZSByZXN1bHQgb2YgdGhlIGNvbXBhcmlzb24gYmV0d2VlbiBwb3MgYW5kIHYgc28KKyAgICAvLyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gZG8gaXQgYWdhaW4gbGF0ZXIuICBOb3RlIHRoYXQgdGhpcyByZXZlcnNlcyB0aGUgc2hvcnRjdXQKKyAgICAvLyBvbiB0aGUgaWYsIHBvc3NpYmx5IGhhcm1pbmcgZWZmaWNpZW5jeSBpbiBjb21wYXJpc29uczsgSSB0aGluayB0aGUgaGFybSB3aWxsCisgICAgLy8gYmUgbmVnbGlnaWJsZSwgYW5kIHRvIGRvIHdoYXQgSSB3YW50IHRvIGRvIChzYXZlIHRoZSByZXN1bHQgb2YgYSBjb21wYXJpc29uIHNvCisgICAgLy8gdGhhdCBpdCBjYW4gYmUgcmUtdXNlZCkgdGhlcmUgaXMgbm8gYWx0ZXJuYXRpdmUuICBUZXN0IGhlcmUgaXMgZm9yIGJlZm9yZSA8PSB2IDw9IHBvcy4KKyAgICBib29sIF9fY29tcF9wb3NfdiA9IF9NX2tleV9jb21wYXJlKF9TX2tleShfX3Bvc2l0aW9uLl9NX25vZGUpLCBfS2V5T2ZWYWx1ZSgpKF9fdmFsKSk7CisgICAgaWYgKCFfX2NvbXBfcG9zX3YgJiYKKyAgICAgICAgIV9NX2tleV9jb21wYXJlKF9LZXlPZlZhbHVlKCkoX192YWwpLCBfU19rZXkoX19iZWZvcmUuX01fbm9kZSkpKSB7CisgICAgICBpZiAoX1NfcmlnaHQoX19iZWZvcmUuX01fbm9kZSkgPT0gMCkKKyAgICAgICAgcmV0dXJuIF9NX2luc2VydChfX2JlZm9yZS5fTV9ub2RlLCBfX3ZhbCwgMCwgX19iZWZvcmUuX01fbm9kZSk7IC8vIExhc3QgYXJndW1lbnQgb25seSBuZWVkcyB0byBiZSBub24tbnVsbAorICAgICAgZWxzZQorICAgICAgICByZXR1cm4gX01faW5zZXJ0KF9fcG9zaXRpb24uX01fbm9kZSwgX192YWwsIF9fcG9zaXRpb24uX01fbm9kZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgLy8gRG9lcyB0aGUgaW5zZXJ0aW9uIHBvaW50IGZhbGwgaW1tZWRpYXRlbHkgQUZURVIgdGhlIGhpbnQ/CisgICAgICAvLyBUZXN0IGZvciBwb3MgPCB2IDw9IGFmdGVyCisgICAgICBpdGVyYXRvciBfX2FmdGVyID0gX19wb3NpdGlvbjsKKyAgICAgICsrX19hZnRlcjsKKworICAgICAgaWYgKF9fY29tcF9wb3NfdiAmJgorICAgICAgICAgICggX19hZnRlci5fTV9ub2RlID09ICZ0aGlzLT5fTV9oZWFkZXIuX01fZGF0YSB8fAorICAgICAgICAgICAgIV9NX2tleV9jb21wYXJlKCBfU19rZXkoX19hZnRlci5fTV9ub2RlKSwgX0tleU9mVmFsdWUoKShfX3ZhbCkgKSApICkgeworICAgICAgICBpZiAoX1NfcmlnaHQoX19wb3NpdGlvbi5fTV9ub2RlKSA9PSAwKQorICAgICAgICAgIHJldHVybiBfTV9pbnNlcnQoX19wb3NpdGlvbi5fTV9ub2RlLCBfX3ZhbCwgMCwgX19wb3NpdGlvbi5fTV9ub2RlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJldHVybiBfTV9pbnNlcnQoX19hZnRlci5fTV9ub2RlLCBfX3ZhbCwgX19hZnRlci5fTV9ub2RlKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeyAvLyBJbnZhbGlkIGhpbnQKKyAgICAgICAgcmV0dXJuIGluc2VydF9lcXVhbChfX3ZhbCk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfQ29tcGFyZSwKKyAgICAgICAgICBjbGFzcyBfVmFsdWUsIGNsYXNzIF9LZXlPZlZhbHVlLCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CitfUmJfdHJlZV9ub2RlX2Jhc2UqCitfUmJfdHJlZTxfS2V5LF9Db21wYXJlLF9WYWx1ZSxfS2V5T2ZWYWx1ZSxfVHJhaXRzLF9BbGxvYz4gOjpfTV9jb3B5KF9SYl90cmVlX25vZGVfYmFzZSogX194LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUmJfdHJlZV9ub2RlX2Jhc2UqIF9fcCkgeworICAvLyBzdHJ1Y3R1cmFsIGNvcHkuICBfX3ggYW5kIF9fcCBtdXN0IGJlIG5vbi1udWxsLgorICBfQmFzZV9wdHIgX190b3AgPSBfTV9jbG9uZV9ub2RlKF9feCk7CisgIF9TX3BhcmVudChfX3RvcCkgPSBfX3A7CisKKyAgX1NUTFBfVFJZIHsKKyAgICBpZiAoX1NfcmlnaHQoX194KSkKKyAgICAgIF9TX3JpZ2h0KF9fdG9wKSA9IF9NX2NvcHkoX1NfcmlnaHQoX194KSwgX190b3ApOworICAgIF9fcCA9IF9fdG9wOworICAgIF9feCA9IF9TX2xlZnQoX194KTsKKworICAgIHdoaWxlIChfX3ggIT0gMCkgeworICAgICAgX0Jhc2VfcHRyIF9feSA9IF9NX2Nsb25lX25vZGUoX194KTsKKyAgICAgIF9TX2xlZnQoX19wKSA9IF9feTsKKyAgICAgIF9TX3BhcmVudChfX3kpID0gX19wOworICAgICAgaWYgKF9TX3JpZ2h0KF9feCkpCisgICAgICAgIF9TX3JpZ2h0KF9feSkgPSBfTV9jb3B5KF9TX3JpZ2h0KF9feCksIF9feSk7CisgICAgICBfX3AgPSBfX3k7CisgICAgICBfX3ggPSBfU19sZWZ0KF9feCk7CisgICAgfQorICB9CisgIF9TVExQX1VOV0lORChfTV9lcmFzZShfX3RvcCkpCisKKyAgcmV0dXJuIF9fdG9wOworfQorCisvLyB0aGlzIGhhcyB0byBzdGF5IG91dC1vZi1saW5lIDogaXQncyByZWN1cnNpdmUKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfQ29tcGFyZSwKKyAgICAgICAgICBjbGFzcyBfVmFsdWUsIGNsYXNzIF9LZXlPZlZhbHVlLCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+Cit2b2lkCitfUmJfdHJlZTxfS2V5LF9Db21wYXJlLF9WYWx1ZSxfS2V5T2ZWYWx1ZSxfVHJhaXRzLF9BbGxvYz46Ol9NX2VyYXNlKF9SYl90cmVlX25vZGVfYmFzZSAqX194KSB7CisgIC8vIGVyYXNlIHdpdGhvdXQgcmViYWxhbmNpbmcKKyAgd2hpbGUgKF9feCAhPSAwKSB7CisgICAgX01fZXJhc2UoX1NfcmlnaHQoX194KSk7CisgICAgX0Jhc2VfcHRyIF9feSA9IF9TX2xlZnQoX194KTsKKyAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95KCZfU192YWx1ZShfX3gpKTsKKyAgICB0aGlzLT5fTV9oZWFkZXIuZGVhbGxvY2F0ZShfX1NUQVRJQ19DQVNUKF9MaW5rX3R5cGUsIF9feCksMSk7CisgICAgX194ID0gX195OworICB9Cit9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9ERUJVRykKK2lubGluZSBpbnQKK19fYmxhY2tfY291bnQoX1JiX3RyZWVfbm9kZV9iYXNlKiBfX25vZGUsIF9SYl90cmVlX25vZGVfYmFzZSogX19yb290KSB7CisgIGlmIChfX25vZGUgPT0gMCkKKyAgICByZXR1cm4gMDsKKyAgZWxzZSB7CisgICAgaW50IF9fYmMgPSBfX25vZGUtPl9NX2NvbG9yID09IF9TX3JiX3RyZWVfYmxhY2sgPyAxIDogMDsKKyAgICBpZiAoX19ub2RlID09IF9fcm9vdCkKKyAgICAgIHJldHVybiBfX2JjOworICAgIGVsc2UKKyAgICAgIHJldHVybiBfX2JjICsgX19ibGFja19jb3VudChfX25vZGUtPl9NX3BhcmVudCwgX19yb290KTsKKyAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX0NvbXBhcmUsCisgICAgICAgICAgY2xhc3MgX1ZhbHVlLCBjbGFzcyBfS2V5T2ZWYWx1ZSwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorYm9vbCBfUmJfdHJlZTxfS2V5LF9Db21wYXJlLF9WYWx1ZSxfS2V5T2ZWYWx1ZSxfVHJhaXRzLF9BbGxvYz46Ol9fcmJfdmVyaWZ5KCkgY29uc3QgeworICBpZiAoX01fbm9kZV9jb3VudCA9PSAwIHx8IGJlZ2luKCkgPT0gZW5kKCkpCisgICAgcmV0dXJuICgoX01fbm9kZV9jb3VudCA9PSAwKSAmJgorICAgICAgICAgICAgKGJlZ2luKCkgPT0gZW5kKCkpICYmCisgICAgICAgICAgICAodGhpcy0+X01faGVhZGVyLl9NX2RhdGEuX01fbGVmdCA9PSAmdGhpcy0+X01faGVhZGVyLl9NX2RhdGEpICYmCisgICAgICAgICAgICAodGhpcy0+X01faGVhZGVyLl9NX2RhdGEuX01fcmlnaHQgPT0gJnRoaXMtPl9NX2hlYWRlci5fTV9kYXRhKSk7CisKKyAgaW50IF9fbGVuID0gX19ibGFja19jb3VudChfTV9sZWZ0bW9zdCgpLCBfTV9yb290KCkpOworICBmb3IgKGNvbnN0X2l0ZXJhdG9yIF9faXQgPSBiZWdpbigpOyBfX2l0ICE9IGVuZCgpOyArK19faXQpIHsKKyAgICBfQmFzZV9wdHIgX194ID0gX19pdC5fTV9ub2RlOworICAgIF9CYXNlX3B0ciBfX0wgPSBfU19sZWZ0KF9feCk7CisgICAgX0Jhc2VfcHRyIF9fUiA9IF9TX3JpZ2h0KF9feCk7CisKKyAgICBpZiAoX194LT5fTV9jb2xvciA9PSBfU19yYl90cmVlX3JlZCkKKyAgICAgIGlmICgoX19MICYmIF9fTC0+X01fY29sb3IgPT0gX1NfcmJfdHJlZV9yZWQpIHx8CisgICAgICAgICAgKF9fUiAmJiBfX1ItPl9NX2NvbG9yID09IF9TX3JiX3RyZWVfcmVkKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKF9fTCAmJiBfTV9rZXlfY29tcGFyZShfU19rZXkoX194KSwgX1Nfa2V5KF9fTCkpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChfX1IgJiYgX01fa2V5X2NvbXBhcmUoX1Nfa2V5KF9fUiksIF9TX2tleShfX3gpKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmICghX19MICYmICFfX1IgJiYgX19ibGFja19jb3VudChfX3gsIF9NX3Jvb3QoKSkgIT0gX19sZW4pCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAoX01fbGVmdG1vc3QoKSAhPSBfUmJfdHJlZV9ub2RlX2Jhc2U6Ol9TX21pbmltdW0oX01fcm9vdCgpKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmIChfTV9yaWdodG1vc3QoKSAhPSBfUmJfdHJlZV9ub2RlX2Jhc2U6Ol9TX21heGltdW0oX01fcm9vdCgpKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgcmV0dXJuIHRydWU7Cit9CisjZW5kaWYgLyogX1NUTFBfREVCVUcgKi8KKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyN1bmRlZiBfUmJfdHJlZQorI3VuZGVmIF9faXRlcmF0b3JfXworI3VuZGVmIGl0ZXJhdG9yCisjdW5kZWYgX19zaXplX3R5cGVfXworCisjZW5kaWYgLyogIF9TVExQX1RSRUVfQyAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RsL190cmVlLmggYi9zdGwvX3RyZWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGM3OTlkCi0tLSAvZGV2L251bGwKKysrIGIvc3RsL190cmVlLmgKQEAgLTAsMCArMSw2NzkgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisvKiBOT1RFOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBTVEwgaGVhZGVycy4KKyAqICAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuCisgKi8KKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9UUkVFX0gKKyNkZWZpbmUgX1NUTFBfSU5URVJOQUxfVFJFRV9ICisKKy8qCisKK1JlZC1ibGFjayB0cmVlIGNsYXNzLCBkZXNpZ25lZCBmb3IgdXNlIGluIGltcGxlbWVudGluZyBTVEwKK2Fzc29jaWF0aXZlIGNvbnRhaW5lcnMgKHNldCwgbXVsdGlzZXQsIG1hcCwgYW5kIG11bHRpbWFwKS4gVGhlCitpbnNlcnRpb24gYW5kIGRlbGV0aW9uIGFsZ29yaXRobXMgYXJlIGJhc2VkIG9uIHRob3NlIGluIENvcm1lbiwKK0xlaXNlcnNvbiwgYW5kIFJpdmVzdCwgSW50cm9kdWN0aW9uIHRvIEFsZ29yaXRobXMgKE1JVCBQcmVzcywgMTk5MCksCitleGNlcHQgdGhhdAorCisoMSkgdGhlIGhlYWRlciBjZWxsIGlzIG1haW50YWluZWQgd2l0aCBsaW5rcyBub3Qgb25seSB0byB0aGUgcm9vdAorYnV0IGFsc28gdG8gdGhlIGxlZnRtb3N0IG5vZGUgb2YgdGhlIHRyZWUsIHRvIGVuYWJsZSBjb25zdGFudCB0aW1lCitiZWdpbigpLCBhbmQgdG8gdGhlIHJpZ2h0bW9zdCBub2RlIG9mIHRoZSB0cmVlLCB0byBlbmFibGUgbGluZWFyIHRpbWUKK3BlcmZvcm1hbmNlIHdoZW4gdXNlZCB3aXRoIHRoZSBnZW5lcmljIHNldCBhbGdvcml0aG1zIChzZXRfdW5pb24sCitldGMuKTsKKworKDIpIHdoZW4gYSBub2RlIGJlaW5nIGRlbGV0ZWQgaGFzIHR3byBjaGlsZHJlbiBpdHMgc3VjY2Vzc29yIG5vZGUgaXMKK3JlbGlua2VkIGludG8gaXRzIHBsYWNlLCByYXRoZXIgdGhhbiBjb3BpZWQsIHNvIHRoYXQgdGhlIG9ubHkKK2l0ZXJhdG9ycyBpbnZhbGlkYXRlZCBhcmUgdGhvc2UgcmVmZXJyaW5nIHRvIHRoZSBkZWxldGVkIG5vZGUuCisKKyovCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQUxHT0JBU0VfSAorIyAgaW5jbHVkZSA8c3RsL19hbGdvYmFzZS5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQUxMT0NfSAorIyAgaW5jbHVkZSA8c3RsL19hbGxvYy5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfSVRFUkFUT1JfSAorIyAgaW5jbHVkZSA8c3RsL19pdGVyYXRvci5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ09OU1RSVUNUX0gKKyMgIGluY2x1ZGUgPHN0bC9fY29uc3RydWN0Lmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9GVU5DVElPTl9CQVNFX0gKKyMgIGluY2x1ZGUgPHN0bC9fZnVuY3Rpb25fYmFzZS5oPgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3R5cGVkZWYgYm9vbCBfUmJfdHJlZV9Db2xvcl90eXBlOworLy9jb25zdCBfUmJfdHJlZV9Db2xvcl90eXBlIF9TX3JiX3RyZWVfcmVkID0gZmFsc2U7CisvL2NvbnN0IF9SYl90cmVlX0NvbG9yX3R5cGUgX1NfcmJfdHJlZV9ibGFjayA9IHRydWU7CisKKyNkZWZpbmUgX1NfcmJfdHJlZV9yZWQgZmFsc2UKKyNkZWZpbmUgX1NfcmJfdHJlZV9ibGFjayB0cnVlCisKK3N0cnVjdCBfUmJfdHJlZV9ub2RlX2Jhc2UgeworICB0eXBlZGVmIF9SYl90cmVlX0NvbG9yX3R5cGUgX0NvbG9yX3R5cGU7CisgIHR5cGVkZWYgX1JiX3RyZWVfbm9kZV9iYXNlKiBfQmFzZV9wdHI7CisKKyAgX0NvbG9yX3R5cGUgX01fY29sb3I7CisgIF9CYXNlX3B0ciBfTV9wYXJlbnQ7CisgIF9CYXNlX3B0ciBfTV9sZWZ0OworICBfQmFzZV9wdHIgX01fcmlnaHQ7CisKKyAgc3RhdGljIF9CYXNlX3B0ciBfU1RMUF9DQUxMIF9TX21pbmltdW0oX0Jhc2VfcHRyIF9feCkgeworICAgIHdoaWxlIChfX3gtPl9NX2xlZnQgIT0gMCkgX194ID0gX194LT5fTV9sZWZ0OworICAgIHJldHVybiBfX3g7CisgIH0KKworICBzdGF0aWMgX0Jhc2VfcHRyIF9TVExQX0NBTEwgX1NfbWF4aW11bShfQmFzZV9wdHIgX194KSB7CisgICAgd2hpbGUgKF9feC0+X01fcmlnaHQgIT0gMCkgX194ID0gX194LT5fTV9yaWdodDsKKyAgICByZXR1cm4gX194OworICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbHVlPgorc3RydWN0IF9SYl90cmVlX25vZGUgOiBwdWJsaWMgX1JiX3RyZWVfbm9kZV9iYXNlIHsKKyAgX1ZhbHVlIF9NX3ZhbHVlX2ZpZWxkOworICBfX1RSSVZJQUxfU1RVRkYoX1JiX3RyZWVfbm9kZSkKK307CisKK3N0cnVjdCBfUmJfdHJlZV9iYXNlX2l0ZXJhdG9yOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0R1bW15PgorY2xhc3MgX1JiX2dsb2JhbCB7CitwdWJsaWM6CisgIHR5cGVkZWYgX1JiX3RyZWVfbm9kZV9iYXNlKiBfQmFzZV9wdHI7CisgIC8vIHRob3NlIHVzZWQgdG8gYmUgZ2xvYmFsIGZ1bmN0aW9ucworICBzdGF0aWMgdm9pZCBfU1RMUF9DQUxMIF9SZWJhbGFuY2UoX0Jhc2VfcHRyIF9feCwgX0Jhc2VfcHRyJiBfX3Jvb3QpOworICBzdGF0aWMgX0Jhc2VfcHRyIF9TVExQX0NBTEwgX1JlYmFsYW5jZV9mb3JfZXJhc2UoX0Jhc2VfcHRyIF9feiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9CYXNlX3B0ciYgX19yb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0Jhc2VfcHRyJiBfX2xlZnRtb3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0Jhc2VfcHRyJiBfX3JpZ2h0bW9zdCk7CisgIC8vIHRob3NlIGFyZSBmcm9tIF9SYl90cmVlX2Jhc2VfaXRlcmF0b3IgLSBtb3ZlZCBoZXJlIHRvIHJlZHVjZSBjb2RlIGJsb2F0CisgIC8vIG1vdmVkIGhlcmUgdG8gcmVkdWNlIGNvZGUgYmxvYXQgd2l0aG91dCB0ZW1wbGF0aXppbmcgX1JiX3RyZWVfYmFzZV9pdGVyYXRvcgorICBzdGF0aWMgX0Jhc2VfcHRyICBfU1RMUF9DQUxMIF9NX2luY3JlbWVudCAoX0Jhc2VfcHRyKTsKKyAgc3RhdGljIF9CYXNlX3B0ciAgX1NUTFBfQ0FMTCBfTV9kZWNyZW1lbnQgKF9CYXNlX3B0cik7CisgIHN0YXRpYyB2b2lkICAgICAgIF9TVExQX0NBTEwgX1JvdGF0ZV9sZWZ0IChfQmFzZV9wdHIgX194LCBfQmFzZV9wdHImIF9fcm9vdCk7CisgIHN0YXRpYyB2b2lkICAgICAgIF9TVExQX0NBTEwgX1JvdGF0ZV9yaWdodChfQmFzZV9wdHIgX194LCBfQmFzZV9wdHImIF9fcm9vdCk7Cit9OworCisjIGlmIGRlZmluZWQgKF9TVExQX1VTRV9URU1QTEFURV9FWFBPUlQpCitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgX1JiX2dsb2JhbDxib29sPjsKKyMgZW5kaWYKKwordHlwZWRlZiBfUmJfZ2xvYmFsPGJvb2w+IF9SYl9nbG9iYWxfaW5zdDsKKworc3RydWN0IF9SYl90cmVlX2Jhc2VfaXRlcmF0b3IgeworICB0eXBlZGVmIF9SYl90cmVlX25vZGVfYmFzZSogICAgICAgIF9CYXNlX3B0cjsKKyAgdHlwZWRlZiBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKKyAgdHlwZWRlZiBwdHJkaWZmX3QgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgIF9CYXNlX3B0ciBfTV9ub2RlOworICBfUmJfdHJlZV9iYXNlX2l0ZXJhdG9yKCkgOiBfTV9ub2RlKDApIHt9CisgIF9SYl90cmVlX2Jhc2VfaXRlcmF0b3IoX0Jhc2VfcHRyIF9feCkgOiBfTV9ub2RlKF9feCkge30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsdWUsIGNsYXNzIF9UcmFpdHM+CitzdHJ1Y3QgX1JiX3RyZWVfaXRlcmF0b3IgOiBwdWJsaWMgX1JiX3RyZWVfYmFzZV9pdGVyYXRvciB7CisgIHR5cGVkZWYgX1ZhbHVlIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6cmVmZXJlbmNlICByZWZlcmVuY2U7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6cG9pbnRlciAgICBwb2ludGVyOworICB0eXBlZGVmIF9SYl90cmVlX2l0ZXJhdG9yPF9WYWx1ZSwgX1RyYWl0cz4gX1NlbGY7CisgIHR5cGVkZWYgX1JiX3RyZWVfbm9kZV9iYXNlKiAgICBfQmFzZV9wdHI7CisgIHR5cGVkZWYgX1JiX3RyZWVfbm9kZTxfVmFsdWU+KiBfTGlua190eXBlOworCisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6X05vbkNvbnN0VHJhaXRzIF9Ob25Db25zdFRyYWl0czsKKyAgdHlwZWRlZiBfUmJfdHJlZV9pdGVyYXRvcjxfVmFsdWUsIF9Ob25Db25zdFRyYWl0cz4gaXRlcmF0b3I7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6X0NvbnN0VHJhaXRzIF9Db25zdFRyYWl0czsKKyAgdHlwZWRlZiBfUmJfdHJlZV9pdGVyYXRvcjxfVmFsdWUsIF9Db25zdFRyYWl0cz4gY29uc3RfaXRlcmF0b3I7CisKKyAgX1JiX3RyZWVfaXRlcmF0b3IoKSB7fQorI2lmICFkZWZpbmVkIChfU1RMUF9ERUJVRykKKyAgLyogSW4gU1RMIGRlYnVnIG1vZGUgd2UgbmVlZCB0aGlzIGNvbnN0cnVjdG9yIGltcGxpY2l0IGZvciB0aGUgcG9pbnRlcgorICAgKiBzcGVjaWFsaXphdGlvbiBpbXBsZW1lbnRhdGlvbi4KKyAgICovCisgIGV4cGxpY2l0CisjZW5kaWYKKyAgX1JiX3RyZWVfaXRlcmF0b3IoX0Jhc2VfcHRyIF9feCkgOiBfUmJfdHJlZV9iYXNlX2l0ZXJhdG9yKF9feCkge30KKyAgLy9jb3B5IGNvbnN0cnVjdG9yIGZvciBpdGVyYXRvciBhbmQgY29uc3RydWN0b3IgZnJvbSBpdGVyYXRvciBmb3IgY29uc3RfaXRlcmF0b3IKKyAgX1JiX3RyZWVfaXRlcmF0b3IoY29uc3QgaXRlcmF0b3ImIF9faXQpIDogX1JiX3RyZWVfYmFzZV9pdGVyYXRvcihfX2l0Ll9NX25vZGUpIHt9CisKKyAgcmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICByZXR1cm4gX19TVEFUSUNfQ0FTVChfTGlua190eXBlLCBfTV9ub2RlKS0+X01fdmFsdWVfZmllbGQ7CisgIH0KKworICBfU1RMUF9ERUZJTkVfQVJST1dfT1BFUkFUT1IKKworICBfU2VsZiYgb3BlcmF0b3IrKygpIHsKKyAgICBfTV9ub2RlID0gX1JiX2dsb2JhbF9pbnN0OjpfTV9pbmNyZW1lbnQoX01fbm9kZSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIF9TZWxmIG9wZXJhdG9yKysoaW50KSB7CisgICAgX1NlbGYgX190bXAgPSAqdGhpczsKKyAgICArKygqdGhpcyk7CisgICAgcmV0dXJuIF9fdG1wOworICB9CisKKyAgX1NlbGYmIG9wZXJhdG9yLS0oKSB7CisgICAgX01fbm9kZSA9IF9SYl9nbG9iYWxfaW5zdDo6X01fZGVjcmVtZW50KF9NX25vZGUpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBfU2VsZiBvcGVyYXRvci0tKGludCkgeworICAgIF9TZWxmIF9fdG1wID0gKnRoaXM7CisgICAgLS0oKnRoaXMpOworICAgIHJldHVybiBfX3RtcDsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0X2l0ZXJhdG9yIF9fcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIF9NX25vZGUgPT0gX19yaHMuX01fbm9kZTsKKyAgfQorICBib29sIG9wZXJhdG9yICE9IChjb25zdF9pdGVyYXRvciBfX3JocykgY29uc3QgeworICAgIHJldHVybiBfTV9ub2RlICE9IF9fcmhzLl9NX25vZGU7CisgIH0KK307CisKKyNpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQorX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfVHJhaXRzPgorc3RydWN0IF9fdHlwZV90cmFpdHM8X1NUTFBfUFJJViBfUmJfdHJlZV9pdGVyYXRvcjxfVmFsdWUsIF9UcmFpdHM+ID4geworICB0eXBlZGVmIF9fZmFsc2VfdHlwZSAgIGhhc190cml2aWFsX2RlZmF1bHRfY29uc3RydWN0b3I7CisgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfY29weV9jb25zdHJ1Y3RvcjsKKyAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9hc3NpZ25tZW50X29wZXJhdG9yOworICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2Rlc3RydWN0b3I7CisgIHR5cGVkZWYgX19mYWxzZV90eXBlICAgaXNfUE9EX3R5cGU7Cit9OworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorI2VuZGlmIC8qIF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04gKi8KKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9PTERfSFBfSVRFUkFUT1JfUVVFUklFUykKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQordGVtcGxhdGUgPGNsYXNzIF9WYWx1ZSwgY2xhc3MgX1RyYWl0cz4KK2lubGluZSBfVmFsdWUqIHZhbHVlX3R5cGUoY29uc3QgX1NUTFBfUFJJViBfUmJfdHJlZV9pdGVyYXRvcjxfVmFsdWUsIF9UcmFpdHM+JikKK3sgcmV0dXJuIChfVmFsdWUqKTA7IH0KK2lubGluZSBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeShjb25zdCBfU1RMUF9QUklWIF9SYl90cmVlX2Jhc2VfaXRlcmF0b3ImKQoreyByZXR1cm4gYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcoKTsgfQoraW5saW5lIHB0cmRpZmZfdCogZGlzdGFuY2VfdHlwZShjb25zdCBfU1RMUF9QUklWIF9SYl90cmVlX2Jhc2VfaXRlcmF0b3ImKQoreyByZXR1cm4gKHB0cmRpZmZfdCopIDA7IH0KK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKyNlbmRpZiAvKiBfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OICovCisKKy8vIEJhc2UgY2xhc3MgdG8gaGVscCBFSAorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CitjbGFzcyBfUmJfdHJlZV9iYXNlIHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBfUmJfdHJlZV9ub2RlX2Jhc2UgX05vZGVfYmFzZTsKKyAgdHlwZWRlZiBfUmJfdHJlZV9ub2RlPF9UcD4gX05vZGU7CisgIF9TVExQX0ZPUkNFX0FMTE9DQVRPUlMoX1RwLCBfQWxsb2MpCisgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jX3RyYWl0czxfVHAsIF9BbGxvYz46OmFsbG9jYXRvcl90eXBlIGFsbG9jYXRvcl90eXBlOworcHJpdmF0ZToKKyAgdHlwZWRlZiBfUmJfdHJlZV9iYXNlPF9UcCwgX0FsbG9jPiBfU2VsZjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2NfdHJhaXRzPF9Ob2RlLCBfQWxsb2M+OjphbGxvY2F0b3JfdHlwZSBfTV9ub2RlX2FsbG9jYXRvcl90eXBlOworICB0eXBlZGVmIF9TVExQX2FsbG9jX3Byb3h5PF9Ob2RlX2Jhc2UsIF9Ob2RlLCBfTV9ub2RlX2FsbG9jYXRvcl90eXBlPiBfQWxsb2NQcm94eTsKKworcHVibGljOgorICBhbGxvY2F0b3JfdHlwZSBnZXRfYWxsb2NhdG9yKCkgY29uc3QgeworICAgIHJldHVybiBfU1RMUF9DT05WRVJUX0FMTE9DQVRPUihfTV9oZWFkZXIsIF9UcCk7CisgIH0KKworcHJvdGVjdGVkOgorICBfUmJfdHJlZV9iYXNlKGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpIDoKKyAgICBfTV9oZWFkZXIoX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoX19hLCBfTm9kZSksIF9Ob2RlX2Jhc2UoKSApIHsKKyAgICBfTV9lbXB0eV9pbml0aWFsaXplKCk7CisgIH0KKyAgX1JiX3RyZWVfYmFzZShfX21vdmVfc291cmNlPF9TZWxmPiBzcmMpIDoKKyAgICBfTV9oZWFkZXIoX19tb3ZlX3NvdXJjZTxfQWxsb2NQcm94eT4oc3JjLmdldCgpLl9NX2hlYWRlcikpIHsKKyAgICBfTV9yZWJpbmQoJnNyYy5nZXQoKS5fTV9oZWFkZXIuX01fZGF0YSk7CisgICAgc3JjLmdldCgpLl9NX2VtcHR5X2luaXRpYWxpemUoKTsKKyAgfQorICB2b2lkIF9NX2VtcHR5X2luaXRpYWxpemUoKSB7CisgICAgX01faGVhZGVyLl9NX2RhdGEuX01fY29sb3IgPSBfU19yYl90cmVlX3JlZDsgLy8gdXNlZCB0byBkaXN0aW5ndWlzaCBoZWFkZXIgZnJvbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIF9fcm9vdCwgaW4gaXRlcmF0b3Iub3BlcmF0b3IrKworICAgIF9NX2hlYWRlci5fTV9kYXRhLl9NX3BhcmVudCA9IDA7CisgICAgX01faGVhZGVyLl9NX2RhdGEuX01fbGVmdCA9ICZfTV9oZWFkZXIuX01fZGF0YTsKKyAgICBfTV9oZWFkZXIuX01fZGF0YS5fTV9yaWdodCA9ICZfTV9oZWFkZXIuX01fZGF0YTsKKyAgfQorCisgIHZvaWQgX01fcmViaW5kKF9Ob2RlX2Jhc2UgKl9fc3RhdGljX25vZGUpIHsKKyAgICBpZiAoX01faGVhZGVyLl9NX2RhdGEuX01fcGFyZW50ICE9IDApIHsKKyAgICAgIF9NX2hlYWRlci5fTV9kYXRhLl9NX3BhcmVudC0+X01fcGFyZW50ID0gJl9NX2hlYWRlci5fTV9kYXRhOworICAgIH0KKyAgICBpZiAoX01faGVhZGVyLl9NX2RhdGEuX01fcmlnaHQgPT0gX19zdGF0aWNfbm9kZSkgeworICAgICAgX01faGVhZGVyLl9NX2RhdGEuX01fcmlnaHQgPSAmX01faGVhZGVyLl9NX2RhdGE7CisgICAgfQorICAgIGlmIChfTV9oZWFkZXIuX01fZGF0YS5fTV9sZWZ0ID09IF9fc3RhdGljX25vZGUpIHsKKyAgICAgIF9NX2hlYWRlci5fTV9kYXRhLl9NX2xlZnQgPSAmX01faGVhZGVyLl9NX2RhdGE7CisgICAgfQorICB9CisKKyAgX0FsbG9jUHJveHkgX01faGVhZGVyOworfTsKKworI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHKQorIyAgZGVmaW5lIF9SYl90cmVlIF9TVExQX05PTl9EQkdfTkFNRShSYl90cmVlKQorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfQ29tcGFyZSwKKyAgICAgICAgICBjbGFzcyBfVmFsdWUsIGNsYXNzIF9LZXlPZlZhbHVlLCBjbGFzcyBfVHJhaXRzLAorICAgICAgICAgIF9TVExQX0RFRkFVTFRfQUxMT0NBVE9SX1NFTEVDVChfVmFsdWUpID4KK2NsYXNzIF9SYl90cmVlIDogcHVibGljIF9SYl90cmVlX2Jhc2U8X1ZhbHVlLCBfQWxsb2M+IHsKKyAgdHlwZWRlZiBfUmJfdHJlZV9iYXNlPF9WYWx1ZSwgX0FsbG9jPiBfQmFzZTsKKyAgdHlwZWRlZiBfUmJfdHJlZTxfS2V5LCBfQ29tcGFyZSwgX1ZhbHVlLCBfS2V5T2ZWYWx1ZSwgX1RyYWl0cywgX0FsbG9jPiBfU2VsZjsKK3Byb3RlY3RlZDoKKyAgdHlwZWRlZiBfUmJfdHJlZV9ub2RlX2Jhc2UgKiBfQmFzZV9wdHI7CisgIHR5cGVkZWYgX1JiX3RyZWVfbm9kZTxfVmFsdWU+IF9Ob2RlOworICB0eXBlZGVmIF9Ob2RlKiBfTGlua190eXBlOworICB0eXBlZGVmIF9SYl90cmVlX0NvbG9yX3R5cGUgX0NvbG9yX3R5cGU7CitwdWJsaWM6CisgIHR5cGVkZWYgX0tleSBrZXlfdHlwZTsKKyAgdHlwZWRlZiBfVmFsdWUgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpwb2ludGVyIHBvaW50ZXI7CisgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSogY29uc3RfcG9pbnRlcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpyZWZlcmVuY2UgcmVmZXJlbmNlOworICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmIGNvbnN0X3JlZmVyZW5jZTsKKyAgdHlwZWRlZiBzaXplX3Qgc2l6ZV90eXBlOworICB0eXBlZGVmIHB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7CisgIHR5cGVkZWYgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcgX0l0ZXJhdG9yX2NhdGVnb3J5OworICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKKworcHJvdGVjdGVkOgorCisgIF9TVExQX0tFWV9UWVBFX0ZPUl9DT05UX0VYVChrZXlfdHlwZSkKKyAgX0Jhc2VfcHRyIF9NX2NyZWF0ZV9ub2RlKGNvbnN0IHZhbHVlX3R5cGUmIF9feCkgeworICAgIF9MaW5rX3R5cGUgX190bXAgPSB0aGlzLT5fTV9oZWFkZXIuYWxsb2NhdGUoMSk7CisgICAgX1NUTFBfVFJZIHsKKyAgICAgIF9Db3B5X0NvbnN0cnVjdCgmX190bXAtPl9NX3ZhbHVlX2ZpZWxkLCBfX3gpOworICAgIH0KKyAgICBfU1RMUF9VTldJTkQodGhpcy0+X01faGVhZGVyLmRlYWxsb2NhdGUoX190bXAsMSkpCisgICAgX1NfbGVmdChfX3RtcCkgPSAwOworICAgIF9TX3JpZ2h0KF9fdG1wKSA9IDA7CisgICAgcmV0dXJuIF9fdG1wOworICB9CisKKyAgX0Jhc2VfcHRyIF9NX2Nsb25lX25vZGUoX0Jhc2VfcHRyIF9feCkgeworICAgIF9CYXNlX3B0ciBfX3RtcCA9IF9NX2NyZWF0ZV9ub2RlKF9TX3ZhbHVlKF9feCkpOworICAgIF9TX2NvbG9yKF9fdG1wKSA9IF9TX2NvbG9yKF9feCk7CisgICAgcmV0dXJuIF9fdG1wOworICB9CisKKyAgc2l6ZV90eXBlIF9NX25vZGVfY291bnQ7IC8vIGtlZXBzIHRyYWNrIG9mIHNpemUgb2YgdHJlZQorICBfQ29tcGFyZSBfTV9rZXlfY29tcGFyZTsKKworICBfQmFzZV9wdHIgX01fcm9vdCgpIGNvbnN0CisgIHsgcmV0dXJuIHRoaXMtPl9NX2hlYWRlci5fTV9kYXRhLl9NX3BhcmVudDsgfQorICBfQmFzZV9wdHIgX01fbGVmdG1vc3QoKSBjb25zdAorICB7IHJldHVybiB0aGlzLT5fTV9oZWFkZXIuX01fZGF0YS5fTV9sZWZ0OyB9CisgIF9CYXNlX3B0ciBfTV9yaWdodG1vc3QoKSBjb25zdAorICB7IHJldHVybiB0aGlzLT5fTV9oZWFkZXIuX01fZGF0YS5fTV9yaWdodDsgfQorCisgIF9CYXNlX3B0ciYgX01fcm9vdCgpCisgIHsgcmV0dXJuIHRoaXMtPl9NX2hlYWRlci5fTV9kYXRhLl9NX3BhcmVudDsgfQorICBfQmFzZV9wdHImIF9NX2xlZnRtb3N0KCkKKyAgeyByZXR1cm4gdGhpcy0+X01faGVhZGVyLl9NX2RhdGEuX01fbGVmdDsgfQorICBfQmFzZV9wdHImIF9NX3JpZ2h0bW9zdCgpCisgIHsgcmV0dXJuIHRoaXMtPl9NX2hlYWRlci5fTV9kYXRhLl9NX3JpZ2h0OyB9CisKKyAgc3RhdGljIF9CYXNlX3B0ciYgX1NUTFBfQ0FMTCBfU19sZWZ0KF9CYXNlX3B0ciBfX3gpCisgIHsgcmV0dXJuIF9feC0+X01fbGVmdDsgfQorICBzdGF0aWMgX0Jhc2VfcHRyJiBfU1RMUF9DQUxMIF9TX3JpZ2h0KF9CYXNlX3B0ciBfX3gpCisgIHsgcmV0dXJuIF9feC0+X01fcmlnaHQ7IH0KKyAgc3RhdGljIF9CYXNlX3B0ciYgX1NUTFBfQ0FMTCBfU19wYXJlbnQoX0Jhc2VfcHRyIF9feCkKKyAgeyByZXR1cm4gX194LT5fTV9wYXJlbnQ7IH0KKyAgc3RhdGljIHZhbHVlX3R5cGUmIF9TVExQX0NBTEwgX1NfdmFsdWUoX0Jhc2VfcHRyIF9feCkKKyAgeyByZXR1cm4gX19TVEFUSUNfQ0FTVChfTGlua190eXBlLCBfX3gpLT5fTV92YWx1ZV9maWVsZDsgfQorICBzdGF0aWMgY29uc3QgX0tleSYgX1NUTFBfQ0FMTCBfU19rZXkoX0Jhc2VfcHRyIF9feCkKKyAgeyByZXR1cm4gX0tleU9mVmFsdWUoKShfU192YWx1ZShfX3gpKTt9CisgIHN0YXRpYyBfQ29sb3JfdHlwZSYgX1NUTFBfQ0FMTCBfU19jb2xvcihfQmFzZV9wdHIgX194KQorICB7IHJldHVybiAoX0NvbG9yX3R5cGUmKShfX3gtPl9NX2NvbG9yKTsgfQorCisgIHN0YXRpYyBfQmFzZV9wdHIgX1NUTFBfQ0FMTCBfU19taW5pbXVtKF9CYXNlX3B0ciBfX3gpCisgIHsgcmV0dXJuIF9SYl90cmVlX25vZGVfYmFzZTo6X1NfbWluaW11bShfX3gpOyB9CisKKyAgc3RhdGljIF9CYXNlX3B0ciBfU1RMUF9DQUxMIF9TX21heGltdW0oX0Jhc2VfcHRyIF9feCkKKyAgeyByZXR1cm4gX1JiX3RyZWVfbm9kZV9iYXNlOjpfU19tYXhpbXVtKF9feCk7IH0KKworcHVibGljOgorICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6Ol9Ob25Db25zdFRyYWl0cyBfTm9uQ29uc3RUcmFpdHM7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6X0NvbnN0VHJhaXRzIF9Db25zdFRyYWl0czsKKyAgdHlwZWRlZiBfUmJfdHJlZV9pdGVyYXRvcjx2YWx1ZV90eXBlLCBfTm9uQ29uc3RUcmFpdHM+IGl0ZXJhdG9yOworICB0eXBlZGVmIF9SYl90cmVlX2l0ZXJhdG9yPHZhbHVlX3R5cGUsIF9Db25zdFRyYWl0cz4gY29uc3RfaXRlcmF0b3I7CisgIF9TVExQX0RFQ0xBUkVfQklESVJFQ1RJT05BTF9SRVZFUlNFX0lURVJBVE9SUzsKKworcHJpdmF0ZToKKyAgaXRlcmF0b3IgX01faW5zZXJ0KF9CYXNlX3B0ciBfX3BhcmVudCwgY29uc3QgdmFsdWVfdHlwZSYgX192YWwsIF9CYXNlX3B0ciBfX29uX2xlZnQgPSAwLCBfQmFzZV9wdHIgX19vbl9yaWdodCA9IDApOworICBfQmFzZV9wdHIgX01fY29weShfQmFzZV9wdHIgX194LCBfQmFzZV9wdHIgX19wKTsKKyAgdm9pZCBfTV9lcmFzZShfQmFzZV9wdHIgX194KTsKKworcHVibGljOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0aW9uL2RlYWxsb2NhdGlvbgorICBfUmJfdHJlZSgpCisgICAgOiBfUmJfdHJlZV9iYXNlPF9WYWx1ZSwgX0FsbG9jPihhbGxvY2F0b3JfdHlwZSgpKSwgX01fbm9kZV9jb3VudCgwKSwgX01fa2V5X2NvbXBhcmUoX0NvbXBhcmUoKSkKKyAgICB7fQorCisgIF9SYl90cmVlKGNvbnN0IF9Db21wYXJlJiBfX2NvbXApCisgICAgOiBfUmJfdHJlZV9iYXNlPF9WYWx1ZSwgX0FsbG9jPihhbGxvY2F0b3JfdHlwZSgpKSwgX01fbm9kZV9jb3VudCgwKSwgX01fa2V5X2NvbXBhcmUoX19jb21wKQorICAgIHt9CisKKyAgX1JiX3RyZWUoY29uc3QgX0NvbXBhcmUmIF9fY29tcCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICA6IF9SYl90cmVlX2Jhc2U8X1ZhbHVlLCBfQWxsb2M+KF9fYSksIF9NX25vZGVfY291bnQoMCksIF9NX2tleV9jb21wYXJlKF9fY29tcCkKKyAgICB7fQorCisgIF9SYl90cmVlKGNvbnN0IF9TZWxmJiBfX3gpCisgICAgOiBfUmJfdHJlZV9iYXNlPF9WYWx1ZSwgX0FsbG9jPihfX3guZ2V0X2FsbG9jYXRvcigpKSwKKyAgICAgIF9NX25vZGVfY291bnQoMCksIF9NX2tleV9jb21wYXJlKF9feC5fTV9rZXlfY29tcGFyZSkgeworICAgIGlmIChfX3guX01fcm9vdCgpICE9IDApIHsKKyAgICAgIF9TX2NvbG9yKCZ0aGlzLT5fTV9oZWFkZXIuX01fZGF0YSkgPSBfU19yYl90cmVlX3JlZDsKKyAgICAgIF9NX3Jvb3QoKSA9IF9NX2NvcHkoX194Ll9NX3Jvb3QoKSwgJnRoaXMtPl9NX2hlYWRlci5fTV9kYXRhKTsKKyAgICAgIF9NX2xlZnRtb3N0KCkgPSBfU19taW5pbXVtKF9NX3Jvb3QoKSk7CisgICAgICBfTV9yaWdodG1vc3QoKSA9IF9TX21heGltdW0oX01fcm9vdCgpKTsKKyAgICB9CisgICAgX01fbm9kZV9jb3VudCA9IF9feC5fTV9ub2RlX2NvdW50OworICB9CisKKyAgX1JiX3RyZWUoX19tb3ZlX3NvdXJjZTxfU2VsZj4gc3JjKQorICAgIDogX1JiX3RyZWVfYmFzZTxfVmFsdWUsIF9BbGxvYz4oX19tb3ZlX3NvdXJjZTxfQmFzZT4oc3JjLmdldCgpKSksCisgICAgICBfTV9ub2RlX2NvdW50KHNyYy5nZXQoKS5fTV9ub2RlX2NvdW50KSwKKyAgICAgIF9NX2tleV9jb21wYXJlKF9Bc01vdmVTb3VyY2Uoc3JjLmdldCgpLl9NX2tleV9jb21wYXJlKSkgeworICAgIHNyYy5nZXQoKS5fTV9ub2RlX2NvdW50ID0gMDsKKyAgfQorCisgIH5fUmJfdHJlZSgpIHsgY2xlYXIoKTsgfQorICBfU2VsZiYgb3BlcmF0b3I9KGNvbnN0IF9TZWxmJiBfX3gpOworCitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFjY2Vzc29yczoKKyAgX0NvbXBhcmUga2V5X2NvbXAoKSBjb25zdCB7IHJldHVybiBfTV9rZXlfY29tcGFyZTsgfQorCisgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gaXRlcmF0b3IoX01fbGVmdG1vc3QoKSk7IH0KKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfTV9sZWZ0bW9zdCgpKTsgfQorICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBpdGVyYXRvcigmdGhpcy0+X01faGVhZGVyLl9NX2RhdGEpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9fQ09OU1RfQ0FTVChfQmFzZV9wdHIsICZ0aGlzLT5fTV9oZWFkZXIuX01fZGF0YSkpOyB9CisKKyAgcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0CisgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisgIHJldmVyc2VfaXRlcmF0b3IgcmVuZCgpIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgY29uc3QKKyAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gX01fbm9kZV9jb3VudCA9PSAwOyB9CisgIHNpemVfdHlwZSBzaXplKCkgY29uc3QgeyByZXR1cm4gX01fbm9kZV9jb3VudDsgfQorICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCB7IHJldHVybiBzaXplX3R5cGUoLTEpOyB9CisKKyAgdm9pZCBzd2FwKF9TZWxmJiBfX3QpIHsKKyAgICBpZiAoX190LmVtcHR5KCkpIHsKKyAgICAgIGlmICh0aGlzLT5lbXB0eSgpKSByZXR1cm47CisgICAgICBfX3QuX01faGVhZGVyLnN3YXAodGhpcy0+X01faGVhZGVyKTsKKyAgICAgIF9fdC5fTV9yZWJpbmQoJnRoaXMtPl9NX2hlYWRlci5fTV9kYXRhKTsKKyAgICAgIHRoaXMtPl9NX2VtcHR5X2luaXRpYWxpemUoKTsKKyAgICB9CisgICAgZWxzZSBpZiAodGhpcy0+ZW1wdHkoKSkgeworICAgICAgX190LnN3YXAoKnRoaXMpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHRoaXMtPl9NX2hlYWRlci5zd2FwKF9fdC5fTV9oZWFkZXIpOworICAgICAgdGhpcy0+X01fcmViaW5kKCZfX3QuX01faGVhZGVyLl9NX2RhdGEpOworICAgICAgX190Ll9NX3JlYmluZCgmdGhpcy0+X01faGVhZGVyLl9NX2RhdGEpOworICAgIH0KKyAgICBfU1RMUF9TVEQ6OnN3YXAoX01fbm9kZV9jb3VudCwgX190Ll9NX25vZGVfY291bnQpOworICAgIF9TVExQX1NURDo6c3dhcChfTV9rZXlfY29tcGFyZSwgX190Ll9NX2tleV9jb21wYXJlKTsKKyAgfQorCitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluc2VydC9lcmFzZQorICBwYWlyPGl0ZXJhdG9yLGJvb2w+IGluc2VydF91bmlxdWUoY29uc3QgdmFsdWVfdHlwZSYgX194KTsKKyAgaXRlcmF0b3IgaW5zZXJ0X2VxdWFsKGNvbnN0IHZhbHVlX3R5cGUmIF9feCk7CisKKyAgaXRlcmF0b3IgaW5zZXJ0X3VuaXF1ZShpdGVyYXRvciBfX3BvcywgY29uc3QgdmFsdWVfdHlwZSYgX194KTsKKyAgaXRlcmF0b3IgaW5zZXJ0X2VxdWFsKGl0ZXJhdG9yIF9fcG9zLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpOworCisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyAgdGVtcGxhdGU8Y2xhc3MgX0lJPiB2b2lkIGluc2VydF9lcXVhbChfSUkgX19maXJzdCwgX0lJIF9fbGFzdCkgeworICAgIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKyAgICAgIGluc2VydF9lcXVhbCgqX19maXJzdCk7CisgIH0KKyAgdGVtcGxhdGU8Y2xhc3MgX0lJPiB2b2lkIGluc2VydF91bmlxdWUoX0lJIF9fZmlyc3QsIF9JSSBfX2xhc3QpIHsKKyAgICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisgICAgICBpbnNlcnRfdW5pcXVlKCpfX2ZpcnN0KTsKKyAgfQorI2Vsc2UKKyAgdm9pZCBpbnNlcnRfdW5pcXVlKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkgeworICAgIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKyAgICAgIGluc2VydF91bmlxdWUoKl9fZmlyc3QpOworICB9CisgIHZvaWQgaW5zZXJ0X3VuaXF1ZShjb25zdCB2YWx1ZV90eXBlKiBfX2ZpcnN0LCBjb25zdCB2YWx1ZV90eXBlKiBfX2xhc3QpIHsKKyAgICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisgICAgICBpbnNlcnRfdW5pcXVlKCpfX2ZpcnN0KTsKKyAgfQorICB2b2lkIGluc2VydF9lcXVhbChjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpIHsKKyAgICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisgICAgICBpbnNlcnRfZXF1YWwoKl9fZmlyc3QpOworICB9CisgIHZvaWQgaW5zZXJ0X2VxdWFsKGNvbnN0IHZhbHVlX3R5cGUqIF9fZmlyc3QsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbGFzdCkgeworICAgIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKyAgICAgIGluc2VydF9lcXVhbCgqX19maXJzdCk7CisgIH0KKyNlbmRpZgorCisgIHZvaWQgZXJhc2UoaXRlcmF0b3IgX19wb3MpIHsKKyAgICBfQmFzZV9wdHIgX194ID0gX1JiX2dsb2JhbF9pbnN0OjpfUmViYWxhbmNlX2Zvcl9lcmFzZShfX3Bvcy5fTV9ub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPl9NX2hlYWRlci5fTV9kYXRhLl9NX3BhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5fTV9oZWFkZXIuX01fZGF0YS5fTV9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPl9NX2hlYWRlci5fTV9kYXRhLl9NX3JpZ2h0KTsKKyAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95KCZfU192YWx1ZShfX3gpKTsKKyAgICB0aGlzLT5fTV9oZWFkZXIuZGVhbGxvY2F0ZShfX1NUQVRJQ19DQVNUKF9MaW5rX3R5cGUsIF9feCksIDEpOworICAgIC0tX01fbm9kZV9jb3VudDsKKyAgfQorCisgIHNpemVfdHlwZSBlcmFzZShjb25zdCBrZXlfdHlwZSYgX194KSB7CisgICAgcGFpcjxpdGVyYXRvcixpdGVyYXRvcj4gX19wID0gZXF1YWxfcmFuZ2UoX194KTsKKyAgICBzaXplX3R5cGUgX19uID0gZGlzdGFuY2UoX19wLmZpcnN0LCBfX3Auc2Vjb25kKTsKKyAgICBlcmFzZShfX3AuZmlyc3QsIF9fcC5zZWNvbmQpOworICAgIHJldHVybiBfX247CisgIH0KKworICBzaXplX3R5cGUgZXJhc2VfdW5pcXVlKGNvbnN0IGtleV90eXBlJiBfX3gpIHsKKyAgICBpdGVyYXRvciBfX2kgPSBmaW5kKF9feCk7CisgICAgaWYgKF9faS5fTV9ub2RlICE9ICZ0aGlzLT5fTV9oZWFkZXIuX01fZGF0YSkgeworICAgICAgZXJhc2UoX19pKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHZvaWQgZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KSB7CisgICAgaWYgKF9fZmlyc3QuX01fbm9kZSA9PSB0aGlzLT5fTV9oZWFkZXIuX01fZGF0YS5fTV9sZWZ0ICYmIC8vIGJlZ2luKCkKKyAgICAgICAgX19sYXN0Ll9NX25vZGUgPT0gJnRoaXMtPl9NX2hlYWRlci5fTV9kYXRhKSAgICAgICAgICAgLy8gZW5kKCkKKyAgICAgIGNsZWFyKCk7CisgICAgZWxzZQorICAgICAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0KSBlcmFzZShfX2ZpcnN0KyspOworICB9CisKKyAgdm9pZCBlcmFzZShjb25zdCBrZXlfdHlwZSogX19maXJzdCwgY29uc3Qga2V5X3R5cGUqIF9fbGFzdCkgeworICAgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkgZXJhc2UoKl9fZmlyc3QrKyk7CisgIH0KKworICB2b2lkIGNsZWFyKCkgeworICAgIGlmIChfTV9ub2RlX2NvdW50ICE9IDApIHsKKyAgICAgIF9NX2VyYXNlKF9NX3Jvb3QoKSk7CisgICAgICBfTV9sZWZ0bW9zdCgpID0gJnRoaXMtPl9NX2hlYWRlci5fTV9kYXRhOworICAgICAgX01fcm9vdCgpID0gMDsKKyAgICAgIF9NX3JpZ2h0bW9zdCgpID0gJnRoaXMtPl9NX2hlYWRlci5fTV9kYXRhOworICAgICAgX01fbm9kZV9jb3VudCA9IDA7CisgICAgfQorICB9CisKK3B1YmxpYzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IG9wZXJhdGlvbnM6CisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBpdGVyYXRvciBmaW5kKGNvbnN0IF9LVCYgX19rKSB7IHJldHVybiBpdGVyYXRvcihfTV9maW5kKF9faykpOyB9CisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBjb25zdF9pdGVyYXRvciBmaW5kKGNvbnN0IF9LVCYgX19rKSBjb25zdCB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfTV9maW5kKF9faykpOyB9Citwcml2YXRlOgorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgX0Jhc2VfcHRyIF9NX2ZpbmQoY29uc3QgX0tUJiBfX2spIGNvbnN0IHsKKyAgICBfQmFzZV9wdHIgX195ID0gX19DT05TVF9DQVNUKF9CYXNlX3B0ciwgJnRoaXMtPl9NX2hlYWRlci5fTV9kYXRhKTsgICAgICAvLyBMYXN0IG5vZGUgd2hpY2ggaXMgbm90IGxlc3MgdGhhbiBfX2suCisgICAgX0Jhc2VfcHRyIF9feCA9IF9NX3Jvb3QoKTsgICAgICAvLyBDdXJyZW50IG5vZGUuCisKKyAgICB3aGlsZSAoX194ICE9IDApCisgICAgICBpZiAoIV9NX2tleV9jb21wYXJlKF9TX2tleShfX3gpLCBfX2spKQorICAgICAgICBfX3kgPSBfX3gsIF9feCA9IF9TX2xlZnQoX194KTsKKyAgICAgIGVsc2UKKyAgICAgICAgX194ID0gX1NfcmlnaHQoX194KTsKKworICAgIGlmIChfX3kgIT0gJnRoaXMtPl9NX2hlYWRlci5fTV9kYXRhKSB7CisgICAgICBpZiAoX01fa2V5X2NvbXBhcmUoX19rLCBfU19rZXkoX195KSkpIHsKKyAgICAgICAgX195ID0gX19DT05TVF9DQVNUKF9CYXNlX3B0ciwgJnRoaXMtPl9NX2hlYWRlci5fTV9kYXRhKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIF9feTsKKyAgfQorCisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBfQmFzZV9wdHIgX01fbG93ZXJfYm91bmQoY29uc3QgX0tUJiBfX2spIGNvbnN0IHsKKyAgICBfQmFzZV9wdHIgX195ID0gX19DT05TVF9DQVNUKF9CYXNlX3B0ciwgJnRoaXMtPl9NX2hlYWRlci5fTV9kYXRhKTsgLyogTGFzdCBub2RlIHdoaWNoIGlzIG5vdCBsZXNzIHRoYW4gX19rLiAqLworICAgIF9CYXNlX3B0ciBfX3ggPSBfTV9yb290KCk7IC8qIEN1cnJlbnQgbm9kZS4gKi8KKworICAgIHdoaWxlIChfX3ggIT0gMCkKKyAgICAgIGlmICghX01fa2V5X2NvbXBhcmUoX1Nfa2V5KF9feCksIF9faykpCisgICAgICAgIF9feSA9IF9feCwgX194ID0gX1NfbGVmdChfX3gpOworICAgICAgZWxzZQorICAgICAgICBfX3ggPSBfU19yaWdodChfX3gpOworCisgICAgcmV0dXJuIF9feTsKKyAgfQorCisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBfQmFzZV9wdHIgX01fdXBwZXJfYm91bmQoY29uc3QgX0tUJiBfX2spIGNvbnN0IHsKKyAgICBfQmFzZV9wdHIgX195ID0gX19DT05TVF9DQVNUKF9CYXNlX3B0ciwgJnRoaXMtPl9NX2hlYWRlci5fTV9kYXRhKTsgLyogTGFzdCBub2RlIHdoaWNoIGlzIGdyZWF0ZXIgdGhhbiBfX2suICovCisgICAgX0Jhc2VfcHRyIF9feCA9IF9NX3Jvb3QoKTsgLyogQ3VycmVudCBub2RlLiAqLworCisgICAgd2hpbGUgKF9feCAhPSAwKQorICAgICAgaWYgKF9NX2tleV9jb21wYXJlKF9faywgX1Nfa2V5KF9feCkpKQorICAgICAgICBfX3kgPSBfX3gsIF9feCA9IF9TX2xlZnQoX194KTsKKyAgICAgIGVsc2UKKyAgICAgICAgX194ID0gX1NfcmlnaHQoX194KTsKKworICAgIHJldHVybiBfX3k7CisgIH0KKworcHVibGljOgorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgc2l6ZV90eXBlIGNvdW50KGNvbnN0IF9LVCYgX194KSBjb25zdCB7CisgICAgcGFpcjxjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3I+IF9fcCA9IGVxdWFsX3JhbmdlKF9feCk7CisgICAgcmV0dXJuIGRpc3RhbmNlKF9fcC5maXJzdCwgX19wLnNlY29uZCk7CisgIH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIGl0ZXJhdG9yIGxvd2VyX2JvdW5kKGNvbnN0IF9LVCYgX194KSB7IHJldHVybiBpdGVyYXRvcihfTV9sb3dlcl9ib3VuZChfX3gpKTsgfQorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgY29uc3RfaXRlcmF0b3IgbG93ZXJfYm91bmQoY29uc3QgX0tUJiBfX3gpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9NX2xvd2VyX2JvdW5kKF9feCkpOyB9CisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBpdGVyYXRvciB1cHBlcl9ib3VuZChjb25zdCBfS1QmIF9feCkgeyByZXR1cm4gaXRlcmF0b3IoX01fdXBwZXJfYm91bmQoX194KSk7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIGNvbnN0X2l0ZXJhdG9yIHVwcGVyX2JvdW5kKGNvbnN0IF9LVCYgX194KSBjb25zdCB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfTV91cHBlcl9ib3VuZChfX3gpKTsgfQorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgcGFpcjxpdGVyYXRvcixpdGVyYXRvcj4gZXF1YWxfcmFuZ2UoY29uc3QgX0tUJiBfX3gpCisgIHsgcmV0dXJuIHBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPihsb3dlcl9ib3VuZChfX3gpLCB1cHBlcl9ib3VuZChfX3gpKTsgfQorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgcGFpcjxjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3I+IGVxdWFsX3JhbmdlKGNvbnN0IF9LVCYgX194KSBjb25zdAorICB7IHJldHVybiBwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4obG93ZXJfYm91bmQoX194KSwgdXBwZXJfYm91bmQoX194KSk7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIHBhaXI8aXRlcmF0b3IsaXRlcmF0b3I+IGVxdWFsX3JhbmdlX3VuaXF1ZShjb25zdCBfS1QmIF9feCkgeworICAgIHBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPiBfX3A7CisgICAgX19wLnNlY29uZCA9IGxvd2VyX2JvdW5kKF9feCk7CisgICAgaWYgKF9fcC5zZWNvbmQuX01fbm9kZSAhPSAmdGhpcy0+X01faGVhZGVyLl9NX2RhdGEgJiYKKyAgICAgICAgIV9NX2tleV9jb21wYXJlKF9feCwgX1Nfa2V5KF9fcC5zZWNvbmQuX01fbm9kZSkpKSB7CisgICAgICBfX3AuZmlyc3QgPSBfX3Auc2Vjb25kKys7CisgICAgfQorICAgIGVsc2UgeworICAgICAgX19wLmZpcnN0ID0gX19wLnNlY29uZDsKKyAgICB9CisgICAgcmV0dXJuIF9fcDsKKyAgfQorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgcGFpcjxjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3I+IGVxdWFsX3JhbmdlX3VuaXF1ZShjb25zdCBfS1QmIF9feCkgY29uc3QgeworICAgIHBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPiBfX3A7CisgICAgX19wLnNlY29uZCA9IGxvd2VyX2JvdW5kKF9feCk7CisgICAgaWYgKF9fcC5zZWNvbmQuX01fbm9kZSAhPSAmdGhpcy0+X01faGVhZGVyLl9NX2RhdGEgJiYKKyAgICAgICAgIV9NX2tleV9jb21wYXJlKF9feCwgX1Nfa2V5KF9fcC5zZWNvbmQuX01fbm9kZSkpKSB7CisgICAgICBfX3AuZmlyc3QgPSBfX3Auc2Vjb25kKys7CisgICAgfQorICAgIGVsc2UgeworICAgICAgX19wLmZpcnN0ID0gX19wLnNlY29uZDsKKyAgICB9CisgICAgcmV0dXJuIF9fcDsKKyAgfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpCitwdWJsaWM6CisgIC8vIERlYnVnZ2luZy4KKyAgYm9vbCBfX3JiX3ZlcmlmeSgpIGNvbnN0OworI2VuZGlmIC8vX1NUTFBfREVCVUcKK307CisKKyNpZiBkZWZpbmVkIChfU1RMUF9ERUJVRykKKyMgIHVuZGVmIF9SYl90cmVlCisjZW5kaWYKKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2lmICFkZWZpbmVkIChfU1RMUF9MSU5LX1RJTUVfSU5TVEFOVElBVElPTikKKyMgIGluY2x1ZGUgPHN0bC9fdHJlZS5jPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9ERUJVRykKKyMgIGluY2x1ZGUgPHN0bC9kZWJ1Zy9fdHJlZS5oPgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisjZGVmaW5lIF9TVExQX1RFTVBMQVRFX0hFQURFUiB0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0tleU9mVmFsdWUsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KKyNkZWZpbmUgX1NUTFBfVEVNUExBVEVfQ09OVEFJTkVSIF9TVExQX1BSSVYgX1JiX3RyZWU8X0tleSxfQ29tcGFyZSxfVmFsdWUsX0tleU9mVmFsdWUsX1RyYWl0cyxfQWxsb2M+CisjaW5jbHVkZSA8c3RsL19yZWxvcHNfY29udC5oPgorI3VuZGVmIF9TVExQX1RFTVBMQVRFX0NPTlRBSU5FUgorI3VuZGVmIF9TVExQX1RFTVBMQVRFX0hFQURFUgorCisjaWYgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfQ29tcGFyZSwgY2xhc3MgX1ZhbHVlLCBjbGFzcyBfS2V5T2ZWYWx1ZSwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorc3RydWN0IF9fbW92ZV90cmFpdHM8X1NUTFBfUFJJViBfUmJfdHJlZTxfS2V5LCBfQ29tcGFyZSwgX1ZhbHVlLCBfS2V5T2ZWYWx1ZSwgX1RyYWl0cywgX0FsbG9jPiA+CisgIDogX1NUTFBfUFJJViBfX21vdmVfdHJhaXRzX2hlbHAyPF9Db21wYXJlLCBfQWxsb2M+IHt9OworI2VuZGlmCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2VuZGlmIC8qIF9TVExQX0lOVEVSTkFMX1RSRUVfSCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RsL190eXBlaW5mby5oIGIvc3RsL190eXBlaW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlNjAyZmIKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvX3R5cGVpbmZvLmgKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfVFlQRUlORk8KKyNkZWZpbmUgX1NUTFBfSU5URVJOQUxfVFlQRUlORk8KKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19UWVBFSU5GTykKKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfTk9fTkVXX05FV19IRUFERVIpCisjICAgIGluY2x1ZGUgPHR5cGVpbmZvLmg+CisjICBlbHNlCisjICAgIGlmZGVmIF9TVExQX0JST0tFTl9CQURfQ0FTVF9DTEFTUworIyAgICAgIGRlZmluZSBiYWRfY2FzdCBfU1RMUF9OVUxMSUZJRURfQlJPS0VOX0JBRF9DQVNUX0NMQVNTCisjICAgIGVuZGlmCisjICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9SVU5USU1FX0hFQURFUih0eXBlaW5mbykKKyMgICAgaWZkZWYgX1NUTFBfQlJPS0VOX0JBRF9DQVNUX0NMQVNTCisjICAgICAgdW5kZWYgYmFkX2Nhc3QKKyMgICAgICB1bmRlZiBfU1RMUF9OVUxMSUZJRURfQlJPS0VOX0JBRF9DQVNUX0NMQVNTCisjICAgIGVuZGlmCisjICBlbmRpZgorCisjICBpZiAoZGVmaW5lZChfU1RMUF9NU1ZDKSAmJiAoX1NUTFBfTVNWQyA+PSAxMzAwKSkgfHwgKGRlZmluZWQoX19JTlRFTF9DT01QSUxFUikgJiYgKF9fSU5URUxfQ09NUElMRVIgPj0gODAwKSkKKy8vIEluIC5ORVQsIDx0eXBlaW5mbz4gYWN0dWFsbHkgaW5jbHVkZXMgPHR5cGVpbmZvLmg+CisjICAgIHVuZGVmIF9TVExQX09MRFNURF90eXBlaW5mbworIyAgZW5kaWYKKworLy8gaWYgPHR5cGVpbmZvLmg+IGFscmVhZHkgaW5jbHVkZWQsIGRvIG5vdCBpbXBvcnQgYW55dGhpbmcKKyMgIGlmIGRlZmluZWQoX1NUTFBfVVNFX05BTUVTUEFDRVMpICYmICFkZWZpbmVkKF9TVExQX09MRFNURF90eXBlaW5mbykgJiYgXAorICAgICAgKGRlZmluZWQoX1NUTFBfVkVORE9SX0dMT0JBTF9FWENFUFRfU1REKSB8fCBcCisgICAgICAgZGVmaW5lZChfU1RMUF9VU0VfT1dOX05BTUVTUEFDRSkgfHwgZGVmaW5lZCAoX1NUTFBfREVCVUcpKQorIyAgICBpZiBkZWZpbmVkKF9TVExQX01TVkMpICYmIChfU1RMUF9NU1ZDIDwgMTMwMCkgJiYgIWRlZmluZWQoX1NUTFBfV0NFX05FVCkKK2NsYXNzIGJhZF9jYXN0IDogcHVibGljIGV4Y2VwdGlvbiB7fTsKKyMgICAgZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisvLyBWQyA2IGFuZCBlVkMgNCBoYXZlIHR5cGVfaW5mbyBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZQorIyAgICBpZiAoZGVmaW5lZChfU1RMUF9NU1ZDKSAmJiAoX1NUTFBfTVNWQyA8IDEzMDApKSB8fCBkZWZpbmVkKF9TVExQX1dDRV9ORVQpCit1c2luZyA6OnR5cGVfaW5mbzsKKyMgICAgZWxzZQordXNpbmcgX1NUTFBfVkVORE9SX0VYQ0VQVF9TVEQ6OnR5cGVfaW5mbzsKKyMgICAgZW5kaWYKKworIyAgICBpZiAhKGRlZmluZWQgKF9fTVJDX18pIHx8IGRlZmluZWQgKF9fU0NfXykgfHwgZGVmaW5lZCAoX19ETUNfXykpCit1c2luZyBfU1RMUF9WRU5ET1JfRVhDRVBUX1NURDo6YmFkX3R5cGVpZDsKKyMgICAgZW5kaWYKKworLy8jaWYgZGVmaW5lZCggX194bENfXyApICYmIChfX3hsQ19fIDwgMHg1MDApCisvLyMgaW5jbHVkZSA8ZXhjZXB0aW9uPgorLy9zdHJ1Y3QgYmFkX2Nhc3QgOiBleGNlcHRpb24ge307CisvLyNlbmRpZgorIyAgICBpZiBkZWZpbmVkIChfU1RMUF9NU1ZDKSAmJiAoX1NUTFBfTVNWQyA8IDEzMDApICYmICFkZWZpbmVkIChfU1RMUF9XQ0VfTkVUKQordXNpbmcgOjpiYWRfY2FzdDsKKyMgICAgZWxzZQordXNpbmcgX1NUTFBfVkVORE9SX0VYQ0VQVF9TVEQ6OmJhZF9jYXN0OworIyAgICBlbmRpZgorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyMgIGVuZGlmCisKKyNlbHNlCisKKyMgIGlmbmRlZiBfU1RMUF9JTlRFUk5BTF9FWENFUFRJT04KKyMgICAgaW5jbHVkZSA8c3RsL19leGNlcHRpb24uaD4KKyMgIGVuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorIyAgaWYgIWRlZmluZWQgKF9fRE1DX18pCitzdHJ1Y3QgYmFkX2Nhc3QgOiBleGNlcHRpb24ge307CisjICBlbmRpZgorX1NUTFBfRU5EX05BTUVTUEFDRQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3RsL191bmluaXRpYWxpemVkLmggYi9zdGwvX3VuaW5pdGlhbGl6ZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmYzNTc4Ci0tLSAvZGV2L251bGwKKysrIGIvc3RsL191bmluaXRpYWxpemVkLmgKQEAgLTAsMCArMSw0MzcgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisvKiBOT1RFOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBTVEwgaGVhZGVycy4KKyAqICAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuCisgKi8KKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9VTklOSVRJQUxJWkVEX0gKKyNkZWZpbmUgX1NUTFBfSU5URVJOQUxfVU5JTklUSUFMSVpFRF9ICisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1NUUklORworIyAgaW5jbHVkZSA8c3RsL19jc3RyaW5nLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9BTEdPQkFTRV9ICisjICBpbmNsdWRlIDxzdGwvX2FsZ29iYXNlLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DT05TVFJVQ1RfSAorIyAgaW5jbHVkZSA8c3RsL19jb25zdHJ1Y3QuaD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCisvLyB1bmluaXRpYWxpemVkX2NvcHkKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9PdXRwdXRJdGVyLCBjbGFzcyBfRGlzdGFuY2U+CitpbmxpbmUgX091dHB1dEl0ZXIgX191Y29weShfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXIgX19yZXN1bHQsIF9EaXN0YW5jZSopIHsKKyAgX091dHB1dEl0ZXIgX19jdXIgPSBfX3Jlc3VsdDsKKyAgX1NUTFBfVFJZIHsKKyAgICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QsICsrX19jdXIpCisgICAgICBfUGFyYW1fQ29uc3RydWN0KCYqX19jdXIsICpfX2ZpcnN0KTsKKyAgICByZXR1cm4gX19jdXI7CisgIH0KKyAgX1NUTFBfVU5XSU5EKF9TVExQX1NURDo6X0Rlc3Ryb3lfUmFuZ2UoX19yZXN1bHQsIF9fY3VyKSkKKyAgX1NUTFBfUkVUX0FGVEVSX1RIUk9XKF9fY3VyKQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX091dHB1dEl0ZXIsIGNsYXNzIF9EaXN0YW5jZT4KK2lubGluZSBfT3V0cHV0SXRlciBfX3Vjb3B5KF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlciBfX3Jlc3VsdCwgY29uc3QgaW5wdXRfaXRlcmF0b3JfdGFnICYsIF9EaXN0YW5jZSogX19kKQoreyByZXR1cm4gX191Y29weShfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0LCBfX2QpOyB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9OT05URU1QTF9CQVNFX01BVENIX0JVRykKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfT3V0cHV0SXRlciwgY2xhc3MgX0Rpc3RhbmNlPgoraW5saW5lIF9PdXRwdXRJdGVyIF9fdWNvcHkoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyIF9fcmVzdWx0LCBjb25zdCBmb3J3YXJkX2l0ZXJhdG9yX3RhZyAmLCBfRGlzdGFuY2UqIF9fZCkKK3sgcmV0dXJuIF9fdWNvcHkoX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdCwgX19kKTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX091dHB1dEl0ZXIsIGNsYXNzIF9EaXN0YW5jZT4KK2lubGluZSBfT3V0cHV0SXRlciBfX3Vjb3B5KF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlciBfX3Jlc3VsdCwgY29uc3QgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcgJiwgX0Rpc3RhbmNlKiBfX2QpCit7IHJldHVybiBfX3Vjb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQsIF9fZCk7IH0KKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9PdXRwdXRJdGVyLCBjbGFzcyBfRGlzdGFuY2U+CitpbmxpbmUgX091dHB1dEl0ZXIgX191Y29weShfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlciBfX3Jlc3VsdCwgY29uc3QgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgJiwgX0Rpc3RhbmNlKikgeworICBfT3V0cHV0SXRlciBfX2N1ciA9IF9fcmVzdWx0OworICBfU1RMUF9UUlkgeworICAgIGZvciAoX0Rpc3RhbmNlIF9fbiA9IF9fbGFzdCAtIF9fZmlyc3Q7IF9fbiA+IDA7IC0tX19uKSB7CisgICAgICBfUGFyYW1fQ29uc3RydWN0KCYqX19jdXIsICpfX2ZpcnN0KTsKKyAgICAgICsrX19maXJzdDsKKyAgICAgICsrX19jdXI7CisgICAgfQorICAgIHJldHVybiBfX2N1cjsKKyAgfQorICBfU1RMUF9VTldJTkQoX1NUTFBfU1REOjpfRGVzdHJveV9SYW5nZShfX3Jlc3VsdCwgX19jdXIpKQorICBfU1RMUF9SRVRfQUZURVJfVEhST1coX19jdXIpCit9CisKKy8vVXNlZCBpbnRlcm5hbHkKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX091dHB1dEl0ZXI+CitpbmxpbmUgX091dHB1dEl0ZXIgX191Y29weShfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsIF9PdXRwdXRJdGVyIF9fcmVzdWx0KQoreyByZXR1cm4gX191Y29weShfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0LCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZygpLCAocHRyZGlmZl90KikwKTsgfQorCitpbmxpbmUgdm9pZCoKK19fdWNvcHlfdHJpdmlhbChjb25zdCB2b2lkKiBfX2ZpcnN0LCBjb25zdCB2b2lkKiBfX2xhc3QsIHZvaWQqIF9fcmVzdWx0KSB7CisgIC8vZHVtczogdGhpcyB2ZXJzaW9uIGNhbiB1c2UgbWVtY3B5IChfX2NvcHlfdHJpdmlhbCBjYW4ndCkKKyAgcmV0dXJuIChfX2xhc3QgPT0gX19maXJzdCkgPyBfX3Jlc3VsdCA6CisgICAgKChjaGFyKiltZW1jcHkoX19yZXN1bHQsIF9fZmlyc3QsICgoY29uc3QgY2hhciopX19sYXN0IC0gKGNvbnN0IGNoYXIqKV9fZmlyc3QpKSkgKworICAgICgoY29uc3QgY2hhciopX19sYXN0IC0gKGNvbnN0IGNoYXIqKV9fZmlyc3QpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX091dHB1dEl0ZXI+CitpbmxpbmUgX091dHB1dEl0ZXIgX191Y29weV9wdHJzKF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsIF9PdXRwdXRJdGVyIF9fcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qVHJpdmlhbFVDb3B5Ki8pCit7IHJldHVybiBfX3Vjb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQsIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKCksIChwdHJkaWZmX3QqKTApOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfT3V0cHV0SXRlcj4KK2lubGluZSBfT3V0cHV0SXRlciBfX3Vjb3B5X3B0cnMoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwgX091dHB1dEl0ZXIgX19yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKlRyaXZpYWxVQ29weSovKSB7CisgIC8vIHdlIGtub3cgdGhleSBhbGwgcG9pbnRlcnMsIHNvIHRoaXMgY2FzdCBpcyBPSworICAvLyAgcmV0dXJuIChfT3V0cHV0SXRlcilfX2NvcHlfdHJpdmlhbCgmKCpfX2ZpcnN0KSwgJigqX19sYXN0KSwgJigqX19yZXN1bHQpKTsKKyAgcmV0dXJuIChfT3V0cHV0SXRlcilfX3Vjb3B5X3RyaXZpYWwoX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfT3V0cHV0SXRlcj4KK2lubGluZSBfT3V0cHV0SXRlciBfX3Vjb3B5X2F1eChfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LCBfT3V0cHV0SXRlciBfX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX3RydWVfdHlwZSYgLypCb3RoUHRyVHlwZSovKSB7CisgIHJldHVybiBfX3Vjb3B5X3B0cnMoX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICBfVXNlVHJpdmlhbFVDb3B5KF9TVExQX1ZBTFVFX1RZUEUoX19maXJzdCwgX0lucHV0SXRlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9WQUxVRV9UWVBFKF9fcmVzdWx0LCBfT3V0cHV0SXRlcikpLl9BbnN3ZXIoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfT3V0cHV0SXRlcj4KK2lubGluZSBfT3V0cHV0SXRlciBfX3Vjb3B5X2F1eChfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LCBfT3V0cHV0SXRlciBfX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qQm90aFB0clR5cGUqLykgeworICByZXR1cm4gX191Y29weShfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0LAorICAgICAgICAgICAgICAgICBfU1RMUF9JVEVSQVRPUl9DQVRFR09SWShfX2ZpcnN0LCBfSW5wdXRJdGVyKSwKKyAgICAgICAgICAgICAgICAgX1NUTFBfRElTVEFOQ0VfVFlQRShfX2ZpcnN0LCBfSW5wdXRJdGVyKSk7Cit9CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX0ZvcndhcmRJdGVyPgoraW5saW5lIF9Gb3J3YXJkSXRlcgordW5pbml0aWFsaXplZF9jb3B5KF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsIF9Gb3J3YXJkSXRlciBfX3Jlc3VsdCkKK3sgcmV0dXJuIF9TVExQX1BSSVYgX191Y29weV9hdXgoX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdCwgX0JvdGhQdHJUeXBlPCBfSW5wdXRJdGVyLCBfRm9yd2FyZEl0ZXI+OjpfQW5zd2VyKCkpOyB9CisKK2lubGluZSBjaGFyKgordW5pbml0aWFsaXplZF9jb3B5KGNvbnN0IGNoYXIqIF9fZmlyc3QsIGNvbnN0IGNoYXIqIF9fbGFzdCwgY2hhciogX19yZXN1bHQpCit7IHJldHVybiAgKGNoYXIqKV9TVExQX1BSSVYgX191Y29weV90cml2aWFsKF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQpOyB9CisKKyMgIGlmIGRlZmluZWQgKF9TVExQX0hBU19XQ0hBUl9UKSAvLyBkd2EgOC8xNS85NworaW5saW5lIHdjaGFyX3QqCit1bmluaXRpYWxpemVkX2NvcHkoY29uc3Qgd2NoYXJfdCogX19maXJzdCwgY29uc3Qgd2NoYXJfdCogX19sYXN0LCB3Y2hhcl90KiBfX3Jlc3VsdCkKK3sgcmV0dXJuICAod2NoYXJfdCopX1NUTFBfUFJJViBfX3Vjb3B5X3RyaXZpYWwgKF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQpOyB9CisjICBlbmRpZgorCisvLyB1bmluaXRpYWxpemVkX2NvcHlfbiAobm90IHBhcnQgb2YgdGhlIEMrKyBzdGFuZGFyZCkKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9TaXplLCBjbGFzcyBfRm9yd2FyZEl0ZXI+CitfU1RMUF9JTkxJTkVfTE9PUAorcGFpcjxfSW5wdXRJdGVyLCBfRm9yd2FyZEl0ZXI+CitfX3Vjb3B5X24oX0lucHV0SXRlciBfX2ZpcnN0LCBfU2l6ZSBfX2NvdW50LCBfRm9yd2FyZEl0ZXIgX19yZXN1bHQsCisgICAgICAgICAgY29uc3QgaW5wdXRfaXRlcmF0b3JfdGFnICYpIHsKKyAgX0ZvcndhcmRJdGVyIF9fY3VyID0gX19yZXN1bHQ7CisgIF9TVExQX1RSWSB7CisgICAgZm9yICggOyBfX2NvdW50ID4gMCA7IC0tX19jb3VudCwgKytfX2ZpcnN0LCArK19fY3VyKQorICAgICAgX1BhcmFtX0NvbnN0cnVjdCgmKl9fY3VyLCAqX19maXJzdCk7CisgICAgcmV0dXJuIHBhaXI8X0lucHV0SXRlciwgX0ZvcndhcmRJdGVyPihfX2ZpcnN0LCBfX2N1cik7CisgIH0KKyAgX1NUTFBfVU5XSU5EKF9TVExQX1NURDo6X0Rlc3Ryb3lfUmFuZ2UoX19yZXN1bHQsIF9fY3VyKSkKKyAgX1NUTFBfUkVUX0FGVEVSX1RIUk9XKChwYWlyPF9JbnB1dEl0ZXIsIF9Gb3J3YXJkSXRlcj4oX19maXJzdCwgX19jdXIpKSkKK30KKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfTk9OVEVNUExfQkFTRV9NQVRDSF9CVUcpCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX1NpemUsIGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CitpbmxpbmUgcGFpcjxfSW5wdXRJdGVyLCBfRm9yd2FyZEl0ZXJhdG9yPgorX191Y29weV9uKF9JbnB1dEl0ZXIgX19maXJzdCwgX1NpemUgX19jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9yd2FyZF9pdGVyYXRvcl90YWcgJikKK3sgcmV0dXJuIF9fdWNvcHlfbihfX2ZpcnN0LCBfX2NvdW50LCBfX3Jlc3VsdCwgaW5wdXRfaXRlcmF0b3JfdGFnKCkpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfU2l6ZSwgY2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KK2lubGluZSBwYWlyPF9JbnB1dEl0ZXIsIF9Gb3J3YXJkSXRlcmF0b3I+CitfX3Vjb3B5X24oX0lucHV0SXRlciBfX2ZpcnN0LCBfU2l6ZSBfX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZyAmKQoreyByZXR1cm4gX191Y29weV9uKF9fZmlyc3QsIF9fY291bnQsIF9fcmVzdWx0LCBpbnB1dF9pdGVyYXRvcl90YWcoKSk7IH0KKyMgIGVuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX1NpemUsIGNsYXNzIF9Gb3J3YXJkSXRlcj4KK2lubGluZSBwYWlyPF9SYW5kb21BY2Nlc3NJdGVyLCBfRm9yd2FyZEl0ZXI+CitfX3Vjb3B5X24oX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwgX1NpemUgX19jb3VudCwgX0ZvcndhcmRJdGVyIF9fcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyAmKSB7CisgIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCA9IF9fZmlyc3QgKyBfX2NvdW50OworICByZXR1cm4gcGFpcjxfUmFuZG9tQWNjZXNzSXRlciwgX0ZvcndhcmRJdGVyPihfX2xhc3QsIHVuaW5pdGlhbGl6ZWRfY29weShfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0KSk7Cit9CisKKy8vIFRoaXMgaXMgdXNlZCBpbnRlcm5hbGx5IGluIDxyb3BlPiAsIHdoaWNoIGlzIGV4dGVuc2lvbiBpdHNlbGYuCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX1NpemUsIGNsYXNzIF9Gb3J3YXJkSXRlcj4KK2lubGluZSBwYWlyPF9JbnB1dEl0ZXIsIF9Gb3J3YXJkSXRlcj4KK19fdWNvcHlfbihfSW5wdXRJdGVyIF9fZmlyc3QsIF9TaXplIF9fY291bnQsIF9Gb3J3YXJkSXRlciBfX3Jlc3VsdCkKK3sgcmV0dXJuIF9TVExQX1BSSVYgX191Y29weV9uKF9fZmlyc3QsIF9fY291bnQsIF9fcmVzdWx0LCBfU1RMUF9JVEVSQVRPUl9DQVRFR09SWShfX2ZpcnN0LCBfSW5wdXRJdGVyKSk7IH0KKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKQorCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9TaXplLCBjbGFzcyBfRm9yd2FyZEl0ZXI+CitpbmxpbmUgcGFpcjxfSW5wdXRJdGVyLCBfRm9yd2FyZEl0ZXI+Cit1bmluaXRpYWxpemVkX2NvcHlfbihfSW5wdXRJdGVyIF9fZmlyc3QsIF9TaXplIF9fY291bnQsIF9Gb3J3YXJkSXRlciBfX3Jlc3VsdCkKK3sgcmV0dXJuIF9TVExQX1BSSVYgX191Y29weV9uKF9fZmlyc3QsIF9fY291bnQsIF9fcmVzdWx0KTsgfQorCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfVHAsIGNsYXNzIF9EaXN0YW5jZT4KK2lubGluZSB2b2lkIF9fdWZpbGwoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsIGNvbnN0IF9UcCYgX194LCBfRGlzdGFuY2UqKSB7CisgIF9Gb3J3YXJkSXRlciBfX2N1ciA9IF9fZmlyc3Q7CisgIF9TVExQX1RSWSB7CisgICAgZm9yICggOyBfX2N1ciAhPSBfX2xhc3Q7ICsrX19jdXIpCisgICAgICBfUGFyYW1fQ29uc3RydWN0KCYqX19jdXIsIF9feCk7CisgIH0KKyAgX1NUTFBfVU5XSU5EKF9TVExQX1NURDo6X0Rlc3Ryb3lfUmFuZ2UoX19maXJzdCwgX19jdXIpKQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfVHAsIGNsYXNzIF9EaXN0YW5jZT4KK2lubGluZSB2b2lkIF9fdWZpbGwoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9UcCYgX194LCBjb25zdCBpbnB1dF9pdGVyYXRvcl90YWcgJiwgX0Rpc3RhbmNlKiBfX2QpCit7IF9fdWZpbGwoX19maXJzdCwgX19sYXN0LCBfX3gsIF9fZCk7IH0KKworI2lmIGRlZmluZWQgKF9TVExQX05PTlRFTVBMX0JBU0VfTUFUQ0hfQlVHKQordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1RwLCBjbGFzcyBfRGlzdGFuY2U+CitpbmxpbmUgdm9pZCBfX3VmaWxsKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBfVHAmIF9feCwgY29uc3QgZm9yd2FyZF9pdGVyYXRvcl90YWcgJiwgX0Rpc3RhbmNlKiBfX2QpCit7IF9fdWZpbGwoX19maXJzdCwgX19sYXN0LCBfX3gsIF9fZCk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1RwLCBjbGFzcyBfRGlzdGFuY2U+CitpbmxpbmUgdm9pZCBfX3VmaWxsKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBfVHAmIF9feCwgY29uc3QgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcgJiwgX0Rpc3RhbmNlKiBfX2QpCit7IF9fdWZpbGwoX19maXJzdCwgX19sYXN0LCBfX3gsIF9fZCk7IH0KKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfVHAsIGNsYXNzIF9EaXN0YW5jZT4KK2lubGluZSB2b2lkIF9fdWZpbGwoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9UcCYgX194LCBjb25zdCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyAmLCBfRGlzdGFuY2UqKSB7CisgIF9Gb3J3YXJkSXRlciBfX2N1ciA9IF9fZmlyc3Q7CisgIF9TVExQX1RSWSB7CisgICAgZm9yIChfRGlzdGFuY2UgX19uID0gX19sYXN0IC0gX19maXJzdDsgX19uID4gMDsgLS1fX24sICsrX19jdXIpCisgICAgICBfUGFyYW1fQ29uc3RydWN0KCYqX19jdXIsIF9feCk7CisgIH0KKyAgX1NUTFBfVU5XSU5EKF9TVExQX1NURDo6X0Rlc3Ryb3lfUmFuZ2UoX19maXJzdCwgX19jdXIpKQorfQorCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1RwPgoraW5saW5lIHZvaWQgdW5pbml0aWFsaXplZF9maWxsKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LCAgY29uc3QgX1RwJiBfX3gpIHsKKyAgX1NUTFBfUFJJViBfX3VmaWxsKF9fZmlyc3QsIF9fbGFzdCwgX194LAorICAgICAgICAgICAgICAgICAgICAgX1NUTFBfSVRFUkFUT1JfQ0FURUdPUlkoX19maXJzdCwgX0ZvcndhcmRJdGVyKSwKKyAgICAgICAgICAgICAgICAgICAgIF9TVExQX0RJU1RBTkNFX1RZUEUoX19maXJzdCwgX0ZvcndhcmRJdGVyKSk7Cit9CisKKy8vIFNwZWNpYWxpemF0aW9uOiBmb3Igb25lLWJ5dGUgdHlwZXMgd2UgY2FuIHVzZSBtZW1zZXQuCitpbmxpbmUgdm9pZCB1bmluaXRpYWxpemVkX2ZpbGwodW5zaWduZWQgY2hhciogX19maXJzdCwgdW5zaWduZWQgY2hhciogX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXImIF9fdmFsKSB7CisgIHVuc2lnbmVkIGNoYXIgX190bXAgPSBfX3ZhbDsKKyAgbWVtc2V0KF9fZmlyc3QsIF9fdG1wLCBfX2xhc3QgLSBfX2ZpcnN0KTsKK30KKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fU0lHTkVEX0JVSUxUSU5TKQoraW5saW5lIHZvaWQgdW5pbml0aWFsaXplZF9maWxsKHNpZ25lZCBjaGFyKiBfX2ZpcnN0LCBzaWduZWQgY2hhciogX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpZ25lZCBjaGFyJiBfX3ZhbCkgeworICBzaWduZWQgY2hhciBfX3RtcCA9IF9fdmFsOworICBtZW1zZXQoX19maXJzdCwgX19TVEFUSUNfQ0FTVCh1bnNpZ25lZCBjaGFyLF9fdG1wKSwgX19sYXN0IC0gX19maXJzdCk7Cit9CisjZW5kaWYKK2lubGluZSB2b2lkIHVuaW5pdGlhbGl6ZWRfZmlsbChjaGFyKiBfX2ZpcnN0LCBjaGFyKiBfX2xhc3QsIGNvbnN0IGNoYXImIF9fdmFsKSB7CisgIGNoYXIgX190bXAgPSBfX3ZhbDsKKyAgbWVtc2V0KF9fZmlyc3QsIF9fU1RBVElDX0NBU1QodW5zaWduZWQgY2hhcixfX3RtcCksIF9fbGFzdCAtIF9fZmlyc3QpOworfQorCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9TaXplLCBjbGFzcyBfVHA+CitpbmxpbmUgX0ZvcndhcmRJdGVyIF9fdWZpbGxfbihfRm9yd2FyZEl0ZXIgX19maXJzdCwgX1NpemUgX19uLCBjb25zdCBfVHAmIF9feCkgeworICBfRm9yd2FyZEl0ZXIgX19jdXIgPSBfX2ZpcnN0OworICBfU1RMUF9UUlkgeworICAgIGZvciAoIDsgX19uID4gMDsgLS1fX24sICsrX19jdXIpCisgICAgICBfUGFyYW1fQ29uc3RydWN0KCYqX19jdXIsIF9feCk7CisgIH0KKyAgX1NUTFBfVU5XSU5EKF9TVExQX1NURDo6X0Rlc3Ryb3lfUmFuZ2UoX19maXJzdCwgX19jdXIpKQorICByZXR1cm4gX19jdXI7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9TaXplLCBjbGFzcyBfVHA+CitpbmxpbmUgX0ZvcndhcmRJdGVyIF9fdWZpbGxfbihfRm9yd2FyZEl0ZXIgX19maXJzdCwgX1NpemUgX19uLCBjb25zdCBfVHAmIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0X2l0ZXJhdG9yX3RhZyAmKQoreyByZXR1cm4gX191ZmlsbF9uKF9fZmlyc3QsIF9fbiwgX194KTsgfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfTk9OVEVNUExfQkFTRV9NQVRDSF9CVUcpCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfU2l6ZSwgY2xhc3MgX1RwPgoraW5saW5lIF9Gb3J3YXJkSXRlciBfX3VmaWxsX24oX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9TaXplIF9fbiwgY29uc3QgX1RwJiBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3J3YXJkX2l0ZXJhdG9yX3RhZyAmKQoreyByZXR1cm4gX191ZmlsbF9uKF9fZmlyc3QsIF9fbiwgX194KTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfU2l6ZSwgY2xhc3MgX1RwPgoraW5saW5lIF9Gb3J3YXJkSXRlciBfX3VmaWxsX24oX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9TaXplIF9fbiwgY29uc3QgX1RwJiBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZyAmKQoreyByZXR1cm4gX191ZmlsbF9uKF9fZmlyc3QsIF9fbiwgX194KTsgfQorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9TaXplLCBjbGFzcyBfVHA+CitpbmxpbmUgX0ZvcndhcmRJdGVyIF9fdW5pbml0aWFsaXplZF9maWxsX24oX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9TaXplIF9fbiwgY29uc3QgX1RwJiBfX3gpIHsKKyAgX0ZvcndhcmRJdGVyIF9fbGFzdCA9IF9fZmlyc3QgKyBfX247CisgIF9fdWZpbGwoX19maXJzdCwgX19sYXN0LCBfX3gsIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKCksIChwdHJkaWZmX3QqKTApOworICByZXR1cm4gX19sYXN0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfU2l6ZSwgY2xhc3MgX1RwPgoraW5saW5lIF9Gb3J3YXJkSXRlciBfX3VmaWxsX24oX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9TaXplIF9fbiwgY29uc3QgX1RwJiBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyAmKQoreyByZXR1cm4gX191bmluaXRpYWxpemVkX2ZpbGxfbihfX2ZpcnN0LCBfX24sIF9feCk7IH0KKworLyogX191bmluaXRpYWxpemVkX2luaXQgaXMgYW4gaW50ZXJuYWwgYWxnbyB0byBpbml0IGEgcmFuZ2Ugd2l0aCBhIHZhbHVlCisgKiBidWlsdCB1c2luZyBkZWZhdWx0IGNvbnN0cnVjdG9yLiBJdCBpcyBvbmx5IGNhbGxlZCB3aXRoIHBvaW50ZXIgYXMKKyAqIGl0ZXJhdG9yLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfU2l6ZSwgY2xhc3MgX1RwPgoraW5saW5lIF9Gb3J3YXJkSXRlciBfX3Vpbml0X2F1eF9hdXgoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9TaXplIF9fbiwgY29uc3QgX1RwJiBfX3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypfSGFzRGVmYXVsdFplcm8qLykKK3sgcmV0dXJuIF9fdW5pbml0aWFsaXplZF9maWxsX24oX19maXJzdCwgX19uLCBfX3ZhbCk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1NpemUsIGNsYXNzIF9UcD4KK2lubGluZSBfRm9yd2FyZEl0ZXIgX191aW5pdF9hdXhfYXV4KF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfU2l6ZSBfX24sIGNvbnN0IF9UcCYgX192YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX3RydWVfdHlwZSYgLypfSGFzRGVmYXVsdFplcm8qLykgeworICBtZW1zZXQoKHVuc2lnbmVkIGNoYXIqKV9fZmlyc3QsIDAsIF9fbiAqIHNpemVvZihfVHApKTsKKyAgcmV0dXJuIF9fZmlyc3QgKyBfX247Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9TaXplLCBjbGFzcyBfVHA+CitpbmxpbmUgX0ZvcndhcmRJdGVyIF9fdWluaXRfYXV4KF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfU2l6ZSBfX24sIGNvbnN0IF9UcCYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKl9Ucml2aWFsSW5pdCovKQoreyByZXR1cm4gX19maXJzdCArIF9fbjsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfU2l6ZSwgY2xhc3MgX1RwPgoraW5saW5lIF9Gb3J3YXJkSXRlciBfX3Vpbml0X2F1eChfRm9yd2FyZEl0ZXIgX19maXJzdCwgX1NpemUgX19uLCBjb25zdCBfVHAmIF9fdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qX1RyaXZpYWxJbml0Ki8pCit7IHJldHVybiBfX3Vpbml0X2F1eF9hdXgoX19maXJzdCwgX19uLCBfX3ZhbCwgX0hhc0RlZmF1bHRaZXJvVmFsdWUoX19maXJzdCkuX0Fuc3dlcigpKTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfU2l6ZSwgY2xhc3MgX1RwPgoraW5saW5lIF9Gb3J3YXJkSXRlciBfX3VuaW5pdGlhbGl6ZWRfaW5pdChfRm9yd2FyZEl0ZXIgX19maXJzdCwgX1NpemUgX19uLCBjb25zdCBfVHAmIF9fdmFsKQoreyByZXR1cm4gX191aW5pdF9hdXgoX19maXJzdCwgX19uLCBfX3ZhbCwgX1VzZVRyaXZpYWxJbml0KF9fZmlyc3QpLl9BbnN3ZXIoKSk7IH0KKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9TaXplLCBjbGFzcyBfVHA+CitpbmxpbmUgdm9pZAordW5pbml0aWFsaXplZF9maWxsX24oX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9TaXplIF9fbiwgY29uc3QgX1RwJiBfX3gpCit7IF9TVExQX1BSSVYgX191ZmlsbF9uKF9fZmlyc3QsIF9fbiwgX194LCBfU1RMUF9JVEVSQVRPUl9DQVRFR09SWShfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIpKTsgfQorCisvLyBFeHRlbnNpb25zOiBfX3VuaW5pdGlhbGl6ZWRfY29weV9jb3B5LCBfX3VuaW5pdGlhbGl6ZWRfY29weV9maWxsLAorLy8gX191bmluaXRpYWxpemVkX2ZpbGxfY29weS4KKworLy8gX191bmluaXRpYWxpemVkX2NvcHlfY29weQorLy8gQ29waWVzIFtmaXJzdDEsIGxhc3QxKSBpbnRvIFtyZXN1bHQsIHJlc3VsdCArIChsYXN0MSAtIGZpcnN0MSkpLCBhbmQKKy8vICBjb3BpZXMgW2ZpcnN0MiwgbGFzdDIpIGludG8KKy8vICBbcmVzdWx0ICsgKGxhc3QxIC0gZmlyc3QxKSwgcmVzdWx0ICsgKGxhc3QxIC0gZmlyc3QxKSArIChsYXN0MiAtIGZpcnN0MikpLgorCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0SXRlcjIsIGNsYXNzIF9Gb3J3YXJkSXRlcj4KK2lubGluZSBfRm9yd2FyZEl0ZXIKK19fdW5pbml0aWFsaXplZF9jb3B5X2NvcHkoX0lucHV0SXRlcjEgX19maXJzdDEsIF9JbnB1dEl0ZXIxIF9fbGFzdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyLCBfSW5wdXRJdGVyMiBfX2xhc3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXIgX19yZXN1bHQpCit7IHJldHVybiB1bmluaXRpYWxpemVkX2NvcHkoX19maXJzdDIsIF9fbGFzdDIsIHVuaW5pdGlhbGl6ZWRfY29weShfX2ZpcnN0MSwgX19sYXN0MSwgX19yZXN1bHQpKTsgfQorCisvLyBfX3VuaW5pdGlhbGl6ZWRfZmlsbF9jb3B5CisvLyBGaWxscyBbcmVzdWx0LCBtaWQpIHdpdGggeCwgYW5kIGNvcGllcyBbZmlyc3QsIGxhc3QpIGludG8KKy8vICBbbWlkLCBtaWQgKyAobGFzdCAtIGZpcnN0KSkuCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfVHAsIGNsYXNzIF9JbnB1dEl0ZXI+CitpbmxpbmUgX0ZvcndhcmRJdGVyCitfX3VuaW5pdGlhbGl6ZWRfZmlsbF9jb3B5KF9Gb3J3YXJkSXRlciBfX3Jlc3VsdCwgX0ZvcndhcmRJdGVyIF9fbWlkLCBjb25zdCBfVHAmIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCkgeworICB1bmluaXRpYWxpemVkX2ZpbGwoX19yZXN1bHQsIF9fbWlkLCBfX3gpOworICBfU1RMUF9UUlkgeworICAgIHJldHVybiB1bmluaXRpYWxpemVkX2NvcHkoX19maXJzdCwgX19sYXN0LCBfX21pZCk7CisgIH0KKyAgX1NUTFBfVU5XSU5EKF9TVExQX1NURDo6X0Rlc3Ryb3lfUmFuZ2UoX19yZXN1bHQsIF9fbWlkKSkKKyAgX1NUTFBfUkVUX0FGVEVSX1RIUk9XKF9fcmVzdWx0KQorfQorCisvLyBfX3VuaW5pdGlhbGl6ZWRfY29weV9maWxsCisvLyBDb3BpZXMgW2ZpcnN0MSwgbGFzdDEpIGludG8gW2ZpcnN0MiwgZmlyc3QyICsgKGxhc3QxIC0gZmlyc3QxKSksIGFuZAorLy8gIGZpbGxzIFtmaXJzdDIgKyAobGFzdDEgLSBmaXJzdDEpLCBsYXN0Mikgd2l0aCB4LgordGVtcGxhdGUgPGNsYXNzIF9JdGVyLCBjbGFzcyBfVHA+CitpbmxpbmUgdm9pZAorX191bmluaXRpYWxpemVkX2NvcHlfZmlsbChfSXRlciBfX2ZpcnN0MSwgX0l0ZXIgX19sYXN0MSwgX0l0ZXIgX19maXJzdDIsIF9JdGVyIF9fbGFzdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9UcCYgX194KSB7CisgIF9JdGVyIF9fbWlkMiA9IHVuaW5pdGlhbGl6ZWRfY29weShfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIpOworICBfU1RMUF9UUlkgeworICAgIHVuaW5pdGlhbGl6ZWRfZmlsbChfX21pZDIsIF9fbGFzdDIsIF9feCk7CisgIH0KKyAgX1NUTFBfVU5XSU5EKF9TVExQX1NURDo6X0Rlc3Ryb3lfUmFuZ2UoX19maXJzdDIsIF9fbWlkMikpCit9CisKKy8qIF9fdW5pbml0aWFsaXplZF9tb3ZlOgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGludGVybmFseSBhbmQgb25seSB3aXRoIHBvaW50ZXJzIGFzIGl0ZXJhdG9ycy4KKyAqLwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1RyaXZpYWxVQ3B5PgoraW5saW5lIF9Gb3J3YXJkSXRlcgorX191bmluaXRpYWxpemVkX21vdmUoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwgX0ZvcndhcmRJdGVyIF9fcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgX1RyaXZpYWxVQ3B5IF9fdHJpdmlhbF91Y3B5LCBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qX01vdmFibGUqLykKK3sgcmV0dXJuIF9fdWNvcHlfcHRycyhfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0LCBfX3RyaXZpYWxfdWNweSk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1RyaXZpYWxVQ3B5PgorX1NUTFBfSU5MSU5FX0xPT1AKK19Gb3J3YXJkSXRlcgorX191bmluaXRpYWxpemVkX21vdmUoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwgX0ZvcndhcmRJdGVyIF9fcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgX1RyaXZpYWxVQ3B5ICwgY29uc3QgX190cnVlX3R5cGUmIC8qX01vdmFibGUqLykgeworICAvL01vdmUgY29uc3RydWN0b3Igc2hvdWxkIG5vdCB0aHJvdyBzbyB3ZSBkbyBub3QgbmVlZCB0byB0YWtlIGNhcmUgb2YgZXhjZXB0aW9ucyBoZXJlLgorICBmb3IgKHB0cmRpZmZfdCBfX24gPSBfX2xhc3QgLSBfX2ZpcnN0IDsgX19uID4gMDsgLS1fX24pIHsKKyAgICBfTW92ZV9Db25zdHJ1Y3QoJipfX3Jlc3VsdCwgKl9fZmlyc3QpOworICAgICsrX19maXJzdDsgKytfX3Jlc3VsdDsKKyAgfQorICByZXR1cm4gX19yZXN1bHQ7Cit9CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9VTklOSVRJQUxJWkVEX0ggKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9fdW5vcmRlcmVkX21hcC5oIGIvc3RsL191bm9yZGVyZWRfbWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FkMzI4ZAotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9fdW5vcmRlcmVkX21hcC5oCkBAIC0wLDAgKzEsNDI3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA0CisgKiBGcmFuY29pcyBEdW1vbnQKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworLyogTk9URTogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgU1RMIGhlYWRlcnMuCisgKiAgIFlvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LgorICovCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfVU5PUkRFUkVEX01BUF9ICisjZGVmaW5lIF9TVExQX0lOVEVSTkFMX1VOT1JERVJFRF9NQVBfSAorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0hBU0hUQUJMRV9ICisjICBpbmNsdWRlIDxzdGwvX2hhc2h0YWJsZS5oPgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisvL1NwZWNpZmljIGl0ZXJhdG9yIHRyYWl0cyBjcmVhdGlvbgorX1NUTFBfQ1JFQVRFX0hBU0hfSVRFUkFUT1JfVFJBSVRTKFVub3JkZXJlZE1hcFRyYWl0c1QsIHRyYWl0cykKKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgX1NUTFBfREZMX1RNUExfUEFSQU0oX0hhc2hGY24saGFzaDxfS2V5PiksCisgICAgICAgICAgX1NUTFBfREZMX1RNUExfUEFSQU0oX0VxdWFsS2V5LGVxdWFsX3RvPF9LZXk+KSwKKyAgICAgICAgICBfU1RMUF9ERUZBVUxUX1BBSVJfQUxMT0NBVE9SX1NFTEVDVChjb25zdCBfS2V5LCBfVHApID4KK2NsYXNzIHVub3JkZXJlZF9tYXAKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUEFSVElBTF9TUEVDX1dPUktBUk9VTkQpCisgICAgICAgICAgICAgICA6IHB1YmxpYyBfX3N0bHBvcnRfY2xhc3M8dW5vcmRlcmVkX21hcDxfS2V5LCBfVHAsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz4gPgorI2VuZGlmCit7Citwcml2YXRlOgorICB0eXBlZGVmIHVub3JkZXJlZF9tYXA8X0tleSwgX1RwLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+IF9TZWxmOworcHVibGljOgorICB0eXBlZGVmIF9LZXkga2V5X3R5cGU7CisgIHR5cGVkZWYgX1RwIGRhdGFfdHlwZTsKKyAgdHlwZWRlZiBfVHAgbWFwcGVkX3R5cGU7CisjaWYgIWRlZmluZWQgKF9fRE1DX18pCisgIHR5cGVkZWYgcGFpcjxjb25zdCBrZXlfdHlwZSwgZGF0YV90eXBlPiB2YWx1ZV90eXBlOworI2Vsc2UKKyAgdHlwZWRlZiBwYWlyPGtleV90eXBlLCBkYXRhX3R5cGU+IHZhbHVlX3R5cGU7CisjZW5kaWYKK3ByaXZhdGU6CisgIC8vU3BlY2lmaWMgaXRlcmF0b3IgdHJhaXRzIGNyZWF0aW9uCisgIHR5cGVkZWYgX1NUTFBfUFJJViBfVW5vcmRlcmVkTWFwVHJhaXRzVDx2YWx1ZV90eXBlPiBfVW5vcmRlcmVkTWFwVHJhaXRzOworCitwdWJsaWM6CisgIHR5cGVkZWYgaGFzaHRhYmxlPHZhbHVlX3R5cGUsIGtleV90eXBlLCBfSGFzaEZjbiwgX1Vub3JkZXJlZE1hcFRyYWl0cywKKyAgICAgICAgICAgICAgICAgICAgX1NUTFBfU0VMRUNUMVNUKHZhbHVlX3R5cGUsICBfS2V5KSwgX0VxdWFsS2V5LCBfQWxsb2MgPiBfSHQ7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6Omhhc2hlciBoYXNoZXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjprZXlfZXF1YWwga2V5X2VxdWFsOworCisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpzaXplX3R5cGUgc2l6ZV90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OnBvaW50ZXIgcG9pbnRlcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmNvbnN0X3BvaW50ZXIgY29uc3RfcG9pbnRlcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OnJlZmVyZW5jZSByZWZlcmVuY2U7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpjb25zdF9yZWZlcmVuY2UgY29uc3RfcmVmZXJlbmNlOworCisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjppdGVyYXRvciBpdGVyYXRvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6bG9jYWxfaXRlcmF0b3IgbG9jYWxfaXRlcmF0b3I7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpjb25zdF9sb2NhbF9pdGVyYXRvciBjb25zdF9sb2NhbF9pdGVyYXRvcjsKKworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7CisKKyAgaGFzaGVyIGhhc2hfZnVuY3Rpb24oKSBjb25zdCB7IHJldHVybiBfTV9odC5oYXNoX2Z1bmN0KCk7IH0KKyAga2V5X2VxdWFsIGtleV9lcSgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmtleV9lcSgpOyB9CisgIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdCB7IHJldHVybiBfTV9odC5nZXRfYWxsb2NhdG9yKCk7IH0KKworcHJpdmF0ZToKKyAgX0h0IF9NX2h0OworICBfU1RMUF9LRVlfVFlQRV9GT1JfQ09OVF9FWFQoa2V5X3R5cGUpCisKK3B1YmxpYzoKKyAgZXhwbGljaXQgdW5vcmRlcmVkX21hcChzaXplX3R5cGUgX19uID0gMTAwLCBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBfX2EpIHt9CisKKyAgdW5vcmRlcmVkX21hcChfX21vdmVfc291cmNlPF9TZWxmPiBzcmMpCisgICAgOiBfTV9odChfX21vdmVfc291cmNlPF9IdD4oc3JjLmdldCgpLl9NX2h0KSkge30KKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgdW5vcmRlcmVkX21hcChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwKKyAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uID0gMTAwLCBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKyAgICAgICAgICAgICAgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCisgICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBfX2EpCisgIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCk7IH0KKyNlbHNlCisgIHVub3JkZXJlZF9tYXAoY29uc3QgdmFsdWVfdHlwZSogX19mLCBjb25zdCB2YWx1ZV90eXBlKiBfX2wsCisgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fbiA9IDEwMCwgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisgICAgICAgICAgICAgICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorICAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX01faHQoX19uLCBfX2hmLCBfX2VxbCwgX19hKQorICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9CisKKyAgdW5vcmRlcmVkX21hcChjb25zdF9pdGVyYXRvciBfX2YsIGNvbnN0X2l0ZXJhdG9yIF9fbCwKKyAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uID0gMTAwLCBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKyAgICAgICAgICAgICAgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCisgICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBfX2EpCisgIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCk7IH0KKyNlbmRpZiAvKl9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKworICBfU2VsZiYgb3BlcmF0b3IgPSAoY29uc3QgX1NlbGYmIF9fb3RoZXIpCisgIHsgX01faHQgPSBfX290aGVyLl9NX2h0OyByZXR1cm4gKnRoaXM7IH0KKworICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LnNpemUoKTsgfQorICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCB7IHJldHVybiBfTV9odC5tYXhfc2l6ZSgpOyB9CisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBfTV9odC5lbXB0eSgpOyB9CisgIHZvaWQgc3dhcChfU2VsZiYgX19ocykgeyBfTV9odC5zd2FwKF9faHMuX01faHQpOyB9CisKKyAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBfTV9odC5iZWdpbigpOyB9CisgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIF9NX2h0LmVuZCgpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gX01faHQuYmVnaW4oKTsgfQorICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBfTV9odC5lbmQoKTsgfQorCisgIHBhaXI8aXRlcmF0b3IsYm9vbD4gaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKQorICB7IHJldHVybiBfTV9odC5pbnNlcnRfdW5pcXVlKF9fb2JqKTsgfQorICBpdGVyYXRvciBpbnNlcnQoY29uc3RfaXRlcmF0b3IgLypfX2hpbnQqLywgY29uc3QgdmFsdWVfdHlwZSYgX19vYmopCisgIHsgcmV0dXJuIF9NX2h0Lmluc2VydF91bmlxdWUoX19vYmopOyB9CisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICB2b2lkIGluc2VydChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCkKKyNlbHNlCisgIHZvaWQgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUqIF9fZiwgY29uc3QgdmFsdWVfdHlwZSogX19sKQorICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLF9fbCk7IH0KKyAgdm9pZCBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19mLCBjb25zdF9pdGVyYXRvciBfX2wpCisjZW5kaWYgLypfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisgIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCk7IH0KKworICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgaXRlcmF0b3IgZmluZChjb25zdCBfS1QmIF9fa2V5KSB7IHJldHVybiBfTV9odC5maW5kKF9fa2V5KTsgfQorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgY29uc3RfaXRlcmF0b3IgZmluZChjb25zdCBfS1QmIF9fa2V5KSBjb25zdCB7IHJldHVybiBfTV9odC5maW5kKF9fa2V5KTsgfQorCisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBfVHAmIG9wZXJhdG9yW10oY29uc3QgX0tUJiBfX2tleSkgeworICAgIGl0ZXJhdG9yIF9faXQgPSBfTV9odC5maW5kKF9fa2V5KTsKKyAgICByZXR1cm4gKF9faXQgPT0gX01faHQuZW5kKCkgPworICAgICAgX01faHQuX01faW5zZXJ0KHZhbHVlX3R5cGUoX19rZXksIF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQoX1RwKSkpLnNlY29uZCA6CisgICAgICAoKl9faXQpLnNlY29uZCApOworICB9CisKKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIHNpemVfdHlwZSBjb3VudChjb25zdCBfS1QmIF9fa2V5KSBjb25zdCB7IHJldHVybiBfTV9odC5jb3VudChfX2tleSk7IH0KKworICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgcGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+IGVxdWFsX3JhbmdlKGNvbnN0IF9LVCYgX19rZXkpCisgIHsgcmV0dXJuIF9NX2h0LmVxdWFsX3JhbmdlKF9fa2V5KTsgfQorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgcGFpcjxjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3I+IGVxdWFsX3JhbmdlKGNvbnN0IF9LVCYgX19rZXkpIGNvbnN0CisgIHsgcmV0dXJuIF9NX2h0LmVxdWFsX3JhbmdlKF9fa2V5KTsgfQorCisgIHNpemVfdHlwZSBlcmFzZShjb25zdCBrZXlfdHlwZSYgX19rZXkpIHtyZXR1cm4gX01faHQuZXJhc2UoX19rZXkpOyB9CisgIHZvaWQgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19pdCkgeyBfTV9odC5lcmFzZShfX2l0KTsgfQorICB2b2lkIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fZiwgY29uc3RfaXRlcmF0b3IgX19sKSB7IF9NX2h0LmVyYXNlKF9fZiwgX19sKTsgfQorICB2b2lkIGNsZWFyKCkgeyBfTV9odC5jbGVhcigpOyB9CisKKyAgc2l6ZV90eXBlIGJ1Y2tldF9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmJ1Y2tldF9jb3VudCgpOyB9CisgIHNpemVfdHlwZSBtYXhfYnVja2V0X2NvdW50KCkgY29uc3QgeyByZXR1cm4gX01faHQubWF4X2J1Y2tldF9jb3VudCgpOyB9CisgIHNpemVfdHlwZSBidWNrZXRfc2l6ZShzaXplX3R5cGUgX19uKSBjb25zdCB7IHJldHVybiBfTV9odC5lbGVtc19pbl9idWNrZXQoX19uKTsgfQorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgc2l6ZV90eXBlIGJ1Y2tldChjb25zdCBfS1QmIF9faykgY29uc3QgeyByZXR1cm4gX01faHQuYnVja2V0KF9fayk7IH0KKyAgbG9jYWxfaXRlcmF0b3IgYmVnaW4oc2l6ZV90eXBlIF9fbikgeyByZXR1cm4gX01faHQuYmVnaW4oX19uKTsgfQorICBsb2NhbF9pdGVyYXRvciBlbmQoc2l6ZV90eXBlIF9fbikgeyByZXR1cm4gX01faHQuZW5kKF9fbik7IH0KKyAgY29uc3RfbG9jYWxfaXRlcmF0b3IgYmVnaW4oc2l6ZV90eXBlIF9fbikgY29uc3QgeyByZXR1cm4gX01faHQuYmVnaW4oX19uKTsgfQorICBjb25zdF9sb2NhbF9pdGVyYXRvciBlbmQoc2l6ZV90eXBlIF9fbikgY29uc3QgeyByZXR1cm4gX01faHQuZW5kKF9fbik7IH0KKworICBmbG9hdCBsb2FkX2ZhY3RvcigpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmxvYWRfZmFjdG9yKCk7IH0KKyAgZmxvYXQgbWF4X2xvYWRfZmFjdG9yKCkgY29uc3QgeyByZXR1cm4gX01faHQubWF4X2xvYWRfZmFjdG9yKCk7IH0KKyAgdm9pZCBtYXhfbG9hZF9mYWN0b3IoZmxvYXQgX192YWwpIHsgX01faHQubWF4X2xvYWRfZmFjdG9yKF9fdmFsKTsgfQorICB2b2lkIHJlaGFzaChzaXplX3R5cGUgX19oaW50KSB7IF9NX2h0LnJlaGFzaChfX2hpbnQpOyB9Cit9OworCisvL1NwZWNpZmljIGl0ZXJhdG9yIHRyYWl0cyBjcmVhdGlvbgorX1NUTFBfQ1JFQVRFX0hBU0hfSVRFUkFUT1JfVFJBSVRTKFVub3JkZXJlZE11bHRpbWFwVHJhaXRzVCwgdHJhaXRzKQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBfU1RMUF9ERkxfVE1QTF9QQVJBTShfSGFzaEZjbixoYXNoPF9LZXk+KSwKKyAgICAgICAgICBfU1RMUF9ERkxfVE1QTF9QQVJBTShfRXF1YWxLZXksZXF1YWxfdG88X0tleT4pLAorICAgICAgICAgIF9TVExQX0RFRkFVTFRfUEFJUl9BTExPQ0FUT1JfU0VMRUNUKGNvbnN0IF9LZXksIF9UcCkgPgorY2xhc3MgdW5vcmRlcmVkX211bHRpbWFwCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EKQorICAgICAgICAgICAgICAgICAgICA6IHB1YmxpYyBfX3N0bHBvcnRfY2xhc3M8dW5vcmRlcmVkX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2hGY24sIF9FcXVhbEtleSwgX0FsbG9jPiA+CisjZW5kaWYKK3sKK3ByaXZhdGU6CisgIHR5cGVkZWYgdW5vcmRlcmVkX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2hGY24sIF9FcXVhbEtleSwgX0FsbG9jPiBfU2VsZjsKK3B1YmxpYzoKKyAgdHlwZWRlZiBfS2V5IGtleV90eXBlOworICB0eXBlZGVmIF9UcCBkYXRhX3R5cGU7CisgIHR5cGVkZWYgX1RwIG1hcHBlZF90eXBlOworI2lmICFkZWZpbmVkIChfX0RNQ19fKQorICB0eXBlZGVmIHBhaXI8Y29uc3Qga2V5X3R5cGUsIGRhdGFfdHlwZT4gdmFsdWVfdHlwZTsKKyNlbHNlCisgIHR5cGVkZWYgcGFpcjxrZXlfdHlwZSwgZGF0YV90eXBlPiB2YWx1ZV90eXBlOworI2VuZGlmCitwcml2YXRlOgorICAvL1NwZWNpZmljIGl0ZXJhdG9yIHRyYWl0cyBjcmVhdGlvbgorICB0eXBlZGVmIF9TVExQX1BSSVYgX1Vub3JkZXJlZE11bHRpbWFwVHJhaXRzVDx2YWx1ZV90eXBlPiBfVW5vcmRlcmVkTXVsdGltYXBUcmFpdHM7CisKK3B1YmxpYzoKKyAgdHlwZWRlZiBoYXNodGFibGU8dmFsdWVfdHlwZSwga2V5X3R5cGUsIF9IYXNoRmNuLCBfVW5vcmRlcmVkTXVsdGltYXBUcmFpdHMsCisgICAgICAgICAgICAgICAgICAgIF9TVExQX1NFTEVDVDFTVCh2YWx1ZV90eXBlLCAgX0tleSksIF9FcXVhbEtleSwgX0FsbG9jID4gX0h0OworCisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpoYXNoZXIgaGFzaGVyOworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6a2V5X2VxdWFsIGtleV9lcXVhbDsKKworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6c2l6ZV90eXBlIHNpemVfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpwb2ludGVyIHBvaW50ZXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpjb25zdF9wb2ludGVyIGNvbnN0X3BvaW50ZXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpyZWZlcmVuY2UgcmVmZXJlbmNlOworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X3JlZmVyZW5jZTsKKworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6aXRlcmF0b3IgaXRlcmF0b3I7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmxvY2FsX2l0ZXJhdG9yIGxvY2FsX2l0ZXJhdG9yOworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6Y29uc3RfbG9jYWxfaXRlcmF0b3IgY29uc3RfbG9jYWxfaXRlcmF0b3I7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmFsbG9jYXRvcl90eXBlIGFsbG9jYXRvcl90eXBlOworCisgIGhhc2hlciBoYXNoX2Z1bmN0aW9uKCkgY29uc3QgeyByZXR1cm4gX01faHQuaGFzaF9mdW5jdCgpOyB9CisgIGtleV9lcXVhbCBrZXlfZXEoKSBjb25zdCB7IHJldHVybiBfTV9odC5rZXlfZXEoKTsgfQorICBhbGxvY2F0b3JfdHlwZSBnZXRfYWxsb2NhdG9yKCkgY29uc3QgeyByZXR1cm4gX01faHQuZ2V0X2FsbG9jYXRvcigpOyB9CisKK3ByaXZhdGU6CisgIF9IdCBfTV9odDsKKyAgX1NUTFBfS0VZX1RZUEVfRk9SX0NPTlRfRVhUKGtleV90eXBlKQorCitwdWJsaWM6CisgIGV4cGxpY2l0IHVub3JkZXJlZF9tdWx0aW1hcChzaXplX3R5cGUgX19uID0gMTAwLCBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX01faHQoX19uLCBfX2hmLCBfX2VxbCwgX19hKSB7fQorCisgIHVub3JkZXJlZF9tdWx0aW1hcChfX21vdmVfc291cmNlPF9TZWxmPiBzcmMpCisgICAgOiBfTV9odChfX21vdmVfc291cmNlPF9IdD4oc3JjLmdldCgpLl9NX2h0KSkge30KKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgdW5vcmRlcmVkX211bHRpbWFwKF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLAorICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fbiA9IDEwMCwgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9NX2h0KF9fbiwgX19oZiwgX19lcWwsIF9fYSkKKyAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLCBfX2wpOyB9CisjZWxzZQorICB1bm9yZGVyZWRfbXVsdGltYXAoY29uc3QgdmFsdWVfdHlwZSogX19mLCBjb25zdCB2YWx1ZV90eXBlKiBfX2wsCisgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uID0gMTAwLCBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX01faHQoX19uLCBfX2hmLCBfX2VxbCwgX19hKQorICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsIF9fbCk7IH0KKworICB1bm9yZGVyZWRfbXVsdGltYXAoY29uc3RfaXRlcmF0b3IgX19mLCBjb25zdF9pdGVyYXRvciBfX2wsCisgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uID0gMTAwLCBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX01faHQoX19uLCBfX2hmLCBfX2VxbCwgX19hKQorICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsIF9fbCk7IH0KKyNlbmRpZiAvKl9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKworICBfU2VsZiYgb3BlcmF0b3IgPSAoY29uc3QgX1NlbGYmIF9fb3RoZXIpCisgIHsgX01faHQgPSBfX290aGVyLl9NX2h0OyByZXR1cm4gKnRoaXM7IH0KKworICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LnNpemUoKTsgfQorICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCB7IHJldHVybiBfTV9odC5tYXhfc2l6ZSgpOyB9CisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBfTV9odC5lbXB0eSgpOyB9CisgIHZvaWQgc3dhcChfU2VsZiYgX19ocykgeyBfTV9odC5zd2FwKF9faHMuX01faHQpOyB9CisKKyAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBfTV9odC5iZWdpbigpOyB9CisgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIF9NX2h0LmVuZCgpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gX01faHQuYmVnaW4oKTsgfQorICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBfTV9odC5lbmQoKTsgfQorCisgIGl0ZXJhdG9yIGluc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX29iaikKKyAgeyByZXR1cm4gX01faHQuaW5zZXJ0X2VxdWFsKF9fb2JqKTsgfQorICBpdGVyYXRvciBpbnNlcnQoY29uc3RfaXRlcmF0b3IgLypfX2hpbnQqLywgY29uc3QgdmFsdWVfdHlwZSYgX19vYmopCisgIHsgcmV0dXJuIF9NX2h0Lmluc2VydF9lcXVhbChfX29iaik7IH0KKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZvaWQgaW5zZXJ0KF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sKQorI2Vsc2UKKyAgdm9pZCBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSogX19mLCBjb25zdCB2YWx1ZV90eXBlKiBfX2wpCisgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZixfX2wpOyB9CisgIHZvaWQgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9fZiwgY29uc3RfaXRlcmF0b3IgX19sKQorI2VuZGlmIC8qX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsIF9fbCk7IH0KKworICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgaXRlcmF0b3IgZmluZChjb25zdCBfS1QmIF9fa2V5KSB7IHJldHVybiBfTV9odC5maW5kKF9fa2V5KTsgfQorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgY29uc3RfaXRlcmF0b3IgZmluZChjb25zdCBfS1QmIF9fa2V5KSBjb25zdCB7IHJldHVybiBfTV9odC5maW5kKF9fa2V5KTsgfQorCisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBzaXplX3R5cGUgY291bnQoY29uc3QgX0tUJiBfX2tleSkgY29uc3QgeyByZXR1cm4gX01faHQuY291bnQoX19rZXkpOyB9CisKKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIHBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPiBlcXVhbF9yYW5nZShjb25zdCBfS1QmIF9fa2V5KQorICB7IHJldHVybiBfTV9odC5lcXVhbF9yYW5nZShfX2tleSk7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIHBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPiBlcXVhbF9yYW5nZShjb25zdCBfS1QmIF9fa2V5KSBjb25zdAorICB7IHJldHVybiBfTV9odC5lcXVhbF9yYW5nZShfX2tleSk7IH0KKworICBzaXplX3R5cGUgZXJhc2UoY29uc3Qga2V5X3R5cGUmIF9fa2V5KSB7cmV0dXJuIF9NX2h0LmVyYXNlKF9fa2V5KTsgfQorICB2b2lkIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9faXQpIHsgX01faHQuZXJhc2UoX19pdCk7IH0KKyAgdm9pZCBlcmFzZShjb25zdF9pdGVyYXRvciBfX2YsIGNvbnN0X2l0ZXJhdG9yIF9fbCkgeyBfTV9odC5lcmFzZShfX2YsIF9fbCk7IH0KKyAgdm9pZCBjbGVhcigpIHsgX01faHQuY2xlYXIoKTsgfQorCisgIHNpemVfdHlwZSBidWNrZXRfY291bnQoKSBjb25zdCB7IHJldHVybiBfTV9odC5idWNrZXRfY291bnQoKTsgfQorICBzaXplX3R5cGUgbWF4X2J1Y2tldF9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0Lm1heF9idWNrZXRfY291bnQoKTsgfQorICBzaXplX3R5cGUgYnVja2V0X3NpemUoc2l6ZV90eXBlIF9fbikgY29uc3QgeyByZXR1cm4gX01faHQuZWxlbXNfaW5fYnVja2V0KF9fbik7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIHNpemVfdHlwZSBidWNrZXQoY29uc3QgX0tUJiBfX2spIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmJ1Y2tldChfX2spOyB9CisgIGxvY2FsX2l0ZXJhdG9yIGJlZ2luKHNpemVfdHlwZSBfX24pIHsgcmV0dXJuIF9NX2h0LmJlZ2luKF9fbik7IH0KKyAgbG9jYWxfaXRlcmF0b3IgZW5kKHNpemVfdHlwZSBfX24pIHsgcmV0dXJuIF9NX2h0LmVuZChfX24pOyB9CisgIGNvbnN0X2xvY2FsX2l0ZXJhdG9yIGJlZ2luKHNpemVfdHlwZSBfX24pIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmJlZ2luKF9fbik7IH0KKyAgY29uc3RfbG9jYWxfaXRlcmF0b3IgZW5kKHNpemVfdHlwZSBfX24pIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmVuZChfX24pOyB9CisKKyAgZmxvYXQgbG9hZF9mYWN0b3IoKSBjb25zdCB7IHJldHVybiBfTV9odC5sb2FkX2ZhY3RvcigpOyB9CisgIGZsb2F0IG1heF9sb2FkX2ZhY3RvcigpIGNvbnN0IHsgcmV0dXJuIF9NX2h0Lm1heF9sb2FkX2ZhY3RvcigpOyB9CisgIHZvaWQgbWF4X2xvYWRfZmFjdG9yKGZsb2F0IF9fdmFsKSB7IF9NX2h0Lm1heF9sb2FkX2ZhY3RvcihfX3ZhbCk7IH0KKyAgdm9pZCByZWhhc2goc2l6ZV90eXBlIF9faGludCkgeyBfTV9odC5yZWhhc2goX19oaW50KTsgfQorfTsKKworI2RlZmluZSBfU1RMUF9URU1QTEFURV9IRUFERVIgdGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2hGY24sIGNsYXNzIF9FcWxLZXksIGNsYXNzIF9BbGxvYz4KKyNkZWZpbmUgX1NUTFBfVEVNUExBVEVfQ09OVEFJTkVSIHVub3JkZXJlZF9tYXA8X0tleSxfVHAsX0hhc2hGY24sX0VxbEtleSxfQWxsb2M+CisKKyNpbmNsdWRlIDxzdGwvX3JlbG9wc19oYXNoX2NvbnQuaD4KKworI3VuZGVmIF9TVExQX1RFTVBMQVRFX0NPTlRBSU5FUgorI2RlZmluZSBfU1RMUF9URU1QTEFURV9DT05UQUlORVIgdW5vcmRlcmVkX211bHRpbWFwPF9LZXksX1RwLF9IYXNoRmNuLF9FcWxLZXksX0FsbG9jPgorCisjaW5jbHVkZSA8c3RsL19yZWxvcHNfaGFzaF9jb250Lmg+CisKKyN1bmRlZiBfU1RMUF9URU1QTEFURV9DT05UQUlORVIKKyN1bmRlZiBfU1RMUF9URU1QTEFURV9IRUFERVIKKworLy8gU3BlY2lhbGl6YXRpb24gb2YgaW5zZXJ0X2l0ZXJhdG9yIHNvIHRoYXQgaXQgd2lsbCB3b3JrIGZvciB1bm9yZGVyZWRfbWFwCisvLyBhbmQgdW5vcmRlcmVkX211bHRpbWFwLgorCisjaWYgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IYXNoRm4sICBjbGFzcyBfRXFLZXksIGNsYXNzIF9BbGxvYz4KK3N0cnVjdCBfX21vdmVfdHJhaXRzPHVub3JkZXJlZF9tYXA8X0tleSwgX1RwLCBfSGFzaEZuLCBfRXFLZXksIF9BbGxvYz4gPiA6CisgIF9TVExQX1BSSVYgX19tb3ZlX3RyYWl0c19oZWxwPHR5cGVuYW1lIHVub3JkZXJlZF9tYXA8X0tleSwgX1RwLCBfSGFzaEZuLCBfRXFLZXksIF9BbGxvYz46Ol9IdD4KK3t9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaEZuLCAgY2xhc3MgX0VxS2V5LCBjbGFzcyBfQWxsb2M+CitzdHJ1Y3QgX19tb3ZlX3RyYWl0czx1bm9yZGVyZWRfbXVsdGltYXA8X0tleSwgX1RwLCBfSGFzaEZuLCBfRXFLZXksIF9BbGxvYz4gPiA6CisgIF9TVExQX1BSSVYgX19tb3ZlX3RyYWl0c19oZWxwPHR5cGVuYW1lIHVub3JkZXJlZF9tYXA8X0tleSwgX1RwLCBfSGFzaEZuLCBfRXFLZXksIF9BbGxvYz46Ol9IdD4KK3t9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaEZuLCAgY2xhc3MgX0VxS2V5LCBjbGFzcyBfQWxsb2M+CitjbGFzcyBpbnNlcnRfaXRlcmF0b3I8dW5vcmRlcmVkX21hcDxfS2V5LCBfVHAsIF9IYXNoRm4sIF9FcUtleSwgX0FsbG9jPiA+IHsKK3Byb3RlY3RlZDoKKyAgdHlwZWRlZiB1bm9yZGVyZWRfbWFwPF9LZXksIF9UcCwgX0hhc2hGbiwgX0VxS2V5LCBfQWxsb2M+IF9Db250YWluZXI7CisgIF9Db250YWluZXIqIGNvbnRhaW5lcjsKK3B1YmxpYzoKKyAgdHlwZWRlZiBfQ29udGFpbmVyICAgICAgICAgIGNvbnRhaW5lcl90eXBlOworICB0eXBlZGVmIG91dHB1dF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CisgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKworICBpbnNlcnRfaXRlcmF0b3IoX0NvbnRhaW5lciYgX194KSA6IGNvbnRhaW5lcigmX194KSB7fQorICBpbnNlcnRfaXRlcmF0b3IoX0NvbnRhaW5lciYgX194LCB0eXBlbmFtZSBfQ29udGFpbmVyOjppdGVyYXRvcikKKyAgICA6IGNvbnRhaW5lcigmX194KSB7fQorICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mCisgIG9wZXJhdG9yPShjb25zdCB0eXBlbmFtZSBfQ29udGFpbmVyOjp2YWx1ZV90eXBlJiBfX3ZhbCkgeworICAgIGNvbnRhaW5lci0+aW5zZXJ0KF9fdmFsKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JiBvcGVyYXRvciooKSB7IHJldHVybiAqdGhpczsgfQorICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mIG9wZXJhdG9yKysoKSB7IHJldHVybiAqdGhpczsgfQorICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mIG9wZXJhdG9yKysoaW50KSB7IHJldHVybiAqdGhpczsgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2hGbiwgIGNsYXNzIF9FcUtleSwgY2xhc3MgX0FsbG9jPgorY2xhc3MgaW5zZXJ0X2l0ZXJhdG9yPHVub3JkZXJlZF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoRm4sIF9FcUtleSwgX0FsbG9jPiA+IHsKK3Byb3RlY3RlZDoKKyAgdHlwZWRlZiB1bm9yZGVyZWRfbXVsdGltYXA8X0tleSwgX1RwLCBfSGFzaEZuLCBfRXFLZXksIF9BbGxvYz4gX0NvbnRhaW5lcjsKKyAgX0NvbnRhaW5lciogY29udGFpbmVyOworICB0eXBlbmFtZSBfQ29udGFpbmVyOjppdGVyYXRvciBpdGVyOworcHVibGljOgorICB0eXBlZGVmIF9Db250YWluZXIgICAgICAgICAgY29udGFpbmVyX3R5cGU7CisgIHR5cGVkZWYgb3V0cHV0X2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKKyAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICBwb2ludGVyOworICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworCisgIGluc2VydF9pdGVyYXRvcihfQ29udGFpbmVyJiBfX3gpIDogY29udGFpbmVyKCZfX3gpIHt9CisgIGluc2VydF9pdGVyYXRvcihfQ29udGFpbmVyJiBfX3gsIHR5cGVuYW1lIF9Db250YWluZXI6Oml0ZXJhdG9yKQorICAgIDogY29udGFpbmVyKCZfX3gpIHt9CisgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYKKyAgb3BlcmF0b3I9KGNvbnN0IHR5cGVuYW1lIF9Db250YWluZXI6OnZhbHVlX3R5cGUmIF9fdmFsKSB7CisgICAgY29udGFpbmVyLT5pbnNlcnQoX192YWwpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mIG9wZXJhdG9yKigpIHsgcmV0dXJuICp0aGlzOyB9CisgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYgb3BlcmF0b3IrKygpIHsgcmV0dXJuICp0aGlzOyB9CisgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYgb3BlcmF0b3IrKyhpbnQpIHsgcmV0dXJuICp0aGlzOyB9Cit9OworCisjZW5kaWYgLyogX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTiAqLworCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNlbmRpZiAvKiBfU1RMUF9JTlRFUk5BTF9VTk9SREVSRURfTUFQX0ggKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9fdW5vcmRlcmVkX3NldC5oIGIvc3RsL191bm9yZGVyZWRfc2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNkNjYyZAotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9fdW5vcmRlcmVkX3NldC5oCkBAIC0wLDAgKzEsMzk4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA0CisgKiBGcmFuY29pcyBEdW1vbnQKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworLyogTk9URTogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgU1RMIGhlYWRlcnMuCisgKiAgIFlvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LgorICovCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfVU5PUkRFUkVEX1NFVF9ICisjZGVmaW5lIF9TVExQX0lOVEVSTkFMX1VOT1JERVJFRF9TRVRfSAorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0hBU0hUQUJMRV9ICisjICBpbmNsdWRlIDxzdGwvX2hhc2h0YWJsZS5oPgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisvL1NwZWNpZmljIGl0ZXJhdG9yIHRyYWl0cyBjcmVhdGlvbgorX1NUTFBfQ1JFQVRFX0hBU0hfSVRFUkFUT1JfVFJBSVRTKFVub3JkZXJlZFNldFRyYWl0c1QsIENvbnN0X3RyYWl0cykKKwordGVtcGxhdGUgPGNsYXNzIF9WYWx1ZSwgX1NUTFBfREZMX1RNUExfUEFSQU0oX0hhc2hGY24saGFzaDxfVmFsdWU+KSwKKyAgICAgICAgICBfU1RMUF9ERkxfVE1QTF9QQVJBTShfRXF1YWxLZXksZXF1YWxfdG88X1ZhbHVlPiksCisgICAgICAgICAgX1NUTFBfREVGQVVMVF9BTExPQ0FUT1JfU0VMRUNUKF9WYWx1ZSkgPgorY2xhc3MgdW5vcmRlcmVkX3NldAorI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QQVJUSUFMX1NQRUNfV09SS0FST1VORCkKKyAgICAgICAgICAgICAgIDogcHVibGljIF9fc3RscG9ydF9jbGFzczx1bm9yZGVyZWRfc2V0PF9WYWx1ZSwgX0hhc2hGY24sIF9FcXVhbEtleSwgX0FsbG9jPiA+CisjZW5kaWYKK3sKKyAgdHlwZWRlZiB1bm9yZGVyZWRfc2V0PF9WYWx1ZSwgX0hhc2hGY24sIF9FcXVhbEtleSwgX0FsbG9jPiBfU2VsZjsKKyAgLy9TcGVjaWZpYyBpdGVyYXRvciB0cmFpdHMgY3JlYXRpb24KKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9Vbm9yZGVyZWRTZXRUcmFpdHNUPF9WYWx1ZT4gX1Vub3JkZXJlZFNldFRyYWl0czsKK3B1YmxpYzoKKyAgdHlwZWRlZiBoYXNodGFibGU8X1ZhbHVlLCBfVmFsdWUsIF9IYXNoRmNuLAorICAgICAgICAgICAgICAgICAgICBfVW5vcmRlcmVkU2V0VHJhaXRzLCBfU1RMUF9QUklWIF9JZGVudGl0eTxfVmFsdWU+LCBfRXF1YWxLZXksIF9BbGxvYz4gX0h0OworcHVibGljOgorICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6a2V5X3R5cGUga2V5X3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpoYXNoZXIgaGFzaGVyOworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6a2V5X2VxdWFsIGtleV9lcXVhbDsKKworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6c2l6ZV90eXBlIHNpemVfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpwb2ludGVyICAgICAgICAgcG9pbnRlcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmNvbnN0X3BvaW50ZXIgICBjb25zdF9wb2ludGVyOworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6cmVmZXJlbmNlICAgICAgIHJlZmVyZW5jZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9yZWZlcmVuY2U7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6Oml0ZXJhdG9yIGl0ZXJhdG9yOworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpsb2NhbF9pdGVyYXRvciBsb2NhbF9pdGVyYXRvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmNvbnN0X2xvY2FsX2l0ZXJhdG9yIGNvbnN0X2xvY2FsX2l0ZXJhdG9yOworCisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKKworICBoYXNoZXIgaGFzaF9mdW5jdGlvbigpIGNvbnN0IHsgcmV0dXJuIF9NX2h0Lmhhc2hfZnVuY3QoKTsgfQorICBrZXlfZXF1YWwga2V5X2VxKCkgY29uc3QgeyByZXR1cm4gX01faHQua2V5X2VxKCk7IH0KKyAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmdldF9hbGxvY2F0b3IoKTsgfQorCitwcml2YXRlOgorICBfSHQgX01faHQ7CisgIF9TVExQX0tFWV9UWVBFX0ZPUl9DT05UX0VYVChrZXlfdHlwZSkKKworcHVibGljOgorICBleHBsaWNpdCB1bm9yZGVyZWRfc2V0KHNpemVfdHlwZSBfX24gPSAxMDAsIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9NX2h0KF9fbiwgX19oZiwgX19lcWwsIF9fYSkge30KKworICB1bm9yZGVyZWRfc2V0KF9fbW92ZV9zb3VyY2U8X1NlbGY+IHNyYykKKyAgICA6IF9NX2h0KF9fbW92ZV9zb3VyY2U8X0h0PihzcmMuZ2V0KCkuX01faHQpKSB7fQorCisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICB1bm9yZGVyZWRfc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLAorICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX24gPSAxMDAsIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorICAgICAgICAgICAgICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKyAgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9NX2h0KF9fbiwgX19oZiwgX19lcWwsIF9fYSkKKyAgeyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZiwgX19sKTsgfQorI2Vsc2UKKyAgdW5vcmRlcmVkX3NldChjb25zdCB2YWx1ZV90eXBlKiBfX2YsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbCwKKyAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uID0gMTAwLCBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKyAgICAgICAgICAgICAgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCisgICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBfX2EpCisgIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCk7IH0KKworICB1bm9yZGVyZWRfc2V0KGNvbnN0X2l0ZXJhdG9yIF9fZiwgY29uc3RfaXRlcmF0b3IgX19sLAorICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX24gPSAxMDAsIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorICAgICAgICAgICAgICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKyAgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9NX2h0KF9fbiwgX19oZiwgX19lcWwsIF9fYSkKKyAgeyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZiwgX19sKTsgfQorI2VuZGlmIC8qX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworCisgIF9TZWxmJiBvcGVyYXRvciA9IChjb25zdCBfU2VsZiYgX19vdGhlcikKKyAgeyBfTV9odCA9IF9fb3RoZXIuX01faHQ7IHJldHVybiAqdGhpczsgfQorCisgIHNpemVfdHlwZSBzaXplKCkgY29uc3QgeyByZXR1cm4gX01faHQuc2l6ZSgpOyB9CisgIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0Lm1heF9zaXplKCk7IH0KKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmVtcHR5KCk7IH0KKyAgdm9pZCBzd2FwKF9TZWxmJiBfX2hzKSB7IF9NX2h0LnN3YXAoX19ocy5fTV9odCk7IH0KKworICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIF9NX2h0LmJlZ2luKCk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gX01faHQuZW5kKCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBfTV9odC5iZWdpbigpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmVuZCgpOyB9CisKKyAgcGFpcjxpdGVyYXRvciwgYm9vbD4gaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKQorICB7IHJldHVybiBfTV9odC5pbnNlcnRfdW5pcXVlKF9fb2JqKTsgfQorICBpdGVyYXRvciBpbnNlcnQoY29uc3RfaXRlcmF0b3IgLypfX2hpbnQqLywgY29uc3QgdmFsdWVfdHlwZSYgX19vYmopCisgIHsgcmV0dXJuIF9NX2h0Lmluc2VydF91bmlxdWUoX19vYmopOyB9CisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICB2b2lkIGluc2VydChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCkKKyNlbHNlCisgIHZvaWQgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9fZiwgY29uc3RfaXRlcmF0b3IgX19sKQorICB7X01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCk7IH0KKyAgdm9pZCBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSogX19mLCBjb25zdCB2YWx1ZV90eXBlKiBfX2wpCisjZW5kaWYKKyAgeyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZixfX2wpOyB9CisKKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIGl0ZXJhdG9yIGZpbmQoY29uc3QgX0tUJiBfX2tleSkgeyByZXR1cm4gX01faHQuZmluZChfX2tleSk7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIGNvbnN0X2l0ZXJhdG9yIGZpbmQoY29uc3QgX0tUJiBfX2tleSkgY29uc3QgeyByZXR1cm4gX01faHQuZmluZChfX2tleSk7IH0KKworICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgc2l6ZV90eXBlIGNvdW50KGNvbnN0IF9LVCYgX19rZXkpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmNvdW50KF9fa2V5KTsgfQorCisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBwYWlyPGl0ZXJhdG9yLCBpdGVyYXRvcj4gZXF1YWxfcmFuZ2UoY29uc3QgX0tUJiBfX2tleSkKKyAgeyByZXR1cm4gX01faHQuZXF1YWxfcmFuZ2UoX19rZXkpOyB9CisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4gZXF1YWxfcmFuZ2UoY29uc3QgX0tUJiBfX2tleSkgY29uc3QKKyAgeyByZXR1cm4gX01faHQuZXF1YWxfcmFuZ2UoX19rZXkpOyB9CisKKyAgc2l6ZV90eXBlIGVyYXNlKGNvbnN0IGtleV90eXBlJiBfX2tleSkge3JldHVybiBfTV9odC5lcmFzZShfX2tleSk7IH0KKyAgdm9pZCBlcmFzZShjb25zdF9pdGVyYXRvciBfX2l0KSB7IF9NX2h0LmVyYXNlKF9faXQpOyB9CisgIHZvaWQgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19mLCBjb25zdF9pdGVyYXRvciBfX2wpIHsgX01faHQuZXJhc2UoX19mLCBfX2wpOyB9CisgIHZvaWQgY2xlYXIoKSB7IF9NX2h0LmNsZWFyKCk7IH0KKworICBzaXplX3R5cGUgYnVja2V0X2NvdW50KCkgY29uc3QgeyByZXR1cm4gX01faHQuYnVja2V0X2NvdW50KCk7IH0KKyAgc2l6ZV90eXBlIG1heF9idWNrZXRfY291bnQoKSBjb25zdCB7IHJldHVybiBfTV9odC5tYXhfYnVja2V0X2NvdW50KCk7IH0KKyAgc2l6ZV90eXBlIGJ1Y2tldF9zaXplKHNpemVfdHlwZSBfX24pIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmVsZW1zX2luX2J1Y2tldChfX24pOyB9CisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBzaXplX3R5cGUgYnVja2V0KGNvbnN0IF9LVCYgX19rKSBjb25zdCB7IHJldHVybiBfTV9odC5idWNrZXQoX19rKTsgfQorICBsb2NhbF9pdGVyYXRvciBiZWdpbihzaXplX3R5cGUgX19uKSB7IHJldHVybiBfTV9odC5iZWdpbihfX24pOyB9CisgIGxvY2FsX2l0ZXJhdG9yIGVuZChzaXplX3R5cGUgX19uKSB7IHJldHVybiBfTV9odC5lbmQoX19uKTsgfQorICBjb25zdF9sb2NhbF9pdGVyYXRvciBiZWdpbihzaXplX3R5cGUgX19uKSBjb25zdCB7IHJldHVybiBfTV9odC5iZWdpbihfX24pOyB9CisgIGNvbnN0X2xvY2FsX2l0ZXJhdG9yIGVuZChzaXplX3R5cGUgX19uKSBjb25zdCB7IHJldHVybiBfTV9odC5lbmQoX19uKTsgfQorCisgIGZsb2F0IGxvYWRfZmFjdG9yKCkgY29uc3QgeyByZXR1cm4gX01faHQubG9hZF9mYWN0b3IoKTsgfQorICBmbG9hdCBtYXhfbG9hZF9mYWN0b3IoKSBjb25zdCB7IHJldHVybiBfTV9odC5tYXhfbG9hZF9mYWN0b3IoKTsgfQorICB2b2lkIG1heF9sb2FkX2ZhY3RvcihmbG9hdCBfX3ZhbCkgeyBfTV9odC5tYXhfbG9hZF9mYWN0b3IoX192YWwpOyB9CisgIHZvaWQgcmVoYXNoKHNpemVfdHlwZSBfX2hpbnQpIHsgX01faHQucmVoYXNoKF9faGludCk7IH0KK307CisKKy8vU3BlY2lmaWMgaXRlcmF0b3IgdHJhaXRzIGNyZWF0aW9uCitfU1RMUF9DUkVBVEVfSEFTSF9JVEVSQVRPUl9UUkFJVFMoVW5vcmRlcmVkTXVsdGlzZXRUcmFpdHNULCBDb25zdF90cmFpdHMpCisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsdWUsIF9TVExQX0RGTF9UTVBMX1BBUkFNKF9IYXNoRmNuLGhhc2g8X1ZhbHVlPiksCisgICAgICAgICAgX1NUTFBfREZMX1RNUExfUEFSQU0oX0VxdWFsS2V5LGVxdWFsX3RvPF9WYWx1ZT4pLAorICAgICAgICAgIF9TVExQX0RFRkFVTFRfQUxMT0NBVE9SX1NFTEVDVChfVmFsdWUpID4KK2NsYXNzIHVub3JkZXJlZF9tdWx0aXNldAorI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QQVJUSUFMX1NQRUNfV09SS0FST1VORCkKKyAgICAgICAgICAgICAgIDogcHVibGljIF9fc3RscG9ydF9jbGFzczx1bm9yZGVyZWRfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+ID4KKyNlbmRpZgoreworICB0eXBlZGVmIHVub3JkZXJlZF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz4gX1NlbGY7CisgIC8vU3BlY2lmaWMgaXRlcmF0b3IgdHJhaXRzIGNyZWF0aW9uCisgIHR5cGVkZWYgX1NUTFBfUFJJViBfVW5vcmRlcmVkTXVsdGlzZXRUcmFpdHNUPF9WYWx1ZT4gX1Vub3JkZXJlZE11bHRpc2V0VHJhaXRzOworcHVibGljOgorICB0eXBlZGVmIGhhc2h0YWJsZTxfVmFsdWUsIF9WYWx1ZSwgX0hhc2hGY24sCisgICAgICAgICAgICAgICAgICAgIF9Vbm9yZGVyZWRNdWx0aXNldFRyYWl0cywgX1NUTFBfUFJJViBfSWRlbnRpdHk8X1ZhbHVlPiwgX0VxdWFsS2V5LCBfQWxsb2M+IF9IdDsKKworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6a2V5X3R5cGUga2V5X3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpoYXNoZXIgaGFzaGVyOworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6a2V5X2VxdWFsIGtleV9lcXVhbDsKKworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6c2l6ZV90eXBlIHNpemVfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpwb2ludGVyICAgICAgIHBvaW50ZXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpjb25zdF9wb2ludGVyIGNvbnN0X3BvaW50ZXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpyZWZlcmVuY2UgcmVmZXJlbmNlOworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X3JlZmVyZW5jZTsKKworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6aXRlcmF0b3IgaXRlcmF0b3I7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmxvY2FsX2l0ZXJhdG9yIGxvY2FsX2l0ZXJhdG9yOworICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6Y29uc3RfbG9jYWxfaXRlcmF0b3IgY29uc3RfbG9jYWxfaXRlcmF0b3I7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmFsbG9jYXRvcl90eXBlIGFsbG9jYXRvcl90eXBlOworCisgIGhhc2hlciBoYXNoX2Z1bmN0aW9uKCkgY29uc3QgeyByZXR1cm4gX01faHQuaGFzaF9mdW5jdCgpOyB9CisgIGtleV9lcXVhbCBrZXlfZXEoKSBjb25zdCB7IHJldHVybiBfTV9odC5rZXlfZXEoKTsgfQorICBhbGxvY2F0b3JfdHlwZSBnZXRfYWxsb2NhdG9yKCkgY29uc3QgeyByZXR1cm4gX01faHQuZ2V0X2FsbG9jYXRvcigpOyB9CisKK3ByaXZhdGU6CisgIF9IdCBfTV9odDsKKyAgX1NUTFBfS0VZX1RZUEVfRk9SX0NPTlRfRVhUKGtleV90eXBlKQorCitwdWJsaWM6CisgIGV4cGxpY2l0IHVub3JkZXJlZF9tdWx0aXNldChzaXplX3R5cGUgX19uID0gMTAwLCBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX01faHQoX19uLCBfX2hmLCBfX2VxbCwgX19hKSB7fQorCisgIHVub3JkZXJlZF9tdWx0aXNldChfX21vdmVfc291cmNlPF9TZWxmPiBzcmMpCisgICAgOiBfTV9odChfX21vdmVfc291cmNlPF9IdD4oc3JjLmdldCgpLl9NX2h0KSkge30KKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgdW5vcmRlcmVkX211bHRpc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLAorICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fbiA9IDEwMCwgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9NX2h0KF9fbiwgX19oZiwgX19lcWwsIF9fYSkKKyAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLCBfX2wpOyB9CisjZWxzZQorICB1bm9yZGVyZWRfbXVsdGlzZXQoY29uc3QgdmFsdWVfdHlwZSogX19mLCBjb25zdCB2YWx1ZV90eXBlKiBfX2wsCisgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uID0gMTAwLCBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX01faHQoX19uLCBfX2hmLCBfX2VxbCwgX19hKQorICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsIF9fbCk7IH0KKworICB1bm9yZGVyZWRfbXVsdGlzZXQoY29uc3RfaXRlcmF0b3IgX19mLCBjb25zdF9pdGVyYXRvciBfX2wsCisgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uID0gMTAwLCBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX01faHQoX19uLCBfX2hmLCBfX2VxbCwgX19hKQorICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsIF9fbCk7IH0KKyNlbmRpZiAvKl9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKworICBfU2VsZiYgb3BlcmF0b3IgPSAoY29uc3QgX1NlbGYmIF9fb3RoZXIpCisgIHsgX01faHQgPSBfX290aGVyLl9NX2h0OyByZXR1cm4gKnRoaXM7IH0KKworICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LnNpemUoKTsgfQorICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCB7IHJldHVybiBfTV9odC5tYXhfc2l6ZSgpOyB9CisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBfTV9odC5lbXB0eSgpOyB9CisgIHZvaWQgc3dhcChfU2VsZiYgaHMpIHsgX01faHQuc3dhcChocy5fTV9odCk7IH0KKworICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIF9NX2h0LmJlZ2luKCk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gX01faHQuZW5kKCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBfTV9odC5iZWdpbigpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmVuZCgpOyB9CisKKyAgaXRlcmF0b3IgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKQorICB7IHJldHVybiBfTV9odC5pbnNlcnRfZXF1YWwoX19vYmopOyB9CisgIGl0ZXJhdG9yIGluc2VydChjb25zdF9pdGVyYXRvciAvKl9faGludCovLCBjb25zdCB2YWx1ZV90eXBlJiBfX29iaikKKyAgeyByZXR1cm4gX01faHQuaW5zZXJ0X2VxdWFsKF9fb2JqKTsgfQorI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgdm9pZCBpbnNlcnQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wpCisjZWxzZQorICB2b2lkIGluc2VydChjb25zdCB2YWx1ZV90eXBlKiBfX2YsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbCkKKyAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLF9fbCk7IH0KKyAgdm9pZCBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19mLCBjb25zdF9pdGVyYXRvciBfX2wpCisjZW5kaWYgLypfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZiwgX19sKTsgfQorCisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBpdGVyYXRvciBmaW5kKGNvbnN0IF9LVCYgX19rZXkpIHsgcmV0dXJuIF9NX2h0LmZpbmQoX19rZXkpOyB9CisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBjb25zdF9pdGVyYXRvciBmaW5kKGNvbnN0IF9LVCYgX19rZXkpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmZpbmQoX19rZXkpOyB9CisKKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIHNpemVfdHlwZSBjb3VudChjb25zdCBfS1QmIF9fa2V5KSBjb25zdCB7IHJldHVybiBfTV9odC5jb3VudChfX2tleSk7IH0KKworICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgcGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+IGVxdWFsX3JhbmdlKGNvbnN0IF9LVCYgX19rZXkpCisgIHsgcmV0dXJuIF9NX2h0LmVxdWFsX3JhbmdlKF9fa2V5KTsgfQorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgcGFpcjxjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3I+IGVxdWFsX3JhbmdlKGNvbnN0IF9LVCYgX19rZXkpIGNvbnN0CisgIHsgcmV0dXJuIF9NX2h0LmVxdWFsX3JhbmdlKF9fa2V5KTsgfQorCisgIHNpemVfdHlwZSBlcmFzZShjb25zdCBrZXlfdHlwZSYgX19rZXkpIHtyZXR1cm4gX01faHQuZXJhc2UoX19rZXkpOyB9CisgIHZvaWQgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19pdCkgeyBfTV9odC5lcmFzZShfX2l0KTsgfQorICB2b2lkIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fZiwgY29uc3RfaXRlcmF0b3IgX19sKSB7IF9NX2h0LmVyYXNlKF9fZiwgX19sKTsgfQorICB2b2lkIGNsZWFyKCkgeyBfTV9odC5jbGVhcigpOyB9CisKKyAgc2l6ZV90eXBlIGJ1Y2tldF9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmJ1Y2tldF9jb3VudCgpOyB9CisgIHNpemVfdHlwZSBtYXhfYnVja2V0X2NvdW50KCkgY29uc3QgeyByZXR1cm4gX01faHQubWF4X2J1Y2tldF9jb3VudCgpOyB9CisgIHNpemVfdHlwZSBidWNrZXRfc2l6ZShzaXplX3R5cGUgX19uKSBjb25zdCB7IHJldHVybiBfTV9odC5lbGVtc19pbl9idWNrZXQoX19uKTsgfQorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgc2l6ZV90eXBlIGJ1Y2tldChjb25zdCBfS1QmIF9faykgY29uc3QgeyByZXR1cm4gX01faHQuYnVja2V0KF9fayk7IH0KKyAgbG9jYWxfaXRlcmF0b3IgYmVnaW4oc2l6ZV90eXBlIF9fbikgeyByZXR1cm4gX01faHQuYmVnaW4oX19uKTsgfQorICBsb2NhbF9pdGVyYXRvciBlbmQoc2l6ZV90eXBlIF9fbikgeyByZXR1cm4gX01faHQuZW5kKF9fbik7IH0KKyAgY29uc3RfbG9jYWxfaXRlcmF0b3IgYmVnaW4oc2l6ZV90eXBlIF9fbikgY29uc3QgeyByZXR1cm4gX01faHQuYmVnaW4oX19uKTsgfQorICBjb25zdF9sb2NhbF9pdGVyYXRvciBlbmQoc2l6ZV90eXBlIF9fbikgY29uc3QgeyByZXR1cm4gX01faHQuZW5kKF9fbik7IH0KKworICBmbG9hdCBsb2FkX2ZhY3RvcigpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmxvYWRfZmFjdG9yKCk7IH0KKyAgZmxvYXQgbWF4X2xvYWRfZmFjdG9yKCkgY29uc3QgeyByZXR1cm4gX01faHQubWF4X2xvYWRfZmFjdG9yKCk7IH0KKyAgdm9pZCBtYXhfbG9hZF9mYWN0b3IoZmxvYXQgX192YWwpIHsgX01faHQubWF4X2xvYWRfZmFjdG9yKF9fdmFsKTsgfQorICB2b2lkIHJlaGFzaChzaXplX3R5cGUgX19oaW50KSB7IF9NX2h0LnJlaGFzaChfX2hpbnQpOyB9Cit9OworCisjZGVmaW5lIF9TVExQX1RFTVBMQVRFX0hFQURFUiB0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaEZjbiwgY2xhc3MgX0VxdWFsS2V5LCBjbGFzcyBfQWxsb2M+CisjZGVmaW5lIF9TVExQX1RFTVBMQVRFX0NPTlRBSU5FUiB1bm9yZGVyZWRfc2V0PF9WYWx1ZSxfSGFzaEZjbixfRXF1YWxLZXksX0FsbG9jPgorCisjaW5jbHVkZSA8c3RsL19yZWxvcHNfaGFzaF9jb250Lmg+CisKKyN1bmRlZiBfU1RMUF9URU1QTEFURV9DT05UQUlORVIKKyNkZWZpbmUgX1NUTFBfVEVNUExBVEVfQ09OVEFJTkVSIHVub3JkZXJlZF9tdWx0aXNldDxfVmFsdWUsX0hhc2hGY24sX0VxdWFsS2V5LF9BbGxvYz4KKyNpbmNsdWRlIDxzdGwvX3JlbG9wc19oYXNoX2NvbnQuaD4KKworI3VuZGVmIF9TVExQX1RFTVBMQVRFX0NPTlRBSU5FUgorI3VuZGVmIF9TVExQX1RFTVBMQVRFX0hFQURFUgorCisvLyBTcGVjaWFsaXphdGlvbiBvZiBpbnNlcnRfaXRlcmF0b3Igc28gdGhhdCBpdCB3aWxsIHdvcmsgZm9yIHVub3JkZXJlZF9zZXQKKy8vIGFuZCB1bm9yZGVyZWRfbXVsdGlzZXQuCisKKyNpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQordGVtcGxhdGUgPGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0hhc2hGY24sIGNsYXNzIF9FcXVhbEtleSwgY2xhc3MgX0FsbG9jPgorc3RydWN0IF9fbW92ZV90cmFpdHM8dW5vcmRlcmVkX3NldDxfVmFsdWUsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz4gPiA6CisgIF9TVExQX1BSSVYgX19tb3ZlX3RyYWl0c19hdXg8dHlwZW5hbWUgdW5vcmRlcmVkX3NldDxfVmFsdWUsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz46Ol9IdD4KK3t9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaEZjbiwgY2xhc3MgX0VxdWFsS2V5LCBjbGFzcyBfQWxsb2M+CitzdHJ1Y3QgX19tb3ZlX3RyYWl0czx1bm9yZGVyZWRfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+ID4gOgorICBfU1RMUF9QUklWIF9fbW92ZV90cmFpdHNfYXV4PHR5cGVuYW1lIHVub3JkZXJlZF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz46Ol9IdD4KK3t9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaEZjbiwgY2xhc3MgX0VxdWFsS2V5LCBjbGFzcyBfQWxsb2M+CitjbGFzcyBpbnNlcnRfaXRlcmF0b3I8dW5vcmRlcmVkX3NldDxfVmFsdWUsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz4gPiB7Citwcm90ZWN0ZWQ6CisgIHR5cGVkZWYgdW5vcmRlcmVkX3NldDxfVmFsdWUsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz4gX0NvbnRhaW5lcjsKKyAgX0NvbnRhaW5lciogY29udGFpbmVyOworcHVibGljOgorICB0eXBlZGVmIF9Db250YWluZXIgICAgICAgICAgY29udGFpbmVyX3R5cGU7CisgIHR5cGVkZWYgb3V0cHV0X2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKKyAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICBwb2ludGVyOworICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworCisgIGluc2VydF9pdGVyYXRvcihfQ29udGFpbmVyJiBfX3gpIDogY29udGFpbmVyKCZfX3gpIHt9CisgIGluc2VydF9pdGVyYXRvcihfQ29udGFpbmVyJiBfX3gsIHR5cGVuYW1lIF9Db250YWluZXI6Oml0ZXJhdG9yKQorICAgIDogY29udGFpbmVyKCZfX3gpIHt9CisgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYKKyAgb3BlcmF0b3I9KGNvbnN0IHR5cGVuYW1lIF9Db250YWluZXI6OnZhbHVlX3R5cGUmIF9fdmFsKSB7CisgICAgY29udGFpbmVyLT5pbnNlcnQoX192YWwpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mIG9wZXJhdG9yKigpIHsgcmV0dXJuICp0aGlzOyB9CisgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYgb3BlcmF0b3IrKygpIHsgcmV0dXJuICp0aGlzOyB9CisgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYgb3BlcmF0b3IrKyhpbnQpIHsgcmV0dXJuICp0aGlzOyB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaEZjbiwgY2xhc3MgX0VxdWFsS2V5LCBjbGFzcyBfQWxsb2M+CitjbGFzcyBpbnNlcnRfaXRlcmF0b3I8dW5vcmRlcmVkX211bHRpc2V0PF9WYWx1ZSwgX0hhc2hGY24sIF9FcXVhbEtleSwgX0FsbG9jPiA+IHsKK3Byb3RlY3RlZDoKKyAgdHlwZWRlZiB1bm9yZGVyZWRfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+IF9Db250YWluZXI7CisgIF9Db250YWluZXIqIGNvbnRhaW5lcjsKKyAgdHlwZW5hbWUgX0NvbnRhaW5lcjo6aXRlcmF0b3IgaXRlcjsKK3B1YmxpYzoKKyAgdHlwZWRlZiBfQ29udGFpbmVyICAgICAgICAgIGNvbnRhaW5lcl90eXBlOworICB0eXBlZGVmIG91dHB1dF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CisgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKworICBpbnNlcnRfaXRlcmF0b3IoX0NvbnRhaW5lciYgX194KSA6IGNvbnRhaW5lcigmX194KSB7fQorICBpbnNlcnRfaXRlcmF0b3IoX0NvbnRhaW5lciYgX194LCB0eXBlbmFtZSBfQ29udGFpbmVyOjppdGVyYXRvcikKKyAgICA6IGNvbnRhaW5lcigmX194KSB7fQorICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mCisgIG9wZXJhdG9yPShjb25zdCB0eXBlbmFtZSBfQ29udGFpbmVyOjp2YWx1ZV90eXBlJiBfX3ZhbCkgeworICAgIGNvbnRhaW5lci0+aW5zZXJ0KF9fdmFsKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JiBvcGVyYXRvciooKSB7IHJldHVybiAqdGhpczsgfQorICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mIG9wZXJhdG9yKysoKSB7IHJldHVybiAqdGhpczsgfQorICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mIG9wZXJhdG9yKysoaW50KSB7IHJldHVybiAqdGhpczsgfQorfTsKKyNlbmRpZiAvKiBfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OICovCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2VuZGlmIC8qIF9TVExQX0lOVEVSTkFMX1VOT1JERVJFRF9TRVRfSCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgorCmRpZmYgLS1naXQgYS9zdGwvX3ZhbGFycmF5LmMgYi9zdGwvX3ZhbGFycmF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg0MWE0MwotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9fdmFsYXJyYXkuYwpAQCAtMCwwICsxLDE5NiBAQAorLyoKKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworI2lmbmRlZiBfU1RMUF9WQUxBUlJBWV9DCisjZGVmaW5lIF9TVExQX1ZBTEFSUkFZX0MKKworI2lmbmRlZiBfU1RMUF9WQUxBUlJBWV9ICisjIGluY2x1ZGUgPHN0bC9fdmFsYXJyYXkuaD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK19WYWxhcnJheV9ib29sIHZhbGFycmF5PF9UcD46OiBvcGVyYXRvciEoKSBjb25zdCB7CisgIF9WYWxhcnJheV9ib29sIF9fdG1wKHRoaXMtPnNpemUoKSwgX1ZhbGFycmF5X2Jvb2w6Ol9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IHRoaXMtPnNpemUoKTsgKytfX2kpCisgICAgX190bXBbX19pXSA9ICEoKnRoaXMpW19faV07CisgIHJldHVybiBfX3RtcDsKK30KKworLy8gQmVoYXZpb3IgaXMgdW5kZWZpbmVkIGlmIF9feCBhbmQgKnRoaXMgaGF2ZSBkaWZmZXJlbnQgc2l6ZXMKK3RlbXBsYXRlIDxjbGFzcyBfVHA+Cit2YWxhcnJheTxfVHA+JiB2YWxhcnJheTxfVHA+OjpvcGVyYXRvcj0oY29uc3Qgc2xpY2VfYXJyYXk8X1RwPiYgX194KQoreworICBzaXplX3QgX19pbmRleCA9IF9feC5fTV9zbGljZS5zdGFydCgpOworICBmb3IgKHNpemVfdCBfX2kgPSAwOworICAgICAgIF9faSA8IF9feC5fTV9zbGljZS5zaXplKCk7CisgICAgICAgKytfX2ksIF9faW5kZXggKz0gX194Ll9NX3NsaWNlLnN0cmlkZSgpKQorICAgICgqdGhpcylbX19pXSA9IF9feC5fTV9hcnJheVtfX2luZGV4XTsKKyAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgordmFsYXJyYXk8X1RwPiB2YWxhcnJheTxfVHA+OjpvcGVyYXRvcltdKHNsaWNlIF9fc2xpY2UpIGNvbnN0IHsKKyAgdmFsYXJyYXk8X1RwPiBfX3RtcChfX3NsaWNlLnNpemUoKSwgX05vSW5pdCgpKTsKKyAgc2l6ZV90IF9faW5kZXggPSBfX3NsaWNlLnN0YXJ0KCk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7CisgICAgICAgX19pIDwgX19zbGljZS5zaXplKCk7CisgICAgICAgKytfX2ksIF9faW5kZXggKz0gX19zbGljZS5zdHJpZGUoKSkKKyAgICBfX3RtcFtfX2ldID0gKCp0aGlzKVtfX2luZGV4XTsKKyAgcmV0dXJuIF9fdG1wOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1NpemU+Citib29sIF9Hc2xpY2VfSXRlcl90bXBsPF9TaXplPjo6X01faW5jcigpIHsKKyAgc2l6ZV90IF9fZGltID0gX01faW5kaWNlcy5zaXplKCkgLSAxOworICArK19NX3N0ZXA7CisgIGZvciAoOzspIHsKKyAgICBfTV8xZF9pZHggKz0gX01fZ3NsaWNlLl9NX3N0cmlkZXNbX19kaW1dOworICAgIGlmICgrK19NX2luZGljZXNbX19kaW1dICE9IF9NX2dzbGljZS5fTV9sZW5ndGhzW19fZGltXSkKKyAgICAgIHJldHVybiB0cnVlOworICAgIGVsc2UgaWYgKF9fZGltICE9IDApIHsKKyAgICAgIF9NXzFkX2lkeCAtPSBfTV9nc2xpY2UuX01fc3RyaWRlc1tfX2RpbV0gKiBfTV9nc2xpY2UuX01fbGVuZ3Roc1tfX2RpbV07CisgICAgICBfTV9pbmRpY2VzW19fZGltXSA9IDA7CisgICAgICAtLV9fZGltOworICAgIH0KKyAgICBlbHNlCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworLy8gQmVoYXZpb3IgaXMgdW5kZWZpbmVkIGlmIF9feCBhbmQgKnRoaXMgaGF2ZSBkaWZmZXJlbnQgc2l6ZXMsIG9yIGlmCisvLyBfX3ggd2FzIGNvbnN0cnVjdGVkIGZyb20gYSBkZWdlbmVyYXRlIGdzbGljZS4KK3RlbXBsYXRlIDxjbGFzcyBfVHA+Cit2YWxhcnJheTxfVHA+JiB2YWxhcnJheTxfVHA+OjpvcGVyYXRvcj0oY29uc3QgZ3NsaWNlX2FycmF5PF9UcD4mIF9feCkKK3sKKyAgaWYgKHRoaXMtPnNpemUoKSAhPSAwKSB7CisgICAgX0dzbGljZV9JdGVyIF9faShfX3guX01fZ3NsaWNlKTsKKyAgICBkbworICAgICAgKCp0aGlzKVtfX2kuX01fc3RlcF0gPSBfX3guX01fYXJyYXlbX19pLl9NXzFkX2lkeF07CisgICAgd2hpbGUoX19pLl9NX2luY3IoKSk7CisgIH0KKyAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgordmFsYXJyYXk8X1RwPiB2YWxhcnJheTxfVHA+OjpvcGVyYXRvcltdKGNvbnN0IGdzbGljZSYgX19zbGljZSkgY29uc3QKK3sKKyAgdmFsYXJyYXk8X1RwPiBfX3RtcChfX3NsaWNlLl9NX3NpemUoKSwgX05vSW5pdCgpKTsKKyAgaWYgKF9fdG1wLnNpemUoKSAhPSAwKSB7CisgICAgX0dzbGljZV9JdGVyIF9faShfX3NsaWNlKTsKKyAgICBkbyBfX3RtcFtfX2kuX01fc3RlcF0gPSAoKnRoaXMpW19faS5fTV8xZF9pZHhdOyB3aGlsZShfX2kuX01faW5jcigpKTsKKyAgfQorICByZXR1cm4gX190bXA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+Cit2YWxhcnJheTxfVHA+IHZhbGFycmF5PF9UcD46Om9wZXJhdG9yW10oY29uc3QgX1ZhbGFycmF5X2Jvb2wmIF9fbWFzaykgY29uc3QKK3sKKyAgc2l6ZV90IF9wX3NpemUgPSAwOworICB7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19tYXNrLnNpemUoKTsgKytfX2kpCisgICAgICBpZiAoX19tYXNrW19faV0pICsrX3Bfc2l6ZTsKKyAgfQorCisgIHZhbGFycmF5PF9UcD4gX190bXAoX3Bfc2l6ZSwgX05vSW5pdCgpKTsKKyAgc2l6ZV90IF9faWR4ID0gMDsKKyAgeworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fbWFzay5zaXplKCk7ICsrX19pKQorICAgICAgaWYgKF9fbWFza1tfX2ldKSBfX3RtcFtfX2lkeCsrXSA9ICgqdGhpcylbX19pXTsKKyAgfQorCisgIHJldHVybiBfX3RtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3ZhbGFycmF5PF9UcD4mIHZhbGFycmF5PF9UcD46Om9wZXJhdG9yPShjb25zdCBpbmRpcmVjdF9hcnJheTxfVHA+JiBfX3gpIHsKKyAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194Ll9NX2FkZHIuc2l6ZSgpOyArK19faSkKKyAgICAoKnRoaXMpW19faV0gPSBfX3guX01fYXJyYXlbX194Ll9NX2FkZHJbX19pXV07CisgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3ZhbGFycmF5PF9UcD4KK3ZhbGFycmF5PF9UcD46Om9wZXJhdG9yW10oY29uc3QgX1ZhbGFycmF5X3NpemVfdCYgX19hZGRyKSBjb25zdAoreworICB2YWxhcnJheTxfVHA+IF9fdG1wKF9fYWRkci5zaXplKCksIF9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fYWRkci5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSAoKnRoaXMpW19fYWRkcltfX2ldXTsKKyAgcmV0dXJuIF9fdG1wOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE90aGVyIHZhbGFycmF5IG5vbmlubGluZSBtZW1iZXIgZnVuY3Rpb25zCisKKy8vIFNoaWZ0IGFuZCBjc2hpZnQKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3ZhbGFycmF5PF9UcD4gdmFsYXJyYXk8X1RwPjo6c2hpZnQoaW50IF9fbikgY29uc3QKK3sKKyAgdmFsYXJyYXk8X1RwPiBfX3RtcCh0aGlzLT5zaXplKCkpOworCisgIGlmIChfX24gPj0gMCkgeworICAgIGlmIChfX24gPCB0aGlzLT5zaXplKCkpCisgICAgICBjb3B5KHRoaXMtPl9NX2ZpcnN0ICsgX19uLCB0aGlzLT5fTV9maXJzdCArIHRoaXMtPnNpemUoKSwKKyAgICAgICAgICAgX190bXAuX01fZmlyc3QpOworICB9CisgIGVsc2UgeworICAgIGlmICgtX19uIDwgdGhpcy0+c2l6ZSgpKQorICAgICAgY29weSh0aGlzLT5fTV9maXJzdCwgdGhpcy0+X01fZmlyc3QgKyB0aGlzLT5zaXplKCkgKyBfX24sCisgICAgICAgICAgIF9fdG1wLl9NX2ZpcnN0IC0gX19uKTsKKyAgfQorICByZXR1cm4gX190bXA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+Cit2YWxhcnJheTxfVHA+IHZhbGFycmF5PF9UcD46OmNzaGlmdChpbnQgX19tKSBjb25zdAoreworICB2YWxhcnJheTxfVHA+IF9fdG1wKHRoaXMtPnNpemUoKSk7CisKKyAgLy8gUmVkdWNlIF9fbSB0byBhbiBlcXVpdmFsZW50IG51bWJlciBpbiB0aGUgcmFuZ2UgWzAsIHNpemUoKSkuICBXZQorICAvLyBoYXZlIHRvIGJlIGNhcmVmdWwgd2l0aCBuZWdhdGl2ZSBudW1iZXJzLCBzaW5jZSB0aGUgc2lnbiBvZiBhICUgYgorICAvLyBpcyB1bnNwZWNpZmllZCB3aGVuIGEgPCAwLgorICBsb25nIF9fbiA9IF9fbTsKKyAgaWYgKHRoaXMtPnNpemUoKSA8IChudW1lcmljX2xpbWl0czxsb25nPjo6bWF4KSgpKQorICAgIF9fbiAlPSBsb25nKHRoaXMtPnNpemUoKSk7CisgIGlmIChfX24gPCAwKQorICAgIF9fbiArPSB0aGlzLT5zaXplKCk7CisKKyAgY29weSh0aGlzLT5fTV9maXJzdCwgICAgICAgdGhpcy0+X01fZmlyc3QgKyBfX24sCisgICAgICAgX190bXAuX01fZmlyc3QgKyAodGhpcy0+c2l6ZSgpIC0gX19uKSk7CisgIGNvcHkodGhpcy0+X01fZmlyc3QgKyBfX24sIHRoaXMtPl9NX2ZpcnN0ICsgdGhpcy0+c2l6ZSgpLAorICAgICAgIF9fdG1wLl9NX2ZpcnN0KTsKKworICByZXR1cm4gX190bXA7Cit9CisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2VuZGlmIC8qICBfU1RMUF9WQUxBUlJBWV9DICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvX3ZhbGFycmF5LmggYi9zdGwvX3ZhbGFycmF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM3YzViOQotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9fdmFsYXJyYXkuaApAQCAtMCwwICsxLDE2NjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfVkFMQVJSQVlfSAorI2RlZmluZSBfU1RMUF9WQUxBUlJBWV9ICisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ01BVEgKKyMgIGluY2x1ZGUgPHN0bC9fY21hdGguaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX05FVworIyAgaW5jbHVkZSA8c3RsL19uZXcuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0FMR09fSAorIyAgaW5jbHVkZSA8c3RsL19hbGdvLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9OVU1FUklDX0gKKyMgIGluY2x1ZGUgPHN0bC9fbnVtZXJpYy5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfTElNSVRTCisjICBpbmNsdWRlIDxzdGwvX2xpbWl0cy5oPgorI2VuZGlmCisKKy8qIEFzIHdlIG9ubHkgbmVlZCB0aGUgX1NUTFBfQVNTRVJUIG1hY3JvIGZyb20gX2RlYnVnLmggd2UgdGVzdCBpdCB0byBpbmNsdWRlIF9kZWJ1Zy5oICovCisjaWZuZGVmIF9TVExQX0FTU0VSVAorIyAgaW5jbHVkZSA8c3RsL2RlYnVnL19kZWJ1Zy5oPgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCitjbGFzcyBzbGljZTsKK2NsYXNzIGdzbGljZTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4gY2xhc3MgdmFsYXJyYXk7Cit0eXBlZGVmIHZhbGFycmF5PGJvb2w+ICAgIF9WYWxhcnJheV9ib29sOwordHlwZWRlZiB2YWxhcnJheTxzaXplX3Q+ICBfVmFsYXJyYXlfc2l6ZV90OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBjbGFzcyBzbGljZV9hcnJheTsKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IGNsYXNzIGdzbGljZV9hcnJheTsKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IGNsYXNzIG1hc2tfYXJyYXk7Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBjbGFzcyBpbmRpcmVjdF9hcnJheTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjbGFzcyB2YWxhcnJheQorCisvLyBCYXNlIGNsYXNzIHRvIGhhbmRsZSBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgZGVhbGxvY2F0aW9uLiAgV2UgY2FuJ3QganVzdAorLy8gdXNlIHZlY3Rvcjw+LCBiZWNhdXNlIHZlY3Rvcjxib29sPiB3b3VsZCBiZSB1bnN1aXRhYmxlIGFzIGFuIGludGVybmFsCisvLyByZXByZXNlbnRhdGlvbiBmb3IgdmFsYXJyYXk8Ym9vbD4uCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX1ZhbGFycmF5X2Jhc2UKK3sKKyAgX1RwKiAgIF9NX2ZpcnN0OworICBzaXplX3QgX01fc2l6ZTsKKworICBfVmFsYXJyYXlfYmFzZSgpIDogX01fZmlyc3QoMCksIF9NX3NpemUoMCkge30KKyAgX1ZhbGFycmF5X2Jhc2Uoc2l6ZV90IF9fbikgOiBfTV9maXJzdCgwKSwgX01fc2l6ZSgwKSB7IF9NX2FsbG9jYXRlKF9fbik7IH0KKyAgfl9WYWxhcnJheV9iYXNlKCkgeyBfTV9kZWFsbG9jYXRlKCk7IH0KKworICB2b2lkIF9NX2FsbG9jYXRlKHNpemVfdCBfX24pIHsKKyAgICBpZiAoX19uICE9IDApIHsKKyAgICAgIF9NX2ZpcnN0ID0gX19TVEFUSUNfQ0FTVChfVHAqLCAobWFsbG9jKF9fbiAqIHNpemVvZihfVHApKSkpOworICAgICAgX01fc2l6ZSAgPSBfX247CisjaWYgIWRlZmluZWQoX1NUTFBfTk9fQkFEX0FMTE9DKSAmJiBkZWZpbmVkKF9TVExQX1VTRV9FWENFUFRJT05TKQorICAgICAgaWYgKF9NX2ZpcnN0ID09IDApIHsKKyAgICAgICAgX01fc2l6ZSA9IDA7CisgICAgICAgIHRocm93IF9TVExQX1NURDo6YmFkX2FsbG9jKCk7CisgICAgICB9CisjZW5kaWYKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBfTV9maXJzdCA9IDA7CisgICAgICBfTV9zaXplID0gMDsKKyAgICB9CisgIH0KKworICB2b2lkIF9NX2RlYWxsb2NhdGUoKSB7CisgICAgZnJlZShfTV9maXJzdCk7CisgICAgX01fZmlyc3QgPSAwOworICAgIF9NX3NpemUgPSAwOworICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorY2xhc3MgdmFsYXJyYXkgOiBwcml2YXRlIF9WYWxhcnJheV9iYXNlPF9UcD4KK3sKKyAgZnJpZW5kIGNsYXNzIGdzbGljZTsKKworcHVibGljOgorICB0eXBlZGVmIF9UcCB2YWx1ZV90eXBlOworCisgIC8vIEJhc2ljIGNvbnN0cnVjdG9ycworICB2YWxhcnJheSgpIDogX1ZhbGFycmF5X2Jhc2U8X1RwPigpIHt9CisgIGV4cGxpY2l0IHZhbGFycmF5KHNpemVfdCBfX24pIDogX1ZhbGFycmF5X2Jhc2U8X1RwPihfX24pCisgICAgeyB1bmluaXRpYWxpemVkX2ZpbGxfbih0aGlzLT5fTV9maXJzdCwgdGhpcy0+X01fc2l6ZSwgX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRCh2YWx1ZV90eXBlKSk7IH0KKyAgdmFsYXJyYXkoY29uc3QgdmFsdWVfdHlwZSYgX194LCBzaXplX3QgX19uKSA6IF9WYWxhcnJheV9iYXNlPF9UcD4oX19uKQorICAgIHsgdW5pbml0aWFsaXplZF9maWxsX24odGhpcy0+X01fZmlyc3QsIHRoaXMtPl9NX3NpemUsIF9feCk7IH0KKyAgdmFsYXJyYXkoY29uc3QgdmFsdWVfdHlwZSogX19wLCBzaXplX3QgX19uKSA6IF9WYWxhcnJheV9iYXNlPF9UcD4oX19uKQorICAgIHsgdW5pbml0aWFsaXplZF9jb3B5KF9fcCwgX19wICsgX19uLCB0aGlzLT5fTV9maXJzdCk7IH0KKyAgdmFsYXJyYXkoY29uc3QgdmFsYXJyYXk8X1RwPiYgX194KSA6IF9WYWxhcnJheV9iYXNlPF9UcD4oX194Ll9NX3NpemUpIHsKKyAgICB1bmluaXRpYWxpemVkX2NvcHkoX194Ll9NX2ZpcnN0LCBfX3guX01fZmlyc3QgKyBfX3guX01fc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+X01fZmlyc3QpOworICB9CisKKyAgLy8gQ29uc3RydWN0b3JzIGZyb20gYXV4aWxpYXJ5IGFycmF5IHR5cGVzCisgIHZhbGFycmF5KGNvbnN0IHNsaWNlX2FycmF5PF9UcD4mKTsKKyAgdmFsYXJyYXkoY29uc3QgZ3NsaWNlX2FycmF5PF9UcD4mKTsKKyAgdmFsYXJyYXkoY29uc3QgbWFza19hcnJheTxfVHA+Jik7CisgIHZhbGFycmF5KGNvbnN0IGluZGlyZWN0X2FycmF5PF9UcD4mKTsKKworICAvLyBEZXN0cnVjdG9yCisgIH52YWxhcnJheSgpIHsgX1NUTFBfU1REOjpfRGVzdHJveV9SYW5nZSh0aGlzLT5fTV9maXJzdCwgdGhpcy0+X01fZmlyc3QgKyB0aGlzLT5fTV9zaXplKTsgfQorCisgIC8vIEV4dGVuc2lvbjogY29uc3RydWN0b3IgdGhhdCBkb2Vzbid0IGluaXRpYWxpemUgdmFsYXJyYXkgZWxlbWVudHMgdG8gYQorICAvLyBzcGVjaWZpYyB2YWx1ZS4gIFRoaXMgaXMgZmFzdGVyIGZvciB0eXBlcyBzdWNoIGFzIGludCBhbmQgZG91YmxlLgorcHJpdmF0ZToKKyAgdm9pZCBfTV9pbml0aWFsaXplKGNvbnN0IF9fdHJ1ZV90eXBlJikge30KKyAgdm9pZCBfTV9pbml0aWFsaXplKGNvbnN0IF9fZmFsc2VfdHlwZSYpCisgICAgeyB1bmluaXRpYWxpemVkX2ZpbGxfbih0aGlzLT5fTV9maXJzdCwgdGhpcy0+X01fc2l6ZSwgX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRChfVHApKTsgfQorCitwdWJsaWM6CisgIHN0cnVjdCBfTm9Jbml0IHt9OworICB2YWxhcnJheShzaXplX3QgX19uLCBfTm9Jbml0KSA6IF9WYWxhcnJheV9iYXNlPF9UcD4oX19uKSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3R5cGVfdHJhaXRzPF9UcD46Omhhc190cml2aWFsX2RlZmF1bHRfY29uc3RydWN0b3IgX0lzX1RyaXZpYWw7CisgICAgX01faW5pdGlhbGl6ZShfSXNfVHJpdmlhbCgpKTsKKyAgfQorCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFzc2lnbm1lbnQKKyAgLy8gQmFzaWMgYXNzaWdubWVudC4gIE5vdGUgdGhhdCAneCA9IHknIGlzIHVuZGVmaW5lZCBpZiB4LnNpemUoKSAhPSB5LnNpemUoKQorICB2YWxhcnJheTxfVHA+JiBvcGVyYXRvcj0oY29uc3QgdmFsYXJyYXk8X1RwPiYgX194KSB7CisgICAgX1NUTFBfQVNTRVJUKF9feC5zaXplKCkgPT0gdGhpcy0+c2l6ZSgpKQorICAgIGlmICh0aGlzICE9ICZfX3gpCisgICAgICBjb3B5KF9feC5fTV9maXJzdCwgX194Ll9NX2ZpcnN0ICsgX194Ll9NX3NpemUsIHRoaXMtPl9NX2ZpcnN0KTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLyBTY2FsYXIgYXNzaWdubWVudAorICB2YWxhcnJheTxfVHA+JiBvcGVyYXRvcj0oY29uc3QgdmFsdWVfdHlwZSYgX194KSB7CisgICAgZmlsbF9uKHRoaXMtPl9NX2ZpcnN0LCB0aGlzLT5fTV9zaXplLCBfX3gpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vIEFzc2lnbm1lbnQgb2YgYXV4aWxpYXJ5IGFycmF5IHR5cGVzCisgIHZhbGFycmF5PF9UcD4mIG9wZXJhdG9yPShjb25zdCBzbGljZV9hcnJheTxfVHA+Jik7CisgIHZhbGFycmF5PF9UcD4mIG9wZXJhdG9yPShjb25zdCBnc2xpY2VfYXJyYXk8X1RwPiYpOworICB2YWxhcnJheTxfVHA+JiBvcGVyYXRvcj0oY29uc3QgbWFza19hcnJheTxfVHA+Jik7CisgIHZhbGFycmF5PF9UcD4mIG9wZXJhdG9yPShjb25zdCBpbmRpcmVjdF9hcnJheTxfVHA+Jik7CisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gRWxlbWVudCBhY2Nlc3MKKyAgdmFsdWVfdHlwZSAgb3BlcmF0b3JbXShzaXplX3QgX19uKSBjb25zdCB7IHJldHVybiB0aGlzLT5fTV9maXJzdFtfX25dOyB9CisgIHZhbHVlX3R5cGUmIG9wZXJhdG9yW10oc2l6ZV90IF9fbikgICAgICAgeyByZXR1cm4gdGhpcy0+X01fZmlyc3RbX19uXTsgfQorICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHRoaXMtPl9NX3NpemU7IH0KKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdWJzZXR0aW5nIG9wZXJhdGlvbnMgd2l0aCBhdXhpbGlhcnkgdHlwZQorICB2YWxhcnJheTxfVHA+ICAgICAgICAgICAgb3BlcmF0b3JbXShzbGljZSkgY29uc3Q7CisgIHNsaWNlX2FycmF5PF9UcD4gICAgb3BlcmF0b3JbXShzbGljZSk7CisgIHZhbGFycmF5PF9UcD4gICAgICAgICAgICBvcGVyYXRvcltdKGNvbnN0IGdzbGljZSYpIGNvbnN0OworICBnc2xpY2VfYXJyYXk8X1RwPiAgIG9wZXJhdG9yW10oY29uc3QgZ3NsaWNlJik7CisgIHZhbGFycmF5PF9UcD4gICAgICAgICAgICBvcGVyYXRvcltdKGNvbnN0IF9WYWxhcnJheV9ib29sJikgY29uc3Q7CisgIG1hc2tfYXJyYXk8X1RwPiAgICAgb3BlcmF0b3JbXShjb25zdCBfVmFsYXJyYXlfYm9vbCYpOworICB2YWxhcnJheTxfVHA+ICAgICAgICAgICAgb3BlcmF0b3JbXShjb25zdCBfVmFsYXJyYXlfc2l6ZV90JikgY29uc3Q7CisgIGluZGlyZWN0X2FycmF5PF9UcD4gb3BlcmF0b3JbXShjb25zdCBfVmFsYXJyYXlfc2l6ZV90Jik7CisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gVW5hcnkgb3BlcmF0b3JzLgorICB2YWxhcnJheTxfVHA+IG9wZXJhdG9yKygpIGNvbnN0IHsgcmV0dXJuICp0aGlzOyB9CisKKyAgdmFsYXJyYXk8X1RwPiBvcGVyYXRvci0oKSBjb25zdCB7CisgICAgdmFsYXJyYXk8X1RwPiBfX3RtcCh0aGlzLT5zaXplKCksIF9Ob0luaXQoKSk7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgdGhpcy0+c2l6ZSgpOyArK19faSkKKyAgICAgIF9fdG1wW19faV0gPSAtKCp0aGlzKVtfX2ldOworICAgIHJldHVybiBfX3RtcDsKKyAgfQorCisgIHZhbGFycmF5PF9UcD4gb3BlcmF0b3J+KCkgY29uc3QgeworICAgIHZhbGFycmF5PF9UcD4gX190bXAodGhpcy0+c2l6ZSgpLCBfTm9Jbml0KCkpOworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IHRoaXMtPnNpemUoKTsgKytfX2kpCisgICAgICBfX3RtcFtfX2ldID0gfigqdGhpcylbX19pXTsKKyAgICByZXR1cm4gX190bXA7CisgIH0KKworICBfVmFsYXJyYXlfYm9vbCBvcGVyYXRvciEoKSBjb25zdDsKKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTY2FsYXIgY29tcHV0ZWQgYXNzaWdubWVudC4KKyAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3IqPSAoY29uc3QgdmFsdWVfdHlwZSYgX194KSB7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgdGhpcy0+c2l6ZSgpOyArK19faSkKKyAgICAgICgqdGhpcylbX19pXSAqPSBfX3g7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3IvPSAoY29uc3QgdmFsdWVfdHlwZSYgX194KSB7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgdGhpcy0+c2l6ZSgpOyArK19faSkKKyAgICAgICgqdGhpcylbX19pXSAvPSBfX3g7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3IlPSAoY29uc3QgdmFsdWVfdHlwZSYgX194KSB7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgdGhpcy0+c2l6ZSgpOyArK19faSkKKyAgICAgICgqdGhpcylbX19pXSAlPSBfX3g7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3IrPSAoY29uc3QgdmFsdWVfdHlwZSYgX194KSB7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgdGhpcy0+c2l6ZSgpOyArK19faSkKKyAgICAgICgqdGhpcylbX19pXSArPSBfX3g7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3ItPSAoY29uc3QgdmFsdWVfdHlwZSYgX194KSB7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgdGhpcy0+c2l6ZSgpOyArK19faSkKKyAgICAgICgqdGhpcylbX19pXSAtPSBfX3g7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3JePSAoY29uc3QgdmFsdWVfdHlwZSYgX194KSB7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgdGhpcy0+c2l6ZSgpOyArK19faSkKKyAgICAgICgqdGhpcylbX19pXSBePSBfX3g7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3ImPSAoY29uc3QgdmFsdWVfdHlwZSYgX194KSB7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgdGhpcy0+c2l6ZSgpOyArK19faSkKKyAgICAgICgqdGhpcylbX19pXSAmPSBfX3g7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3J8PSAoY29uc3QgdmFsdWVfdHlwZSYgX194KSB7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgdGhpcy0+c2l6ZSgpOyArK19faSkKKyAgICAgICgqdGhpcylbX19pXSB8PSBfX3g7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3I8PD0gKGNvbnN0IHZhbHVlX3R5cGUmIF9feCkgeworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IHRoaXMtPnNpemUoKTsgKytfX2kpCisgICAgICAoKnRoaXMpW19faV0gPDw9IF9feDsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB2YWxhcnJheTxfVHA+JiBvcGVyYXRvcj4+PSAoY29uc3QgdmFsdWVfdHlwZSYgX194KSB7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgdGhpcy0+c2l6ZSgpOyArK19faSkKKyAgICAgICgqdGhpcylbX19pXSA+Pj0gX194OworICAgIHJldHVybiAqdGhpczsKKyAgfQorCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFycmF5IGNvbXB1dGVkIGFzc2lnbm1lbnQuCisgIHZhbGFycmF5PF9UcD4mIG9wZXJhdG9yKj0gKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCkgeworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IHRoaXMtPnNpemUoKTsgKytfX2kpCisgICAgICAoKnRoaXMpW19faV0gKj0gX194W19faV07CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3IvPSAoY29uc3QgdmFsYXJyYXk8X1RwPiYgX194KSB7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgdGhpcy0+c2l6ZSgpOyArK19faSkKKyAgICAgICgqdGhpcylbX19pXSAvPSBfX3hbX19pXTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB2YWxhcnJheTxfVHA+JiBvcGVyYXRvciU9IChjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gpIHsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCB0aGlzLT5zaXplKCk7ICsrX19pKQorICAgICAgKCp0aGlzKVtfX2ldICU9IF9feFtfX2ldOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHZhbGFycmF5PF9UcD4mIG9wZXJhdG9yKz0gKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCkgeworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IHRoaXMtPnNpemUoKTsgKytfX2kpCisgICAgICAoKnRoaXMpW19faV0gKz0gX194W19faV07CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3ItPSAoY29uc3QgdmFsYXJyYXk8X1RwPiYgX194KSB7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgdGhpcy0+c2l6ZSgpOyArK19faSkKKyAgICAgICgqdGhpcylbX19pXSAtPSBfX3hbX19pXTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB2YWxhcnJheTxfVHA+JiBvcGVyYXRvcl49IChjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gpIHsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCB0aGlzLT5zaXplKCk7ICsrX19pKQorICAgICAgKCp0aGlzKVtfX2ldIF49IF9feFtfX2ldOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHZhbGFycmF5PF9UcD4mIG9wZXJhdG9yJj0gKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCkgeworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IHRoaXMtPnNpemUoKTsgKytfX2kpCisgICAgICAoKnRoaXMpW19faV0gJj0gX194W19faV07CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3J8PSAoY29uc3QgdmFsYXJyYXk8X1RwPiYgX194KSB7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgdGhpcy0+c2l6ZSgpOyArK19faSkKKyAgICAgICgqdGhpcylbX19pXSB8PSBfX3hbX19pXTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB2YWxhcnJheTxfVHA+JiBvcGVyYXRvcjw8PSAoY29uc3QgdmFsYXJyYXk8X1RwPiYgX194KSB7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgdGhpcy0+c2l6ZSgpOyArK19faSkKKyAgICAgICgqdGhpcylbX19pXSA8PD0gX194W19faV07CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3I+Pj0gKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCkgeworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IHRoaXMtPnNpemUoKTsgKytfX2kpCisgICAgICAoKnRoaXMpW19faV0gPj49IF9feFtfX2ldOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE90aGVyIG1lbWJlciBmdW5jdGlvbnMuCisKKyAgLy8gVGhlIHJlc3VsdCBpcyB1bmRlZmluZWQgZm9yIHplcm8tbGVuZ3RoIGFycmF5cworICB2YWx1ZV90eXBlIHN1bSgpIGNvbnN0IHsKKyAgICByZXR1cm4gYWNjdW11bGF0ZSh0aGlzLT5fTV9maXJzdCArIDEsIHRoaXMtPl9NX2ZpcnN0ICsgdGhpcy0+X01fc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAoKnRoaXMpWzBdKTsKKyAgfQorCisgIC8vIFRoZSByZXN1bHQgaXMgdW5kZWZpbmVkIGZvciB6ZXJvLWxlbmd0aCBhcnJheXMKKyAgdmFsdWVfdHlwZSAobWluKSAoKSBjb25zdCB7CisgICAgcmV0dXJuICptaW5fZWxlbWVudCh0aGlzLT5fTV9maXJzdCArIDAsIHRoaXMtPl9NX2ZpcnN0ICsgdGhpcy0+X01fc2l6ZSk7CisgIH0KKworICB2YWx1ZV90eXBlIChtYXgpICgpIGNvbnN0IHsKKyAgICByZXR1cm4gKm1heF9lbGVtZW50KHRoaXMtPl9NX2ZpcnN0ICsgMCwgdGhpcy0+X01fZmlyc3QgKyB0aGlzLT5fTV9zaXplKTsKKyAgfQorCisgIHZhbGFycmF5PF9UcD4gc2hpZnQoaW50IF9fbikgY29uc3Q7CisgIHZhbGFycmF5PF9UcD4gY3NoaWZ0KGludCBfX24pIGNvbnN0OworCisgIHZhbGFycmF5PF9UcD4gYXBwbHkodmFsdWVfdHlwZSBfX2YodmFsdWVfdHlwZSkpIGNvbnN0IHsKKyAgICB2YWxhcnJheTxfVHA+IF9fdG1wKHRoaXMtPnNpemUoKSk7CisgICAgdHJhbnNmb3JtKHRoaXMtPl9NX2ZpcnN0ICsgMCwgdGhpcy0+X01fZmlyc3QgKyB0aGlzLT5fTV9zaXplLCBfX3RtcC5fTV9maXJzdCwKKyAgICAgICAgICAgICAgX19mKTsKKyAgICByZXR1cm4gX190bXA7CisgIH0KKyAgdmFsYXJyYXk8X1RwPiBhcHBseSh2YWx1ZV90eXBlIF9fZihjb25zdCB2YWx1ZV90eXBlJikpIGNvbnN0IHsKKyAgICB2YWxhcnJheTxfVHA+IF9fdG1wKHRoaXMtPnNpemUoKSk7CisgICAgdHJhbnNmb3JtKHRoaXMtPl9NX2ZpcnN0ICsgMCwgdGhpcy0+X01fZmlyc3QgKyB0aGlzLT5fTV9zaXplLCBfX3RtcC5fTV9maXJzdCwKKyAgICAgICAgICAgICAgX19mKTsKKyAgICByZXR1cm4gX190bXA7CisgIH0KKworICB2b2lkIHJlc2l6ZShzaXplX3QgX19uLCB2YWx1ZV90eXBlIF9feCA9IHZhbHVlX3R5cGUoKSkgeworICAgIF9TVExQX1NURDo6X0Rlc3Ryb3lfUmFuZ2UodGhpcy0+X01fZmlyc3QsIHRoaXMtPl9NX2ZpcnN0ICsgdGhpcy0+X01fc2l6ZSk7CisgICAgX1ZhbGFycmF5X2Jhc2U8X1RwPjo6X01fZGVhbGxvY2F0ZSgpOworICAgIF9WYWxhcnJheV9iYXNlPF9UcD46Ol9NX2FsbG9jYXRlKF9fbik7CisgICAgdW5pbml0aWFsaXplZF9maWxsX24odGhpcy0+X01fZmlyc3QsIHRoaXMtPl9NX3NpemUsIF9feCk7CisgIH0KK307CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdmFsYXJyYXkgbm9uLW1lbWJlciBmdW5jdGlvbnMuCisKKy8vIEJpbmFyeSBhcml0aG1ldGljIG9wZXJhdGlvbnMgYmV0d2VlbiB0d28gYXJyYXlzLiAgQmVoYXZpb3IgaXMKKy8vIHVuZGVmaW5lZCBpZiB0aGUgdHdvIGFycmF5cyBkbyBub3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGguCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgdmFsYXJyYXk8X1RwPiAgX1NUTFBfQ0FMTCBvcGVyYXRvciooY29uc3QgdmFsYXJyYXk8X1RwPiYgX194LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feSkgeworICB0eXBlZGVmIHR5cGVuYW1lIHZhbGFycmF5PF9UcD46Ol9Ob0luaXQgX05vSW5pdDsKKyAgdmFsYXJyYXk8X1RwPiBfX3RtcChfX3guc2l6ZSgpLCBfTm9Jbml0KCkpOworICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKKyAgICBfX3RtcFtfX2ldID0gX194W19faV0gKiBfX3lbX19pXTsKKyAgcmV0dXJuIF9fdG1wOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIHZhbGFycmF5PF9UcD4gIF9TVExQX0NBTEwgb3BlcmF0b3IvKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWxhcnJheTxfVHA+JiBfX3kpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSB2YWxhcnJheTxfVHA+OjpfTm9Jbml0IF9Ob0luaXQ7CisgIHZhbGFycmF5PF9UcD4gX190bXAoX194LnNpemUoKSwgX05vSW5pdCgpKTsKKyAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCisgICAgX190bXBbX19pXSA9IF9feFtfX2ldIC8gX195W19faV07CisgIHJldHVybiBfX3RtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSB2YWxhcnJheTxfVHA+ICBfU1RMUF9DQUxMIG9wZXJhdG9yJShjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsYXJyYXk8X1RwPiYgX195KSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OworICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSBfX3hbX19pXSAlIF9feVtfX2ldOworICByZXR1cm4gX190bXA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgdmFsYXJyYXk8X1RwPiAgX1NUTFBfQ0FMTCBvcGVyYXRvcisoY29uc3QgdmFsYXJyYXk8X1RwPiYgX194LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feSkgeworICB0eXBlZGVmIHR5cGVuYW1lIHZhbGFycmF5PF9UcD46Ol9Ob0luaXQgX05vSW5pdDsKKyAgdmFsYXJyYXk8X1RwPiBfX3RtcChfX3guc2l6ZSgpLCBfTm9Jbml0KCkpOworICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKKyAgICBfX3RtcFtfX2ldID0gX194W19faV0gKyBfX3lbX19pXTsKKyAgcmV0dXJuIF9fdG1wOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIHZhbGFycmF5PF9UcD4gIF9TVExQX0NBTEwgb3BlcmF0b3ItKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWxhcnJheTxfVHA+JiBfX3kpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSB2YWxhcnJheTxfVHA+OjpfTm9Jbml0IF9Ob0luaXQ7CisgIHZhbGFycmF5PF9UcD4gX190bXAoX194LnNpemUoKSwgX05vSW5pdCgpKTsKKyAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCisgICAgX190bXBbX19pXSA9IF9feFtfX2ldIC0gX195W19faV07CisgIHJldHVybiBfX3RtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSB2YWxhcnJheTxfVHA+IF9TVExQX0NBTEwgb3BlcmF0b3JeKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWxhcnJheTxfVHA+JiBfX3kpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSB2YWxhcnJheTxfVHA+OjpfTm9Jbml0IF9Ob0luaXQ7CisgIHZhbGFycmF5PF9UcD4gX190bXAoX194LnNpemUoKSwgX05vSW5pdCgpKTsKKyAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCisgICAgX190bXBbX19pXSA9IF9feFtfX2ldIF4gX195W19faV07CisgIHJldHVybiBfX3RtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSB2YWxhcnJheTxfVHA+IF9TVExQX0NBTEwgb3BlcmF0b3ImKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWxhcnJheTxfVHA+JiBfX3kpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSB2YWxhcnJheTxfVHA+OjpfTm9Jbml0IF9Ob0luaXQ7CisgIHZhbGFycmF5PF9UcD4gX190bXAoX194LnNpemUoKSwgX05vSW5pdCgpKTsKKyAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCisgICAgX190bXBbX19pXSA9IF9feFtfX2ldICYgX195W19faV07CisgIHJldHVybiBfX3RtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSB2YWxhcnJheTxfVHA+IF9TVExQX0NBTEwgb3BlcmF0b3J8KGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWxhcnJheTxfVHA+JiBfX3kpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSB2YWxhcnJheTxfVHA+OjpfTm9Jbml0IF9Ob0luaXQ7CisgIHZhbGFycmF5PF9UcD4gX190bXAoX194LnNpemUoKSwgX05vSW5pdCgpKTsKKyAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCisgICAgX190bXBbX19pXSA9IF9feFtfX2ldIHwgX195W19faV07CisgIHJldHVybiBfX3RtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSB2YWxhcnJheTxfVHA+IF9TVExQX0NBTEwgb3BlcmF0b3I8PChjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsYXJyYXk8X1RwPiYgX195KSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OworICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSBfX3hbX19pXSA8PCBfX3lbX19pXTsKKyAgcmV0dXJuIF9fdG1wOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIHZhbGFycmF5PF9UcD4gX1NUTFBfQ0FMTCBvcGVyYXRvcj4+KGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWxhcnJheTxfVHA+JiBfX3kpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSB2YWxhcnJheTxfVHA+OjpfTm9Jbml0IF9Ob0luaXQ7CisgIHZhbGFycmF5PF9UcD4gX190bXAoX194LnNpemUoKSwgX05vSW5pdCgpKTsKKyAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCisgICAgX190bXBbX19pXSA9IF9feFtfX2ldID4+IF9feVtfX2ldOworICByZXR1cm4gX190bXA7Cit9CisKKy8vIEJpbmFyeSBhcml0aG1ldGljIG9wZXJhdGlvbnMgYmV0d2VlbiBhbiBhcnJheSBhbmQgYSBzY2FsYXIuCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgdmFsYXJyYXk8X1RwPiBfU1RMUF9DQUxMIG9wZXJhdG9yKihjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gsIGNvbnN0IF9UcCYgX19jKSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OworICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSBfX3hbX19pXSAgKiBfX2M7CisgIHJldHVybiBfX3RtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSB2YWxhcnJheTxfVHA+IF9TVExQX0NBTEwgb3BlcmF0b3IqKGNvbnN0IF9UcCYgX19jLCBjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSB2YWxhcnJheTxfVHA+OjpfTm9Jbml0IF9Ob0luaXQ7CisgIHZhbGFycmF5PF9UcD4gX190bXAoX194LnNpemUoKSwgX05vSW5pdCgpKTsKKyAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCisgICAgX190bXBbX19pXSA9IF9fYyAqIF9feFtfX2ldOworICByZXR1cm4gX190bXA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgdmFsYXJyYXk8X1RwPiBfU1RMUF9DQUxMIG9wZXJhdG9yLyhjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gsIGNvbnN0IF9UcCYgX19jKSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OworICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSBfX3hbX19pXSAgLyBfX2M7CisgIHJldHVybiBfX3RtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSB2YWxhcnJheTxfVHA+IF9TVExQX0NBTEwgb3BlcmF0b3IvKGNvbnN0IF9UcCYgX19jLCBjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSB2YWxhcnJheTxfVHA+OjpfTm9Jbml0IF9Ob0luaXQ7CisgIHZhbGFycmF5PF9UcD4gX190bXAoX194LnNpemUoKSwgX05vSW5pdCgpKTsKKyAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCisgICAgX190bXBbX19pXSA9IF9fYyAvIF9feFtfX2ldOworICByZXR1cm4gX190bXA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgdmFsYXJyYXk8X1RwPiBfU1RMUF9DQUxMIG9wZXJhdG9yJShjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gsIGNvbnN0IF9UcCYgX19jKSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OworICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSBfX3hbX19pXSAgJSBfX2M7CisgIHJldHVybiBfX3RtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSB2YWxhcnJheTxfVHA+IF9TVExQX0NBTEwgb3BlcmF0b3IlKGNvbnN0IF9UcCYgX19jLCBjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSB2YWxhcnJheTxfVHA+OjpfTm9Jbml0IF9Ob0luaXQ7CisgIHZhbGFycmF5PF9UcD4gX190bXAoX194LnNpemUoKSwgX05vSW5pdCgpKTsKKyAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCisgICAgX190bXBbX19pXSA9IF9fYyAlIF9feFtfX2ldOworICByZXR1cm4gX190bXA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgdmFsYXJyYXk8X1RwPiBfU1RMUF9DQUxMIG9wZXJhdG9yKyhjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gsIGNvbnN0IF9UcCYgX19jKSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OworICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSBfX3hbX19pXSAgKyBfX2M7CisgIHJldHVybiBfX3RtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSB2YWxhcnJheTxfVHA+IF9TVExQX0NBTEwgb3BlcmF0b3IrKGNvbnN0IF9UcCYgX19jLCBjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSB2YWxhcnJheTxfVHA+OjpfTm9Jbml0IF9Ob0luaXQ7CisgIHZhbGFycmF5PF9UcD4gX190bXAoX194LnNpemUoKSwgX05vSW5pdCgpKTsKKyAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCisgICAgX190bXBbX19pXSA9IF9fYyArIF9feFtfX2ldOworICByZXR1cm4gX190bXA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgdmFsYXJyYXk8X1RwPiBfU1RMUF9DQUxMIG9wZXJhdG9yLShjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gsIGNvbnN0IF9UcCYgX19jKSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OworICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSBfX3hbX19pXSAgLSBfX2M7CisgIHJldHVybiBfX3RtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSB2YWxhcnJheTxfVHA+IF9TVExQX0NBTEwgb3BlcmF0b3ItKGNvbnN0IF9UcCYgX19jLCBjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSB2YWxhcnJheTxfVHA+OjpfTm9Jbml0IF9Ob0luaXQ7CisgIHZhbGFycmF5PF9UcD4gX190bXAoX194LnNpemUoKSwgX05vSW5pdCgpKTsKKyAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCisgICAgX190bXBbX19pXSA9IF9fYyAtIF9feFtfX2ldOworICByZXR1cm4gX190bXA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgdmFsYXJyYXk8X1RwPiBfU1RMUF9DQUxMIG9wZXJhdG9yXihjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gsIGNvbnN0IF9UcCYgX19jKSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OworICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSBfX3hbX19pXSAgXiBfX2M7CisgIHJldHVybiBfX3RtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSB2YWxhcnJheTxfVHA+IF9TVExQX0NBTEwgb3BlcmF0b3JeKGNvbnN0IF9UcCYgX19jLCBjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSB2YWxhcnJheTxfVHA+OjpfTm9Jbml0IF9Ob0luaXQ7CisgIHZhbGFycmF5PF9UcD4gX190bXAoX194LnNpemUoKSwgX05vSW5pdCgpKTsKKyAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCisgICAgX190bXBbX19pXSA9IF9fYyBeIF9feFtfX2ldOworICByZXR1cm4gX190bXA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgdmFsYXJyYXk8X1RwPiBfU1RMUF9DQUxMIG9wZXJhdG9yJihjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gsIGNvbnN0IF9UcCYgX19jKSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OworICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSBfX3hbX19pXSAgJiBfX2M7CisgIHJldHVybiBfX3RtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSB2YWxhcnJheTxfVHA+IF9TVExQX0NBTEwgb3BlcmF0b3ImKGNvbnN0IF9UcCYgX19jLCBjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSB2YWxhcnJheTxfVHA+OjpfTm9Jbml0IF9Ob0luaXQ7CisgIHZhbGFycmF5PF9UcD4gX190bXAoX194LnNpemUoKSwgX05vSW5pdCgpKTsKKyAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCisgICAgX190bXBbX19pXSA9IF9fYyAmIF9feFtfX2ldOworICByZXR1cm4gX190bXA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgdmFsYXJyYXk8X1RwPiBfU1RMUF9DQUxMIG9wZXJhdG9yfChjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gsIGNvbnN0IF9UcCYgX19jKSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OworICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSBfX3hbX19pXSAgfCBfX2M7CisgIHJldHVybiBfX3RtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSB2YWxhcnJheTxfVHA+IF9TVExQX0NBTEwgb3BlcmF0b3J8KGNvbnN0IF9UcCYgX19jLCBjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSB2YWxhcnJheTxfVHA+OjpfTm9Jbml0IF9Ob0luaXQ7CisgIHZhbGFycmF5PF9UcD4gX190bXAoX194LnNpemUoKSwgX05vSW5pdCgpKTsKKyAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCisgICAgX190bXBbX19pXSA9IF9fYyB8IF9feFtfX2ldOworICByZXR1cm4gX190bXA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgdmFsYXJyYXk8X1RwPiBfU1RMUF9DQUxMIG9wZXJhdG9yPDwoY29uc3QgdmFsYXJyYXk8X1RwPiYgX194LCBjb25zdCBfVHAmIF9fYykgeworICB0eXBlZGVmIHR5cGVuYW1lIHZhbGFycmF5PF9UcD46Ol9Ob0luaXQgX05vSW5pdDsKKyAgdmFsYXJyYXk8X1RwPiBfX3RtcChfX3guc2l6ZSgpLCBfTm9Jbml0KCkpOworICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKKyAgICBfX3RtcFtfX2ldID0gX194W19faV0gIDw8IF9fYzsKKyAgcmV0dXJuIF9fdG1wOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIHZhbGFycmF5PF9UcD4gX1NUTFBfQ0FMTCBvcGVyYXRvcjw8KGNvbnN0IF9UcCYgX19jLCBjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSB2YWxhcnJheTxfVHA+OjpfTm9Jbml0IF9Ob0luaXQ7CisgIHZhbGFycmF5PF9UcD4gX190bXAoX194LnNpemUoKSwgX05vSW5pdCgpKTsKKyAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCisgICAgX190bXBbX19pXSA9IF9fYyA8PCBfX3hbX19pXTsKKyAgcmV0dXJuIF9fdG1wOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIHZhbGFycmF5PF9UcD4gX1NUTFBfQ0FMTCBvcGVyYXRvcj4+KGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCwgY29uc3QgX1RwJiBfX2MpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSB2YWxhcnJheTxfVHA+OjpfTm9Jbml0IF9Ob0luaXQ7CisgIHZhbGFycmF5PF9UcD4gX190bXAoX194LnNpemUoKSwgX05vSW5pdCgpKTsKKyAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCisgICAgX190bXBbX19pXSA9IF9feFtfX2ldICA+PiBfX2M7CisgIHJldHVybiBfX3RtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSB2YWxhcnJheTxfVHA+IF9TVExQX0NBTEwgb3BlcmF0b3I+Pihjb25zdCBfVHAmIF9fYywgY29uc3QgdmFsYXJyYXk8X1RwPiYgX194KSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OworICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSBfX2MgPj4gX194W19faV07CisgIHJldHVybiBfX3RtcDsKK30KKworLy8gQmluYXJ5IGxvZ2ljYWwgb3BlcmF0aW9ucyBiZXR3ZWVuIHR3byBhcnJheXMuICBCZWhhdmlvciBpcyB1bmRlZmluZWQKKy8vIGlmIHRoZSB0d28gYXJyYXlzIGhhdmUgZGlmZmVyZW50IGxlbmd0aHMuICBOb3RlIHRoYXQgb3BlcmF0b3I9PSBkb2VzCisvLyBub3QgZG8gd2hhdCB5b3UgbWlnaHQgYXQgZmlyc3QgZXhwZWN0LgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIF9WYWxhcnJheV9ib29sIF9TVExQX0NBTEwgb3BlcmF0b3I9PShjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWxhcnJheTxfVHA+JiBfX3kpCit7CisgIF9WYWxhcnJheV9ib29sIF9fdG1wKF9feC5zaXplKCksIF9WYWxhcnJheV9ib29sOjpfTm9Jbml0KCkpOworICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKKyAgICBfX3RtcFtfX2ldID0gX194W19faV0gPT0gX195W19faV07CisgIHJldHVybiBfX3RtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfVmFsYXJyYXlfYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yPChjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feSkKK3sKKyAgX1ZhbGFycmF5X2Jvb2wgX190bXAoX194LnNpemUoKSwgX1ZhbGFycmF5X2Jvb2w6Ol9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSBfX3hbX19pXSA8IF9feVtfX2ldOworICByZXR1cm4gX190bXA7Cit9CisKKyNpZmRlZiBfU1RMUF9VU0VfU0VQQVJBVEVfUkVMT1BTX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIF9WYWxhcnJheV9ib29sIF9TVExQX0NBTEwgb3BlcmF0b3IhPShjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWxhcnJheTxfVHA+JiBfX3kpCit7CisgIF9WYWxhcnJheV9ib29sIF9fdG1wKF9feC5zaXplKCksIF9WYWxhcnJheV9ib29sOjpfTm9Jbml0KCkpOworICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKKyAgICBfX3RtcFtfX2ldID0gX194W19faV0gIT0gX195W19faV07CisgIHJldHVybiBfX3RtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfVmFsYXJyYXlfYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yPihjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feSkKK3sKKyAgX1ZhbGFycmF5X2Jvb2wgX190bXAoX194LnNpemUoKSwgX1ZhbGFycmF5X2Jvb2w6Ol9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSBfX3hbX19pXSA+IF9feVtfX2ldOworICByZXR1cm4gX190bXA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX1ZhbGFycmF5X2Jvb2wgX1NUTFBfQ0FMTCBvcGVyYXRvcjw9KGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feSkKK3sKKyAgX1ZhbGFycmF5X2Jvb2wgX190bXAoX194LnNpemUoKSwgX1ZhbGFycmF5X2Jvb2w6Ol9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSBfX3hbX19pXSA8PSBfX3lbX19pXTsKKyAgcmV0dXJuIF9fdG1wOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIF9WYWxhcnJheV9ib29sIF9TVExQX0NBTEwgb3BlcmF0b3I+PShjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWxhcnJheTxfVHA+JiBfX3kpCit7CisgIF9WYWxhcnJheV9ib29sIF9fdG1wKF9feC5zaXplKCksIF9WYWxhcnJheV9ib29sOjpfTm9Jbml0KCkpOworICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKKyAgICBfX3RtcFtfX2ldID0gX194W19faV0gPj0gX195W19faV07CisgIHJldHVybiBfX3RtcDsKK30KKworI2VuZGlmIC8qIF9TVExQX1VTRV9TRVBBUkFURV9SRUxPUFNfTkFNRVNQQUNFICovCisvLyBmYnAgOiBzd2FwID8KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfVmFsYXJyYXlfYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yJiYoY29uc3QgdmFsYXJyYXk8X1RwPiYgX194LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsYXJyYXk8X1RwPiYgX195KQoreworICBfVmFsYXJyYXlfYm9vbCBfX3RtcChfX3guc2l6ZSgpLCBfVmFsYXJyYXlfYm9vbDo6X05vSW5pdCgpKTsKKyAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCisgICAgX190bXBbX19pXSA9IF9feFtfX2ldICYmIF9feVtfX2ldOworICByZXR1cm4gX190bXA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX1ZhbGFycmF5X2Jvb2wgX1NUTFBfQ0FMTCBvcGVyYXRvcnx8KGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feSkKK3sKKyAgX1ZhbGFycmF5X2Jvb2wgX190bXAoX194LnNpemUoKSwgX1ZhbGFycmF5X2Jvb2w6Ol9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSBfX3hbX19pXSB8fCBfX3lbX19pXTsKKyAgcmV0dXJuIF9fdG1wOworfQorCisvLyBMb2dpY2FsIG9wZXJhdGlvbnMgYmV0d2VlbiBhbiBhcnJheSBhbmQgYSBzY2FsYXIuCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX1ZhbGFycmF5X2Jvb2wgX1NUTFBfQ0FMTCBvcGVyYXRvcj09KGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCwgY29uc3QgX1RwJiBfX2MpCit7CisgIF9WYWxhcnJheV9ib29sIF9fdG1wKF9feC5zaXplKCksIF9WYWxhcnJheV9ib29sOjpfTm9Jbml0KCkpOworICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKKyAgICBfX3RtcFtfX2ldID0gX194W19faV0gPT0gX19jOworICByZXR1cm4gX190bXA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX1ZhbGFycmF5X2Jvb2wgX1NUTFBfQ0FMTCBvcGVyYXRvcj09KGNvbnN0IF9UcCYgX19jLCBjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gpCit7CisgIF9WYWxhcnJheV9ib29sIF9fdG1wKF9feC5zaXplKCksIF9WYWxhcnJheV9ib29sOjpfTm9Jbml0KCkpOworICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKKyAgICBfX3RtcFtfX2ldID0gX19jID09IF9feFtfX2ldOworICByZXR1cm4gX190bXA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX1ZhbGFycmF5X2Jvb2wgX1NUTFBfQ0FMTCBvcGVyYXRvciE9KGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCwgY29uc3QgX1RwJiBfX2MpCit7CisgIF9WYWxhcnJheV9ib29sIF9fdG1wKF9feC5zaXplKCksIF9WYWxhcnJheV9ib29sOjpfTm9Jbml0KCkpOworICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKKyAgICBfX3RtcFtfX2ldID0gX194W19faV0gIT0gX19jOworICByZXR1cm4gX190bXA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX1ZhbGFycmF5X2Jvb2wgX1NUTFBfQ0FMTCBvcGVyYXRvciE9KGNvbnN0IF9UcCYgX19jLCBjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gpCit7CisgIF9WYWxhcnJheV9ib29sIF9fdG1wKF9feC5zaXplKCksIF9WYWxhcnJheV9ib29sOjpfTm9Jbml0KCkpOworICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKKyAgICBfX3RtcFtfX2ldID0gX19jICE9IF9feFtfX2ldOworICByZXR1cm4gX190bXA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX1ZhbGFycmF5X2Jvb2wgX1NUTFBfQ0FMTCBvcGVyYXRvcjwoY29uc3QgdmFsYXJyYXk8X1RwPiYgX194LCBjb25zdCBfVHAmIF9fYykKK3sKKyAgX1ZhbGFycmF5X2Jvb2wgX190bXAoX194LnNpemUoKSwgX1ZhbGFycmF5X2Jvb2w6Ol9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSBfX3hbX19pXSA8IF9fYzsKKyAgcmV0dXJuIF9fdG1wOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIF9WYWxhcnJheV9ib29sIF9TVExQX0NBTEwgb3BlcmF0b3I8KGNvbnN0IF9UcCYgX19jLCBjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gpCit7CisgIF9WYWxhcnJheV9ib29sIF9fdG1wKF9feC5zaXplKCksIF9WYWxhcnJheV9ib29sOjpfTm9Jbml0KCkpOworICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKKyAgICBfX3RtcFtfX2ldID0gX19jIDwgX194W19faV07CisgIHJldHVybiBfX3RtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfVmFsYXJyYXlfYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yPihjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gsIGNvbnN0IF9UcCYgX19jKQoreworICBfVmFsYXJyYXlfYm9vbCBfX3RtcChfX3guc2l6ZSgpLCBfVmFsYXJyYXlfYm9vbDo6X05vSW5pdCgpKTsKKyAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCisgICAgX190bXBbX19pXSA9IF9feFtfX2ldID4gX19jOworICByZXR1cm4gX190bXA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX1ZhbGFycmF5X2Jvb2wgX1NUTFBfQ0FMTCBvcGVyYXRvcj4oY29uc3QgX1RwJiBfX2MsIGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCkKK3sKKyAgX1ZhbGFycmF5X2Jvb2wgX190bXAoX194LnNpemUoKSwgX1ZhbGFycmF5X2Jvb2w6Ol9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSBfX2MgPiBfX3hbX19pXTsKKyAgcmV0dXJuIF9fdG1wOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIF9WYWxhcnJheV9ib29sIF9TVExQX0NBTEwgb3BlcmF0b3I8PShjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gsIGNvbnN0IF9UcCYgX19jKQoreworICBfVmFsYXJyYXlfYm9vbCBfX3RtcChfX3guc2l6ZSgpLCBfVmFsYXJyYXlfYm9vbDo6X05vSW5pdCgpKTsKKyAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCisgICAgX190bXBbX19pXSA9IF9feFtfX2ldICA8PSBfX2M7CisgIHJldHVybiBfX3RtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfVmFsYXJyYXlfYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yPD0oY29uc3QgX1RwJiBfX2MsIGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCkKK3sKKyAgX1ZhbGFycmF5X2Jvb2wgX190bXAoX194LnNpemUoKSwgX1ZhbGFycmF5X2Jvb2w6Ol9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSBfX2MgPD0gX194W19faV07CisgIHJldHVybiBfX3RtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfVmFsYXJyYXlfYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yPj0oY29uc3QgdmFsYXJyYXk8X1RwPiYgX194LCBjb25zdCBfVHAmIF9fYykKK3sKKyAgX1ZhbGFycmF5X2Jvb2wgX190bXAoX194LnNpemUoKSwgX1ZhbGFycmF5X2Jvb2w6Ol9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSBfX3hbX19pXSA+PSBfX2M7CisgIHJldHVybiBfX3RtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfVmFsYXJyYXlfYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yPj0oY29uc3QgX1RwJiBfX2MsIGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCkKK3sKKyAgX1ZhbGFycmF5X2Jvb2wgX190bXAoX194LnNpemUoKSwgX1ZhbGFycmF5X2Jvb2w6Ol9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSBfX2MgPj0gX194W19faV07CisgIHJldHVybiBfX3RtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfVmFsYXJyYXlfYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yJiYoY29uc3QgdmFsYXJyYXk8X1RwPiYgX194LCBjb25zdCBfVHAmIF9fYykKK3sKKyAgX1ZhbGFycmF5X2Jvb2wgX190bXAoX194LnNpemUoKSwgX1ZhbGFycmF5X2Jvb2w6Ol9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSBfX3hbX19pXSAmJiBfX2M7CisgIHJldHVybiBfX3RtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfVmFsYXJyYXlfYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yJiYoY29uc3QgX1RwJiBfX2MsIGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCkKK3sKKyAgX1ZhbGFycmF5X2Jvb2wgX190bXAoX194LnNpemUoKSwgX1ZhbGFycmF5X2Jvb2w6Ol9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSBfX2MgJiYgX194W19faV07CisgIHJldHVybiBfX3RtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfVmFsYXJyYXlfYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yfHwoY29uc3QgdmFsYXJyYXk8X1RwPiYgX194LCBjb25zdCBfVHAmIF9fYykKK3sKKyAgX1ZhbGFycmF5X2Jvb2wgX190bXAoX194LnNpemUoKSwgX1ZhbGFycmF5X2Jvb2w6Ol9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSBfX3hbX19pXSB8fCBfX2M7CisgIHJldHVybiBfX3RtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfVmFsYXJyYXlfYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yfHwoY29uc3QgX1RwJiBfX2MsIGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCkKK3sKKyAgX1ZhbGFycmF5X2Jvb2wgX190bXAoX194LnNpemUoKSwgX1ZhbGFycmF5X2Jvb2w6Ol9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSBfX2MgfHwgX194W19faV07CisgIHJldHVybiBfX3RtcDsKK30KKworLy8gdmFsYXJyYXkgInRyYW5zY2VuZGVudGFscyIgKHRoZSBsaXN0IGluY2x1ZGVzIGFicyBhbmQgc3FydCwgd2hpY2gsCisvLyBvZiBjb3Vyc2UsIGFyZSBub3QgdHJhbnNjZW5kZW50YWwpLgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIHZhbGFycmF5PF9UcD4gYWJzKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCkgeworICB0eXBlZGVmIHR5cGVuYW1lIHZhbGFycmF5PF9UcD46Ol9Ob0luaXQgX05vSW5pdDsKKyAgdmFsYXJyYXk8X1RwPiBfX3RtcChfX3guc2l6ZSgpLCBfTm9Jbml0KCkpOworICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKKyAgICBfX3RtcFtfX2ldID0gOjphYnMoX194W19faV0pOworICByZXR1cm4gX190bXA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgdmFsYXJyYXk8X1RwPiBhY29zKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCkgeworICB0eXBlZGVmIHR5cGVuYW1lIHZhbGFycmF5PF9UcD46Ol9Ob0luaXQgX05vSW5pdDsKKyAgdmFsYXJyYXk8X1RwPiBfX3RtcChfX3guc2l6ZSgpLCBfTm9Jbml0KCkpOworICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKKyAgICBfX3RtcFtfX2ldID0gOjphY29zKF9feFtfX2ldKTsKKyAgcmV0dXJuIF9fdG1wOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIHZhbGFycmF5PF9UcD4gYXNpbihjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSB2YWxhcnJheTxfVHA+OjpfTm9Jbml0IF9Ob0luaXQ7CisgIHZhbGFycmF5PF9UcD4gX190bXAoX194LnNpemUoKSwgX05vSW5pdCgpKTsKKyAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCisgICAgX190bXBbX19pXSA9IDo6YXNpbihfX3hbX19pXSk7CisgIHJldHVybiBfX3RtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSB2YWxhcnJheTxfVHA+IGF0YW4oY29uc3QgdmFsYXJyYXk8X1RwPiYgX194KSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OworICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSA6OmF0YW4oX194W19faV0pOworICByZXR1cm4gX190bXA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgdmFsYXJyYXk8X1RwPiBhdGFuMihjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWxhcnJheTxfVHA+JiBfX3kpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSB2YWxhcnJheTxfVHA+OjpfTm9Jbml0IF9Ob0luaXQ7CisgIHZhbGFycmF5PF9UcD4gX190bXAoX194LnNpemUoKSwgX05vSW5pdCgpKTsKKyAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCisgICAgX190bXBbX19pXSA9IDo6YXRhbjIoX194W19faV0sIF9feVtfX2ldKTsKKyAgcmV0dXJuIF9fdG1wOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIHZhbGFycmF5PF9UcD4gYXRhbjIoY29uc3QgdmFsYXJyYXk8X1RwPiYgX194LCBjb25zdCBfVHAmIF9fYykgeworICB0eXBlZGVmIHR5cGVuYW1lIHZhbGFycmF5PF9UcD46Ol9Ob0luaXQgX05vSW5pdDsKKyAgdmFsYXJyYXk8X1RwPiBfX3RtcChfX3guc2l6ZSgpLCBfTm9Jbml0KCkpOworICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKKyAgICBfX3RtcFtfX2ldID0gOjphdGFuMihfX3hbX19pXSwgX19jKTsKKyAgcmV0dXJuIF9fdG1wOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIHZhbGFycmF5PF9UcD4gYXRhbjIoY29uc3QgX1RwJiBfX2MsIGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCkgeworICB0eXBlZGVmIHR5cGVuYW1lIHZhbGFycmF5PF9UcD46Ol9Ob0luaXQgX05vSW5pdDsKKyAgdmFsYXJyYXk8X1RwPiBfX3RtcChfX3guc2l6ZSgpLCBfTm9Jbml0KCkpOworICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKKyAgICBfX3RtcFtfX2ldID0gOjphdGFuMihfX2MsIF9feFtfX2ldKTsKKyAgcmV0dXJuIF9fdG1wOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIHZhbGFycmF5PF9UcD4gY29zKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCkgeworICB0eXBlZGVmIHR5cGVuYW1lIHZhbGFycmF5PF9UcD46Ol9Ob0luaXQgX05vSW5pdDsKKyAgdmFsYXJyYXk8X1RwPiBfX3RtcChfX3guc2l6ZSgpLCBfTm9Jbml0KCkpOworICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKKyAgICBfX3RtcFtfX2ldID0gOjpjb3MoX194W19faV0pOworICByZXR1cm4gX190bXA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgdmFsYXJyYXk8X1RwPiBjb3NoKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCkgeworICB0eXBlZGVmIHR5cGVuYW1lIHZhbGFycmF5PF9UcD46Ol9Ob0luaXQgX05vSW5pdDsKKyAgdmFsYXJyYXk8X1RwPiBfX3RtcChfX3guc2l6ZSgpLCBfTm9Jbml0KCkpOworICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKKyAgICBfX3RtcFtfX2ldID0gOjpjb3NoKF9feFtfX2ldKTsKKyAgcmV0dXJuIF9fdG1wOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIHZhbGFycmF5PF9UcD4gZXhwKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCkgeworICB0eXBlZGVmIHR5cGVuYW1lIHZhbGFycmF5PF9UcD46Ol9Ob0luaXQgX05vSW5pdDsKKyAgdmFsYXJyYXk8X1RwPiBfX3RtcChfX3guc2l6ZSgpLCBfTm9Jbml0KCkpOworICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKKyAgICBfX3RtcFtfX2ldID0gOjpleHAoX194W19faV0pOworICByZXR1cm4gX190bXA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgdmFsYXJyYXk8X1RwPiBsb2coY29uc3QgdmFsYXJyYXk8X1RwPiYgX194KSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OworICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSA6OmxvZyhfX3hbX19pXSk7CisgIHJldHVybiBfX3RtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSB2YWxhcnJheTxfVHA+IGxvZzEwKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCkgeworICB0eXBlZGVmIHR5cGVuYW1lIHZhbGFycmF5PF9UcD46Ol9Ob0luaXQgX05vSW5pdDsKKyAgdmFsYXJyYXk8X1RwPiBfX3RtcChfX3guc2l6ZSgpLCBfTm9Jbml0KCkpOworICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKKyAgICBfX3RtcFtfX2ldID0gOjpsb2cxMChfX3hbX19pXSk7CisgIHJldHVybiBfX3RtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSB2YWxhcnJheTxfVHA+IHBvdyhjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsYXJyYXk8X1RwPiYgX195KSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OworICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSA6OnBvdyhfX3hbX19pXSwgX195W19faV0pOworICByZXR1cm4gX190bXA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgdmFsYXJyYXk8X1RwPiBwb3coY29uc3QgdmFsYXJyYXk8X1RwPiYgX194LCBjb25zdCBfVHAmIF9fYykgeworICB0eXBlZGVmIHR5cGVuYW1lIHZhbGFycmF5PF9UcD46Ol9Ob0luaXQgX05vSW5pdDsKKyAgdmFsYXJyYXk8X1RwPiBfX3RtcChfX3guc2l6ZSgpLCBfTm9Jbml0KCkpOworICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKKyAgICBfX3RtcFtfX2ldID0gOjpwb3coX194W19faV0sIF9fYyk7CisgIHJldHVybiBfX3RtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSB2YWxhcnJheTxfVHA+IHBvdyhjb25zdCBfVHAmIF9fYywgY29uc3QgdmFsYXJyYXk8X1RwPiYgX194KSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6X05vSW5pdCBfTm9Jbml0OworICB2YWxhcnJheTxfVHA+IF9fdG1wKF9feC5zaXplKCksIF9Ob0luaXQoKSk7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5zaXplKCk7ICsrX19pKQorICAgIF9fdG1wW19faV0gPSA6OnBvdyhfX2MsIF9feFtfX2ldKTsKKyAgcmV0dXJuIF9fdG1wOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIHZhbGFycmF5PF9UcD4gc2luKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCkgeworICB0eXBlZGVmIHR5cGVuYW1lIHZhbGFycmF5PF9UcD46Ol9Ob0luaXQgX05vSW5pdDsKKyAgdmFsYXJyYXk8X1RwPiBfX3RtcChfX3guc2l6ZSgpLCBfTm9Jbml0KCkpOworICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKKyAgICBfX3RtcFtfX2ldID0gOjpzaW4oX194W19faV0pOworICByZXR1cm4gX190bXA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgdmFsYXJyYXk8X1RwPiBzaW5oKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9feCkgeworICB0eXBlZGVmIHR5cGVuYW1lIHZhbGFycmF5PF9UcD46Ol9Ob0luaXQgX05vSW5pdDsKKyAgdmFsYXJyYXk8X1RwPiBfX3RtcChfX3guc2l6ZSgpLCBfTm9Jbml0KCkpOworICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guc2l6ZSgpOyArK19faSkKKyAgICBfX3RtcFtfX2ldID0gOjpzaW5oKF9feFtfX2ldKTsKKyAgcmV0dXJuIF9fdG1wOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIHZhbGFycmF5PF9UcD4gc3FydChjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSB2YWxhcnJheTxfVHA+OjpfTm9Jbml0IF9Ob0luaXQ7CisgIHZhbGFycmF5PF9UcD4gX190bXAoX194LnNpemUoKSwgX05vSW5pdCgpKTsKKyAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCisgICAgX190bXBbX19pXSA9IDo6c3FydChfX3hbX19pXSk7CisgIHJldHVybiBfX3RtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSB2YWxhcnJheTxfVHA+IHRhbihjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSB2YWxhcnJheTxfVHA+OjpfTm9Jbml0IF9Ob0luaXQ7CisgIHZhbGFycmF5PF9UcD4gX190bXAoX194LnNpemUoKSwgX05vSW5pdCgpKTsKKyAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCisgICAgX190bXBbX19pXSA9IDo6dGFuKF9feFtfX2ldKTsKKyAgcmV0dXJuIF9fdG1wOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIHZhbGFycmF5PF9UcD4gdGFuaChjb25zdCB2YWxhcnJheTxfVHA+JiBfX3gpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSB2YWxhcnJheTxfVHA+OjpfTm9Jbml0IF9Ob0luaXQ7CisgIHZhbGFycmF5PF9UcD4gX190bXAoX194LnNpemUoKSwgX05vSW5pdCgpKTsKKyAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194LnNpemUoKTsgKytfX2kpCisgICAgX190bXBbX19pXSA9IDo6dGFuaChfX3hbX19pXSk7CisgIHJldHVybiBfX3RtcDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBzbGljZSBhbmQgc2xpY2VfYXJyYXkKKworY2xhc3Mgc2xpY2UgeworcHVibGljOgorICBzbGljZSgpIDogX01fc3RhcnQoMCksIF9NX2xlbmd0aCgwKSwgX01fc3RyaWRlKDApIHt9CisgIHNsaWNlKHNpemVfdCBfX3N0YXJ0LCBzaXplX3QgX19sZW5ndGgsIHNpemVfdCBfX3N0cmlkZSkKKyAgICA6IF9NX3N0YXJ0KF9fc3RhcnQpLCBfTV9sZW5ndGgoX19sZW5ndGgpLCBfTV9zdHJpZGUoX19zdHJpZGUpCisgICAge30KKyAgX19UUklWSUFMX0RFU1RSVUNUT1Ioc2xpY2UpCisKKyAgc2l6ZV90IHN0YXJ0KCkgIGNvbnN0IHsgcmV0dXJuIF9NX3N0YXJ0OyB9CisgIHNpemVfdCBzaXplKCkgICBjb25zdCB7IHJldHVybiBfTV9sZW5ndGg7IH0KKyAgc2l6ZV90IHN0cmlkZSgpIGNvbnN0IHsgcmV0dXJuIF9NX3N0cmlkZTsgfQorCitwcml2YXRlOgorICBzaXplX3QgX01fc3RhcnQ7CisgIHNpemVfdCBfTV9sZW5ndGg7CisgIHNpemVfdCBfTV9zdHJpZGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorY2xhc3Mgc2xpY2VfYXJyYXkgeworICBmcmllbmQgY2xhc3MgdmFsYXJyYXk8X1RwPjsKK3B1YmxpYzoKKyAgdHlwZWRlZiBfVHAgdmFsdWVfdHlwZTsKKworICB2b2lkIG9wZXJhdG9yPShjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgX194KSBjb25zdCB7CisgICAgc2l6ZV90IF9faW5kZXggPSBfTV9zbGljZS5zdGFydCgpOworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7CisgICAgICAgICBfX2kgPCBfTV9zbGljZS5zaXplKCk7CisgICAgICAgICArK19faSwgX19pbmRleCArPSBfTV9zbGljZS5zdHJpZGUoKSkKKyAgICAgIF9NX2FycmF5W19faW5kZXhdID0gX194W19faV07CisgIH0KKworICB2b2lkIG9wZXJhdG9yKj0oY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIF9feCkgY29uc3QgeworICAgIHNpemVfdCBfX2luZGV4ID0gX01fc2xpY2Uuc3RhcnQoKTsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOworICAgICAgICAgX19pIDwgX01fc2xpY2Uuc2l6ZSgpOworICAgICAgICAgKytfX2ksIF9faW5kZXggKz0gX01fc2xpY2Uuc3RyaWRlKCkpCisgICAgICBfTV9hcnJheVtfX2luZGV4XSAqPSBfX3hbX19pXTsKKyAgfQorCisgIHZvaWQgb3BlcmF0b3IvPShjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgX194KSBjb25zdCB7CisgICAgc2l6ZV90IF9faW5kZXggPSBfTV9zbGljZS5zdGFydCgpOworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7CisgICAgICAgICBfX2kgPCBfTV9zbGljZS5zaXplKCk7CisgICAgICAgICArK19faSwgX19pbmRleCArPSBfTV9zbGljZS5zdHJpZGUoKSkKKyAgICAgIF9NX2FycmF5W19faW5kZXhdIC89IF9feFtfX2ldOworICB9CisKKyAgdm9pZCBvcGVyYXRvciU9KGNvbnN0IHZhbGFycmF5PHZhbHVlX3R5cGU+JiBfX3gpIGNvbnN0IHsKKyAgICBzaXplX3QgX19pbmRleCA9IF9NX3NsaWNlLnN0YXJ0KCk7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsKKyAgICAgICAgIF9faSA8IF9NX3NsaWNlLnNpemUoKTsKKyAgICAgICAgICsrX19pLCBfX2luZGV4ICs9IF9NX3NsaWNlLnN0cmlkZSgpKQorICAgICAgX01fYXJyYXlbX19pbmRleF0gJT0gX194W19faV07CisgIH0KKworICB2b2lkIG9wZXJhdG9yKz0oY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIF9feCkgY29uc3QgeworICAgIHNpemVfdCBfX2luZGV4ID0gX01fc2xpY2Uuc3RhcnQoKTsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOworICAgICAgICAgX19pIDwgX01fc2xpY2Uuc2l6ZSgpOworICAgICAgICAgKytfX2ksIF9faW5kZXggKz0gX01fc2xpY2Uuc3RyaWRlKCkpCisgICAgICBfTV9hcnJheVtfX2luZGV4XSArPSBfX3hbX19pXTsKKyAgfQorCisgIHZvaWQgb3BlcmF0b3ItPShjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgX194KSBjb25zdCB7CisgICAgc2l6ZV90IF9faW5kZXggPSBfTV9zbGljZS5zdGFydCgpOworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7CisgICAgICAgICBfX2kgPCBfTV9zbGljZS5zaXplKCk7CisgICAgICAgICArK19faSwgX19pbmRleCArPSBfTV9zbGljZS5zdHJpZGUoKSkKKyAgICAgIF9NX2FycmF5W19faW5kZXhdIC09IF9feFtfX2ldOworICB9CisKKyAgdm9pZCBvcGVyYXRvcl49KGNvbnN0IHZhbGFycmF5PHZhbHVlX3R5cGU+JiBfX3gpIGNvbnN0IHsKKyAgICBzaXplX3QgX19pbmRleCA9IF9NX3NsaWNlLnN0YXJ0KCk7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsKKyAgICAgICAgIF9faSA8IF9NX3NsaWNlLnNpemUoKTsKKyAgICAgICAgICsrX19pLCBfX2luZGV4ICs9IF9NX3NsaWNlLnN0cmlkZSgpKQorICAgICAgX01fYXJyYXlbX19pbmRleF0gXj0gX194W19faV07CisgIH0KKworICB2b2lkIG9wZXJhdG9yJj0oY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIF9feCkgY29uc3QgeworICAgIHNpemVfdCBfX2luZGV4ID0gX01fc2xpY2Uuc3RhcnQoKTsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOworICAgICAgICAgX19pIDwgX01fc2xpY2Uuc2l6ZSgpOworICAgICAgICAgKytfX2ksIF9faW5kZXggKz0gX01fc2xpY2Uuc3RyaWRlKCkpCisgICAgICBfTV9hcnJheVtfX2luZGV4XSAmPSBfX3hbX19pXTsKKyAgfQorCisgIHZvaWQgb3BlcmF0b3J8PShjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgX194KSBjb25zdCB7CisgICAgc2l6ZV90IF9faW5kZXggPSBfTV9zbGljZS5zdGFydCgpOworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7CisgICAgICAgICBfX2kgPCBfTV9zbGljZS5zaXplKCk7CisgICAgICAgICArK19faSwgX19pbmRleCArPSBfTV9zbGljZS5zdHJpZGUoKSkKKyAgICAgIF9NX2FycmF5W19faW5kZXhdIHw9IF9feFtfX2ldOworICB9CisKKyAgdm9pZCBvcGVyYXRvcjw8PShjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgX194KSBjb25zdCB7CisgICAgc2l6ZV90IF9faW5kZXggPSBfTV9zbGljZS5zdGFydCgpOworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7CisgICAgICAgICBfX2kgPCBfTV9zbGljZS5zaXplKCk7CisgICAgICAgICArK19faSwgX19pbmRleCArPSBfTV9zbGljZS5zdHJpZGUoKSkKKyAgICAgIF9NX2FycmF5W19faW5kZXhdIDw8PSBfX3hbX19pXTsKKyAgfQorCisgIHZvaWQgb3BlcmF0b3I+Pj0oY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIF9feCkgY29uc3QgeworICAgIHNpemVfdCBfX2luZGV4ID0gX01fc2xpY2Uuc3RhcnQoKTsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOworICAgICAgICAgX19pIDwgX01fc2xpY2Uuc2l6ZSgpOworICAgICAgICAgKytfX2ksIF9faW5kZXggKz0gX01fc2xpY2Uuc3RyaWRlKCkpCisgICAgICBfTV9hcnJheVtfX2luZGV4XSA+Pj0gX194W19faV07CisgIH0KKworICB2b2lkIG9wZXJhdG9yPShjb25zdCB2YWx1ZV90eXBlJiBfX2MpIC8qY29uc3QgY291bGQgYmUgY29uc3QgYnV0IHN0YW5kYXJkIHNheXMgTk8gKDI2LjMuNS40LTEpKi8geworICAgIHNpemVfdCBfX2luZGV4ID0gX01fc2xpY2Uuc3RhcnQoKTsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOworICAgICAgICAgX19pIDwgX01fc2xpY2Uuc2l6ZSgpOworICAgICAgICAgKytfX2ksIF9faW5kZXggKz0gX01fc2xpY2Uuc3RyaWRlKCkpCisgICAgICBfTV9hcnJheVtfX2luZGV4XSA9IF9fYzsKKyAgfQorCisgIH5zbGljZV9hcnJheSgpIHt9CisKK3ByaXZhdGU6CisgIHNsaWNlX2FycmF5KGNvbnN0IHNsaWNlJiBfX3NsaWNlLCB2YWxhcnJheTxfVHA+JiBfX2FycmF5KQorICAgIDogX01fc2xpY2UoX19zbGljZSksIF9NX2FycmF5KF9fYXJyYXkpCisgICAge30KKworICBzbGljZSAgICAgICAgICBfTV9zbGljZTsKKyAgdmFsYXJyYXk8X1RwPiYgX01fYXJyYXk7CisKK3ByaXZhdGU6ICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGlzYWJsZSBhc3NpZ25tZW50IGFuZCBkZWZhdWx0IGNvbnN0cnVjdG9yCisgIHNsaWNlX2FycmF5KCk7CisgIHNsaWNlX2FycmF5KGNvbnN0IHNsaWNlX2FycmF5Jik7CisgIHNsaWNlX2FycmF5JiBvcGVyYXRvcj0oY29uc3Qgc2xpY2VfYXJyYXkmKTsKK307CisKKy8vIHZhbGFycmF5IG1lbWJlciBmdW5jdGlvbnMgZGVhbGluZyB3aXRoIHNsaWNlIGFuZCBzbGljZV9hcnJheQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIHZhbGFycmF5PF9UcD46OnZhbGFycmF5KGNvbnN0IHNsaWNlX2FycmF5PF9UcD4mIF9feCkKKyAgOiBfVmFsYXJyYXlfYmFzZTxfVHA+KF9feC5fTV9zbGljZS5zaXplKCkpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX3R5cGVfdHJhaXRzPF9UcD46Omhhc190cml2aWFsX2RlZmF1bHRfY29uc3RydWN0b3IKKyAgICAgICAgICBfSXNfVHJpdmlhbDsKKyAgX01faW5pdGlhbGl6ZShfSXNfVHJpdmlhbCgpKTsKKyAgKnRoaXMgPSBfX3g7Cit9CisKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBzbGljZV9hcnJheTxfVHA+IHZhbGFycmF5PF9UcD46Om9wZXJhdG9yW10oc2xpY2UgX19zbGljZSkgeworICByZXR1cm4gc2xpY2VfYXJyYXk8X1RwPihfX3NsaWNlLCAqdGhpcyk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZ3NsaWNlIGFuZCBnc2xpY2VfYXJyYXkKKwordGVtcGxhdGUgPGNsYXNzIF9TaXplPgorc3RydWN0IF9Hc2xpY2VfSXRlcl90bXBsOworCitjbGFzcyBnc2xpY2UgeworICBmcmllbmQgc3RydWN0IF9Hc2xpY2VfSXRlcl90bXBsPHNpemVfdD47CitwdWJsaWM6CisgIGdzbGljZSgpIDogX01fc3RhcnQoMCksIF9NX2xlbmd0aHMoMCksIF9NX3N0cmlkZXMoMCkge30KKyAgZ3NsaWNlKHNpemVfdCBfX3N0YXJ0LAorICAgICAgICAgY29uc3QgX1ZhbGFycmF5X3NpemVfdCYgX19sZW5ndGhzLCBjb25zdCBfVmFsYXJyYXlfc2l6ZV90JiBfX3N0cmlkZXMpCisgICAgOiBfTV9zdGFydChfX3N0YXJ0KSwgX01fbGVuZ3RocyhfX2xlbmd0aHMpLCBfTV9zdHJpZGVzKF9fc3RyaWRlcykKKyAgICB7fQorICBfX1RSSVZJQUxfREVTVFJVQ1RPUihnc2xpY2UpCisKKyAgc2l6ZV90IHN0YXJ0KCkgICAgICAgICAgICBjb25zdCB7IHJldHVybiBfTV9zdGFydDsgfQorICBfVmFsYXJyYXlfc2l6ZV90IHNpemUoKSAgIGNvbnN0IHsgcmV0dXJuIF9NX2xlbmd0aHM7IH0KKyAgX1ZhbGFycmF5X3NpemVfdCBzdHJpZGUoKSBjb25zdCB7IHJldHVybiBfTV9zdHJpZGVzOyB9CisKKyAgLy8gRXh0ZW5zaW9uOiBjaGVjayBmb3IgYW4gZW1wdHkgZ3NsaWNlLgorICBib29sIF9NX2VtcHR5KCkgY29uc3QgeyByZXR1cm4gX01fbGVuZ3Rocy5zaXplKCkgPT0gMDsgfQorCisgIC8vIEV4dGVuc2lvbjogbnVtYmVyIG9mIGluZGljZXMgdGhpcyBnc2xpY2UgcmVwcmVzZW50cy4gIChGb3IgYSBkZWdlbmVyYXRlCisgIC8vIGdzbGljZSwgdGhleSdyZSBub3QgbmVjZXNzYXJpbHkgYWxsIGRpc3RpbmN0LikKKyAgc2l6ZV90IF9NX3NpemUoKSBjb25zdCB7CisgICAgcmV0dXJuICF0aGlzLT5fTV9lbXB0eSgpCisgICAgICA/IGFjY3VtdWxhdGUoX01fbGVuZ3Rocy5fTV9maXJzdCArIDEsCisgICAgICAgICAgICAgICAgICAgX01fbGVuZ3Rocy5fTV9maXJzdCArIF9NX2xlbmd0aHMuX01fc2l6ZSwKKyAgICAgICAgICAgICAgICAgICBfTV9sZW5ndGhzWzBdLAorICAgICAgICAgICAgICAgICAgIG11bHRpcGxpZXM8c2l6ZV90PigpKQorICAgICAgOiAwOworICB9CisKKyMgaWZuZGVmIF9fSFBfYUNDCitwcml2YXRlOgorIyBlbmRpZgorCisgIHNpemVfdCBfTV9zdGFydDsKKyAgX1ZhbGFycmF5X3NpemVfdCBfTV9sZW5ndGhzOworICBfVmFsYXJyYXlfc2l6ZV90IF9NX3N0cmlkZXM7Cit9OworCisvLyBUaGlzIGlzIG5vdCBhbiBTVEwgaXRlcmF0b3IuICBJdCBpcyBjb25zdHJ1Y3RlZCBmcm9tIGEgZ3NsaWNlLCBhbmQgaXQKKy8vIHN0ZXBzIHRocm91Z2ggdGhlIGdzbGljZSBpbmRpY2VzIGluIHNlcXVlbmNlLiAgU2VlIDIzLjMuNiBvZiB0aGUgQysrCisvLyBzdGFuZGFyZCwgcGFyYWdyYXBocyAyLTMsIGZvciBhbiBleHBsYW5hdGlvbiBvZiB0aGUgc2VxdWVuY2UuICBBdAorLy8gZWFjaCBzdGVwIHdlIGdldCB0d28gdGhpbmdzOiB0aGUgb3JkaW5hbCAoaS5lLiBudW1iZXIgb2Ygc3RlcHMgdGFrZW4pLAorLy8gYW5kIHRoZSBvbmUtZGltZW5zaW9uYWwgaW5kZXguCisKK3RlbXBsYXRlIDxjbGFzcyBfU2l6ZT4KK3N0cnVjdCBfR3NsaWNlX0l0ZXJfdG1wbCB7CisgIF9Hc2xpY2VfSXRlcl90bXBsKGNvbnN0IGdzbGljZSYgX19nc2xpY2UpCisgICAgOiBfTV9zdGVwKDApLCBfTV8xZF9pZHgoX19nc2xpY2Uuc3RhcnQoKSksCisgICAgICBfTV9pbmRpY2VzKHNpemVfdCgwKSwgX19nc2xpY2UuX01fbGVuZ3Rocy5zaXplKCkpLAorICAgICAgX01fZ3NsaWNlKF9fZ3NsaWNlKQorICAgIHt9CisKKyAgYm9vbCBfTV9kb25lKCkgY29uc3QgeyByZXR1cm4gX01faW5kaWNlc1swXSA9PSBfTV9nc2xpY2UuX01fbGVuZ3Roc1swXTsgfQorCisgIGJvb2wgX01faW5jcigpOworCisgIF9TaXplIF9NX3N0ZXA7CisgIF9TaXplIF9NXzFkX2lkeDsKKworICB2YWxhcnJheTxfU2l6ZT4gX01faW5kaWNlczsKKyAgY29uc3QgZ3NsaWNlJiBfTV9nc2xpY2U7Cit9OworCit0eXBlZGVmIF9Hc2xpY2VfSXRlcl90bXBsPHNpemVfdD4gX0dzbGljZV9JdGVyOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorY2xhc3MgZ3NsaWNlX2FycmF5IHsKKyAgZnJpZW5kIGNsYXNzIHZhbGFycmF5PF9UcD47CitwdWJsaWM6CisgIHR5cGVkZWYgX1RwIHZhbHVlX3R5cGU7CisKKyAgdm9pZCBvcGVyYXRvcj0gKGNvbnN0IHZhbGFycmF5PHZhbHVlX3R5cGU+JiBfX3gpIGNvbnN0IHsKKyAgICBpZiAoIV9NX2dzbGljZS5fTV9lbXB0eSgpKSB7CisgICAgICBfR3NsaWNlX0l0ZXIgX19pKF9NX2dzbGljZSk7CisgICAgICBkbyBfTV9hcnJheVtfX2kuX01fMWRfaWR4XSA9IF9feFtfX2kuX01fc3RlcF07IHdoaWxlKF9faS5fTV9pbmNyKCkpOworICAgIH0KKyAgfQorCisgIHZvaWQgb3BlcmF0b3IqPSAoY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIF9feCkgY29uc3QgeworICAgIGlmICghX01fZ3NsaWNlLl9NX2VtcHR5KCkpIHsKKyAgICAgIF9Hc2xpY2VfSXRlciBfX2koX01fZ3NsaWNlKTsKKyAgICAgIGRvIF9NX2FycmF5W19faS5fTV8xZF9pZHhdICo9IF9feFtfX2kuX01fc3RlcF07IHdoaWxlKF9faS5fTV9pbmNyKCkpOworICAgIH0KKyAgfQorCisgIHZvaWQgb3BlcmF0b3IvPSAoY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIF9feCkgY29uc3QgeworICAgIGlmICghX01fZ3NsaWNlLl9NX2VtcHR5KCkpIHsKKyAgICAgIF9Hc2xpY2VfSXRlciBfX2koX01fZ3NsaWNlKTsKKyAgICAgIGRvIF9NX2FycmF5W19faS5fTV8xZF9pZHhdIC89IF9feFtfX2kuX01fc3RlcF07IHdoaWxlKF9faS5fTV9pbmNyKCkpOworICAgIH0KKyAgfQorCisgIHZvaWQgb3BlcmF0b3IlPSAoY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIF9feCkgY29uc3QgeworICAgIGlmICghX01fZ3NsaWNlLl9NX2VtcHR5KCkpIHsKKyAgICAgIF9Hc2xpY2VfSXRlciBfX2koX01fZ3NsaWNlKTsKKyAgICAgIGRvIF9NX2FycmF5W19faS5fTV8xZF9pZHhdICU9IF9feFtfX2kuX01fc3RlcF07IHdoaWxlKF9faS5fTV9pbmNyKCkpOworICAgIH0KKyAgfQorCisgIHZvaWQgb3BlcmF0b3IrPSAoY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIF9feCkgY29uc3QgeworICAgIGlmICghX01fZ3NsaWNlLl9NX2VtcHR5KCkpIHsKKyAgICAgIF9Hc2xpY2VfSXRlciBfX2koX01fZ3NsaWNlKTsKKyAgICAgIGRvIF9NX2FycmF5W19faS5fTV8xZF9pZHhdICs9IF9feFtfX2kuX01fc3RlcF07IHdoaWxlKF9faS5fTV9pbmNyKCkpOworICAgIH0KKyAgfQorCisgIHZvaWQgb3BlcmF0b3ItPSAoY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIF9feCkgY29uc3QgeworICAgIGlmICghX01fZ3NsaWNlLl9NX2VtcHR5KCkpIHsKKyAgICAgIF9Hc2xpY2VfSXRlciBfX2koX01fZ3NsaWNlKTsKKyAgICAgIGRvIF9NX2FycmF5W19faS5fTV8xZF9pZHhdIC09IF9feFtfX2kuX01fc3RlcF07IHdoaWxlKF9faS5fTV9pbmNyKCkpOworICAgIH0KKyAgfQorCisgIHZvaWQgb3BlcmF0b3JePSAoY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIF9feCkgY29uc3QgeworICAgIGlmICghX01fZ3NsaWNlLl9NX2VtcHR5KCkpIHsKKyAgICAgIF9Hc2xpY2VfSXRlciBfX2koX01fZ3NsaWNlKTsKKyAgICAgIGRvIF9NX2FycmF5W19faS5fTV8xZF9pZHhdIF49IF9feFtfX2kuX01fc3RlcF07IHdoaWxlKF9faS5fTV9pbmNyKCkpOworICAgIH0KKyAgfQorCisgIHZvaWQgb3BlcmF0b3ImPSAoY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIF9feCkgY29uc3QgeworICAgIGlmICghX01fZ3NsaWNlLl9NX2VtcHR5KCkpIHsKKyAgICAgIF9Hc2xpY2VfSXRlciBfX2koX01fZ3NsaWNlKTsKKyAgICAgIGRvIF9NX2FycmF5W19faS5fTV8xZF9pZHhdICY9IF9feFtfX2kuX01fc3RlcF07IHdoaWxlKF9faS5fTV9pbmNyKCkpOworICAgIH0KKyAgfQorCisgIHZvaWQgb3BlcmF0b3J8PSAoY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIF9feCkgY29uc3QgeworICAgIGlmICghX01fZ3NsaWNlLl9NX2VtcHR5KCkpIHsKKyAgICAgIF9Hc2xpY2VfSXRlciBfX2koX01fZ3NsaWNlKTsKKyAgICAgIGRvIF9NX2FycmF5W19faS5fTV8xZF9pZHhdIHw9IF9feFtfX2kuX01fc3RlcF07IHdoaWxlKF9faS5fTV9pbmNyKCkpOworICAgIH0KKyAgfQorCisgIHZvaWQgb3BlcmF0b3I8PD0gKGNvbnN0IHZhbGFycmF5PHZhbHVlX3R5cGU+JiBfX3gpIGNvbnN0IHsKKyAgICBpZiAoIV9NX2dzbGljZS5fTV9lbXB0eSgpKSB7CisgICAgICBfR3NsaWNlX0l0ZXIgX19pKF9NX2dzbGljZSk7CisgICAgICBkbyBfTV9hcnJheVtfX2kuX01fMWRfaWR4XSA8PD0gX194W19faS5fTV9zdGVwXTsgd2hpbGUoX19pLl9NX2luY3IoKSk7CisgICAgfQorICB9CisKKyAgdm9pZCBvcGVyYXRvcj4+PSAoY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIF9feCkgY29uc3QgeworICAgIGlmICghX01fZ3NsaWNlLl9NX2VtcHR5KCkpIHsKKyAgICAgIF9Hc2xpY2VfSXRlciBfX2koX01fZ3NsaWNlKTsKKyAgICAgIGRvIF9NX2FycmF5W19faS5fTV8xZF9pZHhdID4+PSBfX3hbX19pLl9NX3N0ZXBdOyB3aGlsZShfX2kuX01faW5jcigpKTsKKyAgICB9CisgIH0KKworICB2b2lkIG9wZXJhdG9yPSAoY29uc3QgdmFsdWVfdHlwZSYgX19jKSAvKmNvbnN0IGNvdWxkIGJlIGNvbnN0IGJ1dCBzdGFuZGFyZCBzYXlzIE5PICgyNi4zLjcuNC0xKSovIHsKKyAgICBpZiAoIV9NX2dzbGljZS5fTV9lbXB0eSgpKSB7CisgICAgICBfR3NsaWNlX0l0ZXIgX19pKF9NX2dzbGljZSk7CisgICAgICBkbyBfTV9hcnJheVtfX2kuX01fMWRfaWR4XSA9IF9fYzsgd2hpbGUoX19pLl9NX2luY3IoKSk7CisgICAgfQorICB9CisKKyAgfmdzbGljZV9hcnJheSgpIHt9CisKK3ByaXZhdGU6CisgIGdzbGljZV9hcnJheShjb25zdCBnc2xpY2UmIF9fZ3NsaWNlLCB2YWxhcnJheTxfVHA+JiBfX2FycmF5KQorICAgIDogX01fZ3NsaWNlKF9fZ3NsaWNlKSwgX01fYXJyYXkoX19hcnJheSkKKyAgICB7fQorCisgIGdzbGljZSAgICAgICAgICAgICAgICBfTV9nc2xpY2U7CisgIHZhbGFycmF5PHZhbHVlX3R5cGU+JiBfTV9hcnJheTsKKworcHJpdmF0ZTogICAgICAgICAgICAgICAgICAgICAgICAvLyBEaXNhYmxlIGFzc2lnbm1lbnQKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgZ3NsaWNlX2FycmF5PF9UcD4mKTsKK307CisKKy8vIHZhbGFycmF5IG1lbWJlciBmdW5jdGlvbnMgZGVhbGluZyB3aXRoIGdzbGljZSBhbmQgZ3NsaWNlX2FycmF5LiAgTm90ZQorLy8gdGhhdCBpdCBpcyBpbGxlZ2FsIChiZWhhdmlvciBpcyB1bmRlZmluZWQpIHRvIGNvbnN0cnVjdCBhIGdzbGljZV9hcnJheQorLy8gZnJvbSBhIGRlZ2VuZXJhdGUgZ3NsaWNlLgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIHZhbGFycmF5PF9UcD46OnZhbGFycmF5KGNvbnN0IGdzbGljZV9hcnJheTxfVHA+JiBfX3gpCisgIDogX1ZhbGFycmF5X2Jhc2U8X1RwPihfX3guX01fZ3NsaWNlLl9NX3NpemUoKSkgeworICB0eXBlZGVmIHR5cGVuYW1lIF9fdHlwZV90cmFpdHM8X1RwPjo6aGFzX3RyaXZpYWxfZGVmYXVsdF9jb25zdHJ1Y3RvcgorICAgICAgICAgIF9Jc19Ucml2aWFsOworICBfTV9pbml0aWFsaXplKF9Jc19Ucml2aWFsKCkpOworICAqdGhpcyA9IF9feDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBnc2xpY2VfYXJyYXk8X1RwPiB2YWxhcnJheTxfVHA+OjpvcGVyYXRvcltdKGNvbnN0IGdzbGljZSYgX19zbGljZSkgeworICByZXR1cm4gZ3NsaWNlX2FycmF5PF9UcD4oX19zbGljZSwgKnRoaXMpOworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbWFza19hcnJheQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorY2xhc3MgbWFza19hcnJheSB7CisgIGZyaWVuZCBjbGFzcyB2YWxhcnJheTxfVHA+OworcHVibGljOgorICB0eXBlZGVmIF9UcCB2YWx1ZV90eXBlOworCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IHZhbGFycmF5PHZhbHVlX3R5cGU+JiBfX3gpIGNvbnN0IHsKKyAgICBzaXplX3QgX19pZHggPSAwOworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9NX2FycmF5LnNpemUoKTsgKytfX2kpCisgICAgICBpZiAoX01fbWFza1tfX2ldKSBfTV9hcnJheVtfX2ldID0gX194W19faWR4KytdOworICB9CisKKyAgdm9pZCBvcGVyYXRvcio9KGNvbnN0IHZhbGFycmF5PHZhbHVlX3R5cGU+JiBfX3gpIGNvbnN0IHsKKyAgICBzaXplX3QgX19pZHggPSAwOworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9NX2FycmF5LnNpemUoKTsgKytfX2kpCisgICAgICBpZiAoX01fbWFza1tfX2ldKSBfTV9hcnJheVtfX2ldICo9IF9feFtfX2lkeCsrXTsKKyAgfQorCisgIHZvaWQgb3BlcmF0b3IvPShjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgX194KSBjb25zdCB7CisgICAgc2l6ZV90IF9faWR4ID0gMDsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfTV9hcnJheS5zaXplKCk7ICsrX19pKQorICAgICAgaWYgKF9NX21hc2tbX19pXSkgX01fYXJyYXlbX19pXSAvPSBfX3hbX19pZHgrK107CisgIH0KKworICB2b2lkIG9wZXJhdG9yJT0oY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIF9feCkgY29uc3QgeworICAgIHNpemVfdCBfX2lkeCA9IDA7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX01fYXJyYXkuc2l6ZSgpOyArK19faSkKKyAgICAgIGlmIChfTV9tYXNrW19faV0pIF9NX2FycmF5W19faV0gJT0gX194W19faWR4KytdOworICB9CisKKyAgdm9pZCBvcGVyYXRvcis9KGNvbnN0IHZhbGFycmF5PHZhbHVlX3R5cGU+JiBfX3gpIGNvbnN0IHsKKyAgICBzaXplX3QgX19pZHggPSAwOworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9NX2FycmF5LnNpemUoKTsgKytfX2kpCisgICAgICBpZiAoX01fbWFza1tfX2ldKSBfTV9hcnJheVtfX2ldICs9IF9feFtfX2lkeCsrXTsKKyAgfQorCisgIHZvaWQgb3BlcmF0b3ItPShjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgX194KSBjb25zdCB7CisgICAgc2l6ZV90IF9faWR4ID0gMDsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfTV9hcnJheS5zaXplKCk7ICsrX19pKQorICAgICAgaWYgKF9NX21hc2tbX19pXSkgX01fYXJyYXlbX19pXSAtPSBfX3hbX19pZHgrK107CisgIH0KKworICB2b2lkIG9wZXJhdG9yXj0oY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIF9feCkgY29uc3QgeworICAgIHNpemVfdCBfX2lkeCA9IDA7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX01fYXJyYXkuc2l6ZSgpOyArK19faSkKKyAgICAgIGlmIChfTV9tYXNrW19faV0pIF9NX2FycmF5W19faV0gXj0gX194W19faWR4KytdOworICB9CisKKyAgdm9pZCBvcGVyYXRvciY9KGNvbnN0IHZhbGFycmF5PHZhbHVlX3R5cGU+JiBfX3gpIGNvbnN0IHsKKyAgICBzaXplX3QgX19pZHggPSAwOworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9NX2FycmF5LnNpemUoKTsgKytfX2kpCisgICAgICBpZiAoX01fbWFza1tfX2ldKSBfTV9hcnJheVtfX2ldICY9IF9feFtfX2lkeCsrXTsKKyAgfQorCisgIHZvaWQgb3BlcmF0b3J8PShjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgX194KSBjb25zdCB7CisgICAgc2l6ZV90IF9faWR4ID0gMDsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfTV9hcnJheS5zaXplKCk7ICsrX19pKQorICAgICAgaWYgKF9NX21hc2tbX19pXSkgX01fYXJyYXlbX19pXSB8PSBfX3hbX19pZHgrK107CisgIH0KKworICB2b2lkIG9wZXJhdG9yPDw9KGNvbnN0IHZhbGFycmF5PHZhbHVlX3R5cGU+JiBfX3gpIGNvbnN0IHsKKyAgICBzaXplX3QgX19pZHggPSAwOworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9NX2FycmF5LnNpemUoKTsgKytfX2kpCisgICAgICBpZiAoX01fbWFza1tfX2ldKSBfTV9hcnJheVtfX2ldIDw8PSBfX3hbX19pZHgrK107CisgIH0KKworICB2b2lkIG9wZXJhdG9yPj49KGNvbnN0IHZhbGFycmF5PHZhbHVlX3R5cGU+JiBfX3gpIGNvbnN0IHsKKyAgICBzaXplX3QgX19pZHggPSAwOworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9NX2FycmF5LnNpemUoKTsgKytfX2kpCisgICAgICBpZiAoX01fbWFza1tfX2ldKSBfTV9hcnJheVtfX2ldID4+PSBfX3hbX19pZHgrK107CisgIH0KKworICB2b2lkIG9wZXJhdG9yPShjb25zdCB2YWx1ZV90eXBlJiBfX2MpIGNvbnN0IHsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfTV9hcnJheS5zaXplKCk7ICsrX19pKQorICAgICAgaWYgKF9NX21hc2tbX19pXSkgX01fYXJyYXlbX19pXSA9IF9fYzsKKyAgfQorCisgIH5tYXNrX2FycmF5KCkge30KKworICAvLyBFeHRlbnNpb246IG51bWJlciBvZiB0cnVlIHZhbHVlcyBpbiB0aGUgbWFzaworICBzaXplX3QgX01fbnVtX3RydWUoKSBjb25zdCB7CisgICAgc2l6ZV90IF9fcmVzdWx0ID0gMDsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfTV9tYXNrLnNpemUoKTsgKytfX2kpCisgICAgICBpZiAoX01fbWFza1tfX2ldKSArK19fcmVzdWx0OworICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgfQorCitwcml2YXRlOgorICBtYXNrX2FycmF5KGNvbnN0IF9WYWxhcnJheV9ib29sJiBfX21hc2ssIHZhbGFycmF5PF9UcD4mIF9fYXJyYXkpCisgICAgOiBfTV9tYXNrKF9fbWFzayksIF9NX2FycmF5KF9fYXJyYXkpCisgICAge30KKworICBfVmFsYXJyYXlfYm9vbCBfTV9tYXNrOworICB2YWxhcnJheTxfVHA+JiBfTV9hcnJheTsKKworcHJpdmF0ZTogICAgICAgICAgICAgICAgICAgICAgICAvLyBEaXNhYmxlIGFzc2lnbm1lbnQKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgbWFza19hcnJheTxfVHA+Jik7Cit9OworCisvLyB2YWxhcnJheSBtZW1iZXIgZnVuY3Rpb25zIGRlYWxpbmcgd2l0aCBtYXNrX2FycmF5CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgdmFsYXJyYXk8X1RwPjo6dmFsYXJyYXkoY29uc3QgbWFza19hcnJheTxfVHA+JiBfX3gpCisgIDogX1ZhbGFycmF5X2Jhc2U8X1RwPihfX3guX01fbnVtX3RydWUoKSkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX3R5cGVfdHJhaXRzPF9UcD46Omhhc190cml2aWFsX2RlZmF1bHRfY29uc3RydWN0b3IKKyAgICAgICAgICBfSXNfVHJpdmlhbDsKKyAgX01faW5pdGlhbGl6ZShfSXNfVHJpdmlhbCgpKTsKKyAgKnRoaXMgPSBfX3g7Cit9CisKKy8vIEJlaGF2aW9yIGlzIHVuZGVmaW5lZCBpZiBfX3guX01fbnVtX3RydWUoKSAhPSB0aGlzLT5zaXplKCkKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgdmFsYXJyYXk8X1RwPiYgdmFsYXJyYXk8X1RwPjo6b3BlcmF0b3I9KGNvbnN0IG1hc2tfYXJyYXk8X1RwPiYgX194KSB7CisgIHNpemVfdCBfX2lkeCA9IDA7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5fTV9hcnJheS5zaXplKCk7ICsrX19pKQorICAgIGlmIChfX3guX01fbWFza1tfX2ldKSAoKnRoaXMpW19faWR4KytdID0gX194Ll9NX2FycmF5W19faV07CisgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBtYXNrX2FycmF5PF9UcD4gdmFsYXJyYXk8X1RwPjo6b3BlcmF0b3JbXShjb25zdCBfVmFsYXJyYXlfYm9vbCYgX19tYXNrKQoreworICByZXR1cm4gbWFza19hcnJheTxfVHA+KF9fbWFzaywgKnRoaXMpOworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gaW5kaXJlY3RfYXJyYXkKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2NsYXNzIGluZGlyZWN0X2FycmF5IHsKKyAgZnJpZW5kIGNsYXNzIHZhbGFycmF5PF9UcD47CitwdWJsaWM6CisgIHR5cGVkZWYgX1RwIHZhbHVlX3R5cGU7CisKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIF9feCkgY29uc3QgeworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9NX2FkZHIuc2l6ZSgpOyArK19faSkKKyAgICAgIF9NX2FycmF5W19NX2FkZHJbX19pXV0gPSBfX3hbX19pXTsKKyAgfQorCisgIHZvaWQgb3BlcmF0b3IqPShjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgX194KSBjb25zdCB7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX01fYWRkci5zaXplKCk7ICsrX19pKQorICAgICAgX01fYXJyYXlbX01fYWRkcltfX2ldXSAqPSBfX3hbX19pXTsKKyAgfQorCisgIHZvaWQgb3BlcmF0b3IvPShjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgX194KSBjb25zdCB7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX01fYWRkci5zaXplKCk7ICsrX19pKQorICAgICAgX01fYXJyYXlbX01fYWRkcltfX2ldXSAvPSBfX3hbX19pXTsKKyAgfQorCisgIHZvaWQgb3BlcmF0b3IlPShjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgX194KSBjb25zdCB7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX01fYWRkci5zaXplKCk7ICsrX19pKQorICAgICAgX01fYXJyYXlbX01fYWRkcltfX2ldXSAlPSBfX3hbX19pXTsKKyAgfQorCisgIHZvaWQgb3BlcmF0b3IrPShjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgX194KSBjb25zdCB7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX01fYWRkci5zaXplKCk7ICsrX19pKQorICAgICAgX01fYXJyYXlbX01fYWRkcltfX2ldXSArPSBfX3hbX19pXTsKKyAgfQorCisgIHZvaWQgb3BlcmF0b3ItPShjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgX194KSBjb25zdCB7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX01fYWRkci5zaXplKCk7ICsrX19pKQorICAgICAgX01fYXJyYXlbX01fYWRkcltfX2ldXSAtPSBfX3hbX19pXTsKKyAgfQorCisgIHZvaWQgb3BlcmF0b3JePShjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgX194KSBjb25zdCB7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX01fYWRkci5zaXplKCk7ICsrX19pKQorICAgICAgX01fYXJyYXlbX01fYWRkcltfX2ldXSBePSBfX3hbX19pXTsKKyAgfQorCisgIHZvaWQgb3BlcmF0b3ImPShjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgX194KSBjb25zdCB7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX01fYWRkci5zaXplKCk7ICsrX19pKQorICAgICAgX01fYXJyYXlbX01fYWRkcltfX2ldXSAmPSBfX3hbX19pXTsKKyAgfQorCisgIHZvaWQgb3BlcmF0b3J8PShjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgX194KSBjb25zdCB7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX01fYWRkci5zaXplKCk7ICsrX19pKQorICAgICAgX01fYXJyYXlbX01fYWRkcltfX2ldXSB8PSBfX3hbX19pXTsKKyAgfQorCisgIHZvaWQgb3BlcmF0b3I8PD0oY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIF9feCkgY29uc3QgeworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9NX2FkZHIuc2l6ZSgpOyArK19faSkKKyAgICAgIF9NX2FycmF5W19NX2FkZHJbX19pXV0gPDw9IF9feFtfX2ldOworICB9CisKKyAgdm9pZCBvcGVyYXRvcj4+PShjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgX194KSBjb25zdCB7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX01fYWRkci5zaXplKCk7ICsrX19pKQorICAgICAgX01fYXJyYXlbX01fYWRkcltfX2ldXSA+Pj0gX194W19faV07CisgIH0KKworICB2b2lkIG9wZXJhdG9yPShjb25zdCB2YWx1ZV90eXBlJiBfX2MpIGNvbnN0IHsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfTV9hZGRyLnNpemUoKTsgKytfX2kpCisgICAgICBfTV9hcnJheVtfTV9hZGRyW19faV1dID0gX19jOworICB9CisKKyAgfmluZGlyZWN0X2FycmF5KCkge30KKworcHJpdmF0ZToKKyAgaW5kaXJlY3RfYXJyYXkoY29uc3QgX1ZhbGFycmF5X3NpemVfdCYgX19hZGRyLCB2YWxhcnJheTxfVHA+JiBfX2FycmF5KQorICAgIDogX01fYWRkcihfX2FkZHIpLCBfTV9hcnJheShfX2FycmF5KQorICAgIHt9CisKKyAgX1ZhbGFycmF5X3NpemVfdCBfTV9hZGRyOworICB2YWxhcnJheTxfVHA+JiAgIF9NX2FycmF5OworCitwcml2YXRlOiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERpc2FibGUgYXNzaWdubWVudAorICB2b2lkIG9wZXJhdG9yPShjb25zdCBpbmRpcmVjdF9hcnJheTxfVHA+Jik7Cit9OworCisvLyB2YWxhcnJheSBtZW1iZXIgZnVuY3Rpb25zIGRlYWxpbmcgd2l0aCBpbmRpcmVjdF9hcnJheQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIHZhbGFycmF5PF9UcD46OnZhbGFycmF5KGNvbnN0IGluZGlyZWN0X2FycmF5PF9UcD4mIF9feCkKKyAgOiBfVmFsYXJyYXlfYmFzZTxfVHA+KF9feC5fTV9hZGRyLnNpemUoKSkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX3R5cGVfdHJhaXRzPF9UcD46Omhhc190cml2aWFsX2RlZmF1bHRfY29uc3RydWN0b3IKKyAgICAgICAgICBfSXNfVHJpdmlhbDsKKyAgX01faW5pdGlhbGl6ZShfSXNfVHJpdmlhbCgpKTsKKyAgKnRoaXMgPSBfX3g7Cit9CisKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBpbmRpcmVjdF9hcnJheTxfVHA+Cit2YWxhcnJheTxfVHA+OjpvcGVyYXRvcltdKGNvbnN0IF9WYWxhcnJheV9zaXplX3QmIF9fYWRkcikKK3sKKyAgcmV0dXJuIGluZGlyZWN0X2FycmF5PF9UcD4oX19hZGRyLCAqdGhpcyk7Cit9CisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworIyBpZiAhZGVmaW5lZCAoX1NUTFBfTElOS19USU1FX0lOU1RBTlRJQVRJT04pCisjICBpbmNsdWRlIDxzdGwvX3ZhbGFycmF5LmM+CisjIGVuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9WQUxBUlJBWSAqLworCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvX3ZlY3Rvci5jIGIvc3RsL192ZWN0b3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDZhMjNlCi0tLSAvZGV2L251bGwKKysrIGIvc3RsL192ZWN0b3IuYwpAQCAtMCwwICsxLDIzNSBAQAorLyoKKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworI2lmbmRlZiBfU1RMUF9WRUNUT1JfQworI2RlZmluZSBfU1RMUF9WRUNUT1JfQworCisjaWYgIWRlZmluZWQgKF9TVExQX0lOVEVSTkFMX1ZFQ1RPUl9IKQorIyAgaW5jbHVkZSA8c3RsL192ZWN0b3IuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RsL19yYW5nZV9lcnJvcnMuaD4KKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgordm9pZCBfVmVjdG9yX2Jhc2U8X1RwLF9BbGxvYz46Ol9NX3Rocm93X2xlbmd0aF9lcnJvcigpIGNvbnN0IHsKKyAgX19zdGxfdGhyb3dfbGVuZ3RoX2Vycm9yKCJ2ZWN0b3IiKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgordm9pZCBfVmVjdG9yX2Jhc2U8X1RwLCBfQWxsb2M+OjpfTV90aHJvd19vdXRfb2ZfcmFuZ2UoKSBjb25zdCB7CisgIF9fc3RsX3Rocm93X291dF9vZl9yYW5nZSgidmVjdG9yIik7Cit9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUFRSX1NQRUNJQUxJWkFUSU9OUykKKyMgIGRlZmluZSB2ZWN0b3IgX1NUTFBfUFRSX0lNUExfTkFNRSh2ZWN0b3IpCisjZWxpZiBkZWZpbmVkIChfU1RMUF9ERUJVRykKKyMgIGRlZmluZSB2ZWN0b3IgX1NUTFBfTk9OX0RCR19OQU1FKHZlY3RvcikKKyNlbHNlCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfTkVTVEVEX1RZUEVfUEFSQU1fQlVHKQorIyAgZGVmaW5lIF9faXRlcmF0b3JfXyAgX1RwKgorI2Vsc2UKKyMgIGRlZmluZSBfX2l0ZXJhdG9yX18gIF9TVExQX1RZUEVOQU1FX09OX1JFVFVSTl9UWVBFIHZlY3RvcjxfVHAsIF9BbGxvYz46Oml0ZXJhdG9yCisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgordm9pZCB2ZWN0b3I8X1RwLCBfQWxsb2M+OjpyZXNlcnZlKHNpemVfdHlwZSBfX24pIHsKKyAgaWYgKGNhcGFjaXR5KCkgPCBfX24pIHsKKyAgICBpZiAobWF4X3NpemUoKSA8IF9fbikgeworICAgICAgdGhpcy0+X01fdGhyb3dfbGVuZ3RoX2Vycm9yKCk7CisgICAgfQorCisgICAgY29uc3Qgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSBzaXplKCk7CisgICAgcG9pbnRlciBfX3RtcDsKKyAgICBpZiAodGhpcy0+X01fc3RhcnQpIHsKKyAgICAgIF9fdG1wID0gX01fYWxsb2NhdGVfYW5kX2NvcHkoX19uLCB0aGlzLT5fTV9zdGFydCwgdGhpcy0+X01fZmluaXNoKTsKKyAgICAgIF9NX2NsZWFyKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIF9fdG1wID0gdGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuYWxsb2NhdGUoX19uLCBfX24pOworICAgIH0KKyAgICBfTV9zZXQoX190bXAsIF9fdG1wICsgX19vbGRfc2l6ZSwgX190bXAgKyBfX24pOworICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK3ZvaWQgdmVjdG9yPF9UcCwgX0FsbG9jPjo6X01faW5zZXJ0X292ZXJmbG93X2F1eChwb2ludGVyIF9fcG9zLCBjb25zdCBfVHAmIF9feCwgY29uc3QgX19mYWxzZV90eXBlJiAvKkRPIE5PVCBVU0UhISovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX2ZpbGxfbGVuLCBib29sIF9fYXRlbmQgKSB7CisgIGNvbnN0IHNpemVfdHlwZSBfX29sZF9zaXplID0gc2l6ZSgpOworICBzaXplX3R5cGUgX19sZW4gPSBfX29sZF9zaXplICsgKG1heCkoX19vbGRfc2l6ZSwgX19maWxsX2xlbik7CisKKyAgcG9pbnRlciBfX25ld19zdGFydCA9IHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLmFsbG9jYXRlKF9fbGVuLCBfX2xlbik7CisgIHBvaW50ZXIgX19uZXdfZmluaXNoID0gX19uZXdfc3RhcnQ7CisgIF9TVExQX1RSWSB7CisgICAgX19uZXdfZmluaXNoID0gX1NUTFBfUFJJViBfX3VuaW5pdGlhbGl6ZWRfbW92ZSh0aGlzLT5fTV9zdGFydCwgX19wb3MsIF9fbmV3X3N0YXJ0LCBfVHJpdmlhbFVDb3B5KCksIF9Nb3ZhYmxlKCkpOworICAgIC8vIGhhbmRsZSBpbnNlcnRpb24KKyAgICBpZiAoX19maWxsX2xlbiA9PSAxKSB7CisgICAgICBfQ29weV9Db25zdHJ1Y3QoX19uZXdfZmluaXNoLCBfX3gpOworICAgICAgKytfX25ld19maW5pc2g7CisgICAgfSBlbHNlCisgICAgICBfX25ld19maW5pc2ggPSBfU1RMUF9QUklWIF9fdW5pbml0aWFsaXplZF9maWxsX24oX19uZXdfZmluaXNoLCBfX2ZpbGxfbGVuLCBfX3gpOworICAgIGlmICghX19hdGVuZCkKKyAgICAgIF9fbmV3X2ZpbmlzaCA9IF9TVExQX1BSSVYgX191bmluaXRpYWxpemVkX21vdmUoX19wb3MsIHRoaXMtPl9NX2ZpbmlzaCwgX19uZXdfZmluaXNoLCBfVHJpdmlhbFVDb3B5KCksIF9Nb3ZhYmxlKCkpOyAvLyBjb3B5IHJlbWFpbmRlcgorICB9CisgIF9TVExQX1VOV0lORCgoX1NUTFBfU1REOjpfRGVzdHJveV9SYW5nZShfX25ld19zdGFydCxfX25ld19maW5pc2gpLAorICAgICAgICAgICAgICAgdGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuZGVhbGxvY2F0ZShfX25ld19zdGFydCxfX2xlbikpKQorICBfTV9jbGVhcl9hZnRlcl9tb3ZlKCk7CisgIF9NX3NldChfX25ld19zdGFydCwgX19uZXdfZmluaXNoLCBfX25ld19zdGFydCArIF9fbGVuKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgordm9pZCB2ZWN0b3I8X1RwLCBfQWxsb2M+OjpfTV9pbnNlcnRfb3ZlcmZsb3cocG9pbnRlciBfX3BvcywgY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKl9Ucml2aWFsQ29weSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fZmlsbF9sZW4sIGJvb2wgX19hdGVuZCApIHsKKyAgY29uc3Qgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSBzaXplKCk7CisgIHNpemVfdHlwZSBfX2xlbiA9IF9fb2xkX3NpemUgKyAobWF4KShfX29sZF9zaXplLCBfX2ZpbGxfbGVuKTsKKworICBwb2ludGVyIF9fbmV3X3N0YXJ0ID0gdGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuYWxsb2NhdGUoX19sZW4sIF9fbGVuKTsKKyAgcG9pbnRlciBfX25ld19maW5pc2ggPSBfX1NUQVRJQ19DQVNUKHBvaW50ZXIsIF9TVExQX1BSSVYgX19jb3B5X3RyaXZpYWwodGhpcy0+X01fc3RhcnQsIF9fcG9zLCBfX25ld19zdGFydCkpOworICAvLyBoYW5kbGUgaW5zZXJ0aW9uCisgIF9fbmV3X2ZpbmlzaCA9IF9TVExQX1BSSVYgX19maWxsX24oX19uZXdfZmluaXNoLCBfX2ZpbGxfbGVuLCBfX3gpOworICBpZiAoIV9fYXRlbmQpCisgICAgX19uZXdfZmluaXNoID0gX19TVEFUSUNfQ0FTVChwb2ludGVyLCBfU1RMUF9QUklWIF9fY29weV90cml2aWFsKF9fcG9zLCB0aGlzLT5fTV9maW5pc2gsIF9fbmV3X2ZpbmlzaCkpOyAvLyBjb3B5IHJlbWFpbmRlcgorICBfTV9jbGVhcigpOworICBfTV9zZXQoX19uZXdfc3RhcnQsIF9fbmV3X2ZpbmlzaCwgX19uZXdfc3RhcnQgKyBfX2xlbik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK3ZvaWQgdmVjdG9yPF9UcCwgX0FsbG9jPjo6X01fZmlsbF9pbnNlcnRfYXV4KGl0ZXJhdG9yIF9fcG9zLCBzaXplX3R5cGUgX19uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKl9Nb3ZhYmxlKi8pIHsKKyAgaWYgKF9NX2lzX2luc2lkZShfX3gpKSB7CisgICAgX1RwIF9feF9jb3B5ID0gX194OworICAgIF9NX2ZpbGxfaW5zZXJ0X2F1eChfX3BvcywgX19uLCBfX3hfY29weSwgX190cnVlX3R5cGUoKSk7CisgICAgcmV0dXJuOworICB9CisgIGl0ZXJhdG9yIF9fc3JjID0gdGhpcy0+X01fZmluaXNoIC0gMTsKKyAgaXRlcmF0b3IgX19kc3QgPSBfX3NyYyArIF9fbjsKKyAgZm9yICg7IF9fc3JjID49IF9fcG9zOyAtLV9fZHN0LCAtLV9fc3JjKSB7CisgICAgX1NUTFBfU1REOjpfTW92ZV9Db25zdHJ1Y3QoX19kc3QsICpfX3NyYyk7CisgICAgX1NUTFBfU1REOjpfRGVzdHJveV9Nb3ZlZChfX3NyYyk7CisgIH0KKyAgX1NUTFBfUFJJViBfX3VuaW5pdGlhbGl6ZWRfZmlsbF9uKF9fcG9zLCBfX24sIF9feCk7CisgIHRoaXMtPl9NX2ZpbmlzaCArPSBfX247Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK3ZvaWQgdmVjdG9yPF9UcCwgX0FsbG9jPjo6X01fZmlsbF9pbnNlcnRfYXV4IChpdGVyYXRvciBfX3Bvcywgc2l6ZV90eXBlIF9fbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfVHAmIF9feCwgY29uc3QgX19mYWxzZV90eXBlJiAvKl9Nb3ZhYmxlKi8pIHsKKyAgLy9IZXJlIHNlbGYgcmVmZXJlbmNpbmcgbmVlZHMgdG8gYmUgY2hlY2tlZCBldmVuIGZvciBub24gbW92YWJsZSB0eXBlcy4KKyAgaWYgKF9NX2lzX2luc2lkZShfX3gpKSB7CisgICAgX1RwIF9feF9jb3B5ID0gX194OworICAgIF9NX2ZpbGxfaW5zZXJ0X2F1eChfX3BvcywgX19uLCBfX3hfY29weSwgX19mYWxzZV90eXBlKCkpOworICAgIHJldHVybjsKKyAgfQorICBjb25zdCBzaXplX3R5cGUgX19lbGVtc19hZnRlciA9IHRoaXMtPl9NX2ZpbmlzaCAtIF9fcG9zOworICBwb2ludGVyIF9fb2xkX2ZpbmlzaCA9IHRoaXMtPl9NX2ZpbmlzaDsKKyAgaWYgKF9fZWxlbXNfYWZ0ZXIgPiBfX24pIHsKKyAgICBfU1RMUF9QUklWIF9fdWNvcHlfcHRycyh0aGlzLT5fTV9maW5pc2ggLSBfX24sIHRoaXMtPl9NX2ZpbmlzaCwgdGhpcy0+X01fZmluaXNoLCBfVHJpdmlhbFVDb3B5KCkpOworICAgIHRoaXMtPl9NX2ZpbmlzaCArPSBfX247CisgICAgX1NUTFBfUFJJViBfX2NvcHlfYmFja3dhcmRfcHRycyhfX3BvcywgX19vbGRfZmluaXNoIC0gX19uLCBfX29sZF9maW5pc2gsIF9Ucml2aWFsQ29weSgpKTsKKyAgICBfU1RMUF9TVEQ6OmZpbGwoX19wb3MsIF9fcG9zICsgX19uLCBfX3gpOworICB9IGVsc2UgeworICAgIHRoaXMtPl9NX2ZpbmlzaCA9IF9TVExQX1BSSVYgX191bmluaXRpYWxpemVkX2ZpbGxfbih0aGlzLT5fTV9maW5pc2gsIF9fbiAtIF9fZWxlbXNfYWZ0ZXIsIF9feCk7CisgICAgX1NUTFBfUFJJViBfX3Vjb3B5X3B0cnMoX19wb3MsIF9fb2xkX2ZpbmlzaCwgdGhpcy0+X01fZmluaXNoLCBfVHJpdmlhbFVDb3B5KCkpOworICAgIHRoaXMtPl9NX2ZpbmlzaCArPSBfX2VsZW1zX2FmdGVyOworICAgIF9TVExQX1NURDo6ZmlsbChfX3BvcywgX19vbGRfZmluaXNoLCBfX3gpOworICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK3ZvaWQgdmVjdG9yPF9UcCwgX0FsbG9jPjo6X01fZmlsbF9pbnNlcnQoaXRlcmF0b3IgX19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX194KSB7CisgIGlmIChfX24gIT0gMCkgeworICAgIGlmIChzaXplX3R5cGUodGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuX01fZGF0YSAtIHRoaXMtPl9NX2ZpbmlzaCkgPj0gX19uKSB7CisgICAgICBfTV9maWxsX2luc2VydF9hdXgoX19wb3MsIF9fbiwgX194LCBfTW92YWJsZSgpKTsKKyAgICB9IGVsc2UKKyAgICAgIF9NX2luc2VydF9vdmVyZmxvdyhfX3BvcywgX194LCBfVHJpdmlhbENvcHkoKSwgX19uKTsKKyAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Cit2ZWN0b3I8X1RwLCBfQWxsb2M+JiB2ZWN0b3I8X1RwLCBfQWxsb2M+OjpvcGVyYXRvciA9IChjb25zdCB2ZWN0b3I8X1RwLCBfQWxsb2M+JiBfX3gpIHsKKyAgaWYgKCZfX3ggIT0gdGhpcykgeworICAgIGNvbnN0IHNpemVfdHlwZSBfX3hsZW4gPSBfX3guc2l6ZSgpOworICAgIGlmIChfX3hsZW4gPiBjYXBhY2l0eSgpKSB7CisgICAgICBzaXplX3R5cGUgX19sZW4gPSBfX3hsZW47CisgICAgICBwb2ludGVyIF9fdG1wID0gX01fYWxsb2NhdGVfYW5kX2NvcHkoX19sZW4sIF9fQ09OU1RfQ0FTVChjb25zdF9wb2ludGVyLCBfX3guX01fc3RhcnQpICsgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19DT05TVF9DQVNUKGNvbnN0X3BvaW50ZXIsIF9feC5fTV9maW5pc2gpICsgMCk7CisgICAgICBfTV9jbGVhcigpOworICAgICAgdGhpcy0+X01fc3RhcnQgPSBfX3RtcDsKKyAgICAgIHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLl9NX2RhdGEgPSB0aGlzLT5fTV9zdGFydCArIF9fbGVuOworICAgIH0gZWxzZSBpZiAoc2l6ZSgpID49IF9feGxlbikgeworICAgICAgcG9pbnRlciBfX2kgPSBfU1RMUF9QUklWIF9fY29weV9wdHJzKF9fQ09OU1RfQ0FTVChjb25zdF9wb2ludGVyLCBfX3guX01fc3RhcnQpICsgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0NPTlNUX0NBU1QoY29uc3RfcG9pbnRlciwgX194Ll9NX2ZpbmlzaCkgKyAwLCB0aGlzLT5fTV9zdGFydCwgX1RyaXZpYWxDb3B5KCkpOworICAgICAgX1NUTFBfU1REOjpfRGVzdHJveV9SYW5nZShfX2ksIHRoaXMtPl9NX2ZpbmlzaCk7CisgICAgfSBlbHNlIHsKKyAgICAgIF9TVExQX1BSSVYgX19jb3B5X3B0cnMoX19DT05TVF9DQVNUKGNvbnN0X3BvaW50ZXIsIF9feC5fTV9zdGFydCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fQ09OU1RfQ0FTVChjb25zdF9wb2ludGVyLCBfX3guX01fc3RhcnQpICsgc2l6ZSgpLCB0aGlzLT5fTV9zdGFydCwgX1RyaXZpYWxDb3B5KCkpOworICAgICAgX1NUTFBfUFJJViBfX3Vjb3B5X3B0cnMoX19DT05TVF9DQVNUKGNvbnN0X3BvaW50ZXIsIF9feC5fTV9zdGFydCkgKyBzaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0NPTlNUX0NBU1QoY29uc3RfcG9pbnRlciwgX194Ll9NX2ZpbmlzaCkgKyAwLCB0aGlzLT5fTV9maW5pc2gsIF9Ucml2aWFsVUNvcHkoKSk7CisgICAgfQorICAgIHRoaXMtPl9NX2ZpbmlzaCA9IHRoaXMtPl9NX3N0YXJ0ICsgX194bGVuOworICB9CisgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgordm9pZCB2ZWN0b3I8X1RwLCBfQWxsb2M+OjpfTV9maWxsX2Fzc2lnbihzaXplX3QgX19uLCBjb25zdCBfVHAmIF9fdmFsKSB7CisgIGlmIChfX24gPiBjYXBhY2l0eSgpKSB7CisgICAgdmVjdG9yPF9UcCwgX0FsbG9jPiBfX3RtcChfX24sIF9fdmFsLCBnZXRfYWxsb2NhdG9yKCkpOworICAgIF9fdG1wLnN3YXAoKnRoaXMpOworICB9IGVsc2UgaWYgKF9fbiA+IHNpemUoKSkgeworICAgIGZpbGwoYmVnaW4oKSwgZW5kKCksIF9fdmFsKTsKKyAgICB0aGlzLT5fTV9maW5pc2ggPSBfU1RMUF9QUklWIF9fdW5pbml0aWFsaXplZF9maWxsX24odGhpcy0+X01fZmluaXNoLCBfX24gLSBzaXplKCksIF9fdmFsKTsKKyAgfSBlbHNlCisgICAgZXJhc2UoX1NUTFBfUFJJViBfX2ZpbGxfbihiZWdpbigpLCBfX24sIF9fdmFsKSwgZW5kKCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CitfX2l0ZXJhdG9yX18KK3ZlY3RvcjxfVHAsIF9BbGxvYz46Omluc2VydChpdGVyYXRvciBfX3BvcywgY29uc3QgX1RwJiBfX3gpIHsKKyAgc2l6ZV90eXBlIF9fbiA9IF9fcG9zIC0gYmVnaW4oKTsKKyAgX01fZmlsbF9pbnNlcnQoX19wb3MsIDEsIF9feCk7CisgIHJldHVybiBiZWdpbigpICsgX19uOworfQorCisjdW5kZWYgX19pdGVyYXRvcl9fCisKKyNpZiBkZWZpbmVkICh2ZWN0b3IpCisjICB1bmRlZiB2ZWN0b3IKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorI2VuZGlmCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2VuZGlmIC8qICBfU1RMUF9WRUNUT1JfQyAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RsL192ZWN0b3IuaCBiL3N0bC9fdmVjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI0ZTM0NwotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9fdmVjdG9yLmgKQEAgLTAsMCArMSw3MzUgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisvKiBOT1RFOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBTVEwgaGVhZGVycy4KKyAqICAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuCisgKi8KKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9WRUNUT1JfSAorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9WRUNUT1JfSAorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0FMR09CQVNFX0gKKyMgIGluY2x1ZGUgPHN0bC9fYWxnb2Jhc2UuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0FMTE9DX0gKKyMgIGluY2x1ZGUgPHN0bC9fYWxsb2MuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0lURVJBVE9SX0gKKyMgIGluY2x1ZGUgPHN0bC9faXRlcmF0b3IuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX1VOSU5JVElBTElaRURfSAorIyAgaW5jbHVkZSA8c3RsL191bmluaXRpYWxpemVkLmg+CisjZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKKy8vIFRoZSB2ZWN0b3IgYmFzZSBjbGFzcyBzZXJ2ZXMgb25lIHB1cnBvc2UsIGl0cyBjb25zdHJ1Y3RvciBhbmQKKy8vIGRlc3RydWN0b3IgYWxsb2NhdGUgKGJ1dCBkb24ndCBpbml0aWFsaXplKSBzdG9yYWdlLiAgVGhpcyBtYWtlcworLy8gZXhjZXB0aW9uIHNhZmV0eSBlYXNpZXIuCisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgorY2xhc3MgX1ZlY3Rvcl9iYXNlIHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBfVmVjdG9yX2Jhc2U8X1RwLCBfQWxsb2M+IF9TZWxmOworICBfU1RMUF9GT1JDRV9BTExPQ0FUT1JTKF9UcCwgX0FsbG9jKQorICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY190cmFpdHM8X1RwLCBfQWxsb2M+OjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKKyAgdHlwZWRlZiBfVHAqIHBvaW50ZXI7CisgIHR5cGVkZWYgX1NUTFBfYWxsb2NfcHJveHk8cG9pbnRlciwgX1RwLCBhbGxvY2F0b3JfdHlwZT4gX0FsbG9jUHJveHk7CisKKyAgX1ZlY3Rvcl9iYXNlKGNvbnN0IF9BbGxvYyYgX19hKQorICAgIDogX01fc3RhcnQoMCksIF9NX2ZpbmlzaCgwKSwgX01fZW5kX29mX3N0b3JhZ2UoX19hLCAwKSB7fQorCisgIF9WZWN0b3JfYmFzZShzaXplX3QgX19uLCBjb25zdCBfQWxsb2MmIF9fYSkKKyAgICA6IF9NX3N0YXJ0KDApLCBfTV9maW5pc2goMCksIF9NX2VuZF9vZl9zdG9yYWdlKF9fYSwgMCkgeworICAgIF9NX3N0YXJ0ID0gX01fZW5kX29mX3N0b3JhZ2UuYWxsb2NhdGUoX19uLCBfX24pOworICAgIF9NX2ZpbmlzaCA9IF9NX3N0YXJ0OworICAgIF9NX2VuZF9vZl9zdG9yYWdlLl9NX2RhdGEgPSBfTV9zdGFydCArIF9fbjsKKyAgICBfU1RMUF9NUFdGSVhfVFJZIF9TVExQX01QV0ZJWF9DQVRDSAorICB9CisKKyAgX1ZlY3Rvcl9iYXNlKF9fbW92ZV9zb3VyY2U8X1NlbGY+IHNyYykKKyAgICA6IF9NX3N0YXJ0KHNyYy5nZXQoKS5fTV9zdGFydCksIF9NX2ZpbmlzaChzcmMuZ2V0KCkuX01fZmluaXNoKSwKKyAgICAgIF9NX2VuZF9vZl9zdG9yYWdlKF9fbW92ZV9zb3VyY2U8X0FsbG9jUHJveHk+KHNyYy5nZXQoKS5fTV9lbmRfb2Zfc3RvcmFnZSkpIHsKKyAgICAvL1NldCB0aGUgc291cmNlIGFzIGVtcHR5OgorICAgIHNyYy5nZXQoKS5fTV9maW5pc2ggPSBzcmMuZ2V0KCkuX01fZW5kX29mX3N0b3JhZ2UuX01fZGF0YSA9IHNyYy5nZXQoKS5fTV9zdGFydCA9IDA7CisgIH0KKworICB+X1ZlY3Rvcl9iYXNlKCkgeworICAgIGlmIChfTV9zdGFydCAhPSBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKHBvaW50ZXIpKQorICAgICAgX01fZW5kX29mX3N0b3JhZ2UuZGVhbGxvY2F0ZShfTV9zdGFydCwgX01fZW5kX29mX3N0b3JhZ2UuX01fZGF0YSAtIF9NX3N0YXJ0KTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIHZvaWQgX1NUTFBfRlVOQ1RJT05fVEhST1dTIF9NX3Rocm93X2xlbmd0aF9lcnJvcigpIGNvbnN0OworICB2b2lkIF9TVExQX0ZVTkNUSU9OX1RIUk9XUyBfTV90aHJvd19vdXRfb2ZfcmFuZ2UoKSBjb25zdDsKKworICBwb2ludGVyIF9NX3N0YXJ0OworICBwb2ludGVyIF9NX2ZpbmlzaDsKKyAgX0FsbG9jUHJveHkgX01fZW5kX29mX3N0b3JhZ2U7Cit9OworCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BUUl9TUEVDSUFMSVpBVElPTlMpCisjICBkZWZpbmUgdmVjdG9yIF9TVExQX1BUUl9JTVBMX05BTUUodmVjdG9yKQorI2VsaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpCisjICBkZWZpbmUgdmVjdG9yIF9TVExQX05PTl9EQkdfTkFNRSh2ZWN0b3IpCisjZWxzZQorX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgX1NUTFBfREVGQVVMVF9BTExPQ0FUT1JfU0VMRUNUKF9UcCkgPgorY2xhc3MgdmVjdG9yIDogcHJvdGVjdGVkIF9TVExQX1BSSVYgX1ZlY3Rvcl9iYXNlPF9UcCwgX0FsbG9jPgorI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QQVJUSUFMX1NQRUNfV09SS0FST1VORCkgJiYgIWRlZmluZWQgKHZlY3RvcikKKyAgICAgICAgICAgICAsIHB1YmxpYyBfX3N0bHBvcnRfY2xhc3M8dmVjdG9yPF9UcCwgX0FsbG9jPiA+CisjZW5kaWYKK3sKK3ByaXZhdGU6CisgIHR5cGVkZWYgX1NUTFBfUFJJViBfVmVjdG9yX2Jhc2U8X1RwLCBfQWxsb2M+IF9CYXNlOworICB0eXBlZGVmIHZlY3RvcjxfVHAsIF9BbGxvYz4gX1NlbGY7CitwdWJsaWM6CisgIF9TVExQX0ZPUkNFX0FMTE9DQVRPUlMoX1RwLCBfQWxsb2MpCisgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmFsbG9jYXRvcl90eXBlIGFsbG9jYXRvcl90eXBlOworCisgIHR5cGVkZWYgX1RwIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgdmFsdWVfdHlwZSogcG9pbnRlcjsKKyAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlKiBjb25zdF9wb2ludGVyOworICB0eXBlZGVmIHZhbHVlX3R5cGUqIGl0ZXJhdG9yOworICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUqIGNvbnN0X2l0ZXJhdG9yOworCisgIHR5cGVkZWYgdmFsdWVfdHlwZSYgcmVmZXJlbmNlOworICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmIGNvbnN0X3JlZmVyZW5jZTsKKyAgdHlwZWRlZiBzaXplX3Qgc2l6ZV90eXBlOworICB0eXBlZGVmIHB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7CisgIHR5cGVkZWYgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgX0l0ZXJhdG9yX2NhdGVnb3J5OworCisgIF9TVExQX0RFQ0xBUkVfUkFORE9NX0FDQ0VTU19SRVZFUlNFX0lURVJBVE9SUzsKKworICBhbGxvY2F0b3JfdHlwZSBnZXRfYWxsb2NhdG9yKCkgY29uc3QKKyAgeyByZXR1cm4gX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoKGNvbnN0IGFsbG9jYXRvcl90eXBlJil0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZSwgX1RwKTsgfQorCitwcml2YXRlOgorICB0eXBlZGVmIHR5cGVuYW1lIF9fdHlwZV90cmFpdHM8X1RwPjo6aGFzX3RyaXZpYWxfYXNzaWdubWVudF9vcGVyYXRvciBfVHJpdmlhbENvcHk7CisgIHR5cGVkZWYgdHlwZW5hbWUgX190eXBlX3RyYWl0czxfVHA+OjpoYXNfdHJpdmlhbF9jb3B5X2NvbnN0cnVjdG9yIF9Ucml2aWFsVUNvcHk7CisjaWYgIWRlZmluZWQgKF9TVExQX05PX01PVkVfU0VNQU5USUMpCisgIHR5cGVkZWYgdHlwZW5hbWUgX19tb3ZlX3RyYWl0czxfVHA+OjppbXBsZW1lbnRlZCBfTW92YWJsZTsKKyNlbHNlCisgIHR5cGVkZWYgX19mYWxzZV90eXBlIF9Nb3ZhYmxlOworI2VuZGlmCisKKyAgLy8gaGFuZGxlcyBpbnNlcnRpb25zIG9uIG92ZXJmbG93CisgIHZvaWQgX01faW5zZXJ0X292ZXJmbG93X2F1eChwb2ludGVyIF9fcG9zLCBjb25zdCBfVHAmIF9feCwgY29uc3QgX19mYWxzZV90eXBlJiAvKl9Nb3ZhYmxlKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19maWxsX2xlbiwgYm9vbCBfX2F0ZW5kKTsKKyAgdm9pZCBfTV9pbnNlcnRfb3ZlcmZsb3dfYXV4KHBvaW50ZXIgX19wb3MsIGNvbnN0IF9UcCYgX194LCBjb25zdCBfX3RydWVfdHlwZSYgLypfTW92YWJsZSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fZmlsbF9sZW4sIGJvb2wgX19hdGVuZCkgeworICAgIC8vV2UgbmVlZCB0byB0YWtlIGNhcmUgb2Ygc2VsZiByZWZlcmVuY2luZyBoZXJlOgorICAgIGlmIChfTV9pc19pbnNpZGUoX194KSkgeworICAgICAgdmFsdWVfdHlwZSBfX3hfY29weSA9IF9feDsKKyAgICAgIF9NX2luc2VydF9vdmVyZmxvd19hdXgoX19wb3MsIF9feF9jb3B5LCBfX2ZhbHNlX3R5cGUoKSwgX19maWxsX2xlbiwgX19hdGVuZCk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIF9NX2luc2VydF9vdmVyZmxvd19hdXgoX19wb3MsIF9feCwgX19mYWxzZV90eXBlKCksIF9fZmlsbF9sZW4sIF9fYXRlbmQpOworICB9CisKKyAgdm9pZCBfTV9pbnNlcnRfb3ZlcmZsb3cocG9pbnRlciBfX3BvcywgY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypfVHJpdmlhbENvcHkqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fZmlsbF9sZW4sIGJvb2wgX19hdGVuZCA9IGZhbHNlKQorICB7IF9NX2luc2VydF9vdmVyZmxvd19hdXgoX19wb3MsIF9feCwgX01vdmFibGUoKSwgX19maWxsX2xlbiwgX19hdGVuZCk7IH0KKyAgdm9pZCBfTV9pbnNlcnRfb3ZlcmZsb3cocG9pbnRlciBfX3BvcywgY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKl9Ucml2aWFsQ29weSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19maWxsX2xlbiwgYm9vbCBfX2F0ZW5kID0gZmFsc2UpOworICB2b2lkIF9NX3JhbmdlX2NoZWNrKHNpemVfdHlwZSBfX24pIGNvbnN0IHsKKyAgICBpZiAoX19uID49IHNpemVfdHlwZSh0aGlzLT5fTV9maW5pc2ggLSB0aGlzLT5fTV9zdGFydCkpCisgICAgICB0aGlzLT5fTV90aHJvd19vdXRfb2ZfcmFuZ2UoKTsKKyAgfQorCitwdWJsaWM6CisgIGl0ZXJhdG9yIGJlZ2luKCkgICAgICAgICAgICAgeyByZXR1cm4gdGhpcy0+X01fc3RhcnQ7IH0KKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiB0aGlzLT5fTV9zdGFydDsgfQorICBpdGVyYXRvciBlbmQoKSAgICAgICAgICAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX2ZpbmlzaDsgfQorICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCAgIHsgcmV0dXJuIHRoaXMtPl9NX2ZpbmlzaDsgfQorCisgIHJldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgICAgICAgICAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgY29uc3QgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisgIHJldmVyc2VfaXRlcmF0b3IgcmVuZCgpICAgICAgICAgICAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgY29uc3QgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorCisgIHNpemVfdHlwZSBzaXplKCkgY29uc3QgICAgICAgIHsgcmV0dXJuIHNpemVfdHlwZSh0aGlzLT5fTV9maW5pc2ggLSB0aGlzLT5fTV9zdGFydCk7IH0KKyAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgeworICAgIHNpemVfdHlwZSBfX3ZlY3Rvcl9tYXhfc2l6ZSA9IHNpemVfdHlwZSgtMSkgLyBzaXplb2YoX1RwKTsKKyAgICB0eXBlbmFtZSBhbGxvY2F0b3JfdHlwZTo6c2l6ZV90eXBlIF9fYWxsb2NfbWF4X3NpemUgPSB0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5tYXhfc2l6ZSgpOworICAgIHJldHVybiAoX19hbGxvY19tYXhfc2l6ZSA8IF9fdmVjdG9yX21heF9zaXplKT9fX2FsbG9jX21heF9zaXplOl9fdmVjdG9yX21heF9zaXplOworICB9CisKKyAgc2l6ZV90eXBlIGNhcGFjaXR5KCkgY29uc3QgICAgeyByZXR1cm4gc2l6ZV90eXBlKHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLl9NX2RhdGEgLSB0aGlzLT5fTV9zdGFydCk7IH0KKyAgYm9vbCBlbXB0eSgpIGNvbnN0ICAgICAgICAgICAgeyByZXR1cm4gdGhpcy0+X01fc3RhcnQgPT0gdGhpcy0+X01fZmluaXNoOyB9CisKKyAgcmVmZXJlbmNlIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fbikgeyByZXR1cm4gKihiZWdpbigpICsgX19uKTsgfQorICBjb25zdF9yZWZlcmVuY2Ugb3BlcmF0b3JbXShzaXplX3R5cGUgX19uKSBjb25zdCB7IHJldHVybiAqKGJlZ2luKCkgKyBfX24pOyB9CisKKyAgcmVmZXJlbmNlIGZyb250KCkgICAgICAgICAgICAgeyByZXR1cm4gKmJlZ2luKCk7IH0KKyAgY29uc3RfcmVmZXJlbmNlIGZyb250KCkgY29uc3QgeyByZXR1cm4gKmJlZ2luKCk7IH0KKyAgcmVmZXJlbmNlIGJhY2soKSAgICAgICAgICAgICAgeyByZXR1cm4gKihlbmQoKSAtIDEpOyB9CisgIGNvbnN0X3JlZmVyZW5jZSBiYWNrKCkgY29uc3QgIHsgcmV0dXJuICooZW5kKCkgLSAxKTsgfQorCisgIHJlZmVyZW5jZSBhdChzaXplX3R5cGUgX19uKSB7IF9NX3JhbmdlX2NoZWNrKF9fbik7IHJldHVybiAoKnRoaXMpW19fbl07IH0KKyAgY29uc3RfcmVmZXJlbmNlIGF0KHNpemVfdHlwZSBfX24pIGNvbnN0IHsgX01fcmFuZ2VfY2hlY2soX19uKTsgcmV0dXJuICgqdGhpcylbX19uXTsgfQorCisjaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCisgIGV4cGxpY2l0IHZlY3Rvcihjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyNlbHNlCisgIHZlY3RvcigpCisgICAgOiBfU1RMUF9QUklWIF9WZWN0b3JfYmFzZTxfVHAsIF9BbGxvYz4oYWxsb2NhdG9yX3R5cGUoKSkge30KKyAgdmVjdG9yKGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisjZW5kaWYKKyAgICA6IF9TVExQX1BSSVYgX1ZlY3Rvcl9iYXNlPF9UcCwgX0FsbG9jPihfX2EpIHt9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKK3ByaXZhdGU6CisgIC8vV2UgYWx3YXlzIGNhbGwgX01faW5pdGlhbGl6ZSB3aXRoIG9ubHkgMSBwYXJhbWV0ZXIuIERlZmF1bHQgcGFyYW1ldGVyCisgIC8vaXMgdXNlZCB0byBhbGxvdyBleHBsaWNpdCBpbnN0YW5jaWF0aW9uIG9mIHZlY3RvciB3aXRoIHR5cGVzIHdpdGggbm8KKyAgLy9kZWZhdWx0IGNvbnN0cnVjdG9yLgorICB2b2lkIF9NX2luaXRpYWxpemUoc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3ZhbCA9IF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQoX1RwKSkKKyAgeyB0aGlzLT5fTV9maW5pc2ggPSBfU1RMUF9QUklWIF9fdW5pbml0aWFsaXplZF9pbml0KHRoaXMtPl9NX3N0YXJ0LCBfX24sIF9fdmFsKTsgfQorcHVibGljOgorICBleHBsaWNpdCB2ZWN0b3Ioc2l6ZV90eXBlIF9fbikKKyAgICA6IF9TVExQX1BSSVYgX1ZlY3Rvcl9iYXNlPF9UcCwgX0FsbG9jPihfX24sIGFsbG9jYXRvcl90eXBlKCkpCisgIHsgX01faW5pdGlhbGl6ZShfX24pOyB9CisgIHZlY3RvcihzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9fdmFsLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyNlbHNlCisgIGV4cGxpY2l0IHZlY3RvcihzaXplX3R5cGUgX19uKQorICAgIDogX1NUTFBfUFJJViBfVmVjdG9yX2Jhc2U8X1RwLCBfQWxsb2M+KF9fbiwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgeyB0aGlzLT5fTV9maW5pc2ggPSBfU1RMUF9QUklWIF9fdW5pbml0aWFsaXplZF9pbml0KHRoaXMtPl9NX3N0YXJ0LCBfX24sIF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQoX1RwKSk7IH0KKyAgdmVjdG9yKHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX192YWwpCisgICAgOiBfU1RMUF9QUklWIF9WZWN0b3JfYmFzZTxfVHAsIF9BbGxvYz4oX19uLCBhbGxvY2F0b3JfdHlwZSgpKQorICB7IHRoaXMtPl9NX2ZpbmlzaCA9IF9TVExQX1BSSVYgX191bmluaXRpYWxpemVkX2ZpbGxfbih0aGlzLT5fTV9zdGFydCwgX19uLCBfX3ZhbCk7IH0KKyAgdmVjdG9yKHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX192YWwsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisjZW5kaWYKKyAgICA6IF9TVExQX1BSSVYgX1ZlY3Rvcl9iYXNlPF9UcCwgX0FsbG9jPihfX24sIF9fYSkKKyAgeyB0aGlzLT5fTV9maW5pc2ggPSBfU1RMUF9QUklWIF9fdW5pbml0aWFsaXplZF9maWxsX24odGhpcy0+X01fc3RhcnQsIF9fbiwgX192YWwpOyB9CisKKyAgdmVjdG9yKGNvbnN0IF9TZWxmJiBfX3gpCisgICAgOiBfU1RMUF9QUklWIF9WZWN0b3JfYmFzZTxfVHAsIF9BbGxvYz4oX194LnNpemUoKSwgX194LmdldF9hbGxvY2F0b3IoKSkKKyAgeyB0aGlzLT5fTV9maW5pc2ggPSBfU1RMUF9QUklWIF9fdWNvcHlfcHRycyhfX3guYmVnaW4oKSwgX194LmVuZCgpLCB0aGlzLT5fTV9zdGFydCwgX1RyaXZpYWxVQ29weSgpKTsgfQorCisgIHZlY3RvcihfX21vdmVfc291cmNlPF9TZWxmPiBzcmMpCisgICAgOiBfU1RMUF9QUklWIF9WZWN0b3JfYmFzZTxfVHAsIF9BbGxvYz4oX19tb3ZlX3NvdXJjZTxfQmFzZT4oc3JjLmdldCgpKSkKKyAge30KKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCitwcml2YXRlOgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0ludGVnZXI+CisgIHZvaWQgX01faW5pdGlhbGl6ZV9hdXgoX0ludGVnZXIgX19uLCBfSW50ZWdlciBfX3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX3RydWVfdHlwZSYgLypfSXNJbnRlZ3JhbCovKSB7CisgICAgc2l6ZV90eXBlIF9fcmVhbF9uOworICAgIHRoaXMtPl9NX3N0YXJ0ID0gdGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuYWxsb2NhdGUoX19uLCBfX3JlYWxfbik7CisgICAgdGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuX01fZGF0YSA9IHRoaXMtPl9NX3N0YXJ0ICsgX19yZWFsX247CisgICAgdGhpcy0+X01fZmluaXNoID0gX1NUTFBfUFJJViBfX3VuaW5pdGlhbGl6ZWRfZmlsbF9uKHRoaXMtPl9NX3N0YXJ0LCBfX24sIF9fdmFsKTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgdm9pZCBfTV9pbml0aWFsaXplX2F1eChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19mYWxzZV90eXBlJiAvKl9Jc0ludGVncmFsKi8pCisgIHsgX01fcmFuZ2VfaW5pdGlhbGl6ZShfX2ZpcnN0LCBfX2xhc3QsIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yKSk7IH0KKworcHVibGljOgorICAvLyBDaGVjayB3aGV0aGVyIGl0J3MgYW4gaW50ZWdyYWwgdHlwZS4gIElmIHNvLCBpdCdzIG5vdCBhbiBpdGVyYXRvci4KKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICB2ZWN0b3IoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSBfU1RMUF9BTExPQ0FUT1JfVFlQRV9ERkwgKQorICAgIDogX1NUTFBfUFJJViBfVmVjdG9yX2Jhc2U8X1RwLCBfQWxsb2M+KF9fYSkgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lzSW50ZWdyYWw8X0lucHV0SXRlcmF0b3I+OjpfUmV0IF9JbnRlZ3JhbDsKKyAgICBfTV9pbml0aWFsaXplX2F1eChfX2ZpcnN0LCBfX2xhc3QsIF9JbnRlZ3JhbCgpKTsKKyAgfQorCisjICBpZiBkZWZpbmVkIChfU1RMUF9ORUVEU19FWFRSQV9URU1QTEFURV9DT05TVFJVQ1RPUlMpCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgdmVjdG9yKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgICA6IF9TVExQX1BSSVYgX1ZlY3Rvcl9iYXNlPF9UcCwgX0FsbG9jPihhbGxvY2F0b3JfdHlwZSgpKSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXNJbnRlZ3JhbDxfSW5wdXRJdGVyYXRvcj46Ol9SZXQgX0ludGVncmFsOworICAgIF9NX2luaXRpYWxpemVfYXV4KF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOworICB9CisjICBlbmRpZiAvKiBfU1RMUF9ORUVEU19FWFRSQV9URU1QTEFURV9DT05TVFJVQ1RPUlMgKi8KKworI2Vsc2UgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworICB2ZWN0b3IoY29uc3QgX1RwKiBfX2ZpcnN0LCBjb25zdCBfVHAqIF9fbGFzdCwKKyAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX1NUTFBfUFJJViBfVmVjdG9yX2Jhc2U8X1RwLCBfQWxsb2M+KF9fbGFzdCAtIF9fZmlyc3QsIF9fYSkKKyAgeyB0aGlzLT5fTV9maW5pc2ggPSBfU1RMUF9QUklWIF9fdWNvcHlfcHRycyhfX2ZpcnN0LCBfX2xhc3QsIHRoaXMtPl9NX3N0YXJ0LCBfVHJpdmlhbFVDb3B5KCkpOyB9CisjZW5kaWYgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworCisgIC8vQXMgdGhlIHZlY3RvciBjb250YWluZXIgaXMgYSBiYWNrIGluc2VydCBvcmllbnRlZCBjb250YWluZXIgaXQKKyAgLy9zZWVtcyByYXRoZXIgbG9naWNhbCB0byBkZXN0cm95IGVsZW1lbnRzIGluIHJldmVyc2Ugb3JkZXIuCisgIH52ZWN0b3IoKSB7IF9TVExQX1NURDo6X0Rlc3Ryb3lfUmFuZ2UocmJlZ2luKCksIHJlbmQoKSk7IH0KKworICBfU2VsZiYgb3BlcmF0b3I9KGNvbnN0IF9TZWxmJiBfX3gpOworCisgIHZvaWQgcmVzZXJ2ZShzaXplX3R5cGUgX19uKTsKKworICAvLyBhc3NpZ24oKSwgYSBnZW5lcmFsaXplZCBhc3NpZ25tZW50IG1lbWJlciBmdW5jdGlvbi4gIFR3bworICAvLyB2ZXJzaW9uczogb25lIHRoYXQgdGFrZXMgYSBjb3VudCwgYW5kIG9uZSB0aGF0IHRha2VzIGEgcmFuZ2UuCisgIC8vIFRoZSByYW5nZSB2ZXJzaW9uIGlzIGEgbWVtYmVyIHRlbXBsYXRlLCBzbyB3ZSBkaXNwYXRjaCBvbiB3aGV0aGVyCisgIC8vIG9yIG5vdCB0aGUgdHlwZSBpcyBhbiBpbnRlZ2VyLgorCisgIHZvaWQgYXNzaWduKHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX192YWwpIHsgX01fZmlsbF9hc3NpZ24oX19uLCBfX3ZhbCk7IH0KKyAgdm9pZCBfTV9maWxsX2Fzc2lnbihzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9fdmFsKTsKKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXI+CisgIHZvaWQgX01fYXNzaWduX2F1eChfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwgY29uc3QgZm9yd2FyZF9pdGVyYXRvcl90YWcgJikgeworI2Vsc2UKKyAgdm9pZCBhc3NpZ24oY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KSB7CisgICAgdHlwZWRlZiBjb25zdF9pdGVyYXRvciBfRm9yd2FyZEl0ZXI7CisjZW5kaWYKKyAgICBjb25zdCBzaXplX3R5cGUgX19sZW4gPSBkaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QpOworICAgIGlmIChfX2xlbiA+IGNhcGFjaXR5KCkpIHsKKyAgICAgIHNpemVfdHlwZSBfX24gPSBfX2xlbjsKKyAgICAgIGl0ZXJhdG9yIF9fdG1wID0gX01fYWxsb2NhdGVfYW5kX2NvcHkoX19uLCBfX2ZpcnN0LCBfX2xhc3QpOworICAgICAgX01fY2xlYXIoKTsKKyAgICAgIF9NX3NldChfX3RtcCwgX190bXAgKyBfX2xlbiwgX190bXAgKyBfX24pOworICAgIH0KKyAgICBlbHNlIGlmIChzaXplKCkgPj0gX19sZW4pIHsKKyAgICAgIGl0ZXJhdG9yIF9fbmV3X2ZpbmlzaCA9IGNvcHkoX19maXJzdCwgX19sYXN0LCB0aGlzLT5fTV9zdGFydCk7CisgICAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95X1JhbmdlKF9fbmV3X2ZpbmlzaCwgdGhpcy0+X01fZmluaXNoKTsKKyAgICAgIHRoaXMtPl9NX2ZpbmlzaCA9IF9fbmV3X2ZpbmlzaDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBfRm9yd2FyZEl0ZXIgX19taWQgPSBfX2ZpcnN0OworICAgICAgYWR2YW5jZShfX21pZCwgc2l6ZSgpKTsKKyAgICAgIGNvcHkoX19maXJzdCwgX19taWQsIHRoaXMtPl9NX3N0YXJ0KTsKKyAgICAgIHRoaXMtPl9NX2ZpbmlzaCA9IHVuaW5pdGlhbGl6ZWRfY29weShfX21pZCwgX19sYXN0LCB0aGlzLT5fTV9maW5pc2gpOworICAgIH0KKyAgfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXI+CisgIHZvaWQgX01fYXNzaWduX2F1eChfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5wdXRfaXRlcmF0b3JfdGFnICYpIHsKKyAgICBpdGVyYXRvciBfX2N1ciA9IGJlZ2luKCk7CisgICAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdCAmJiBfX2N1ciAhPSBlbmQoKTsgKytfX2N1ciwgKytfX2ZpcnN0KQorICAgICAgKl9fY3VyID0gKl9fZmlyc3Q7CisgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorICAgICAgZXJhc2UoX19jdXIsIGVuZCgpKTsKKyAgICBlbHNlCisgICAgICBpbnNlcnQoZW5kKCksIF9fZmlyc3QsIF9fbGFzdCk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0ludGVnZXI+CisgIHZvaWQgX01fYXNzaWduX2Rpc3BhdGNoKF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX192YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKl9Jc0ludGVncmFsKi8pCisgIHsgX01fZmlsbF9hc3NpZ24oX19uLCBfX3ZhbCk7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcj4KKyAgdm9pZCBfTV9hc3NpZ25fZGlzcGF0Y2goX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19mYWxzZV90eXBlJiAvKl9Jc0ludGVncmFsKi8pCisgIHsgX01fYXNzaWduX2F1eChfX2ZpcnN0LCBfX2xhc3QsIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9fZmlyc3QsIF9JbnB1dEl0ZXIpKTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgdm9pZCBhc3NpZ24oX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXNJbnRlZ3JhbDxfSW5wdXRJdGVyYXRvcj46Ol9SZXQgX0ludGVncmFsOworICAgIF9NX2Fzc2lnbl9kaXNwYXRjaChfX2ZpcnN0LCBfX2xhc3QsIF9JbnRlZ3JhbCgpKTsKKyAgfQorI2VuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKworI2lmICFkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fQU5BQ0hST05JU01TKQorICB2b2lkIHB1c2hfYmFjayhjb25zdCBfVHAmIF9feCA9IF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQoX1RwKSkgeworI2Vsc2UKKyAgdm9pZCBwdXNoX2JhY2soY29uc3QgX1RwJiBfX3gpIHsKKyNlbmRpZiAvKiFfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNICYmICFfU1RMUF9OT19BTkFDSFJPTklTTVMqLworICAgIGlmICh0aGlzLT5fTV9maW5pc2ggIT0gdGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuX01fZGF0YSkgeworICAgICAgX0NvcHlfQ29uc3RydWN0KHRoaXMtPl9NX2ZpbmlzaCwgX194KTsKKyAgICAgICsrdGhpcy0+X01fZmluaXNoOworICAgIH0KKyAgICBlbHNlCisgICAgICBfTV9pbnNlcnRfb3ZlcmZsb3codGhpcy0+X01fZmluaXNoLCBfX3gsIF9Ucml2aWFsQ29weSgpLCAxVUwsIHRydWUpOworICB9CisKKyNpZiAhZGVmaW5lZChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKSAmJiAhZGVmaW5lZChfU1RMUF9OT19BTkFDSFJPTklTTVMpCisgIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBfX3BvcywgY29uc3QgX1RwJiBfX3ggPSBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKF9UcCkpOworI2Vsc2UKKyAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBjb25zdCBfVHAmIF9feCk7CisjZW5kaWYgLyohX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSAmJiAhX1NUTFBfTk9fQU5BQ0hST05JU01TKi8KKworI2lmIGRlZmluZWQoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkgJiYgIWRlZmluZWQoX1NUTFBfTk9fQU5BQ0hST05JU01TKQorICB2b2lkIHB1c2hfYmFjaygpIHsgcHVzaF9iYWNrKF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQoX1RwKSk7IH0KKyAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zKSB7IHJldHVybiBpbnNlcnQoX19wb3MsIF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQoX1RwKSk7IH0KKyNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0gJiYgIV9TVExQX05PX0FOQUNIUk9OSVNNUyovCisKKyAgdm9pZCBzd2FwKF9TZWxmJiBfX3gpIHsKKyAgICBfU1RMUF9TVEQ6OnN3YXAodGhpcy0+X01fc3RhcnQsIF9feC5fTV9zdGFydCk7CisgICAgX1NUTFBfU1REOjpzd2FwKHRoaXMtPl9NX2ZpbmlzaCwgX194Ll9NX2ZpbmlzaCk7CisgICAgdGhpcy0+X01fZW5kX29mX3N0b3JhZ2Uuc3dhcChfX3guX01fZW5kX29mX3N0b3JhZ2UpOworICB9CisKK3ByaXZhdGU6CisgIHZvaWQgX01fZmlsbF9pbnNlcnRfYXV4IChpdGVyYXRvciBfX3Bvcywgc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKl9Nb3ZhYmxlKi8pOworICB2b2lkIF9NX2ZpbGxfaW5zZXJ0X2F1eCAoaXRlcmF0b3IgX19wb3MsIHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX194LCBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qX01vdmFibGUqLyk7CisgIHZvaWQgX01fZmlsbF9pbnNlcnQgKGl0ZXJhdG9yIF9fcG9zLCBzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9feCk7CisKKyAgYm9vbCBfTV9pc19pbnNpZGUoY29uc3QgdmFsdWVfdHlwZSYgX194KSBjb25zdCB7CisgICAgcmV0dXJuICgmX194ID49IHRoaXMtPl9NX3N0YXJ0ICYmICZfX3ggPCB0aGlzLT5fTV9maW5pc2gpOworICB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KKyAgdm9pZCBfTV9yYW5nZV9pbnNlcnRfcmVhbGxvYyhpdGVyYXRvciBfX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorI2Vsc2UKKyAgdm9pZCBfTV9yYW5nZV9pbnNlcnRfcmVhbGxvYyhpdGVyYXRvciBfX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QsCisjZW5kaWYgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX24pIHsKKyAgICBjb25zdCBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IHNpemUoKTsKKyAgICBzaXplX3R5cGUgX19sZW4gPSBfX29sZF9zaXplICsgKG1heCkoX19vbGRfc2l6ZSwgX19uKTsKKyAgICBwb2ludGVyIF9fbmV3X3N0YXJ0ID0gdGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuYWxsb2NhdGUoX19sZW4sIF9fbGVuKTsKKyAgICBwb2ludGVyIF9fbmV3X2ZpbmlzaCA9IF9fbmV3X3N0YXJ0OworICAgIF9TVExQX1RSWSB7CisgICAgICBfX25ld19maW5pc2ggPSBfU1RMUF9QUklWIF9fdW5pbml0aWFsaXplZF9tb3ZlKHRoaXMtPl9NX3N0YXJ0LCBfX3BvcywgX19uZXdfc3RhcnQsIF9Ucml2aWFsVUNvcHkoKSwgX01vdmFibGUoKSk7CisgICAgICBfX25ld19maW5pc2ggPSB1bmluaXRpYWxpemVkX2NvcHkoX19maXJzdCwgX19sYXN0LCBfX25ld19maW5pc2gpOworICAgICAgX19uZXdfZmluaXNoID0gX1NUTFBfUFJJViBfX3VuaW5pdGlhbGl6ZWRfbW92ZShfX3BvcywgdGhpcy0+X01fZmluaXNoLCBfX25ld19maW5pc2gsIF9Ucml2aWFsVUNvcHkoKSwgX01vdmFibGUoKSk7CisgICAgfQorICAgIF9TVExQX1VOV0lORCgoX1NUTFBfU1REOjpfRGVzdHJveV9SYW5nZShfX25ld19zdGFydCxfX25ld19maW5pc2gpLAorICAgICAgICAgICAgICAgICAgdGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuZGVhbGxvY2F0ZShfX25ld19zdGFydCxfX2xlbikpKQorICAgIF9NX2NsZWFyX2FmdGVyX21vdmUoKTsKKyAgICBfTV9zZXQoX19uZXdfc3RhcnQsIF9fbmV3X2ZpbmlzaCwgX19uZXdfc3RhcnQgKyBfX2xlbik7CisgIH0KKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorICB2b2lkIF9NX3JhbmdlX2luc2VydF9hdXgoaXRlcmF0b3IgX19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorI2Vsc2UKKyAgdm9pZCBfTV9yYW5nZV9pbnNlcnRfYXV4KGl0ZXJhdG9yIF9fcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0LAorI2VuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX24sIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKl9Nb3ZhYmxlKi8pIHsKKyAgICBpdGVyYXRvciBfX3NyYyA9IHRoaXMtPl9NX2ZpbmlzaCAtIDE7CisgICAgaXRlcmF0b3IgX19kc3QgPSBfX3NyYyArIF9fbjsKKyAgICBmb3IgKDsgX19zcmMgPj0gX19wb3M7IC0tX19kc3QsIC0tX19zcmMpIHsKKyAgICAgIF9TVExQX1NURDo6X01vdmVfQ29uc3RydWN0KF9fZHN0LCAqX19zcmMpOworICAgICAgX1NUTFBfU1REOjpfRGVzdHJveV9Nb3ZlZChfX3NyYyk7CisgICAgfQorICAgIHVuaW5pdGlhbGl6ZWRfY29weShfX2ZpcnN0LCBfX2xhc3QsIF9fcG9zKTsKKyAgICB0aGlzLT5fTV9maW5pc2ggKz0gX19uOworICB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KKyAgdm9pZCBfTV9yYW5nZV9pbnNlcnRfYXV4KGl0ZXJhdG9yIF9fcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKyNlbHNlCisgIHZvaWQgX01fcmFuZ2VfaW5zZXJ0X2F1eChpdGVyYXRvciBfX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCwKKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uLCBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qX01vdmFibGUqLykgeworICAgIGNvbnN0IHNpemVfdHlwZSBfX2VsZW1zX2FmdGVyID0gdGhpcy0+X01fZmluaXNoIC0gX19wb3M7CisgICAgcG9pbnRlciBfX29sZF9maW5pc2ggPSB0aGlzLT5fTV9maW5pc2g7CisgICAgaWYgKF9fZWxlbXNfYWZ0ZXIgPiBfX24pIHsKKyAgICAgIF9TVExQX1BSSVYgX191Y29weV9wdHJzKHRoaXMtPl9NX2ZpbmlzaCAtIF9fbiwgdGhpcy0+X01fZmluaXNoLCB0aGlzLT5fTV9maW5pc2gsIF9Ucml2aWFsVUNvcHkoKSk7CisgICAgICB0aGlzLT5fTV9maW5pc2ggKz0gX19uOworICAgICAgX1NUTFBfUFJJViBfX2NvcHlfYmFja3dhcmRfcHRycyhfX3BvcywgX19vbGRfZmluaXNoIC0gX19uLCBfX29sZF9maW5pc2gsIF9Ucml2aWFsQ29weSgpKTsKKyAgICAgIGNvcHkoX19maXJzdCwgX19sYXN0LCBfX3Bvcyk7CisgICAgfQorICAgIGVsc2UgeworI2lmIGRlZmluZWQgKCBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICkKKyAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19taWQgPSBfX2ZpcnN0OworICAgICAgYWR2YW5jZShfX21pZCwgX19lbGVtc19hZnRlcik7CisjZWxzZQorICAgICAgY29uc3RfcG9pbnRlciBfX21pZCA9IF9fZmlyc3QgKyBfX2VsZW1zX2FmdGVyOworI2VuZGlmCisgICAgICB1bmluaXRpYWxpemVkX2NvcHkoX19taWQsIF9fbGFzdCwgdGhpcy0+X01fZmluaXNoKTsKKyAgICAgIHRoaXMtPl9NX2ZpbmlzaCArPSBfX24gLSBfX2VsZW1zX2FmdGVyOworICAgICAgX1NUTFBfUFJJViBfX3Vjb3B5X3B0cnMoX19wb3MsIF9fb2xkX2ZpbmlzaCwgdGhpcy0+X01fZmluaXNoLCBfVHJpdmlhbFVDb3B5KCkpOworICAgICAgdGhpcy0+X01fZmluaXNoICs9IF9fZWxlbXNfYWZ0ZXI7CisgICAgICBjb3B5KF9fZmlyc3QsIF9fbWlkLCBfX3Bvcyk7CisgICAgfSAvKiBlbGVtc19hZnRlciAqLworICB9CisKKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIHRlbXBsYXRlIDxjbGFzcyBfSW50ZWdlcj4KKyAgdm9pZCBfTV9pbnNlcnRfZGlzcGF0Y2goaXRlcmF0b3IgX19wb3MsIF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX192YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fdHJ1ZV90eXBlJikKKyAgeyBfTV9maWxsX2luc2VydChfX3BvcywgKHNpemVfdHlwZSkgX19uLCAoX1RwKSBfX3ZhbCk7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZvaWQgX01faW5zZXJ0X2Rpc3BhdGNoKGl0ZXJhdG9yIF9fcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fZmFsc2VfdHlwZSYpCisgIHsgX01fcmFuZ2VfaW5zZXJ0KF9fcG9zLCBfX2ZpcnN0LCBfX2xhc3QsIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yKSk7IH0KKworcHVibGljOgorICAvLyBDaGVjayB3aGV0aGVyIGl0J3MgYW4gaW50ZWdyYWwgdHlwZS4gIElmIHNvLCBpdCdzIG5vdCBhbiBpdGVyYXRvci4KKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICB2b2lkIGluc2VydChpdGVyYXRvciBfX3BvcywgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXNJbnRlZ3JhbDxfSW5wdXRJdGVyYXRvcj46Ol9SZXQgX0ludGVncmFsOworICAgIF9NX2luc2VydF9kaXNwYXRjaChfX3BvcywgX19maXJzdCwgX19sYXN0LCBfSW50ZWdyYWwoKSk7CisgIH0KKworcHJpdmF0ZToKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICB2b2lkIF9NX3JhbmdlX2luc2VydChpdGVyYXRvciBfX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnB1dF9pdGVyYXRvcl90YWcgJikgeworICAgIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkgeworICAgICAgX19wb3MgPSBpbnNlcnQoX19wb3MsICpfX2ZpcnN0KTsKKyAgICAgICsrX19wb3M7CisgICAgfQorICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CisgIHZvaWQgX01fcmFuZ2VfaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLAorICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3J3YXJkX2l0ZXJhdG9yX3RhZyAmKSB7CisjZWxzZSAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCitwdWJsaWM6CisgIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLAorICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpIHsKKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisgICAgLyogVGhpcyBtZXRob2QgZG8gbm90IGNoZWNrIHNlbGYgcmVmZXJlbmNpbmcuCisgICAgICogU3RhbmRhcmQgZm9yYmlkcyBpdCwgY2hlY2tlZCBieSB0aGUgZGVidWcgbW9kZS4KKyAgICAgKi8KKyAgICBpZiAoX19maXJzdCAhPSBfX2xhc3QpIHsKKyAgICAgIHNpemVfdHlwZSBfX24gPSBkaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICBpZiAoc2l6ZV90eXBlKHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLl9NX2RhdGEgLSB0aGlzLT5fTV9maW5pc2gpID49IF9fbikgeworICAgICAgICBfTV9yYW5nZV9pbnNlcnRfYXV4KF9fcG9zLCBfX2ZpcnN0LCBfX2xhc3QsIF9fbiwgX01vdmFibGUoKSk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgX01fcmFuZ2VfaW5zZXJ0X3JlYWxsb2MoX19wb3MsIF9fZmlyc3QsIF9fbGFzdCwgX19uKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworcHVibGljOgorICB2b2lkIGluc2VydCAoaXRlcmF0b3IgX19wb3MsIHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX194KQorICB7IF9NX2ZpbGxfaW5zZXJ0KF9fcG9zLCBfX24sIF9feCk7IH0KKworICB2b2lkIHBvcF9iYWNrKCkgeworICAgIC0tdGhpcy0+X01fZmluaXNoOworICAgIF9TVExQX1NURDo6X0Rlc3Ryb3kodGhpcy0+X01fZmluaXNoKTsKKyAgfQorCitwcml2YXRlOgorICBpdGVyYXRvciBfTV9lcmFzZShpdGVyYXRvciBfX3BvcywgY29uc3QgX190cnVlX3R5cGUmIC8qX01vdmFibGUqLykgeworICAgIF9TVExQX1NURDo6X0Rlc3Ryb3koX19wb3MpOworICAgIGl0ZXJhdG9yIF9fZHN0ID0gX19wb3MsIF9fc3JjID0gX19kc3QgKyAxOworICAgIGl0ZXJhdG9yIF9fZW5kID0gZW5kKCk7CisgICAgZm9yICg7IF9fc3JjICE9IF9fZW5kOyArK19fZHN0LCArK19fc3JjKSB7CisgICAgICBfU1RMUF9TVEQ6Ol9Nb3ZlX0NvbnN0cnVjdChfX2RzdCwgKl9fc3JjKTsKKyAgICAgIF9TVExQX1NURDo6X0Rlc3Ryb3lfTW92ZWQoX19zcmMpOworICAgIH0KKyAgICB0aGlzLT5fTV9maW5pc2ggPSBfX2RzdDsKKyAgICByZXR1cm4gX19wb3M7CisgIH0KKyAgaXRlcmF0b3IgX01fZXJhc2UoaXRlcmF0b3IgX19wb3MsIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypfTW92YWJsZSovKSB7CisgICAgaWYgKF9fcG9zICsgMSAhPSBlbmQoKSkKKyAgICAgIF9TVExQX1BSSVYgX19jb3B5X3B0cnMoX19wb3MgKyAxLCB0aGlzLT5fTV9maW5pc2gsIF9fcG9zLCBfVHJpdmlhbENvcHkoKSk7CisgICAgLS10aGlzLT5fTV9maW5pc2g7CisgICAgX1NUTFBfU1REOjpfRGVzdHJveSh0aGlzLT5fTV9maW5pc2gpOworICAgIHJldHVybiBfX3BvczsKKyAgfQorICBpdGVyYXRvciBfTV9lcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QsIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKl9Nb3ZhYmxlKi8pIHsKKyAgICBpdGVyYXRvciBfX2RzdCA9IF9fZmlyc3QsIF9fc3JjID0gX19sYXN0OworICAgIGl0ZXJhdG9yIF9fZW5kID0gZW5kKCk7CisgICAgZm9yICg7IF9fZHN0ICE9IF9fbGFzdCAmJiBfX3NyYyAhPSBfX2VuZDsgKytfX2RzdCwgKytfX3NyYykgeworICAgICAgX1NUTFBfU1REOjpfRGVzdHJveShfX2RzdCk7CisgICAgICBfU1RMUF9TVEQ6Ol9Nb3ZlX0NvbnN0cnVjdChfX2RzdCwgKl9fc3JjKTsKKyAgICB9CisgICAgaWYgKF9fZHN0ICE9IF9fbGFzdCkgeworICAgICAgLy9UaGVyZSBpcyBtb3JlIGVsZW1lbnRzIHRvIGVyYXNlIHRoYW4gZWxlbWVudCB0byBtb3ZlOgorICAgICAgX1NUTFBfU1REOjpfRGVzdHJveV9SYW5nZShfX2RzdCwgX19sYXN0KTsKKyAgICAgIF9TVExQX1NURDo6X0Rlc3Ryb3lfTW92ZWRfUmFuZ2UoX19sYXN0LCBfX2VuZCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgLy9UaGVyZSBpcyBtb3JlIGVsZW1lbnQgdG8gbW92ZSB0aGFuIGVsZW1lbnQgdG8gZXJhc2U6CisgICAgICBmb3IgKDsgX19zcmMgIT0gX19lbmQ7ICsrX19kc3QsICsrX19zcmMpIHsKKyAgICAgICAgX1NUTFBfU1REOjpfRGVzdHJveV9Nb3ZlZChfX2RzdCk7CisgICAgICAgIF9TVExQX1NURDo6X01vdmVfQ29uc3RydWN0KF9fZHN0LCAqX19zcmMpOworICAgICAgfQorICAgICAgX1NUTFBfU1REOjpfRGVzdHJveV9Nb3ZlZF9SYW5nZShfX2RzdCwgX19lbmQpOworICAgIH0KKyAgICB0aGlzLT5fTV9maW5pc2ggPSBfX2RzdDsKKyAgICByZXR1cm4gX19maXJzdDsKKyAgfQorICBpdGVyYXRvciBfTV9lcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QsIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypfTW92YWJsZSovKSB7CisgICAgcG9pbnRlciBfX2kgPSBfU1RMUF9QUklWIF9fY29weV9wdHJzKF9fbGFzdCwgdGhpcy0+X01fZmluaXNoLCBfX2ZpcnN0LCBfVHJpdmlhbENvcHkoKSk7CisgICAgX1NUTFBfU1REOjpfRGVzdHJveV9SYW5nZShfX2ksIHRoaXMtPl9NX2ZpbmlzaCk7CisgICAgdGhpcy0+X01fZmluaXNoID0gX19pOworICAgIHJldHVybiBfX2ZpcnN0OworICB9CisKK3B1YmxpYzoKKyAgaXRlcmF0b3IgZXJhc2UoaXRlcmF0b3IgX19wb3MpIHsKKyAgICByZXR1cm4gX01fZXJhc2UoX19wb3MsIF9Nb3ZhYmxlKCkpOworICB9CisgIGl0ZXJhdG9yIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkgeworICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKyAgICAgIHJldHVybiBfX2ZpcnN0OworICAgIHJldHVybiBfTV9lcmFzZShfX2ZpcnN0LCBfX2xhc3QsIF9Nb3ZhYmxlKCkpOworICB9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKKyAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9fbmV3X3NpemUsIGNvbnN0IF9UcCYgX194ID0gX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRChfVHApKSB7CisjZWxzZQorICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgX19uZXdfc2l6ZSwgY29uc3QgX1RwJiBfX3gpIHsKKyNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0qLworICAgIGlmIChfX25ld19zaXplIDwgc2l6ZSgpKQorICAgICAgZXJhc2UoYmVnaW4oKSArIF9fbmV3X3NpemUsIGVuZCgpKTsKKyAgICBlbHNlCisgICAgICBpbnNlcnQoZW5kKCksIF9fbmV3X3NpemUgLSBzaXplKCksIF9feCk7CisgIH0KKworI2lmIGRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCisgIHZvaWQgcmVzaXplKHNpemVfdHlwZSBfX25ld19zaXplKSB7IHJlc2l6ZShfX25ld19zaXplLCBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKF9UcCkpOyB9CisjZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKi8KKworICB2b2lkIGNsZWFyKCkgeworICAgIGVyYXNlKGJlZ2luKCksIGVuZCgpKTsKKyAgfQorCitwcml2YXRlOgorICB2b2lkIF9NX2NsZWFyKCkgeworICAgIF9TVExQX1NURDo6X0Rlc3Ryb3lfUmFuZ2UocmJlZ2luKCksIHJlbmQoKSk7CisgICAgdGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuZGVhbGxvY2F0ZSh0aGlzLT5fTV9zdGFydCwgdGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuX01fZGF0YSAtIHRoaXMtPl9NX3N0YXJ0KTsKKyAgfQorCisgIHZvaWQgX01fY2xlYXJfYWZ0ZXJfbW92ZSgpIHsKKyAgICBfU1RMUF9TVEQ6Ol9EZXN0cm95X01vdmVkX1JhbmdlKHJiZWdpbigpLCByZW5kKCkpOworICAgIHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLmRlYWxsb2NhdGUodGhpcy0+X01fc3RhcnQsIHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLl9NX2RhdGEgLSB0aGlzLT5fTV9zdGFydCk7CisgIH0KKworICB2b2lkIF9NX3NldChwb2ludGVyIF9fcywgcG9pbnRlciBfX2YsIHBvaW50ZXIgX19lKSB7CisgICAgdGhpcy0+X01fc3RhcnQgPSBfX3M7CisgICAgdGhpcy0+X01fZmluaXNoID0gX19mOworICAgIHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLl9NX2RhdGEgPSBfX2U7CisgIH0KKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorICBwb2ludGVyIF9NX2FsbG9jYXRlX2FuZF9jb3B5KHNpemVfdHlwZSYgX19uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpCisjZWxzZSAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisgIHBvaW50ZXIgX01fYWxsb2NhdGVfYW5kX2NvcHkoc2l6ZV90eXBlJiBfX24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfcG9pbnRlciBfX2ZpcnN0LCBjb25zdF9wb2ludGVyIF9fbGFzdCkKKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisgIHsKKyAgICBwb2ludGVyIF9fcmVzdWx0ID0gdGhpcy0+X01fZW5kX29mX3N0b3JhZ2UuYWxsb2NhdGUoX19uLCBfX24pOworICAgIF9TVExQX1RSWSB7CisgICAgICB1bmluaXRpYWxpemVkX2NvcHkoX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdCk7CisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorICAgIF9TVExQX1VOV0lORCh0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5kZWFsbG9jYXRlKF9fcmVzdWx0LCBfX24pKQorICAgIF9TVExQX1JFVF9BRlRFUl9USFJPVyhfX3Jlc3VsdCkKKyAgfQorCisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZvaWQgX01fcmFuZ2VfaW5pdGlhbGl6ZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnB1dF9pdGVyYXRvcl90YWcgJikgeworICAgIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKyAgICAgIHB1c2hfYmFjaygqX19maXJzdCk7CisgIH0KKyAgLy8gVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBieSB0aGUgY29uc3RydWN0b3IuCisgIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorICB2b2lkIF9NX3JhbmdlX2luaXRpYWxpemUoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcndhcmRfaXRlcmF0b3JfdGFnICYpIHsKKyAgICBzaXplX3R5cGUgX19uID0gZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KTsKKyAgICB0aGlzLT5fTV9zdGFydCA9IHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlLmFsbG9jYXRlKF9fbiwgX19uKTsKKyAgICB0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZS5fTV9kYXRhID0gdGhpcy0+X01fc3RhcnQgKyBfX247CisgICAgdGhpcy0+X01fZmluaXNoID0gdW5pbml0aWFsaXplZF9jb3B5KF9fZmlyc3QsIF9fbGFzdCwgdGhpcy0+X01fc3RhcnQpOworICB9CisjZW5kaWYgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworfTsKKworI2lmIGRlZmluZWQgKHZlY3RvcikKKyMgIHVuZGVmIHZlY3RvcgorX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisjZW5kaWYKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjaWYgIWRlZmluZWQgKF9TVExQX0xJTktfVElNRV9JTlNUQU5USUFUSU9OKQorIyAgaW5jbHVkZSA8c3RsL192ZWN0b3IuYz4KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BUUl9TUEVDSUFMSVpBVElPTlMpCisjICBpbmNsdWRlIDxzdGwvcG9pbnRlcnMvX3ZlY3Rvci5oPgorI2VuZGlmCisKKy8vV2UgZGVmaW5lIHRoZSBib29sIHNwZWNpYWxpemF0aW9uIGJlZm9yZSB0aGUgZGVidWcgaW50ZXJmYXZlCisvL3RvIGJlbmVmaXQgb2YgdGhlIGRlYnVnIHZlcnNpb24gb2YgdmVjdG9yIGV2ZW4gZm9yIHRoZSBib29sCisvL3NwZWNpYWxpemF0aW9uLgorI2lmICFkZWZpbmVkIChfU1RMUF9OT19CT09MKSB8fCAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9JTlRFUk5BTF9CVkVDVE9SX0gpCisjICAgIGluY2x1ZGUgPHN0bC9fYnZlY3Rvci5oPgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpCisjICBpbmNsdWRlIDxzdGwvZGVidWcvX3ZlY3Rvci5oPgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisjaWYgIWRlZmluZWQgKF9TVExQX05PX0JPT0wpICYmICFkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKQorLy8gVGhpcyB0eXBlZGVmIGlzIG5vbi1zdGFuZGFyZC4gIEl0IGlzIHByb3ZpZGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgordHlwZWRlZiB2ZWN0b3I8Ym9vbCwgYWxsb2NhdG9yPGJvb2w+ID4gYml0X3ZlY3RvcjsKKyNlbmRpZgorCisjZGVmaW5lIF9TVExQX1RFTVBMQVRFX0hFQURFUiB0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CisjZGVmaW5lIF9TVExQX1RFTVBMQVRFX0NPTlRBSU5FUiB2ZWN0b3I8X1RwLCBfQWxsb2M+CisjaW5jbHVkZSA8c3RsL19yZWxvcHNfY29udC5oPgorI3VuZGVmIF9TVExQX1RFTVBMQVRFX0NPTlRBSU5FUgorI3VuZGVmIF9TVExQX1RFTVBMQVRFX0hFQURFUgorCisjaWYgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK3N0cnVjdCBfX21vdmVfdHJhaXRzPHZlY3RvcjxfVHAsIF9BbGxvYz4gPiB7CisgIHR5cGVkZWYgX19zdGxwX21vdmFibGUgaW1wbGVtZW50ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgX19tb3ZlX3RyYWl0czxfQWxsb2M+Ojpjb21wbGV0ZSBjb21wbGV0ZTsKKyNpZiBkZWZpbmVkIChfX0JPUkxBTkRDX18pICYmIChfX0JPUkxBTkRDX18gPCAweDU2MCkKKyAgLy8gZGlzYWJsZSBpbmNvcnJlY3QgImRlcGVuZGVudCB0eXBlIHF1YWxpZmllciIgZXJyb3IKKyAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgX1JldDsKKyNlbmRpZgorfTsKKworIyAgaWYgIWRlZmluZWQgKF9TVExQX0RFQlVHKQordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgorc3RydWN0IF9EZWZhdWx0WmVyb1ZhbHVlPHZlY3RvcjxfVHAsIF9BbGxvYz4gPgoreyB0eXBlZGVmIHR5cGVuYW1lIF9fdHlwZV90cmFpdHM8X0FsbG9jPjo6aGFzX3RyaXZpYWxfZGVmYXVsdF9jb25zdHJ1Y3RvciBfUmV0OyB9OworIyAgZW5kaWYKKworI2VuZGlmIC8qIF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04gKi8KKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYgLyogX1NUTFBfVkVDVE9SX0ggKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9ib29zdF90eXBlX3RyYWl0cy5oIGIvc3RsL2Jvb3N0X3R5cGVfdHJhaXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQxY2M0MQotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9ib29zdF90eXBlX3RyYWl0cy5oCkBAIC0wLDAgKzEsMTQzIEBACisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNAorICogRnJhbmNvaXMgRHVtb250CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfQk9PU1RfVFlQRV9UUkFJVFNfSAorI2RlZmluZSBfU1RMUF9CT09TVF9UWVBFX1RSQUlUU19ICisKKyNpbmNsdWRlIDxib29zdC90eXBlX3RyYWl0cy9pc19pbnRlZ3JhbC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvdHlwZV90cmFpdHMvaXNfZmxvYXQuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3R5cGVfdHJhaXRzL2hhc190cml2aWFsX2NvbnN0cnVjdG9yLmhwcD4KKyNpbmNsdWRlIDxib29zdC90eXBlX3RyYWl0cy9oYXNfdHJpdmlhbF9jb3B5LmhwcD4KKyNpbmNsdWRlIDxib29zdC90eXBlX3RyYWl0cy9oYXNfdHJpdmlhbF9hc3NpZ24uaHBwPgorI2luY2x1ZGUgPGJvb3N0L3R5cGVfdHJhaXRzL2hhc190cml2aWFsX2Rlc3RydWN0b3IuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3R5cGVfdHJhaXRzL2lzX3BvZC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvdHlwZV90cmFpdHMvaXNfcG9pbnRlci5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvdHlwZV90cmFpdHMvaXNfcmVmZXJlbmNlLmhwcD4KKyNpbmNsdWRlIDxib29zdC90eXBlX3RyYWl0cy9yZW1vdmVfY3YuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3R5cGVfdHJhaXRzL2lzX3NhbWUuaHBwPgorCisvKgorICogVGhpcyBmaWxlIG1vc3RseSB3cmFwcyBib29zdCB0eXBlX3RyYWl0cyBpbiB0aGUgU1RMcG9ydCB0eXBlX3RyYWl0cy4KKyAqIFdoZW4gY2hlY2tpbmcgYSB0eXBlIHRyYWl0cyBsaWtlIHRyaXZpYWwgYXNzaWduIG9wZXJhdG9yIGZvciBpbnN0YW5jZQorICogYm90aCB0aGUgYm9vc3QgdmFsdWUgYW5kIFNUTHBvcnQgdmFsdWVzIGhhcyB0byBiZSB0YWtlbiBpbnRvIGFjY291bnQKKyAqIGFzIHdlIGRvbid0IGtub3cgd2hhdCB0aGUgdXNlciBtaWdodCBoYXZlIHByZWZlciwgc3BlY2lhbGl6aW5nIHRoZSBib29zdAorICogdHlwZSB0cmFpdHMgb3IgdGhlIFNUTHBvcnQgb25lLgorICovCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IF9Jc1JlZiB7CisgIGVudW0geyBfSXMgPSA6OmJvb3N0Ojppc19yZWZlcmVuY2U8X1RwPjo6dmFsdWUgfTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX2Jvb2wydHlwZTxfSXM+OjpfUmV0IF9SZXQ7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX0lzUHRyIHsKKyAgZW51bSB7IGlzX3BvaW50ZXIgPSA6OmJvb3N0Ojppc19wb2ludGVyPF9UcD46OnZhbHVlIH07CisgIHR5cGVkZWYgdHlwZW5hbWUgX19ib29sMnR5cGU8aXNfcG9pbnRlcj46Ol9SZXQgX1JldDsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCBfSXNJbnRlZ3JhbCB7CisgIGVudW0geyBpc19pbnRlZ3JhbCA9IDo6Ym9vc3Q6OmlzX2ludGVncmFsPF9UcD46OnZhbHVlIH07CisgIHR5cGVkZWYgdHlwZW5hbWUgX19ib29sMnR5cGU8aXNfaW50ZWdyYWw+OjpfUmV0IF9SZXQ7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX0lzUmF0aW9uYWwgeworICBlbnVtIHsgaXNfZmxvYXQgPSA6OmJvb3N0Ojppc19mbG9hdDxfVHA+Ojp2YWx1ZSB9OworICB0eXBlZGVmIHR5cGVuYW1lIF9fYm9vbDJ0eXBlPGlzX2Zsb2F0Pjo6X1JldCBfUmV0OworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfX3R5cGVfdHJhaXRzIHsKKyAgZW51bSB7IHRyaXZpYWxfY29uc3RydWN0b3IgPSA6OmJvb3N0OjpoYXNfdHJpdmlhbF9jb25zdHJ1Y3RvcjxfVHA+Ojp2YWx1ZSB9OworICB0eXBlZGVmIHR5cGVuYW1lIF9fYm9vbDJ0eXBlPHRyaXZpYWxfY29uc3RydWN0b3I+OjpfUmV0IGhhc190cml2aWFsX2RlZmF1bHRfY29uc3RydWN0b3I7CisKKyAgZW51bSB7IHRyaXZpYWxfY29weSA9IDo6Ym9vc3Q6Omhhc190cml2aWFsX2NvcHk8X1RwPjo6dmFsdWUgfTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX2Jvb2wydHlwZTx0cml2aWFsX2NvcHk+OjpfUmV0IGhhc190cml2aWFsX2NvcHlfY29uc3RydWN0b3I7CisKKyAgZW51bSB7IHRyaXZpYWxfYXNzaWduID0gOjpib29zdDo6aGFzX3RyaXZpYWxfYXNzaWduPF9UcD46OnZhbHVlIH07CisgIHR5cGVkZWYgdHlwZW5hbWUgX19ib29sMnR5cGU8dHJpdmlhbF9hc3NpZ24+OjpfUmV0IGhhc190cml2aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3I7CisKKyAgZW51bSB7IHRyaXZpYWxfZGVzdHJ1Y3RvciA9IDo6Ym9vc3Q6Omhhc190cml2aWFsX2Rlc3RydWN0b3I8X1RwPjo6dmFsdWUgfTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX2Jvb2wydHlwZTx0cml2aWFsX2Rlc3RydWN0b3I+OjpfUmV0IGhhc190cml2aWFsX2Rlc3RydWN0b3I7CisKKyAgZW51bSB7IHBvZCA9IDo6Ym9vc3Q6OmlzX3BvZDxfVHA+Ojp2YWx1ZSB9OworICB0eXBlZGVmIHR5cGVuYW1lIF9fYm9vbDJ0eXBlPHBvZD46Ol9SZXQgaXNfUE9EX3R5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwMSwgY2xhc3MgX1RwMj4KK3N0cnVjdCBfVHJpdmlhbENvcHkgeworICB0eXBlZGVmIHR5cGVuYW1lIDo6Ym9vc3Q6OnJlbW92ZV9jdjxfVHAxPjo6dHlwZSB1bmN2MTsKKyAgdHlwZWRlZiB0eXBlbmFtZSA6OmJvb3N0OjpyZW1vdmVfY3Y8X1RwMj46OnR5cGUgdW5jdjI7CisKKyAgZW51bSB7IHNhbWUgPSA6OmJvb3N0Ojppc19zYW1lPHVuY3YxLCB1bmN2Mj46OnZhbHVlIH07CisgIHR5cGVkZWYgdHlwZW5hbWUgX19ib29sMnR5cGU8c2FtZT46Ol9SZXQgX1NhbWU7CisKKyAgZW51bSB7IGJvb3N0X3RyaXZpYWxfYXNzaWduID0gOjpib29zdDo6aGFzX3RyaXZpYWxfYXNzaWduPHVuY3YxPjo6dmFsdWUgfTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX2Jvb2wydHlwZTxib29zdF90cml2aWFsX2Fzc2lnbj46Ol9SZXQgX0Jvb3N0VHJpdmlhbEFzc2lnbjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX3R5cGVfdHJhaXRzPHVuY3YxPjo6aGFzX3RyaXZpYWxfYXNzaWdubWVudF9vcGVyYXRvciBfU1RMUFRyaXZpYWxBc3NpZ247CisgIHR5cGVkZWYgdHlwZW5hbWUgX0xvcjI8X0Jvb3N0VHJpdmlhbEFzc2lnbiwgX1NUTFBUcml2aWFsQXNzaWduPjo6X1JldCBfVHJpdmlhbEFzc2lnbjsKKworICB0eXBlZGVmIHR5cGVuYW1lIF9MYW5kMjxfU2FtZSwgX1RyaXZpYWxBc3NpZ24+OjpfUmV0IF9UeXBlOworICBzdGF0aWMgX1R5cGUgX0Fuc3dlcigpIHsgcmV0dXJuIF9UeXBlKCk7IH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAxLCBjbGFzcyBfVHAyPgorc3RydWN0IF9Ucml2aWFsVUNvcHkgeworICB0eXBlZGVmIHR5cGVuYW1lIDo6Ym9vc3Q6OnJlbW92ZV9jdjxfVHAxPjo6dHlwZSB1bmN2MTsKKyAgdHlwZWRlZiB0eXBlbmFtZSA6OmJvb3N0OjpyZW1vdmVfY3Y8X1RwMj46OnR5cGUgdW5jdjI7CisKKyAgZW51bSB7IHNhbWUgPSA6OmJvb3N0Ojppc19zYW1lPHVuY3YxLCB1bmN2Mj46OnZhbHVlIH07CisgIHR5cGVkZWYgdHlwZW5hbWUgX19ib29sMnR5cGU8c2FtZT46Ol9SZXQgX1NhbWU7CisKKyAgZW51bSB7IGJvb3N0X3RyaXZpYWxfY29weSA9IDo6Ym9vc3Q6Omhhc190cml2aWFsX2NvcHk8dW5jdjE+Ojp2YWx1ZSB9OworICB0eXBlZGVmIHR5cGVuYW1lIF9fYm9vbDJ0eXBlPGJvb3N0X3RyaXZpYWxfY29weT46Ol9SZXQgX0Jvb3N0VHJpdmlhbENvcHk7CisgIHR5cGVkZWYgdHlwZW5hbWUgX190eXBlX3RyYWl0czx1bmN2MT46Omhhc190cml2aWFsX2NvcHlfY29uc3RydWN0b3IgX1NUTFBUcml2aWFsQ29weTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfTG9yMjxfQm9vc3RUcml2aWFsQ29weSwgX1NUTFBUcml2aWFsQ29weT46Ol9SZXQgX1RyaXZpYWxDb3B5OworCisgIHR5cGVkZWYgdHlwZW5hbWUgX0xhbmQyPF9TYW1lLCBfVHJpdmlhbENvcHk+OjpfUmV0IF9UeXBlOworICBzdGF0aWMgX1R5cGUgX0Fuc3dlcigpIHsgcmV0dXJuIF9UeXBlKCk7IH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX0RlZmF1bHRaZXJvVmFsdWUgeworICBlbnVtIHsgaXNfaW50ZWdyYWwgPSA6OmJvb3N0Ojppc19pbnRlZ3JhbDxfVHA+Ojp2YWx1ZSB9OworICB0eXBlZGVmIHR5cGVuYW1lIF9fYm9vbDJ0eXBlPGlzX2ludGVncmFsPjo6X1JldCBfSXNJbnRlZ3JhbDsKKyAgZW51bSB7IGlzX2Zsb2F0ID0gOjpib29zdDo6aXNfZmxvYXQ8X1RwPjo6dmFsdWUgfTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX2Jvb2wydHlwZTxpc19mbG9hdD46Ol9SZXQgX0lzRmxvYXQ7CisgIGVudW0geyBpc19wb2ludGVyID0gOjpib29zdDo6aXNfcG9pbnRlcjxfVHA+Ojp2YWx1ZSB9OworICB0eXBlZGVmIHR5cGVuYW1lIF9fYm9vbDJ0eXBlPGlzX3BvaW50ZXI+OjpfUmV0IF9Jc1BvaW50ZXI7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBfTG9yMzxfSXNJbnRlZ3JhbCwgX0lzRmxvYXQsIF9Jc1BvaW50ZXI+OjpfUmV0IF9SZXQ7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9Ucml2aWFsSW5pdCB7CisgIHR5cGVkZWYgdHlwZW5hbWUgOjpib29zdDo6cmVtb3ZlX2N2PF9UcD46OnR5cGUgdW5jdjsKKworICBlbnVtIHsgYm9vc3RfdHJpdmlhbF9jb25zdHJ1Y3RvciA9IDo6Ym9vc3Q6Omhhc190cml2aWFsX2NvbnN0cnVjdG9yPHVuY3Y+Ojp2YWx1ZSB9OworICB0eXBlZGVmIHR5cGVuYW1lIF9fYm9vbDJ0eXBlPGJvb3N0X3RyaXZpYWxfY29uc3RydWN0b3I+OjpfUmV0IF9Cb29zdFRyaXZpYWxJbml0OworICB0eXBlZGVmIHR5cGVuYW1lIF9fdHlwZV90cmFpdHM8dW5jdj46Omhhc190cml2aWFsX2RlZmF1bHRfY29uc3RydWN0b3IgX1NUTFBUcml2aWFsSW5pdDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfTG9yMjxfQm9vc3RUcml2aWFsSW5pdCwgX1NUTFBUcml2aWFsSW5pdD46Ol9SZXQgX1RyMTsKKworICB0eXBlZGVmIHR5cGVuYW1lIF9EZWZhdWx0WmVyb1ZhbHVlPF9UcD46Ol9SZXQgX1RyMjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfTm90PF9UcjI+OjpfUmV0IF9UcjM7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBfTGFuZDI8X1RyMSwgX1RyMz46Ol9SZXQgX1JldDsKKyAgc3RhdGljIF9SZXQgX0Fuc3dlcigpIHsgcmV0dXJuIF9SZXQoKTsgfQorfTsKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYgLyogX1NUTFBfQk9PU1RfVFlQRV9UUkFJVFNfSCAqLwpkaWZmIC0tZ2l0IGEvc3RsL2NfbG9jYWxlLmggYi9zdGwvY19sb2NhbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDUwYmI2Ci0tLSAvZGV2L251bGwKKysrIGIvc3RsL2NfbG9jYWxlLmgKQEAgLTAsMCArMSw0MzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKworI2lmbmRlZiBfU1RMUF9DX0xPQ0FMRV9ICisjZGVmaW5lIF9TVExQX0NfTE9DQUxFX0gKKworLyoKKyAqIEltcGxlbWVudGF0aW9uIGRlcGVuZGVudCBkZWZpbml0aW9ucy4KKyAqIEJld2FyZTogVGhpcyBoZWFkZXIgaXMgbm90IGEgcHVyZWx5IGludGVybmFsIGhlYWRlciwgaXQgaXMgYWxzbyBpbmNsdWRlZAorICogZnJvbSB0aGUgb3V0c2lkZSB3b3JsZCB3aGVuIGJ1aWxkaW5nIHRoZSBTVExwb3J0IGxpYnJhcnkuIFNvIHRoaXMgaGVhZGVyCisgKiBzaG91bGQgbm90IHJlZmVyZW5jZSBpbnRlcm5hbCBoZWFkZXJzIChzdGxwb3J0L3N0bC9fKi5oKSBkaXJlY3RseS4KKyAqLworI2lmIGRlZmluZWQgKF9fc2dpKQorIyAgaWYgZGVmaW5lZCAoUk9PVF82NSkgLyogSVJJWCA2LjUueCAqLworIyAgICBpbmNsdWRlIDxzZ2lkZWZzLmg+CisjICAgIGluY2x1ZGUgPHN0YW5kYXJkcy5oPgorIyAgICBpbmNsdWRlIDx3Y2hhci5oPgorIyAgICBpbmNsdWRlIDxjdHlwZS5oPgorIyAgZWxzZSAvKiBJUklYIHByZS02LjUgKi8KKyMgICAgaW5jbHVkZSA8c2dpZGVmcy5oPgorIyAgICBpbmNsdWRlIDxzdGFuZGFyZHMuaD4KKyMgICAgaWYgIWRlZmluZWQoX1NJWkVfVCkgJiYgIWRlZmluZWQoX1NJWkVfVF8pCisjICAgICAgZGVmaW5lIF9TSVpFX1QKKyMgICAgICBpZiAoX01JUFNfU1pMT05HID09IDMyKQordHlwZWRlZiB1bnNpZ25lZCBpbnQgc2l6ZV90OworIyAgICAgIGVuZGlmCisjICAgICAgaWYgKF9NSVBTX1NaTE9ORyA9PSA2NCkKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBzaXplX3Q7CisjICAgICAgZW5kaWYKKyMgICAgZW5kaWYKKyMgICAgaWYgIWRlZmluZWQgKF9XQ0hBUl9UKQorIyAgICAgIGRlZmluZSBfV0NIQVJfVAorIyAgICAgIGlmIChfTUlQU19TWkxPTkcgPT0gMzIpCit0eXBlZGVmIGxvbmcgd2NoYXJfdDsKKyMgICAgICBlbmRpZgorIyAgICAgIGlmIChfTUlQU19TWkxPTkcgPT0gNjQpCit0eXBlZGVmIF9faW50MzJfdCB3Y2hhcl90OworIyAgICAgIGVuZGlmCisjICAgIGVuZGlmIC8qIF9XQ0hBUl9UICovCisjICAgIGlmICFkZWZpbmVkIChfV0lOVF9UKQorIyAgICAgIGRlZmluZSBfV0lOVF9UCisjICAgICAgaWYgKF9NSVBTX1NaTE9ORyA9PSAzMikKK3R5cGVkZWYgbG9uZyB3aW50X3Q7CisjICAgICAgZW5kaWYKKyMgICAgICBpZiAoX01JUFNfU1pMT05HID09IDY0KQordHlwZWRlZiBfX2ludDMyX3Qgd2ludF90OworIyAgICAgIGVuZGlmCisjICAgIGVuZGlmIC8qIF9XSU5UX1QgKi8KKyMgICAgaWYgIWRlZmluZWQgKF9NQlNUQVRFX1QpCisjICAgICAgZGVmaW5lIF9NQlNUQVRFX1QKKy8qIF9NU0NfVkVSIGNoZWNrIGlzIGhlcmUgZm9yIGhpc3RvcmljYWwgcmVhc29uIGFuZCBzZWVtcyB3cm9uZyBhcyBpdCBpcyB0aGUgbWFjcm8gZGVmaW5lZAorICogYnkgTWljcm9zb2Z0IGNvbXBpbGVycyB0byBnaXZlIHRoZWlyIHZlcnNpb24gYW5kIHdlIGFyZSBjdXJyZW50bHkgaW4gYSBTR0kgcGxhdGZvcm0gc2NvcGUuCisgKiBIb3dldmVyIF9NU0NfVkVSIG1pZ2h0IGFsc28gYmUgYSBTR0kgY29tcGlsZXIgbWFjcm8gc28gd2Uga2VlcCBpdCB0aGlzIHdheS4qLworIyAgICAgIGlmIGRlZmluZWQgKF9NU0NfVkVSKQordHlwZWRlZiBpbnQgbWJzdGF0ZV90OworIyAgICAgIGVsc2UKK3R5cGVkZWYgY2hhciBtYnN0YXRlX3Q7CisjICAgICAgZW5kaWYKKyMgICAgZW5kaWYgLyogX01CU1RBVEVfVCAqLworIyAgZW5kaWYgLyogUk9PVDY1ICovCisjZWxzZSAvKiBfX3NnaSAqLworIyAgaW5jbHVkZSA8c3RkZGVmLmg+CisjICBpZiAhZGVmaW5lZCAoQU5EUk9JRCkKKy8qIFRoZSBBbmRyb2lkIHdjaGFyLmggaGVhZGVyIGlzIGJyb2tlbiwgYW5kIHRyaWVzIHRvIHJlZGVmaW5lIHdjaGFyX3QuICovCisjICAgIGluY2x1ZGUgPHdjaGFyLmg+CisjICBlbmRpZgorIyAgaW5jbHVkZSA8Y3R5cGUuaD4KKyNlbmRpZiAvKiBfX3NnaSAqLworCisvKgorICogR0VORVJBTCBGUkFNRVdPUksKKyAqLworCisvKgorICogT3BhcXVlIHR5cGVzLCBpbXBsZW1lbnRhdGlvbiAoaWYgdGhlcmUgaXMgb25lKSBkZXBlbmRzCisgKiBvbiBwbGF0Zm9ybSBsb2NhbGUgQVBJLgorICovCitzdHJ1Y3QgX0xvY2FsZV9jdHlwZTsKK3N0cnVjdCBfTG9jYWxlX251bWVyaWM7CitzdHJ1Y3QgX0xvY2FsZV90aW1lOworc3RydWN0IF9Mb2NhbGVfY29sbGF0ZTsKK3N0cnVjdCBfTG9jYWxlX21vbmV0YXJ5Oworc3RydWN0IF9Mb2NhbGVfbWVzc2FnZXM7CitzdHJ1Y3QgX0xvY2FsZV9uYW1lX2hpbnQ7CisKKy8qCisgIEJpdG1hc2sgbWFjcm9zLgorKi8KKworLyoKKyAqIEZvciBuYXJyb3cgY2hhcmFjdGVycywgd2UgZXhwb3NlIHRoZSBsb29rdXAgdGFibGUgaW50ZXJmYWNlLgorICovCisKKy8qIEludGVybmFsIGJpdG1hc2sgbWFjcm9zLCBvcy1zcGVjaWZpYy4gKi8KKworI2lmIGRlZmluZWQgKF9fc2dpKSAgICAgICAgICAgICAgLyogSVJJWCAqLworCisjICBkZWZpbmUgX0xvY2FsZV9TICAgICAgMHgwMDAwMDAwOCAgICAgIC8qIFNwYWNpbmcgY2hhcmFjdGVyICovCisjICBkZWZpbmUgX0xvY2FsZV9BICAgICAgMHgwMDAwNDAwMCAgICAgIC8qIEFscGhhYmV0aWNhbCBjaGFyYWN0ZXJzIG9ubHkgKi8KKyMgIGRlZmluZSBfTG9jYWxlX0IgICAgICAweDAwMDAwMDQwICAgICAgLyogT2Jzb2xldGU6IHdhcyBzcGFjZSBjaGFyIG9ubHkgKi8KKyMgIGRlZmluZSBfTG9jYWxlX1BSICAgICAweDAwMDA4MDAwICAgICAgLyogUHJpbnRhYmxlIGNoYXJhY3RlcnMgb25seSAqLworIyAgZGVmaW5lIF9Mb2NhbGVfRyAgICAgIDB4NDAwMDAwMDAgICAgICAvKiBHcmFwaGljIGNoYXJhY3RlcnMgb25seSAqLworIyAgZGVmaW5lIF9Mb2NhbGVfQkwgICAgIDB4ODAwMDAwMDAgICAgICAvKiBUaGUgYmxhbmsgY2hhcmFjdGVyIGNsYXNzICovCisKKy8qIFB1YmxpYyBiaXRtYXNrIG1hY3JvcywgbXVzdCBiZSBkZWZpbmVkIGZvciBldmVyeSBPUy4gVGhlc2UgdmFsdWVzLCBvZgorICogY291cnNlLCBhcmUgc3BlY2lmaWMgdG8gSVJJWC4gKi8KKworIyAgZGVmaW5lIF9Mb2NhbGVfQ05UUkwgIDB4MDAwMDAwMjAgICAgICAvKiBDb250cm9sIGNoYXJhY3RlciAqLworIyAgZGVmaW5lIF9Mb2NhbGVfVVBQRVIgIDB4MDAwMDAwMDEgICAgICAvKiBVcHBlciBjYXNlICovCisjICBkZWZpbmUgX0xvY2FsZV9MT1dFUiAgMHgwMDAwMDAwMiAgICAgIC8qIExvd2VyIGNhc2UgKi8KKyMgIGRlZmluZSBfTG9jYWxlX0RJR0lUICAweDAwMDAwMDA0ICAgICAgLyogTnVtZXJhbCAoZGlnaXQpICovCisjICBkZWZpbmUgX0xvY2FsZV9YRElHSVQgMHgwMDAwMDA4MCAgICAgIC8qIGhlWGFkZWNpbWFsIGRpZ2l0ICovCisjICBkZWZpbmUgX0xvY2FsZV9QVU5DVCAgMHgwMDAwMDAxMCAgICAgIC8qIFB1bmN0dWF0aW9uICovCisjICBkZWZpbmUgX0xvY2FsZV9TUEFDRSAgKF9Mb2NhbGVfUyB8IF9Mb2NhbGVfQkwpCisjICBkZWZpbmUgX0xvY2FsZV9QUklOVCAgKF9Mb2NhbGVfUFVOQ1QgfCBfTG9jYWxlX1VQUEVSIHwgX0xvY2FsZV9MT1dFUiB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9Mb2NhbGVfRElHSVQgfCBfTG9jYWxlX0EgfCBfTG9jYWxlX1hESUdJVCB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9Mb2NhbGVfUFIpCisjICBkZWZpbmUgX0xvY2FsZV9BTFBIQSAgX0xvY2FsZV9BCisKKy8qCisqIEFsbCBvZiB0aGVzZSBleGNlcHQgZm9yIGdyYXBoIGFuZCBibGFuayBhcmUgZnJvbSB0aGUgQyBzdGFuZGFyZDsKKyogZ3JhcGggYW5kIGJsYW5rIGFyZSBYUEc0LiAgKGdyYXBoIGluIFhQRzQgZG9lc24ndCBtZWFuIHF1aXRlIHRoZQorKiBzYW1lIHRoaW5nIGFzIGdyYXBoIGluIHRoZSBDKysgbGlicmFyeSkKKyovCisKKyNlbmRpZiAvKiBJUklYICovCisKKworI2lmIGRlZmluZWQgKF9fTHlueF9fKQorIC8qIGF6b3Y6IE9uIEx5bnggaXNhbHBoYSBkZWZpbmVkIGFzIChfVSB8IF9MKSwgd2hpY2ggZ2l2ZXMgdXMgYSBtYXNrCisgICogdW51c2FibGUgaW4gY3R5cGVfdGFibGUuIFNvIHdlIGhhdmUgdG8gcmVkZWZpbmUgaXQgYW5kIHVzZSBoYXJkLWNvZGVkCisgICogbnVtYmVycyAodG8gYXZvaWQgcG90ZW50aWFsIGNsYXNoZXMgaWYgc3lzdGVtIGhlYWRlcnMgY2hhbmdlKS4KKyAgKgorICAqIFAuUy4gQWN0dWFsbHksIEkgc2VlIG5vIHJlYXNvbiBpbiB1c2luZyBwbGF0Zm9ybS1zcGVjaWZpYyBtYXNrcyAtCisgICogaGF2aW5nIGp1c3Qgb25lIHNldCBvZiBtYXNrcyBmb3IgYWxsIHBsYXRmb3JtcyBzaG91bGQgd29yayBqdXN0IGFzCisgICogd2VsbCAtIHdlIG9ubHkgdXNlIHRoZW0gaW50ZXJuYWxseSBhbmQgdGhleSBkb24ndCBoYXZlIHRvIGJlIGVxdWFsCisgICogdG8gd2hhdGV2ZXIgZGVmaW5lZCBpbiBsb2NhbCBjdHlwZS5oCisgICoKKyAgKi8KKyMgIGRlZmluZSBfTG9jYWxlX0NOVFJMICAwNDAgICAgIC8qIF9DLCBDb250cm9sIGNoYXJhY3RlciAqLworIyAgZGVmaW5lIF9Mb2NhbGVfVVBQRVIgIDAxICAgICAgLyogX1UsIFVwcGVyIGNhc2UgKi8KKyMgIGRlZmluZSBfTG9jYWxlX0xPV0VSICAwMiAgICAgIC8qIF9MLCBMb3dlciBjYXNlICovCisjICBkZWZpbmUgX0xvY2FsZV9ESUdJVCAgMDQgICAgICAvKiBfTiwgTnVtZXJhbCAoZGlnaXQpICovCisjICBkZWZpbmUgX0xvY2FsZV9YRElHSVQgMDIwMCAgICAvKiBfWCwgaGVYYWRlY2ltYWwgZGlnaXQgKi8KKyMgIGRlZmluZSBfTG9jYWxlX1BVTkNUICAwMjAgICAgIC8qIF9QLCBQdW5jdHVhdGlvbiAqLworIyAgZGVmaW5lIF9Mb2NhbGVfU1BBQ0UgIDAxMCAgICAgLyogX1MsIFNwYWNpbmcgKi8KKyMgIGRlZmluZSBfTG9jYWxlX0FMUEhBICAwNDAwMDAgIC8qIG5vbmUsIEFscGhhbnVtZXJpY2FsICovCisjICBkZWZpbmUgX0xvY2FsZV9QUklOVCAgKF9Mb2NhbGVfUFVOQ1QgfCBfTG9jYWxlX1VQUEVSIHwgX0xvY2FsZV9MT1dFUiB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX0xvY2FsZV9ESUdJVCB8IF9Mb2NhbGVfQUxQSEEgfCBfTG9jYWxlX1hESUdJVCB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICBfTG9jYWxlX1NQQUNFICkgLyogUHJpbnRhYmxlICovCisjZW5kaWYgLyogX19MeW54X18gKi8KKworI2lmIGRlZmluZWQgKF9fR05VQ19fKSB8fCBkZWZpbmVkIChfX0JPUkxBTkRDX18pIHx8IGRlZmluZWQgKF9fQ09NT19fKQorCisjICBpZiBkZWZpbmVkIChfX0NZR1dJTl9fKQorCisjICAgIGRlZmluZSBfTG9jYWxlX0NOVFJMICAwNDAKKyMgICAgZGVmaW5lIF9Mb2NhbGVfVVBQRVIgIDAyCisjICAgIGRlZmluZSBfTG9jYWxlX0xPV0VSICAwMQorIyAgICBkZWZpbmUgX0xvY2FsZV9ESUdJVCAgMDQKKyMgICAgZGVmaW5lIF9Mb2NhbGVfWERJR0lUICggMDEwMCB8IF9Mb2NhbGVfRElHSVQgKQorIyAgICBkZWZpbmUgX0xvY2FsZV9QVU5DVCAgMDIwCisjICAgIGRlZmluZSBfTG9jYWxlX1NQQUNFICAwMTAKKyMgICAgZGVmaW5lIF9Mb2NhbGVfQUxQSEEgIDAyMDAKKyMgICAgZGVmaW5lIF9Mb2NhbGVfUFJJTlQgIChfTG9jYWxlX0FMUEhBIHwgX0xvY2FsZV9ESUdJVCB8IF9Mb2NhbGVfUFVOQ1QgfCAwNDAwICkKKworIyAgZWxpZiBkZWZpbmVkIChfX0ZyZWVCU0RfXykgfHwgKCBkZWZpbmVkIChfX0FQUExFX18pICYmIGRlZmluZWQgKF9fR05VQ19fKSAmJiAoX19HTlVDX18gPiAzKSApCisKKyMgICAgZGVmaW5lIF9Mb2NhbGVfQ05UUkwgX0NUWVBFX0MKKyMgICAgZGVmaW5lIF9Mb2NhbGVfVVBQRVIgX0NUWVBFX1UKKyMgICAgZGVmaW5lIF9Mb2NhbGVfTE9XRVIgX0NUWVBFX0wKKyMgICAgZGVmaW5lIF9Mb2NhbGVfRElHSVQgX0NUWVBFX0QKKyMgICAgZGVmaW5lIF9Mb2NhbGVfWERJR0lUIF9DVFlQRV9YCisjICAgIGRlZmluZSBfTG9jYWxlX1BVTkNUIF9DVFlQRV9QCisjICAgIGRlZmluZSBfTG9jYWxlX1NQQUNFIF9DVFlQRV9TCisjICAgIGRlZmluZSBfTG9jYWxlX1BSSU5UIF9DVFlQRV9SCisjICAgIGRlZmluZSBfTG9jYWxlX0FMUEhBIF9DVFlQRV9BCisKKyMgIGVsaWYgZGVmaW5lZCAoX19OZXRCU0RfXykgfHwgZGVmaW5lZCAoX19PcGVuQlNEX18pIHx8IGRlZmluZWQgKF9fYW1pZ2Fvc19fKSB8fCBkZWZpbmVkKEFORFJPSUQpCisKKyMgICAgZGVmaW5lIF9Mb2NhbGVfQ05UUkwgX0MKKyMgICAgZGVmaW5lIF9Mb2NhbGVfVVBQRVIgX1UKKyMgICAgZGVmaW5lIF9Mb2NhbGVfTE9XRVIgX0wKKyMgICAgZGVmaW5lIF9Mb2NhbGVfRElHSVQgX04KKyMgICAgZGVmaW5lIF9Mb2NhbGVfWERJR0lUIChfTnxfWCkKKyMgICAgZGVmaW5lIF9Mb2NhbGVfUFVOQ1QgX1AKKyMgICAgZGVmaW5lIF9Mb2NhbGVfU1BBQ0UgX1MKKyMgICAgZGVmaW5lIF9Mb2NhbGVfUFJJTlQgKF9QfF9VfF9MfF9OfF9CKQorIyAgICBkZWZpbmUgX0xvY2FsZV9BTFBIQSAoX1V8X0wpCisjICBlbGlmIGRlZmluZWQgKF9fRU1YX18pIC8qIE9TLzIgd2l0aCBlbXggcnVudGltZSAqLworIyAgICBkZWZpbmUgX0xvY2FsZV9DTlRSTCBfQ05UUkwKKyMgICAgZGVmaW5lIF9Mb2NhbGVfVVBQRVIgX1VQUEVSCisjICAgIGRlZmluZSBfTG9jYWxlX0xPV0VSIF9MT1dFUgorIyAgICBkZWZpbmUgX0xvY2FsZV9ESUdJVCBfRElHSVQKKyMgICAgZGVmaW5lIF9Mb2NhbGVfWERJR0lUIF9YRElHSVQKKyMgICAgZGVmaW5lIF9Mb2NhbGVfUFVOQ1QgX1BVTkNUCisjICAgIGRlZmluZSBfTG9jYWxlX1NQQUNFIF9TUEFDRQorIyAgICBkZWZpbmUgX0xvY2FsZV9QUklOVCBfUFJJTlQKKyMgICAgZGVmaW5lIF9Mb2NhbGVfQUxQSEEgKF9VUFBFUnxfTE9XRVIpCisKKyMgIGVsaWYgZGVmaW5lZCAoX1NUTFBfVVNFX0dMSUJDKSAvKiBsaW51eCwgdXNpbmcgdGhlIGdudSBjb21waWxlciAqLworCisvKiBUaGlzIHNlY3Rpb24gdXNlcyBtYWNyb3MgZGVmaW5lZCBpbiB0aGUgZ251IGxpYmMgY3R5cGUuaCBoZWFkZXIgKi8KKworIyAgICBkZWZpbmUgX0xvY2FsZV9DTlRSTCAgX0lTY250cmwKKyMgICAgZGVmaW5lIF9Mb2NhbGVfVVBQRVIgIF9JU3VwcGVyCisjICAgIGRlZmluZSBfTG9jYWxlX0xPV0VSICBfSVNsb3dlcgorIyAgICBkZWZpbmUgX0xvY2FsZV9ESUdJVCAgX0lTZGlnaXQKKyMgICAgZGVmaW5lIF9Mb2NhbGVfWERJR0lUIF9JU3hkaWdpdAorIyAgICBkZWZpbmUgX0xvY2FsZV9QVU5DVCAgX0lTcHVuY3QKKyMgICAgZGVmaW5lIF9Mb2NhbGVfU1BBQ0UgIF9JU3NwYWNlCisjICAgIGRlZmluZSBfTG9jYWxlX1BSSU5UICBfSVNwcmludAorIyAgICBkZWZpbmUgX0xvY2FsZV9BTFBIQSAgX0lTYWxwaGEKKworIyAgZW5kaWYgLyogR0xJQkMgKi8KKworI2VuZGlmIC8qIGdudSAqLworCisjaWYgKGRlZmluZWQgKF9fc3VuKSAmJiBkZWZpbmVkIChfX1NWUjQpKSB8fCBcCisgICAgKGRlZmluZWQgKF9fZGlnaXRhbF9fKSAmJiBkZWZpbmVkIChfX3VuaXhfXykpIHx8IFwKKyAgICAgZGVmaW5lZCAoX0FJWCkKKy8qIGZicCA6IGNvbmRpdGlvbiBmcm9tIEFUJlQgY29kZSovCisjICBpZiAhKGRlZmluZWQgKF9fWFBHNF9DSEFSX0NMQVNTX18pIHx8IGRlZmluZWQgKF9YUEc0XzIpIHx8IFwKKyAgICAgICAoZGVmaW5lZCAoX1hPUEVOX1NPVVJDRSkgJiYgKF9YT1BFTl9WRVJTSU9OIC0gMCA9PSA0KSkpICYmICEgZGVmaW5lZCAoX0lTQ05UUkwpCisgIC8qIGZicCA6IG9uIDIuNS4xLCB0aGUgZGVmaW5lcyBhcmUgZGlmZmVyZW50IDsoICovCisgIC8qICMgaWYgKCBkZWZpbmVkIChfX3N1bikgJiYgZGVmaW5lZCAoX19TVlI0KSAmJiAhIGRlZmluZWQgKF9JU0NOVFJMKSApICovCisjICAgIGRlZmluZSBfSVNDTlRSTCBfQworIyAgICBkZWZpbmUgX0lTVVBQRVIgX1UKKyMgICAgZGVmaW5lIF9JU0xPV0VSIF9MCisjICAgIGRlZmluZSBfSVNESUdJVCBfTgorIyAgICBkZWZpbmUgX0lTWERJR0lUIF9YCisjICAgIGRlZmluZSBfSVNQVU5DVCBfUAorIyAgICBkZWZpbmUgX0lTU1BBQ0UgX1MKKyMgICAgZGVmaW5lIF9JU1BSSU5UIChfUCB8IF9VIHwgX0wgfCBfTiB8IF9CKQorIyAgICBkZWZpbmUgX0lTQUxQSEEgKF9VIHwgX0wpCisjICBlbmRpZgorCisjICBkZWZpbmUgX0xvY2FsZV9DTlRSTCAgX0lTQ05UUkwKKyMgIGRlZmluZSBfTG9jYWxlX1VQUEVSICBfSVNVUFBFUgorIyAgZGVmaW5lIF9Mb2NhbGVfTE9XRVIgIF9JU0xPV0VSCisjICBkZWZpbmUgX0xvY2FsZV9ESUdJVCAgX0lTRElHSVQKKyMgIGRlZmluZSBfTG9jYWxlX1hESUdJVCBfSVNYRElHSVQKKyMgIGRlZmluZSBfTG9jYWxlX1BVTkNUICBfSVNQVU5DVAorIyAgZGVmaW5lIF9Mb2NhbGVfU1BBQ0UgIF9JU1NQQUNFCisjICBkZWZpbmUgX0xvY2FsZV9QUklOVCAgX0lTUFJJTlQKKyMgIGRlZmluZSBfTG9jYWxlX0FMUEhBICBfSVNBTFBIQQorI2VsaWYgZGVmaW5lZCAoX19NV0VSS1NfXykgJiYgZGVmaW5lZCAoTl9QTEFUX05MTSkKKyMgIGRlZmluZSBfTG9jYWxlX0NOVFJMICBfQ05UUkxfCisjICBkZWZpbmUgX0xvY2FsZV9VUFBFUiAgX1VQUEVSXworIyAgZGVmaW5lIF9Mb2NhbGVfTE9XRVIgIF9MT1dFUl8KKyMgIGRlZmluZSBfTG9jYWxlX0RJR0lUICBfRElHSVRfCisjICBkZWZpbmUgX0xvY2FsZV9YRElHSVQgX1hESUdJVF8KKyMgIGRlZmluZSBfTG9jYWxlX1BVTkNUICBfUFVOQ1RfCisjICBkZWZpbmUgX0xvY2FsZV9TUEFDRSAgX1NQQUNFXworIyAgZGVmaW5lIF9Mb2NhbGVfUFJJTlQgIChfUFVOQ1RffF9VUFBFUl98X0xPV0VSX3xfRElHSVRffF9CTEFOS18pCisjICBkZWZpbmUgX0xvY2FsZV9BTFBIQSAgKF9VUFBFUl98X0xPV0VSXykKKyNlbGlmIGRlZmluZWQgKF9fTVdFUktTX18pCisjICBkZWZpbmUgX0xvY2FsZV9DTlRSTCAgX19jb250cm9sX2NoYXIKKyMgIGRlZmluZSBfTG9jYWxlX1VQUEVSICBfX3VwcGVyX2Nhc2UKKyMgIGRlZmluZSBfTG9jYWxlX0xPV0VSICBfX2xvd2VyX2Nhc2UKKyMgIGRlZmluZSBfTG9jYWxlX0RJR0lUICBfX2RpZ2l0CisjICBkZWZpbmUgX0xvY2FsZV9YRElHSVQgX19oZXhfZGlnaXQKKyMgIGRlZmluZSBfTG9jYWxlX1BVTkNUICBfX3B1bmN0dWF0aW9uCisjICBkZWZpbmUgX0xvY2FsZV9TUEFDRSAgX19zcGFjZV9jaGFyCisjICBkZWZpbmUgX0xvY2FsZV9QUklOVCAgX19wcmludGFibGUKKyMgIGRlZmluZSBfTG9jYWxlX0FMUEhBICBfX2FscGhhbnVtZXJpYworI2VsaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKQorIyAgZGVmaW5lIF9Mb2NhbGVfQ05UUkwgIF9JU19DVEwKKyMgIGRlZmluZSBfTG9jYWxlX1VQUEVSICBfSVNfVVBQCisjICBkZWZpbmUgX0xvY2FsZV9MT1dFUiAgX0lTX0xPVworIyAgZGVmaW5lIF9Mb2NhbGVfRElHSVQgIF9JU19ESUcKKyMgIGRlZmluZSBfTG9jYWxlX1hESUdJVCBfSVNfSEVYCisjICBkZWZpbmUgX0xvY2FsZV9QVU5DVCAgX0lTX1BVTgorIyAgZGVmaW5lIF9Mb2NhbGVfU1BBQ0UgIF9JU19TUAorIyAgZGVmaW5lIF9Mb2NhbGVfUFJJTlQgIChfSVNfU1B8X0lTX1BVTnxfSVNfVVBQfF9JU19MT1d8X0lTX0RJRykKKyMgIGRlZmluZSBfTG9jYWxlX0FMUEhBICBfSVNfQUxQSEEKKyNlbGlmIGRlZmluZWQgKF9TVExQX01TVkNfTElCKSB8fCBkZWZpbmVkIChfX01JTkdXMzJfXykKKyMgIGRlZmluZSBfTG9jYWxlX0NOVFJMICBfQ09OVFJPTAorIyAgZGVmaW5lIF9Mb2NhbGVfVVBQRVIgIF9VUFBFUgorIyAgZGVmaW5lIF9Mb2NhbGVfTE9XRVIgIF9MT1dFUgorIyAgZGVmaW5lIF9Mb2NhbGVfRElHSVQgIF9ESUdJVAorIyAgZGVmaW5lIF9Mb2NhbGVfWERJR0lUIF9IRVgKKyMgIGRlZmluZSBfTG9jYWxlX1BVTkNUICBfUFVOQ1QKKyMgIGRlZmluZSBfTG9jYWxlX1NQQUNFICBfU1BBQ0UKKyMgIGRlZmluZSBfTG9jYWxlX1BSSU5UICAoX0FMUEhBIHwgX0RJR0lUIHwgX0JMQU5LIHwgX1BVTkNUKQorIyAgZGVmaW5lIF9Mb2NhbGVfQUxQSEEgICggX0FMUEhBICYgfiAoX1VQUEVSIHwgX0xPV0VSICkpCisjZWxpZiBkZWZpbmVkIChfX0RNQ19fKQorIyAgZGVmaW5lIF9Mb2NhbGVfQ05UUkwgIF9DT05UUk9MCisjICBkZWZpbmUgX0xvY2FsZV9VUFBFUiAgX1VQUEVSCisjICBkZWZpbmUgX0xvY2FsZV9MT1dFUiAgX0xPV0VSCisjICBkZWZpbmUgX0xvY2FsZV9ESUdJVCAgX0RJR0lUCisjICBkZWZpbmUgX0xvY2FsZV9YRElHSVQgX0hFWAorIyAgZGVmaW5lIF9Mb2NhbGVfUFVOQ1QgIF9QVU5DVAorIyAgZGVmaW5lIF9Mb2NhbGVfU1BBQ0UgIF9TUEFDRQorIyAgZGVmaW5lIF9Mb2NhbGVfUFJJTlQgIChfVVBQRVIgfCBfTE9XRVIgfCBfRElHSVQgfCBfUFVOQ1QgfCBfU1BBQ0UpCisjICBkZWZpbmUgX0xvY2FsZV9BTFBIQSAgX0FMUEhBICYgfihfVVBQRVIgfCBfTE9XRVIpCisjZWxpZiBkZWZpbmVkIChfX01SQ19fKSB8fCBkZWZpbmVkIChfX1NDX18pICAgIC8qICpUWSAwMi8yNC8yMDAwIC0gYWRkZWQgc3VwcG9ydCBmb3IgTVBXICovCisjICBkZWZpbmUgX0xvY2FsZV9DTlRSTCAgX0NUTAorIyAgZGVmaW5lIF9Mb2NhbGVfVVBQRVIgIF9VUFAKKyMgIGRlZmluZSBfTG9jYWxlX0xPV0VSICBfTE9XCisjICBkZWZpbmUgX0xvY2FsZV9ESUdJVCAgX0RJRworIyAgZGVmaW5lIF9Mb2NhbGVfWERJR0lUIF9IRVgKKyMgIGRlZmluZSBfTG9jYWxlX1BVTkNUICBfUFVOCisjICBkZWZpbmUgX0xvY2FsZV9TUEFDRSAgX0JMQQorIyAgZGVmaW5lIF9Mb2NhbGVfUFJJTlQgIChfVVBQIHwgX0xPVyB8IF9ESUcgfCBfUFVOIHwgX0JMQSkKKyMgIGRlZmluZSBfTG9jYWxlX0FMUEhBICAoX1VQUCB8IF9MT1cpCisjZWxpZiBkZWZpbmVkIChfX01MQ0NQUF9fKQorIyAgZGVmaW5lIF9Mb2NhbGVfQ05UUkwgICAgMQorIyAgZGVmaW5lIF9Mb2NhbGVfVVBQRVIgICAgMgorIyAgZGVmaW5lIF9Mb2NhbGVfTE9XRVIgICAgNAorIyAgZGVmaW5lIF9Mb2NhbGVfRElHSVQgICAgOAorIyAgZGVmaW5lIF9Mb2NhbGVfWERJR0lUICAxNgorIyAgZGVmaW5lIF9Mb2NhbGVfUFVOQ1QgICAzMgorIyAgZGVmaW5lIF9Mb2NhbGVfU1BBQ0UgICA2NAorIyAgZGVmaW5lIF9Mb2NhbGVfUFJJTlQgIDEyOAorIyAgZGVmaW5lIF9Mb2NhbGVfQUxQSEEgIDI1NgorI2VsaWYgZGVmaW5lZCAoX19HTlVDX18pICYmIChfX0dOVUNfXyA9PSAzKSAmJiBkZWZpbmVkIChfX0FQUExFX18pCisjICBkZWZpbmUgX0xvY2FsZV9DTlRSTCBfQworIyAgZGVmaW5lIF9Mb2NhbGVfVVBQRVIgX1UKKyMgIGRlZmluZSBfTG9jYWxlX0xPV0VSIF9MCisjICBkZWZpbmUgX0xvY2FsZV9ESUdJVCBfRAorIyAgZGVmaW5lIF9Mb2NhbGVfWERJR0lUIF9YCisjICBkZWZpbmUgX0xvY2FsZV9QVU5DVCBfUAorIyAgZGVmaW5lIF9Mb2NhbGVfU1BBQ0UgX1MKKyMgIGRlZmluZSBfTG9jYWxlX1BSSU5UIF9SCisjICBkZWZpbmUgX0xvY2FsZV9BTFBIQSBfQQorI2VsaWYgZGVmaW5lZCAoX19ocHV4KSB8fCBkZWZpbmVkIChfX29zZl9fKQorIyAgaWYgZGVmaW5lZCAoX19IUF9hQ0MpICYmICFkZWZpbmVkIChfSU5DTFVERV9IUFVYX1NPVVJDRSkKKyMgICAgZGVmaW5lIF9JU0FMUEhBICAgICAgMHgwMDEKKyMgICAgZGVmaW5lIF9JU0FMTlVNICAgICAgMHgwMDIKKyMgICAgZGVmaW5lIF9JU0JMQU5LICAgICAgMHgwMDQKKyMgICAgZGVmaW5lIF9JU0NOVFJMICAgICAgMHgwMDgKKyMgICAgZGVmaW5lIF9JU0RJR0lUICAgICAgMHgwMTAKKyMgICAgZGVmaW5lIF9JU0dSQVBIICAgICAgMHgwMjAKKyMgICAgZGVmaW5lIF9JU0xPV0VSICAgICAgMHgwNDAKKyMgICAgZGVmaW5lIF9JU1BSSU5UICAgICAgMHgwODAKKyMgICAgZGVmaW5lIF9JU1BVTkNUICAgICAgMHgxMDAKKyMgICAgZGVmaW5lIF9JU1NQQUNFICAgICAgMHgyMDAKKyMgICAgZGVmaW5lIF9JU1VQUEVSICAgICAgMHg0MDAKKyMgICAgZGVmaW5lIF9JU1hESUdJVCAgICAgMHg4MDAKKyMgIGVuZGlmCisjICBkZWZpbmUgX0xvY2FsZV9DTlRSTCAgX0lTQ05UUkwKKyMgIGRlZmluZSBfTG9jYWxlX1VQUEVSICBfSVNVUFBFUgorIyAgZGVmaW5lIF9Mb2NhbGVfTE9XRVIgIF9JU0xPV0VSCisjICBkZWZpbmUgX0xvY2FsZV9ESUdJVCAgX0lTRElHSVQKKyMgIGRlZmluZSBfTG9jYWxlX1hESUdJVCBfSVNYRElHSVQKKyMgIGRlZmluZSBfTG9jYWxlX1BVTkNUICBfSVNQVU5DVAorIyAgZGVmaW5lIF9Mb2NhbGVfU1BBQ0UgIF9JU1NQQUNFCisjICBkZWZpbmUgX0xvY2FsZV9QUklOVCAgX0lTUFJJTlQKKyMgIGRlZmluZSBfTG9jYWxlX0FMUEhBICBfSVNBTFBIQQorI2VsaWYgZGVmaW5lZCAoX19NVlNfXykgfHwgZGVmaW5lZCAoX19PUzQwMF9fKQorIyAgZGVmaW5lIF9Mb2NhbGVfQ05UUkwgX19JU0NOVFJMCisjICBkZWZpbmUgX0xvY2FsZV9VUFBFUiBfX0lTVVBQRVIKKyMgIGRlZmluZSBfTG9jYWxlX0xPV0VSIF9fSVNMT1dFUgorIyAgZGVmaW5lIF9Mb2NhbGVfRElHSVQgX19JU0RJR0lUCisjICBkZWZpbmUgX0xvY2FsZV9YRElHSVQgX19JU1hESUdJVAorIyAgZGVmaW5lIF9Mb2NhbGVfUFVOQ1QgX19JU1BVTkNUCisjICBkZWZpbmUgX0xvY2FsZV9TUEFDRSBfX0lTU1BBQ0UKKyMgIGRlZmluZSBfTG9jYWxlX1BSSU5UIF9fSVNQUklOVAorIyAgZGVmaW5lIF9Mb2NhbGVfQUxQSEEgX19JU0FMUEhBCisjZWxpZiBkZWZpbmVkIChfX1FOWE5UT19fKSAgfHwgZGVmaW5lZCAoX19XQVRDT01DX18pCisjICBkZWZpbmUgX0xvY2FsZV9DTlRSTCBfQ05UUkwKKyMgIGRlZmluZSBfTG9jYWxlX1VQUEVSIF9VUFBFUgorIyAgZGVmaW5lIF9Mb2NhbGVfTE9XRVIgX0xPV0VSCisjICBkZWZpbmUgX0xvY2FsZV9ESUdJVCBfRElHSVQKKyMgIGRlZmluZSBfTG9jYWxlX1hESUdJVCBfWERJR1QKKyMgIGRlZmluZSBfTG9jYWxlX1BVTkNUIF9QVU5DVAorIyAgZGVmaW5lIF9Mb2NhbGVfU1BBQ0UgX1NQQUNFCisjICBkZWZpbmUgX0xvY2FsZV9QUklOVCBfUFJJTlQKKyMgIGRlZmluZSBfTG9jYWxlX0FMUEhBIChfVVBQRVIgfCBfTE9XRVIpCisjZWxpZiBkZWZpbmVkIChfX0RKR1BQKQorIyAgZGVmaW5lIF9Mb2NhbGVfQ05UUkwgIF9fZGpfSVNDTlRSTAorIyAgZGVmaW5lIF9Mb2NhbGVfVVBQRVIgIF9fZGpfSVNVUFBFUgorIyAgZGVmaW5lIF9Mb2NhbGVfTE9XRVIgIF9fZGpfSVNMT1dFUgorIyAgZGVmaW5lIF9Mb2NhbGVfRElHSVQgIF9fZGpfSVNESUdJVAorIyAgZGVmaW5lIF9Mb2NhbGVfWERJR0lUIF9fZGpfSVNYRElHSVQKKyMgIGRlZmluZSBfTG9jYWxlX1BVTkNUICBfX2RqX0lTUFVOQ1QKKyMgIGRlZmluZSBfTG9jYWxlX1NQQUNFICBfX2RqX0lTU1BBQ0UKKyMgIGRlZmluZSBfTG9jYWxlX1BSSU5UICBfX2RqX0lTUFJJTlQKKyMgIGRlZmluZSBfTG9jYWxlX0FMUEhBICBfX2RqX0lTQUxQSEEKKyNlbGlmIGRlZmluZWQgKF9TVExQX1NDT19PUEVOU0VSVkVSKQorIyAgZGVmaW5lIF9Mb2NhbGVfQ05UUkwgX0MKKyMgIGRlZmluZSBfTG9jYWxlX1VQUEVSIF9VCisjICBkZWZpbmUgX0xvY2FsZV9MT1dFUiBfTAorIyAgZGVmaW5lIF9Mb2NhbGVfRElHSVQgX04KKyMgIGRlZmluZSBfTG9jYWxlX1hESUdJVCBfWAorIyAgZGVmaW5lIF9Mb2NhbGVfUFVOQ1QgX1AKKyMgIGRlZmluZSBfTG9jYWxlX1NQQUNFIF9TCisjICBkZWZpbmUgX0xvY2FsZV9QUklOVCBfUgorIyAgZGVmaW5lIF9Mb2NhbGVfQUxQSEEgX0EKKyNlbGlmIGRlZmluZWQgKF9fTkNSX1NWUikKKyMgIGRlZmluZSBfTG9jYWxlX0NOVFJMIF9DCisjICBkZWZpbmUgX0xvY2FsZV9VUFBFUiBfVQorIyAgZGVmaW5lIF9Mb2NhbGVfTE9XRVIgX0wKKyMgIGRlZmluZSBfTG9jYWxlX0RJR0lUIF9OCisjICBkZWZpbmUgX0xvY2FsZV9YRElHSVQgX1gKKyMgIGRlZmluZSBfTG9jYWxlX1BVTkNUIF9QCisjICBkZWZpbmUgX0xvY2FsZV9TUEFDRSBfUworIyAgZGVmaW5lIF9Mb2NhbGVfUFJJTlQgKF9QIHwgX1UgfCBfTCB8IF9OIHwgX0IpCisjICBkZWZpbmUgX0xvY2FsZV9BTFBIQSAoX1UgfCBfTCkKKyNlbGlmIGRlZmluZWQgKF9DUkFZKQorIyAgZGVmaW5lIF9Mb2NhbGVfQ05UUkwgIF9DTlRSTAorIyAgZGVmaW5lIF9Mb2NhbGVfVVBQRVIgIF9VUFBFUgorIyAgZGVmaW5lIF9Mb2NhbGVfTE9XRVIgIF9MT1dFUgorIyAgZGVmaW5lIF9Mb2NhbGVfRElHSVQgIF9ESUdJVAorIyAgZGVmaW5lIF9Mb2NhbGVfWERJR0lUIF9YRElHSVQKKyMgIGRlZmluZSBfTG9jYWxlX1BVTkNUICBfUFVOQ1QKKyMgIGRlZmluZSBfTG9jYWxlX1NQQUNFICBfU1BBQ0UKKyMgIGRlZmluZSBfTG9jYWxlX1BSSU5UICBfUFJJTlQKKyMgIGRlZmluZSBfTG9jYWxlX0FMUEhBICBfQUxQSEEKKyNlbmRpZgorCisvKiBXZSBhcmJpdHJhcmlseSBjb25zaWRlciBfTG9jYWxlX0NOVFJMIG1hY3JvIHRvIGNoZWNrIGxvY2FsZSBmYWNldCBudW1lcmljCisgKiBpZGVudGlmaWVyIGhhcyBiZWVuIGRlZmluZWQgZm9yIHRoZSBwbGF0Zm9ybS9jb21waWxlcjoKKyAqLworI2lmICFkZWZpbmVkIChfTG9jYWxlX0NOVFJMKQorIyAgZXJyb3IgVW5hYmxlIHRvIGZpbmQgeW91ciBwbGF0Zm9ybSBsb2NhbGUgZmFjZXRzIGRlZmluaXRpb25zLCBwbGVhc2UgZ3JhbnQgdGhlbS4KKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfQ19MT0NBTEVfSCAqLwpkaWZmIC0tZ2l0IGEvc3RsL2NoYXJfdHJhaXRzLmggYi9zdGwvY2hhcl90cmFpdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmU4ZDA4Ci0tLSAvZGV2L251bGwKKysrIGIvc3RsL2NoYXJfdHJhaXRzLmgKQEAgLTAsMCArMSwyOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmbmRlZiBfU1RMUF9DSEFSX1RSQUlUU19ICisjZGVmaW5lIF9TVExQX0NIQVJfVFJBSVRTX0gKKworLy8gRGVmaW5lIGNoYXJfdHJhaXRzCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1NURERFRgorIyAgaW5jbHVkZSA8c3RsL19jc3RkZGVmLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DU1RSSU5HCisjICBpbmNsdWRlIDxzdGwvX2NzdHJpbmcuaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX191bml4KSB8fCBkZWZpbmVkIChOX1BMQVRfTkxNKQorIyAgaW5jbHVkZSA8c3lzL3R5cGVzLmg+ICAgICAgICAgLy8gRm9yIG9mZl90CisjZW5kaWYgLyogX191bml4ICovCisKKyNpZmRlZiBfX0JPUkxBTkRDX18KKyMgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NfSEVBREVSKG1lbS5oKQorIyAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ19IRUFERVIoc3RyaW5nLmgpCisjICBpbmNsdWRlIF9TVExQX05BVElWRV9DX0hFQURFUihfc3RkZGVmLmgpCisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9DT05TVFJVQ1RfSAorIyAgaW5jbHVkZSA8c3RsL19jb25zdHJ1Y3QuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NXQ0hBUgorIyAgaW5jbHVkZSA8c3RsL19jd2NoYXIuaD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4gY2xhc3MgYWxsb2NhdG9yOworCisjZGVmaW5lIF9TVExQX05VTExfQ0hBUl9JTklUKF9DaFQpIF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQoX0NoVCkKKworI2lmIGRlZmluZWQgKF9fc2dpKSAmJiBkZWZpbmVkIChfU1RMUF9IQVNfTk9fTkVXX0NfSEVBREVSUykgLyogSVJJWCAqLwordHlwZWRlZiBvZmY2NF90IHN0cmVhbW9mZjsKKyNlbGlmIGRlZmluZWQoX1NUTFBfV0NFKQordHlwZWRlZiBsb25nIHN0cmVhbW9mZjsKKyNlbGlmIGRlZmluZWQgKF9TVExQX1dJTjMyKQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfTE9OR19MT05HKSAmJiAhZGVmaW5lZCAoX19DWUdXSU5fXykKKy8vVGhlIFdpbjMyIGZpbGUgaW8gQVBJIHN1cHBvcnQgNjQgYml0cyBhY2Nlc3Mgc28gc3RyZWFtb2ZmIGFuZCBzdHJlYW1zaXplCisvL2hhcyB0byByZWZsZWN0IHRoYXQuIERvIG5vdCBjaGFuZ2UgdGhlIHN0cmluZ2J1ZiBiZWhhdmlvci4KK3R5cGVkZWYgX1NUTFBfTE9OR19MT05HIHN0cmVhbW9mZjsKKyMgIGVsc2UKK3R5cGVkZWYgcHRyZGlmZl90IHN0cmVhbW9mZjsKKyMgIGVuZGlmCisjZWxzZSAvLyBfX3VuaXgKKyMgIGlmZGVmIF9TVExQX1VTRV9ERUZBVUxUX0ZJTEVfT0ZGU0VUCit0eXBlZGVmIG9mZl90IHN0cmVhbW9mZjsKKyMgIGVsaWYgZGVmaW5lZChfTEFSR0VGSUxFX1NPVVJDRSkgfHwgZGVmaW5lZChfTEFSR0VGSUxFNjRfU09VUkNFKSAvKiB8fCBkZWZpbmVkKF9fVVNFX0ZJTEVfT0ZGU0VUNjQpICovIFwKKyAgICAgICAvKiB8fCAoZGVmaW5lZChfRklMRV9PRkZTRVRfQklUUykgJiYgKF9GSUxFX09GRlNFVF9CSVRTID09IDY0KSkgKi8gLyogfHwgZGVmaW5lZCAoX19zZ2kpICYmIGRlZmluZWQgKF9TVExQX0hBU19OT19ORVdfQ19IRUFERVJTKSAqLwordHlwZWRlZiBvZmY2NF90IHN0cmVhbW9mZjsKKyMgIGVsaWYgZGVmaW5lZChBTkRST0lEKQordHlwZWRlZiBsb25nIHN0cmVhbW9mZjsKKyMgIGVsc2UKK3R5cGVkZWYgb2ZmX3Qgc3RyZWFtb2ZmOworIyAgZW5kaWYKKyNlbmRpZiAvKiBfX191bml4ICovCisKKyNpZiBkZWZpbmVkIChfU1RMUF9XSU4zMikKK3R5cGVkZWYgc3RyZWFtb2ZmIHN0cmVhbXNpemU7CisjZWxzZQordHlwZWRlZiBwdHJkaWZmX3Qgc3RyZWFtc2l6ZTsKKyNlbmRpZgorCisvLyBDbGFzcyBmcG9zLCB3aGljaCByZXByZXNlbnRzIGEgcG9zaXRpb24gd2l0aGluIGEgZmlsZS4gIChUaGUgQysrCisvLyBzdGFuZGFyZCBjYWxscyBmb3IgaXQgdG8gYmUgZGVmaW5lZCBpbiA8aW9zPi4gIFRoaXMgaW1wbGVtZW50YXRpb24KKy8vIG1vdmVzIGl0IHRvIDxpb3Nmd2Q+LCB3aGljaCBpcyBpbmNsdWRlZCBieSA8aW9zPi4pCit0ZW1wbGF0ZSA8Y2xhc3MgX1N0YXRlVD4gY2xhc3MgZnBvcyB7CitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZyb20gdGFibGUgODggb2YgdGhlIEMrKyBzdGFuZGFyZC4KKyAgZnBvcyhzdHJlYW1vZmYgX19wb3MpIDogX01fcG9zKF9fcG9zKSwgX01fc3QoX1NUTFBfTlVMTF9DSEFSX0lOSVQoX1N0YXRlVCkpIHt9CisgIGZwb3MoKSA6IF9NX3BvcygwKSwgX01fc3QoX1NUTFBfTlVMTF9DSEFSX0lOSVQoX1N0YXRlVCkpIHt9CisKKyAgb3BlcmF0b3Igc3RyZWFtb2ZmKCkgY29uc3QgeyByZXR1cm4gX01fcG9zOyB9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGZwb3MmIF9feSkgY29uc3QKKyAgeyByZXR1cm4gX01fcG9zID09IF9feS5fTV9wb3M7IH0KKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGZwb3MmIF9feSkgY29uc3QKKyAgeyByZXR1cm4gX01fcG9zICE9IF9feS5fTV9wb3M7IH0KKworICBmcG9zJiBvcGVyYXRvcis9KHN0cmVhbW9mZiBfX29mZikgeworICAgIF9NX3BvcyArPSBfX29mZjsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgZnBvcyYgb3BlcmF0b3ItPShzdHJlYW1vZmYgX19vZmYpIHsKKyAgICBfTV9wb3MgLT0gX19vZmY7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgZnBvcyBvcGVyYXRvcisoc3RyZWFtb2ZmIF9fb2ZmKSB7CisgICAgZnBvcyBfX3RtcCgqdGhpcyk7CisgICAgX190bXAgKz0gX19vZmY7CisgICAgcmV0dXJuIF9fdG1wOworICB9CisgIGZwb3Mgb3BlcmF0b3ItKHN0cmVhbW9mZiBfX29mZikgeworICAgIGZwb3MgX190bXAoKnRoaXMpOworICAgIF9fdG1wIC09IF9fb2ZmOworICAgIHJldHVybiBfX3RtcDsKKyAgfQorCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hbmlwdWxhdGlvbiBvZiB0aGUgc3RhdGUgbWVtYmVyLgorICBfU3RhdGVUIHN0YXRlKCkgY29uc3QgeyByZXR1cm4gX01fc3Q7IH0KKyAgdm9pZCBzdGF0ZShfU3RhdGVUIF9fc3QpIHsgX01fc3QgPSBfX3N0OyB9Citwcml2YXRlOgorICBzdHJlYW1vZmYgX01fcG9zOworICBfU3RhdGVUIF9NX3N0OworfTsKKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19NQlNUQVRFX1QpCit0eXBlZGVmIGZwb3M8bWJzdGF0ZV90PiBzdHJlYW1wb3M7Cit0eXBlZGVmIGZwb3M8bWJzdGF0ZV90PiB3c3RyZWFtcG9zOworI2VuZGlmCisKKy8vIENsYXNzIF9fY2hhcl90cmFpdHNfYmFzZS4KK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9JbnRUPgorY2xhc3MgX19jaGFyX3RyYWl0c19iYXNlIHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBfQ2hhclQgY2hhcl90eXBlOworICB0eXBlZGVmIF9JbnRUIGludF90eXBlOworICB0eXBlZGVmIHN0cmVhbW9mZiBvZmZfdHlwZTsKKyAgdHlwZWRlZiBzdHJlYW1wb3MgcG9zX3R5cGU7CisjaWYgZGVmaW5lZCAoX1NUTFBfTk9fTUJTVEFURV9UKQorICB0eXBlZGVmIGNoYXIgICAgICBzdGF0ZV90eXBlOworI2Vsc2UKKyAgdHlwZWRlZiBtYnN0YXRlX3Qgc3RhdGVfdHlwZTsKKyNlbmRpZgorCisgIHN0YXRpYyB2b2lkIF9TVExQX0NBTEwgYXNzaWduKGNoYXJfdHlwZSYgX19jMSwgY29uc3QgY2hhcl90eXBlJiBfX2MyKSB7IF9fYzEgPSBfX2MyOyB9CisgIHN0YXRpYyBib29sIF9TVExQX0NBTEwgZXEoY29uc3QgY2hhcl90eXBlJiBfX2MxLCBjb25zdCBjaGFyX3R5cGUmIF9fYzIpCisgIHsgcmV0dXJuIF9fYzEgPT0gX19jMjsgfQorICBzdGF0aWMgYm9vbCBfU1RMUF9DQUxMIGx0KGNvbnN0IGNoYXJfdHlwZSYgX19jMSwgY29uc3QgY2hhcl90eXBlJiBfX2MyKQorICB7IHJldHVybiBfX2MxIDwgX19jMjsgfQorCisgIHN0YXRpYyBpbnQgX1NUTFBfQ0FMTCBjb21wYXJlKGNvbnN0IGNoYXJfdHlwZSogX19zMSwgY29uc3QgY2hhcl90eXBlKiBfX3MyLCBzaXplX3QgX19uKSB7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19uOyArK19faSkKKyAgICAgIGlmICghZXEoX19zMVtfX2ldLCBfX3MyW19faV0pKQorICAgICAgICByZXR1cm4gX19zMVtfX2ldIDwgX19zMltfX2ldID8gLTEgOiAxOworICAgIHJldHVybiAwOworICB9CisKKyAgc3RhdGljIHNpemVfdCBfU1RMUF9DQUxMIGxlbmd0aChjb25zdCBjaGFyX3R5cGUqIF9fcykgeworICAgIGNvbnN0IGNoYXJfdHlwZSBfTnVsbENoYXIgPSBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKGNoYXJfdHlwZSk7CisgICAgc2l6ZV90IF9faSgwKTsKKyAgICBmb3IgKDsgIWVxKF9fc1tfX2ldLCBfTnVsbENoYXIpOyArK19faSkge30KKyAgICByZXR1cm4gX19pOworICB9CisKKyAgc3RhdGljIGNvbnN0IGNoYXJfdHlwZSogX1NUTFBfQ0FMTCBmaW5kKGNvbnN0IGNoYXJfdHlwZSogX19zLCBzaXplX3QgX19uLCBjb25zdCBjaGFyX3R5cGUmIF9fYykgeworICAgIGZvciAoIDsgX19uID4gMCA7ICsrX19zLCAtLV9fbikKKyAgICAgIGlmIChlcSgqX19zLCBfX2MpKQorICAgICAgICByZXR1cm4gX19zOworICAgIHJldHVybiAwOworICB9CisKKyAgc3RhdGljIGNoYXJfdHlwZSogX1NUTFBfQ0FMTCBtb3ZlKGNoYXJfdHlwZSogX19zMSwgY29uc3QgY2hhcl90eXBlKiBfX3MyLCBzaXplX3QgX1N6KQorICB7IHJldHVybiAoX1N6ID09IDAgPyBfX3MxIDogKGNoYXJfdHlwZSopbWVtbW92ZShfX3MxLCBfX3MyLCBfU3ogKiBzaXplb2YoY2hhcl90eXBlKSkpOyB9CisKKyAgc3RhdGljIGNoYXJfdHlwZSogX1NUTFBfQ0FMTCBjb3B5KGNoYXJfdHlwZSogX19zMSwgY29uc3QgY2hhcl90eXBlKiBfX3MyLCBzaXplX3QgX19uKSB7CisgICAgcmV0dXJuIChfX24gPT0gMCA/IF9fczEgOgorICAgICAgKGNoYXJfdHlwZSopbWVtY3B5KF9fczEsIF9fczIsIF9fbiAqIHNpemVvZihjaGFyX3R5cGUpKSk7CisgIH0KKworICBzdGF0aWMgY2hhcl90eXBlKiBfU1RMUF9DQUxMIGFzc2lnbihjaGFyX3R5cGUqIF9fcywgc2l6ZV90IF9fbiwgY2hhcl90eXBlIF9fYykgeworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fbjsgKytfX2kpCisgICAgICBfX3NbX19pXSA9IF9fYzsKKyAgICByZXR1cm4gX19zOworICB9CisKKyAgc3RhdGljIGludF90eXBlIF9TVExQX0NBTEwgbm90X2VvZihjb25zdCBpbnRfdHlwZSYgX19jKQorICB7IHJldHVybiAhZXFfaW50X3R5cGUoX19jLCBlb2YoKSkgPyBfX2MgOiBfX1NUQVRJQ19DQVNUKGludF90eXBlLCAwKTsgfQorCisgIHN0YXRpYyBjaGFyX3R5cGUgX1NUTFBfQ0FMTCB0b19jaGFyX3R5cGUoY29uc3QgaW50X3R5cGUmIF9fYykKKyAgeyByZXR1cm4gKGNoYXJfdHlwZSlfX2M7IH0KKworICBzdGF0aWMgaW50X3R5cGUgX1NUTFBfQ0FMTCB0b19pbnRfdHlwZShjb25zdCBjaGFyX3R5cGUmIF9fYykKKyAgeyByZXR1cm4gKGludF90eXBlKV9fYzsgfQorCisgIHN0YXRpYyBib29sIF9TVExQX0NBTEwgZXFfaW50X3R5cGUoY29uc3QgaW50X3R5cGUmIF9fYzEsIGNvbnN0IGludF90eXBlJiBfX2MyKQorICB7IHJldHVybiBfX2MxID09IF9fYzI7IH0KKworICBzdGF0aWMgaW50X3R5cGUgX1NUTFBfQ0FMTCBlb2YoKQorICB7IHJldHVybiAoaW50X3R5cGUpLTE7IH0KK307CisKKy8vIEdlbmVyaWMgY2hhcl90cmFpdHMgY2xhc3MuICBOb3RlIHRoYXQgdGhpcyBjbGFzcyBpcyBwcm92aWRlZCBvbmx5CisvLyAgYXMgYSBiYXNlIGZvciBleHBsaWNpdCBzcGVjaWFsaXphdGlvbjsgaXQgaXMgdW5saWtlbHkgdG8gYmUgdXNlZnVsCisvLyAgYXMgaXMgZm9yIGFueSBwYXJ0aWN1bGFyIHVzZXItZGVmaW5lZCB0eXBlLiAgSW4gcGFydGljdWxhciwgaXQKKy8vICAqd2lsbCBub3Qgd29yayogZm9yIGEgbm9uLVBPRCB0eXBlLgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgorY2xhc3MgY2hhcl90cmFpdHMKKyAgOiBwdWJsaWMgX19jaGFyX3RyYWl0c19iYXNlPF9DaGFyVCwgX0NoYXJUPiB7fTsKKworLy8gU3BlY2lhbGl6YXRpb24gZm9yIGNoYXIuCisKK19TVExQX1RFTVBMQVRFX05VTEwKK2NsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIGNoYXJfdHJhaXRzPGNoYXI+CisgIDogcHVibGljIF9fY2hhcl90cmFpdHNfYmFzZTxjaGFyLCBpbnQ+IHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBjaGFyIGNoYXJfdHlwZTsKKyAgdHlwZWRlZiBpbnQgaW50X3R5cGU7CisgIHR5cGVkZWYgc3RyZWFtb2ZmIG9mZl90eXBlOworI2lmICFkZWZpbmVkIChfU1RMUF9OT19NQlNUQVRFX1QpCisgIHR5cGVkZWYgc3RyZWFtcG9zIHBvc190eXBlOworICB0eXBlZGVmIG1ic3RhdGVfdCBzdGF0ZV90eXBlOworI2VuZGlmCisKKyAgc3RhdGljIGNoYXIgX1NUTFBfQ0FMTCB0b19jaGFyX3R5cGUoY29uc3QgaW50JiBfX2MpCisgIHsgcmV0dXJuIChjaGFyKSh1bnNpZ25lZCBjaGFyKV9fYzsgfQorCisgIHN0YXRpYyBpbnQgX1NUTFBfQ0FMTCB0b19pbnRfdHlwZShjb25zdCBjaGFyJiBfX2MpCisgIHsgcmV0dXJuICh1bnNpZ25lZCBjaGFyKV9fYzsgfQorCisgIHN0YXRpYyBpbnQgX1NUTFBfQ0FMTCBjb21wYXJlKGNvbnN0IGNoYXIqIF9fczEsIGNvbnN0IGNoYXIqIF9fczIsIHNpemVfdCBfX24pCisgIHsgcmV0dXJuIG1lbWNtcChfX3MxLCBfX3MyLCBfX24pOyB9CisKKyAgc3RhdGljIHNpemVfdCBfU1RMUF9DQUxMIGxlbmd0aChjb25zdCBjaGFyKiBfX3MpCisgIHsgcmV0dXJuIHN0cmxlbihfX3MpOyB9CisKKyAgc3RhdGljIHZvaWQgX1NUTFBfQ0FMTCBhc3NpZ24oY2hhciYgX19jMSwgY29uc3QgY2hhciYgX19jMikKKyAgeyBfX2MxID0gX19jMjsgfQorCisgIHN0YXRpYyBjaGFyKiBfU1RMUF9DQUxMIGFzc2lnbihjaGFyKiBfX3MsIHNpemVfdCBfX24sIGNoYXIgX19jKSB7CisgICAgbWVtc2V0KF9fcywgX19jLCBfX24pOworICAgIHJldHVybiBfX3M7CisgIH0KK307CisKKyNpZiBkZWZpbmVkIChfU1RMUF9IQVNfV0NIQVJfVCkKKy8vIFNwZWNpYWxpemF0aW9uIGZvciB3Y2hhcl90LgorX1NUTFBfVEVNUExBVEVfTlVMTAorY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgY2hhcl90cmFpdHM8d2NoYXJfdD4KKyAgOiBwdWJsaWMgX19jaGFyX3RyYWl0c19iYXNlPHdjaGFyX3QsIHdpbnRfdD4geworIyAgaWYgIWRlZmluZWQgKF9TVExQX05PX05BVElWRV9XSURFX0ZVTkNUSU9OUykgJiYgIWRlZmluZWQgKF9TVExQX1dDSEFSX0hQQUNDX0VYQ0xVREUpCitwdWJsaWM6CisjICAgIGlmICFkZWZpbmVkIChOX1BMQVRfTkxNKQorIyAgICAgIGlmICFkZWZpbmVkIChfX0JPUkxBTkRDX18pCisgIHN0YXRpYyB3Y2hhcl90KiBfU1RMUF9DQUxMIG1vdmUod2NoYXJfdCogX19kZXN0LCBjb25zdCB3Y2hhcl90KiBfX3NyYywgc2l6ZV90IF9fbikKKyAgeyByZXR1cm4gd21lbW1vdmUoX19kZXN0LCBfX3NyYywgX19uKTsgfQorIyAgICAgIGVuZGlmCisKKyAgc3RhdGljIHdjaGFyX3QqIF9TVExQX0NBTEwgY29weSh3Y2hhcl90KiBfX2Rlc3QsIGNvbnN0IHdjaGFyX3QqIF9fc3JjLCBzaXplX3QgX19uKQorICB7IHJldHVybiB3bWVtY3B5KF9fZGVzdCwgX19zcmMsIF9fbik7IH0KKworIyAgICAgIGlmICFkZWZpbmVkIChfX0RNQ19fKSAmJiAhZGVmaW5lZCAoX19CT1JMQU5EQ19fKQorICBzdGF0aWMgaW50IF9TVExQX0NBTEwgY29tcGFyZShjb25zdCB3Y2hhcl90KiBfX3MxLCBjb25zdCB3Y2hhcl90KiBfX3MyLCBzaXplX3QgX19uKQorICB7IHJldHVybiB3bWVtY21wKF9fczEsIF9fczIsIF9fbik7IH0KKyMgICAgICBlbmRpZgorCisgIHN0YXRpYyB3Y2hhcl90KiBfU1RMUF9DQUxMIGFzc2lnbih3Y2hhcl90KiBfX3MsIHNpemVfdCBfX24sIHdjaGFyX3QgX19jKQorICB7IHJldHVybiB3bWVtc2V0KF9fcywgX19jLCBfX24pOyB9CisjICAgIGVuZGlmCisKKyAgc3RhdGljIHNpemVfdCBfU1RMUF9DQUxMIGxlbmd0aChjb25zdCB3Y2hhcl90KiBfX3MpCisgIHsgcmV0dXJuIHdjc2xlbihfX3MpOyB9CisKKyAgc3RhdGljIHZvaWQgX1NUTFBfQ0FMTCBhc3NpZ24od2NoYXJfdCYgX19jMSwgY29uc3Qgd2NoYXJfdCYgX19jMikKKyAgeyBfX2MxID0gX19jMjsgfQorIyAgZW5kaWYKK307CisjZW5kaWYKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYgLyogX1NUTFBfQ0hBUl9UUkFJVFNfSCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RsL2NvbmNlcHRfY2hlY2tzLmggYi9zdGwvY29uY2VwdF9jaGVja3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmUwMmMyCi0tLSAvZGV2L251bGwKKysrIGIvc3RsL2NvbmNlcHRfY2hlY2tzLmgKQEAgLTAsMCArMSw4MTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKyNpZm5kZWYgX19DT05DRVBUX0NIRUNLU19ICisjZGVmaW5lIF9fQ09OQ0VQVF9DSEVDS1NfSAorCisvKgorICBVc2UgdGhlc2UgbWFjcm8gbGlrZSBhc3NlcnRpb25zLCBidXQgdGhleSBhc3NlcnQgcHJvcGVydGllcworICBvbiB0eXBlcyAodXN1YWxseSB0ZW1wbGF0ZSBhcmd1bWVudHMpLiBJbiB0ZWNobmljYWwgdGVybXMgdGhleQorICB2ZXJpZnkgd2hldGhlciBhIHR5cGUgIm1vZGVscyIgYSAiY29uY2VwdCIuCisKKyAgVGhpcyBzZXQgb2YgcmVxdWlyZW1lbnRzIGFuZCB0aGUgdGVybWlub2xvZ3kgdXNlZCBoZXJlIGlzIGRlcml2ZWQKKyAgZnJvbSB0aGUgYm9vayAiR2VuZXJpYyBQcm9ncmFtbWluZyBhbmQgdGhlIFNUTCIgYnkgTWF0dCBBdXN0ZXJuCisgIChBZGRpc29uIFdlc2xleSkuIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHBsZWFzZSBjb25zdWx0IHRoYXQKKyAgYm9vay4gVGhlIHJlcXVpcmVtZW50cyBhbHNvIGFyZSBpbnRlbmRlZCB0byBtYXRjaCB0aGUgQU5TSS9JU08gQysrCisgIHN0YW5kYXJkLgorCisgIFRoaXMgZmlsZSBjb3ZlcnMgdGhlIGJhc2ljIGNvbmNlcHRzIGFuZCB0aGUgaXRlcmF0b3IgY29uY2VwdHMuCisgIFRoZXJlIGFyZSBzZXZlcmFsIG90aGVyIGZpbGVzIHRoYXQgcHJvdmlkZSB0aGUgcmVxdWlyZW1lbnRzCisgIGZvciB0aGUgU1RMIGNvbnRhaW5lcnM6CisgICAgY29udGFpbmVyX2NvbmNlcHRzLmgKKyAgICBzZXF1ZW5jZV9jb25jZXB0cy5oCisgICAgYXNzb2NfY29udGFpbmVyX2NvbmNlcHRzLmgKKworICBKZXJlbXkgU2llaywgMTk5OQorCisgIFRPIERPOgorICAgIC0gc29tZSBpc3N1ZXMgd2l0aCByZWdhcmRzIHRvIGNvbmNlcHQgY2xhc3NpZmljYXRpb24gYW5kIG11dGFiaWxpdHkKKyAgICAgIGluY2x1ZGluZyBBc3NvY2lhdGl2ZUNvbnRpYW5lciAtPiBGb3J3YXJkQ29udGFpbmVyCisgICAgICBhbmQgU29ydGVkQXNzb2NpYXRpdmVDb250YWluZXIgLT4gUmV2ZXJzaWJsZUNvbnRhaW5lcgorICAgIC0gSGFzaGVkQXNzb2NpYXRpdmVDb250YWluZXIKKyAgICAtIEFsbG9jYXRvcgorICAgIC0gRnVuY3Rpb24gT2JqZWN0IENvbmNlcHRzCisKKyAgKi8KKworI2lmbmRlZiBfU1RMUF9VU0VfQ09OQ0VQVF9DSEVDS1MKKworLy8gU29tZSBjb21waWxlcnMgbGFjayB0aGUgZmVhdHVyZXMgdGhhdCBhcmUgbmVjZXNzYXJ5IGZvciBjb25jZXB0IGNoZWNrcy4KKy8vIE9uIHRob3NlIGNvbXBpbGVycyB3ZSBkZWZpbmUgdGhlIGNvbmNlcHQgY2hlY2sgbWFjcm9zIHRvIGRvIG5vdGhpbmcuCisjZGVmaW5lIF9TVExQX1JFUVVJUkVTKF9fdHlwZV92YXIsIF9fY29uY2VwdCkgZG8ge30gd2hpbGUoMCkKKyNkZWZpbmUgX1NUTFBfQ0xBU1NfUkVRVUlSRVMoX190eXBlX3ZhciwgX19jb25jZXB0KSBcCisgIHN0YXRpYyBpbnQgIF9fIyNfX3R5cGVfdmFyIyNfIyNfX2NvbmNlcHQKKyNkZWZpbmUgX1NUTFBfQ09OVkVSVElCTEUoX190eXBlX3gsIF9fdHlwZV95KSBkbyB7fSB3aGlsZSgwKQorI2RlZmluZSBfU1RMUF9SRVFVSVJFU19TQU1FX1RZUEUoX190eXBlX3gsIF9fdHlwZV95KSBkbyB7fSB3aGlsZSgwKQorI2RlZmluZSBfU1RMUF9DTEFTU19SRVFVSVJFU19TQU1FX1RZUEUoX190eXBlX3gsIF9fdHlwZV95KSBcCisgIHN0YXRpYyBpbnQgIF9fIyNfX3R5cGVfeCMjX190eXBlX3kjI19yZXF1aXJlX3NhbWVfdHlwZQorI2RlZmluZSBfU1RMUF9HRU5FUkFUT1JfQ0hFQ0soX19mdW5jLCBfX3JldCkgZG8ge30gd2hpbGUoMCkKKyNkZWZpbmUgX1NUTFBfQ0xBU1NfR0VORVJBVE9SX0NIRUNLKF9fZnVuYywgX19yZXQpIFwKKyAgc3RhdGljIGludCAgX18jI19fZnVuYyMjX19yZXQjI19nZW5lcmF0b3JfY2hlY2sKKyNkZWZpbmUgX1NUTFBfVU5BUllfRlVOQ1RJT05fQ0hFQ0soX19mdW5jLCBfX3JldCwgX19hcmcpIGRvIHt9IHdoaWxlKDApCisjZGVmaW5lIF9TVExQX0NMQVNTX1VOQVJZX0ZVTkNUSU9OX0NIRUNLKF9fZnVuYywgX19yZXQsIF9fYXJnKSBcCisgIHN0YXRpYyBpbnQgIF9fIyNfX2Z1bmMjI19fcmV0IyNfX2FyZyMjX3VuYXJ5X2Z1bmN0aW9uX2NoZWNrCisjZGVmaW5lIF9TVExQX0JJTkFSWV9GVU5DVElPTl9DSEVDSyhfX2Z1bmMsIF9fcmV0LCBfX2ZpcnN0LCBfX3NlY29uZCkgXAorICBkbyB7fSB3aGlsZSgwKQorI2RlZmluZSBfU1RMUF9DTEFTU19CSU5BUllfRlVOQ1RJT05fQ0hFQ0soX19mdW5jLCBfX3JldCwgX19maXJzdCwgX19zZWNvbmQpIFwKKyAgc3RhdGljIGludCAgX18jI19fZnVuYyMjX19yZXQjI19fZmlyc3QjI19fc2Vjb25kIyNfYmluYXJ5X2Z1bmN0aW9uX2NoZWNrCisjZGVmaW5lIF9TVExQX1JFUVVJUkVTX0JJTkFSWV9PUChfX29wbmFtZSwgX19yZXQsIF9fZmlyc3QsIF9fc2Vjb25kKSBcCisgIGRvIHt9IHdoaWxlKDApCisjZGVmaW5lIF9TVExQX0NMQVNTX1JFUVVJUkVTX0JJTkFSWV9PUChfX29wbmFtZSwgX19yZXQsIF9fZmlyc3QsIF9fc2Vjb25kKSBcCisgIHN0YXRpYyBpbnQgX18jI19fb3BuYW1lIyNfX3JldCMjX19maXJzdCMjX19zZWNvbmQjI19yZXF1aXJlX2JpbmFyeV9vcAorCisjZWxzZSAvKiBfU1RMUF9VU0VfQ09OQ0VQVF9DSEVDS1MgKi8KKworLy8gVGhpcyBtYWNybyB0ZXN0cyB3aGV0aGVyIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudCAiX190eXBlX3ZhciIKKy8vIHNhdGlzZmllcyB0aGUgcmVxdWlyZW1lbnRzIG9mICJfX2NvbmNlcHQiLiAgSGVyZSBpcyBhIGxpc3Qgb2YgY29uY2VwdHMKKy8vIHRoYXQgd2Uga25vdyBob3cgdG8gY2hlY2s6CisvLyAgICAgICBfQWxsb2NhdG9yCisvLyAgICAgICBfQXNzaWduYWJsZQorLy8gICAgICAgX0RlZmF1bHRDb25zdHJ1Y3RpYmxlCisvLyAgICAgICBfRXF1YWxpdHlDb21wYXJhYmxlCisvLyAgICAgICBfTGVzc1RoYW5Db21wYXJhYmxlCisvLyAgICAgICBfVHJpdmlhbEl0ZXJhdG9yCisvLyAgICAgICBfSW5wdXRJdGVyYXRvcgorLy8gICAgICAgX091dHB1dEl0ZXJhdG9yCisvLyAgICAgICBfRm9yd2FyZEl0ZXJhdG9yCisvLyAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yCisvLyAgICAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IKKy8vICAgICAgIF9NdXRhYmxlX1RyaXZpYWxJdGVyYXRvcgorLy8gICAgICAgX011dGFibGVfRm9yd2FyZEl0ZXJhdG9yCisvLyAgICAgICBfTXV0YWJsZV9CaWRpcmVjdGlvbmFsSXRlcmF0b3IKKy8vICAgICAgIF9NdXRhYmxlX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yCisKKyNkZWZpbmUgX1NUTFBfUkVRVUlSRVMoX190eXBlX3ZhciwgX19jb25jZXB0KSBcCitkbyB7IFwKKyAgdm9pZCAoKl9feCkoIF9fdHlwZV92YXIgKSA9IF9fY29uY2VwdCMjX2NvbmNlcHRfc3BlY2lmaWNhdGlvbjwgX190eXBlX3ZhciA+XAorICAgIDo6IyNfX2NvbmNlcHQjI19yZXF1aXJlbWVudF92aW9sYXRpb247IF9feCA9IF9feDsgfSB3aGlsZSAoMCkKKworLy8gVXNlIHRoaXMgdG8gY2hlY2sgd2hldGhlciB0eXBlIFggaXMgY29udmVydGlibGUgdG8gdHlwZSBZCisjZGVmaW5lIF9TVExQX0NPTlZFUlRJQkxFKF9fdHlwZV94LCBfX3R5cGVfeSkgXAorZG8geyBcCisgIHZvaWQgKCpfX3gpKCBfX3R5cGVfeCAsIF9fdHlwZV95ICkgPSBfU1RMX0NPTlZFUlRfRVJST1I8IF9fdHlwZV94ICwgXAorICBfX3R5cGVfeSA+OjpfX3R5cGVfWF9pc19ub3RfY29udmVydGlibGVfdG9fdHlwZV9ZOyBcCisgIF9feCA9IF9feDsgfSB3aGlsZSAoMCkKKworLy8gVXNlIHRoaXMgdG8gdGVzdCB3aGV0aGVyIHR3byB0ZW1wbGF0ZSBhcmd1bWVudHMgYXJlIHRoZSBzYW1lIHR5cGUKKyNkZWZpbmUgX1NUTFBfUkVRVUlSRVNfU0FNRV9UWVBFKF9fdHlwZV94LCBfX3R5cGVfeSkgXAorZG8geyBcCisgIHZvaWQgKCpfX3gpKCBfX3R5cGVfeCAsIF9fdHlwZV95ICkgPSBfU1RMX1NBTUVfVFlQRV9FUlJPUjwgX190eXBlX3gsIFwKKyAgICBfX3R5cGVfeSAgPjo6X190eXBlX1hfbm90X3NhbWVfYXNfdHlwZV9ZOyBcCisgIF9feCA9IF9feDsgfSB3aGlsZSAoMCkKKworCisvLyBmdW5jdGlvbiBvYmplY3QgY2hlY2tzCisjZGVmaW5lIF9TVExQX0dFTkVSQVRPUl9DSEVDSyhfX2Z1bmMsIF9fcmV0KSBcCitkbyB7IFwKKyAgX19yZXQgKCpfX3gpKCBfX2Z1bmMmKSA9IFwKKyAgICAgX1NUTF9HRU5FUkFUT1JfRVJST1I8IFwKKyAgX19mdW5jLCBfX3JldD46Ol9fZ2VuZXJhdG9yX3JlcXVpcmVtZW50X3Zpb2xhdGlvbjsgXAorICBfX3ggPSBfX3g7IH0gd2hpbGUgKDApCisKKworI2RlZmluZSBfU1RMUF9VTkFSWV9GVU5DVElPTl9DSEVDSyhfX2Z1bmMsIF9fcmV0LCBfX2FyZykgXAorZG8geyBcCisgIF9fcmV0ICgqX194KSggX19mdW5jJiwgY29uc3QgX19hcmcmICkgPSBcCisgICAgIF9TVExfVU5BUllfRlVOQ1RJT05fRVJST1I8IFwKKyAgX19mdW5jLCBfX3JldCwgX19hcmc+OjpfX3VuYXJ5X2Z1bmN0aW9uX3JlcXVpcmVtZW50X3Zpb2xhdGlvbjsgXAorICBfX3ggPSBfX3g7IH0gd2hpbGUgKDApCisKKworI2RlZmluZSBfU1RMUF9CSU5BUllfRlVOQ1RJT05fQ0hFQ0soX19mdW5jLCBfX3JldCwgX19maXJzdCwgX19zZWNvbmQpIFwKK2RvIHsgXAorICBfX3JldCAoKl9feCkoIF9fZnVuYyYsIGNvbnN0IF9fZmlyc3QmLCBjb25zdCBfX3NlY29uZCYgKSA9IFwKKyAgICAgX1NUTF9CSU5BUllfRlVOQ1RJT05fRVJST1I8IFwKKyAgX19mdW5jLCBfX3JldCwgX19maXJzdCwgX19zZWNvbmQ+OjpfX2JpbmFyeV9mdW5jdGlvbl9yZXF1aXJlbWVudF92aW9sYXRpb247IFwKKyAgX194ID0gX194OyB9IHdoaWxlICgwKQorCisKKyNkZWZpbmUgX1NUTFBfUkVRVUlSRVNfQklOQVJZX09QKF9fb3BuYW1lLCBfX3JldCwgX19maXJzdCwgX19zZWNvbmQpIFwKKyAgICBkbyB7IFwKKyAgX19yZXQgKCpfX3gpKCBfX2ZpcnN0JiwgX19zZWNvbmQmICkgPSBfU1RMX0JJTkFSWSMjX19vcG5hbWUjI19FUlJPUjwgXAorICAgIF9fcmV0LCBfX2ZpcnN0LCBfX3NlY29uZD46Ol9fYmluYXJ5X29wZXJhdG9yX3JlcXVpcmVtZW50X3Zpb2xhdGlvbjsgXAorICBfX3JldCAoKl9feSkoIGNvbnN0IF9fZmlyc3QmLCBjb25zdCBfX3NlY29uZCYgKSA9IFwKKyAgICBfU1RMX0JJTkFSWSMjX19vcG5hbWUjI19FUlJPUjwgX19yZXQsIF9fZmlyc3QsIF9fc2Vjb25kPjo6IFwKKyAgICAgIF9fY29uc3RfYmluYXJ5X29wZXJhdG9yX3JlcXVpcmVtZW50X3Zpb2xhdGlvbjsgXAorICBfX3kgPSBfX3k7IF9feCA9IF9feDsgfSB3aGlsZSAoMCkKKworCisjaWZkZWYgX1NUTFBfTk9fRlVOQ1RJT05fUFRSX0lOX0NMQVNTX1RFTVBMQVRFCisKKyNkZWZpbmUgX1NUTFBfQ0xBU1NfUkVRVUlSRVMoX190eXBlX3ZhciwgX19jb25jZXB0KQorI2RlZmluZSBfU1RMUF9DTEFTU19SRVFVSVJFU19TQU1FX1RZUEUoX190eXBlX3gsIF9fdHlwZV95KQorI2RlZmluZSBfU1RMUF9DTEFTU19HRU5FUkFUT1JfQ0hFQ0soX19mdW5jLCBfX3JldCkKKyNkZWZpbmUgX1NUTFBfQ0xBU1NfVU5BUllfRlVOQ1RJT05fQ0hFQ0soX19mdW5jLCBfX3JldCwgX19hcmcpCisjZGVmaW5lIF9TVExQX0NMQVNTX0JJTkFSWV9GVU5DVElPTl9DSEVDSyhfX2Z1bmMsIF9fcmV0LCBfX2ZpcnN0LCBfX3NlY29uZCkKKyNkZWZpbmUgX1NUTFBfQ0xBU1NfUkVRVUlSRVNfQklOQVJZX09QKF9fb3BuYW1lLCBfX3JldCwgX19maXJzdCwgX19zZWNvbmQpCisKKyNlbHNlCisKKy8vIFVzZSB0aGlzIG1hY3JvIGluc2lkZSBvZiB0ZW1wbGF0ZSBjbGFzc2VzLCB3aGVyZSB5b3Ugd291bGQKKy8vIGxpa2UgdG8gcGxhY2UgcmVxdWlyZW1lbnRzIG9uIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudHMgdG8gdGhlIGNsYXNzCisvLyBXYXJuaW5nOiBkbyBub3QgcGFzcyBwb2ludGVycyBhbmQgc3VjaCAoZS5nLiBUKikgaW4gYXMgdGhlIF9fdHlwZV92YXIsCisvLyBzaW5jZSB0aGUgdHlwZV92YXIgaXMgdXNlZCB0byBjb25zdHJ1Y3QgaWRlbnRpZmllcnMuIEluc3RlYWQgdHlwZWRlZgorLy8gdGhlIHBvaW50ZXIgdHlwZSwgdGhlbiB1c2UgdGhlIHR5cGVkZWYgbmFtZSBmb3IgdGhlIF9fdHlwZV92YXIuCisjZGVmaW5lIF9TVExQX0NMQVNTX1JFUVVJUkVTKF9fdHlwZV92YXIsIF9fY29uY2VwdCkgXAorICB0eXBlZGVmIHZvaWQgKCogX19mdW5jIyNfX3R5cGVfdmFyIyNfX2NvbmNlcHQpKCBfX3R5cGVfdmFyICk7IFwKKyAgdGVtcGxhdGUgPF9fZnVuYyMjX190eXBlX3ZhciMjX19jb25jZXB0IF9UcDE+IFwKKyAgc3RydWN0IF9fZHVtbXlfc3RydWN0XyMjX190eXBlX3ZhciMjX19jb25jZXB0IHsgfTsgXAorICBzdGF0aWMgX19kdW1teV9zdHJ1Y3RfIyNfX3R5cGVfdmFyIyNfX2NvbmNlcHQ8IFwKKyAgICBfX2NvbmNlcHQjI19jb25jZXB0X3NwZWNpZmljYXRpb248IFwKKyAgICAgIF9fdHlwZV92YXI+OjpfX2NvbmNlcHQjI19yZXF1aXJlbWVudF92aW9sYXRpb24+ICBcCisgIF9fZHVtbXlfcHRyXyMjX190eXBlX3ZhciMjX19jb25jZXB0CisKKworI2RlZmluZSBfU1RMUF9DTEFTU19SRVFVSVJFU19TQU1FX1RZUEUoX190eXBlX3gsIF9fdHlwZV95KSBcCisgIHR5cGVkZWYgdm9pZCAoKiBfX2Z1bmNfIyNfX3R5cGVfeCMjX190eXBlX3kjI3NhbWVfdHlwZSkoIF9fdHlwZV94LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3R5cGVfeSApOyBcCisgIHRlbXBsYXRlIDwgX19mdW5jXyMjX190eXBlX3gjI19fdHlwZV95IyNzYW1lX3R5cGUgX1RwMT4gXAorICBzdHJ1Y3QgX19kdW1teV9zdHJ1Y3RfIyNfX3R5cGVfeCMjX190eXBlX3kjI19zYW1lX3R5cGUgeyB9OyBcCisgIHN0YXRpYyBfX2R1bW15X3N0cnVjdF8jI19fdHlwZV94IyNfX3R5cGVfeSMjX3NhbWVfdHlwZTwgXAorICAgIF9TVExfU0FNRV9UWVBFX0VSUk9SPF9fdHlwZV94LCBfX3R5cGVfeT46Ol9fdHlwZV9YX25vdF9zYW1lX2FzX3R5cGVfWT4gIFwKKyAgX19kdW1teV9wdHJfIyNfX3R5cGVfeCMjX190eXBlX3kjI19zYW1lX3R5cGUKKworCisjZGVmaW5lIF9TVExQX0NMQVNTX0dFTkVSQVRPUl9DSEVDSyhfX2Z1bmMsIF9fcmV0KSBcCisgIHR5cGVkZWYgX19yZXQgKCogX19mXyMjX19mdW5jIyNfX3JldCMjX2dlbmVyYXRvcikoIF9fZnVuYyYgKTsgXAorICB0ZW1wbGF0ZSA8X19mXyMjX19mdW5jIyNfX3JldCMjX2dlbmVyYXRvciBfVHAxPiBcCisgIHN0cnVjdCBfX2R1bW15X3N0cnVjdF8jI19fZnVuYyMjX19yZXQjI19nZW5lcmF0b3IgeyB9OyBcCisgIHN0YXRpYyBfX2R1bW15X3N0cnVjdF8jI19fZnVuYyMjX19yZXQjI19nZW5lcmF0b3I8IFwKKyAgICBfU1RMX0dFTkVSQVRPUl9FUlJPUjwgXAorICAgICAgX19mdW5jLCBfX3JldD46Ol9fZ2VuZXJhdG9yX3JlcXVpcmVtZW50X3Zpb2xhdGlvbj4gIFwKKyAgX19kdW1teV9wdHJfIyNfX2Z1bmMjI19fcmV0IyNfZ2VuZXJhdG9yCisKKworI2RlZmluZSBfU1RMUF9DTEFTU19VTkFSWV9GVU5DVElPTl9DSEVDSyhfX2Z1bmMsIF9fcmV0LCBfX2FyZykgXAorICB0eXBlZGVmIF9fcmV0ICgqIF9fZl8jI19fZnVuYyMjX19yZXQjI19fYXJnIyNfdW5hcnlfY2hlY2spKCBfX2Z1bmMmLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX2FyZyYgKTsgXAorICB0ZW1wbGF0ZSA8X19mXyMjX19mdW5jIyNfX3JldCMjX19hcmcjI191bmFyeV9jaGVjayBfVHAxPiBcCisgIHN0cnVjdCBfX2R1bW15X3N0cnVjdF8jI19fZnVuYyMjX19yZXQjI19fYXJnIyNfdW5hcnlfY2hlY2sgeyB9OyBcCisgIHN0YXRpYyBfX2R1bW15X3N0cnVjdF8jI19fZnVuYyMjX19yZXQjI19fYXJnIyNfdW5hcnlfY2hlY2s8IFwKKyAgICBfU1RMX1VOQVJZX0ZVTkNUSU9OX0VSUk9SPCBcCisgICAgICBfX2Z1bmMsIF9fcmV0LCBfX2FyZz46Ol9fdW5hcnlfZnVuY3Rpb25fcmVxdWlyZW1lbnRfdmlvbGF0aW9uPiAgXAorICBfX2R1bW15X3B0cl8jI19fZnVuYyMjX19yZXQjI19fYXJnIyNfdW5hcnlfY2hlY2sKKworCisjZGVmaW5lIF9TVExQX0NMQVNTX0JJTkFSWV9GVU5DVElPTl9DSEVDSyhfX2Z1bmMsIF9fcmV0LCBfX2ZpcnN0LCBfX3NlY29uZCkgXAorICB0eXBlZGVmIF9fcmV0ICgqIF9fZl8jI19fZnVuYyMjX19yZXQjI19fZmlyc3QjI19fc2Vjb25kIyNfYmluYXJ5X2NoZWNrKSggX19mdW5jJiwgY29uc3QgX19maXJzdCYsXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fc2Vjb25kJiApOyBcCisgIHRlbXBsYXRlIDxfX2ZfIyNfX2Z1bmMjI19fcmV0IyNfX2ZpcnN0IyNfX3NlY29uZCMjX2JpbmFyeV9jaGVjayBfVHAxPiBcCisgIHN0cnVjdCBfX2R1bW15X3N0cnVjdF8jI19fZnVuYyMjX19yZXQjI19fZmlyc3QjI19fc2Vjb25kIyNfYmluYXJ5X2NoZWNrIHsgfTsgXAorICBzdGF0aWMgX19kdW1teV9zdHJ1Y3RfIyNfX2Z1bmMjI19fcmV0IyNfX2ZpcnN0IyNfX3NlY29uZCMjX2JpbmFyeV9jaGVjazwgXAorICAgIF9TVExfQklOQVJZX0ZVTkNUSU9OX0VSUk9SPF9fZnVuYywgX19yZXQsIF9fZmlyc3QsIF9fc2Vjb25kPjo6IFwKKyAgX19iaW5hcnlfZnVuY3Rpb25fcmVxdWlyZW1lbnRfdmlvbGF0aW9uPiAgXAorICBfX2R1bW15X3B0cl8jI19fZnVuYyMjX19yZXQjI19fZmlyc3QjI19fc2Vjb25kIyNfYmluYXJ5X2NoZWNrCisKKworI2RlZmluZSBfU1RMUF9DTEFTU19SRVFVSVJFU19CSU5BUllfT1AoX19vcG5hbWUsIF9fcmV0LCBfX2ZpcnN0LCBfX3NlY29uZCkgXAorICB0eXBlZGVmIF9fcmV0ICgqIF9fZl8jI19fZnVuYyMjX19yZXQjI19fZmlyc3QjI19fc2Vjb25kIyNfYmluYXJ5X29wKShjb25zdCBfX2ZpcnN0JiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fc2Vjb25kJiApOyBcCisgIHRlbXBsYXRlIDxfX2ZfIyNfX2Z1bmMjI19fcmV0IyNfX2ZpcnN0IyNfX3NlY29uZCMjX2JpbmFyeV9vcCBfVHAxPiBcCisgIHN0cnVjdCBfX2R1bW15X3N0cnVjdF8jI19fZnVuYyMjX19yZXQjI19fZmlyc3QjI19fc2Vjb25kIyNfYmluYXJ5X29wIHsgfTsgXAorICBzdGF0aWMgX19kdW1teV9zdHJ1Y3RfIyNfX2Z1bmMjI19fcmV0IyNfX2ZpcnN0IyNfX3NlY29uZCMjX2JpbmFyeV9vcDwgXAorICAgIF9TVExfQklOQVJZIyNfX29wbmFtZSMjX0VSUk9SPF9fcmV0LCBfX2ZpcnN0LCBfX3NlY29uZD46OiBcCisgIF9fYmluYXJ5X29wZXJhdG9yX3JlcXVpcmVtZW50X3Zpb2xhdGlvbj4gIFwKKyAgX19kdW1teV9wdHJfIyNfX2Z1bmMjI19fcmV0IyNfX2ZpcnN0IyNfX3NlY29uZCMjX2JpbmFyeV9vcAorCisjZW5kaWYKKworLyogaGVscGVyIGNsYXNzIGZvciBmaW5kaW5nIG5vbi1jb25zdCB2ZXJzaW9uIG9mIGEgdHlwZS4gTmVlZCB0byBoYXZlCisgICBzb21ldGhpbmcgdG8gYXNzaWduIHRvIGV0Yy4gd2hlbiB0ZXN0aW5nIGNvbnN0YW50IGl0ZXJhdG9ycy4gKi8KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfTXV0YWJsZV90cmFpdCB7CisgIHR5cGVkZWYgX1RwIF9UeXBlOworfTsKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX011dGFibGVfdHJhaXQ8Y29uc3QgX1RwPiB7CisgIHR5cGVkZWYgX1RwIF9UeXBlOworfTsKKworCisvKiBoZWxwZXIgZnVuY3Rpb24gZm9yIGF2b2lkaW5nIGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IHVudXNlZCB2YXJpYWJsZXMgKi8KK3RlbXBsYXRlIDxjbGFzcyBfVHlwZT4KK3ZvaWQgX19zaW5rX3VudXNlZF93YXJuaW5nKF9UeXBlKSB7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9UeXBlWCwgY2xhc3MgX1R5cGVZPgorc3RydWN0IF9TVExfQ09OVkVSVF9FUlJPUiB7CisgIHN0YXRpYyB2b2lkCisgIF9fdHlwZV9YX2lzX25vdF9jb252ZXJ0aWJsZV90b190eXBlX1koX1R5cGVYIF9feCwgX1R5cGVZKSB7CisgICAgX1R5cGVZIF9feSA9IF9feDsKKyAgICBfX3NpbmtfdW51c2VkX3dhcm5pbmcoX195KTsKKyAgfQorfTsKKworCit0ZW1wbGF0ZSA8Y2xhc3MgX1R5cGU+IHN0cnVjdCBfX2NoZWNrX2VxdWFsIHsgfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UeXBlWCwgY2xhc3MgX1R5cGVZPgorc3RydWN0IF9TVExfU0FNRV9UWVBFX0VSUk9SIHsKKyAgc3RhdGljIHZvaWQKKyAgX190eXBlX1hfbm90X3NhbWVfYXNfdHlwZV9ZKF9UeXBlWCAsIF9UeXBlWSApIHsKKyAgICBfX2NoZWNrX2VxdWFsPF9UeXBlWD4gdDEgPSBfX2NoZWNrX2VxdWFsPF9UeXBlWT4oKTsKKyAgfQorfTsKKworCisvLyBTb21lIEZ1bmN0b24gT2JqZWN0IENoZWNrcworCit0ZW1wbGF0ZSA8Y2xhc3MgX0Z1bmMsIGNsYXNzIF9SZXQ+CitzdHJ1Y3QgX1NUTF9HRU5FUkFUT1JfRVJST1IgeworICBzdGF0aWMgX1JldCBfX2dlbmVyYXRvcl9yZXF1aXJlbWVudF92aW9sYXRpb24oX0Z1bmMmIF9fZikgeworICAgIHJldHVybiBfX2YoKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9GdW5jPgorc3RydWN0IF9TVExfR0VORVJBVE9SX0VSUk9SPF9GdW5jLCB2b2lkPiB7CisgIHN0YXRpYyB2b2lkIF9fZ2VuZXJhdG9yX3JlcXVpcmVtZW50X3Zpb2xhdGlvbihfRnVuYyYgX19mKSB7CisgICAgX19mKCk7CisgIH0KK307CisKKwordGVtcGxhdGUgPGNsYXNzIF9GdW5jLCBjbGFzcyBfUmV0LCBjbGFzcyBfQXJnPgorc3RydWN0IF9TVExfVU5BUllfRlVOQ1RJT05fRVJST1IgeworICBzdGF0aWMgX1JldAorICBfX3VuYXJ5X2Z1bmN0aW9uX3JlcXVpcmVtZW50X3Zpb2xhdGlvbihfRnVuYyYgX19mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0FyZyYgX19hcmcpIHsKKyAgICByZXR1cm4gX19mKF9fYXJnKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9GdW5jLCBjbGFzcyBfQXJnPgorc3RydWN0IF9TVExfVU5BUllfRlVOQ1RJT05fRVJST1I8X0Z1bmMsIHZvaWQsIF9Bcmc+IHsKKyAgc3RhdGljIHZvaWQKKyAgX191bmFyeV9mdW5jdGlvbl9yZXF1aXJlbWVudF92aW9sYXRpb24oX0Z1bmMmIF9fZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9BcmcmIF9fYXJnKSB7CisgICAgX19mKF9fYXJnKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9GdW5jLCBjbGFzcyBfUmV0LCBjbGFzcyBfRmlyc3QsIGNsYXNzIF9TZWNvbmQ+CitzdHJ1Y3QgX1NUTF9CSU5BUllfRlVOQ1RJT05fRVJST1IgeworICBzdGF0aWMgX1JldAorICBfX2JpbmFyeV9mdW5jdGlvbl9yZXF1aXJlbWVudF92aW9sYXRpb24oX0Z1bmMmIF9fZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9GaXJzdCYgX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9TZWNvbmQmIF9fc2Vjb25kKSB7CisgICAgcmV0dXJuIF9fZihfX2ZpcnN0LCBfX3NlY29uZCk7CisgIH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfRnVuYywgY2xhc3MgX0ZpcnN0LCBjbGFzcyBfU2Vjb25kPgorc3RydWN0IF9TVExfQklOQVJZX0ZVTkNUSU9OX0VSUk9SPF9GdW5jLCB2b2lkLCBfRmlyc3QsIF9TZWNvbmQ+IHsKKyAgc3RhdGljIHZvaWQKKyAgX19iaW5hcnlfZnVuY3Rpb25fcmVxdWlyZW1lbnRfdmlvbGF0aW9uKF9GdW5jJiBfX2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfRmlyc3QmIF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfU2Vjb25kJiBfX3NlY29uZCkgeworICAgIF9fZihfX2ZpcnN0LCBfX3NlY29uZCk7CisgIH0KK307CisKKworI2RlZmluZSBfU1RMUF9ERUZJTkVfQklOQVJZX09QX0NIRUNLKF9PUCwgX05BTUUpIFwKK3RlbXBsYXRlIDxjbGFzcyBfUmV0LCBjbGFzcyBfRmlyc3QsIGNsYXNzIF9TZWNvbmQ+IFwKK3N0cnVjdCBfU1RMX0JJTkFSWSMjX05BTUUjI19FUlJPUiB7IFwKKyAgc3RhdGljIF9SZXQgXAorICBfX2NvbnN0X2JpbmFyeV9vcGVyYXRvcl9yZXF1aXJlbWVudF92aW9sYXRpb24oY29uc3QgX0ZpcnN0JiBfX2ZpcnN0LCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1NlY29uZCYgX19zZWNvbmQpIHsgXAorICAgIHJldHVybiBfX2ZpcnN0IF9PUCBfX3NlY29uZDsgXAorICB9IFwKKyAgc3RhdGljIF9SZXQgXAorICBfX2JpbmFyeV9vcGVyYXRvcl9yZXF1aXJlbWVudF92aW9sYXRpb24oX0ZpcnN0JiBfX2ZpcnN0LCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NlY29uZCYgX19zZWNvbmQpIHsgXAorICAgIHJldHVybiBfX2ZpcnN0IF9PUCBfX3NlY29uZDsgXAorICB9IFwKK30KKworX1NUTFBfREVGSU5FX0JJTkFSWV9PUF9DSEVDSyg9PSwgX09QX0VRVUFMKTsKK19TVExQX0RFRklORV9CSU5BUllfT1BfQ0hFQ0soIT0sIF9PUF9OT1RfRVFVQUwpOworX1NUTFBfREVGSU5FX0JJTkFSWV9PUF9DSEVDSyg8LCBfT1BfTEVTU19USEFOKTsKK19TVExQX0RFRklORV9CSU5BUllfT1BfQ0hFQ0soPD0sIF9PUF9MRVNTX0VRVUFMKTsKK19TVExQX0RFRklORV9CSU5BUllfT1BfQ0hFQ0soPiwgX09QX0dSRUFURVJfVEhBTik7CitfU1RMUF9ERUZJTkVfQklOQVJZX09QX0NIRUNLKD49LCBfT1BfR1JFQVRFUl9FUVVBTCk7CitfU1RMUF9ERUZJTkVfQklOQVJZX09QX0NIRUNLKCssIF9PUF9QTFVTKTsKK19TVExQX0RFRklORV9CSU5BUllfT1BfQ0hFQ0soKiwgX09QX1RJTUVTKTsKK19TVExQX0RFRklORV9CSU5BUllfT1BfQ0hFQ0soLywgX09QX0RJVklERSk7CitfU1RMUF9ERUZJTkVfQklOQVJZX09QX0NIRUNLKC0sIF9PUF9TVUJUUkFDVCk7CitfU1RMUF9ERUZJTkVfQklOQVJZX09QX0NIRUNLKCUsIF9PUF9NT0QpOworLy8gLi4uCisKKy8vIFRPRE8sIGFkZCB1bmFyeSBvcGVyYXRvcnMgKHByZWZpeCBhbmQgcG9zdGZpeCkKKworLyoKKyAgVGhlIHByZXNlbmNlIG9mIHRoaXMgY2xhc3MgaXMganVzdCB0byB0cmljayBFREcgaW50byBkaXNwbGF5aW5nCisgIHRoZXNlIGVycm9yIG1lc3NhZ2VzIGJlZm9yZSBhbnkgb3RoZXIgZXJyb3JzLiBXaXRob3V0IHRoZQorICBjbGFzc2VzLCB0aGUgZXJyb3JzIGluIHRoZSBmdW5jdGlvbnMgZ2V0IHJlcG9ydGVkIGFmdGVyCisgIG90aGVyIGNsYXNzIGVycm9ycyBkZWVwIGluc2lkZSB0aGUgbGlicmFyeS4gVGhlIG5hbWUKKyAgY2hvaWNlIGp1c3QgbWFrZXMgZm9yIGFuIGV5ZSBjYXRjaGluZyBlcnJvciBtZXNzYWdlIDopCisgKi8KK3N0cnVjdCBfU1RMX0VSUk9SIHsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1R5cGU+CisgIHN0YXRpYyBfVHlwZQorICBfX2RlZmF1bHRfY29uc3RydWN0b3JfcmVxdWlyZW1lbnRfdmlvbGF0aW9uKF9UeXBlKSB7CisgICAgcmV0dXJuIF9UeXBlKCk7CisgIH0KKyAgdGVtcGxhdGUgPGNsYXNzIF9UeXBlPgorICBzdGF0aWMgX1R5cGUKKyAgX19hc3NpZ25tZW50X29wZXJhdG9yX3JlcXVpcmVtZW50X3Zpb2xhdGlvbihfVHlwZSBfX2EpIHsKKyAgICBfX2EgPSBfX2E7CisgICAgcmV0dXJuIF9fYTsKKyAgfQorICB0ZW1wbGF0ZSA8Y2xhc3MgX1R5cGU+CisgIHN0YXRpYyBfVHlwZQorICBfX2NvcHlfY29uc3RydWN0b3JfcmVxdWlyZW1lbnRfdmlvbGF0aW9uKF9UeXBlIF9fYSkgeworICAgIF9UeXBlIF9fYyhfX2EpOworICAgIHJldHVybiBfX2M7CisgIH0KKyAgdGVtcGxhdGUgPGNsYXNzIF9UeXBlPgorICBzdGF0aWMgX1R5cGUKKyAgX19jb25zdF9wYXJhbWV0ZXJfcmVxdWlyZWRfZm9yX2NvcHlfY29uc3RydWN0b3IoX1R5cGUgLyogX19hICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfVHlwZSYgX19iKSB7CisgICAgX1R5cGUgX19jKF9fYik7CisgICAgcmV0dXJuIF9fYzsKKyAgfQorICB0ZW1wbGF0ZSA8Y2xhc3MgX1R5cGU+CisgIHN0YXRpYyBfVHlwZQorICBfX2NvbnN0X3BhcmFtZXRlcl9yZXF1aXJlZF9mb3JfYXNzaWdubWVudF9vcGVyYXRvcihfVHlwZSBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9UeXBlJiBfX2IpIHsKKyAgICBfX2EgPSBfX2I7CisgICAgcmV0dXJuIF9fYTsKKyAgfQorICB0ZW1wbGF0ZSA8Y2xhc3MgX1R5cGU+CisgIHN0YXRpYyBfVHlwZQorICBfX2xlc3NfdGhhbl9jb21wYXJhYmxlX3JlcXVpcmVtZW50X3Zpb2xhdGlvbihfVHlwZSBfX2EsIF9UeXBlIF9fYikgeworICAgIGlmIChfX2EgPCBfX2IgfHwgX19hID4gX19iIHx8IF9fYSA8PSBfX2IgfHwgX19hID49IF9fYikgcmV0dXJuIF9fYTsKKyAgICByZXR1cm4gX19iOworICB9CisgIHRlbXBsYXRlIDxjbGFzcyBfVHlwZT4KKyAgc3RhdGljIF9UeXBlCisgIF9fZXF1YWxpdHlfY29tcGFyYWJsZV9yZXF1aXJlbWVudF92aW9sYXRpb24oX1R5cGUgX19hLCBfVHlwZSBfX2IpIHsKKyAgICBpZiAoX19hID09IF9fYiB8fCBfX2EgIT0gX19iKSByZXR1cm4gX19hOworICAgIHJldHVybiBfX2I7CisgIH0KKyAgdGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcj4KKyAgc3RhdGljIHZvaWQKKyAgX19kZXJlZmVyZW5jZV9vcGVyYXRvcl9yZXF1aXJlbWVudF92aW9sYXRpb24oX0l0ZXJhdG9yIF9faSkgeworICAgIF9fc2lua191bnVzZWRfd2FybmluZygqX19pKTsKKyAgfQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgorICBzdGF0aWMgdm9pZAorICBfX2RlcmVmZXJlbmNlX29wZXJhdG9yX2FuZF9hc3NpZ25tZW50X3JlcXVpcmVtZW50X3Zpb2xhdGlvbihfSXRlcmF0b3IgX19pKSB7CisgICAgKl9faSA9ICpfX2k7CisgIH0KKyAgdGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcj4KKyAgc3RhdGljIHZvaWQKKyAgX19wcmVpbmNyZW1lbnRfb3BlcmF0b3JfcmVxdWlyZW1lbnRfdmlvbGF0aW9uKF9JdGVyYXRvciBfX2kpIHsKKyAgICArK19faTsKKyAgfQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgorICBzdGF0aWMgdm9pZAorICBfX3Bvc3RpbmNyZW1lbnRfb3BlcmF0b3JfcmVxdWlyZW1lbnRfdmlvbGF0aW9uKF9JdGVyYXRvciBfX2kpIHsKKyAgICBfX2krKzsKKyAgfQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgorICBzdGF0aWMgdm9pZAorICBfX3ByZWRlY3JlbWVudF9vcGVyYXRvcl9yZXF1aXJlbWVudF92aW9sYXRpb24oX0l0ZXJhdG9yIF9faSkgeworICAgIC0tX19pOworICB9CisgIHRlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+CisgIHN0YXRpYyB2b2lkCisgIF9fcG9zdGRlY3JlbWVudF9vcGVyYXRvcl9yZXF1aXJlbWVudF92aW9sYXRpb24oX0l0ZXJhdG9yIF9faSkgeworICAgIF9faS0tOworICB9CisgIHRlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3IsIGNsYXNzIF9UeXBlPgorICBzdGF0aWMgdm9pZAorICBfX3Bvc3RpbmNyZW1lbnRfb3BlcmF0b3JfYW5kX2Fzc2lnbm1lbnRfcmVxdWlyZW1lbnRfdmlvbGF0aW9uKF9JdGVyYXRvciBfX2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1R5cGUgX190KSB7CisgICAgKl9faSsrID0gX190OworICB9CisgIHRlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3IsIGNsYXNzIF9EaXN0YW5jZT4KKyAgc3RhdGljIF9JdGVyYXRvcgorICBfX2l0ZXJhdG9yX2FkZGl0aW9uX2Fzc2lnbm1lbnRfcmVxdWlyZW1lbnRfdmlvbGF0aW9uKF9JdGVyYXRvciBfX2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0Rpc3RhbmNlIF9fbikgeworICAgIF9faSArPSBfX247CisgICAgcmV0dXJuIF9faTsKKyAgfQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yLCBjbGFzcyBfRGlzdGFuY2U+CisgIHN0YXRpYyBfSXRlcmF0b3IKKyAgX19pdGVyYXRvcl9hZGRpdGlvbl9yZXF1aXJlbWVudF92aW9sYXRpb24oX0l0ZXJhdG9yIF9faSwgX0Rpc3RhbmNlIF9fbikgeworICAgIF9faSA9IF9faSArIF9fbjsKKyAgICBfX2kgPSBfX24gKyBfX2k7CisgICAgcmV0dXJuIF9faTsKKyAgfQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yLCBjbGFzcyBfRGlzdGFuY2U+CisgIHN0YXRpYyBfSXRlcmF0b3IKKyAgX19pdGVyYXRvcl9zdWJ0cmFjdGlvbl9hc3NpZ25tZW50X3JlcXVpcmVtZW50X3Zpb2xhdGlvbihfSXRlcmF0b3IgX19pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EaXN0YW5jZSBfX24pIHsKKyAgICBfX2kgLT0gX19uOworICAgIHJldHVybiBfX2k7CisgIH0KKyAgdGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvciwgY2xhc3MgX0Rpc3RhbmNlPgorICBzdGF0aWMgX0l0ZXJhdG9yCisgIF9faXRlcmF0b3Jfc3VidHJhY3Rpb25fcmVxdWlyZW1lbnRfdmlvbGF0aW9uKF9JdGVyYXRvciBfX2ksIF9EaXN0YW5jZSBfX24pIHsKKyAgICBfX2kgPSBfX2kgLSBfX247CisgICAgcmV0dXJuIF9faTsKKyAgfQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yLCBjbGFzcyBfRGlzdGFuY2U+CisgIHN0YXRpYyBfRGlzdGFuY2UKKyAgX19kaWZmZXJlbmNlX29wZXJhdG9yX3JlcXVpcmVtZW50X3Zpb2xhdGlvbihfSXRlcmF0b3IgX19pLCBfSXRlcmF0b3IgX19qLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EaXN0YW5jZSBfX24pIHsKKyAgICBfX24gPSBfX2kgLSBfX2o7CisgICAgcmV0dXJuIF9fbjsKKyAgfQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0V4cCwgY2xhc3MgX1R5cGUsIGNsYXNzIF9EaXN0YW5jZT4KKyAgc3RhdGljIF9UeXBlCisgIF9fZWxlbWVudF9hY2Nlc3Nfb3BlcmF0b3JfcmVxdWlyZW1lbnRfdmlvbGF0aW9uKF9FeHAgX194LCBfVHlwZSosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EaXN0YW5jZSBfX24pIHsKKyAgICByZXR1cm4gX194W19fbl07CisgIH0KKyAgdGVtcGxhdGUgPGNsYXNzIF9FeHAsIGNsYXNzIF9UeXBlLCBjbGFzcyBfRGlzdGFuY2U+CisgIHN0YXRpYyB2b2lkCisgIF9fZWxlbWVudF9hc3NpZ25tZW50X29wZXJhdG9yX3JlcXVpcmVtZW50X3Zpb2xhdGlvbihfRXhwIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9UeXBlKiBfX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRGlzdGFuY2UgX19uKSB7CisgICAgX194W19fbl0gPSAqX190OworICB9CisKK307IC8qIF9TVExfRVJST1IgKi8KKworLyogQXNzb2NpYXRlZCBUeXBlIFJlcXVpcmVtZW50cyAqLworCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+IHN0cnVjdCBpdGVyYXRvcl90cmFpdHM7CitfU1RMUF9FTkRfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcj4KK3N0cnVjdCBfX3ZhbHVlX3R5cGVfdHlwZV9kZWZpbml0aW9uX3JlcXVpcmVtZW50X3Zpb2xhdGlvbiB7CisgIHR5cGVkZWYgdHlwZW5hbWUgX19TVEQ6Oml0ZXJhdG9yX3RyYWl0czxfSXRlcj46OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcj4KK3N0cnVjdCBfX2RpZmZlcmVuY2VfdHlwZV90eXBlX2RlZmluaXRpb25fcmVxdWlyZW1lbnRfdmlvbGF0aW9uIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX1NURDo6aXRlcmF0b3JfdHJhaXRzPF9JdGVyPjo6ZGlmZmVyZW5jZV90eXBlCisgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9JdGVyPgorc3RydWN0IF9fcmVmZXJlbmNlX3R5cGVfZGVmaW5pdGlvbl9yZXF1aXJlbWVudF92aW9sYXRpb24geworICB0eXBlZGVmIHR5cGVuYW1lIF9fU1REOjppdGVyYXRvcl90cmFpdHM8X0l0ZXI+OjpyZWZlcmVuY2UgcmVmZXJlbmNlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9JdGVyPgorc3RydWN0IF9fcG9pbnRlcl90eXBlX2RlZmluaXRpb25fcmVxdWlyZW1lbnRfdmlvbGF0aW9uIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX1NURDo6aXRlcmF0b3JfdHJhaXRzPF9JdGVyPjo6cG9pbnRlciBwb2ludGVyOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9JdGVyPgorc3RydWN0IF9faXRlcmF0b3JfY2F0ZWdvcnlfdHlwZV9kZWZpbml0aW9uX3JlcXVpcmVtZW50X3Zpb2xhdGlvbiB7CisgIHR5cGVkZWYgdHlwZW5hbWUgX19TVEQ6Oml0ZXJhdG9yX3RyYWl0czxfSXRlcj46Oml0ZXJhdG9yX2NhdGVnb3J5CisgICAgICAgICAgaXRlcmF0b3JfY2F0ZWdvcnk7Cit9OworCisvKiBBc3NpZ25hYmxlIFJlcXVpcmVtZW50cyAqLworCisKK3RlbXBsYXRlIDxjbGFzcyBfVHlwZT4KK3N0cnVjdCBfQXNzaWduYWJsZV9jb25jZXB0X3NwZWNpZmljYXRpb24geworICBzdGF0aWMgdm9pZCBfQXNzaWduYWJsZV9yZXF1aXJlbWVudF92aW9sYXRpb24oX1R5cGUgX19hKSB7CisgICAgX1NUTF9FUlJPUjo6X19hc3NpZ25tZW50X29wZXJhdG9yX3JlcXVpcmVtZW50X3Zpb2xhdGlvbihfX2EpOworICAgIF9TVExfRVJST1I6Ol9fY29weV9jb25zdHJ1Y3Rvcl9yZXF1aXJlbWVudF92aW9sYXRpb24oX19hKTsKKyAgICBfU1RMX0VSUk9SOjpfX2NvbnN0X3BhcmFtZXRlcl9yZXF1aXJlZF9mb3JfY29weV9jb25zdHJ1Y3RvcihfX2EsX19hKTsKKyAgICBfU1RMX0VSUk9SOjpfX2NvbnN0X3BhcmFtZXRlcl9yZXF1aXJlZF9mb3JfYXNzaWdubWVudF9vcGVyYXRvcihfX2EsX19hKTsKKyAgfQorfTsKKworLyogRGVmYXVsdENvbnN0cnVjdGlibGUgUmVxdWlyZW1lbnRzICovCisKKwordGVtcGxhdGUgPGNsYXNzIF9UeXBlPgorc3RydWN0IF9EZWZhdWx0Q29uc3RydWN0aWJsZV9jb25jZXB0X3NwZWNpZmljYXRpb24geworICBzdGF0aWMgdm9pZCBfRGVmYXVsdENvbnN0cnVjdGlibGVfcmVxdWlyZW1lbnRfdmlvbGF0aW9uKF9UeXBlIF9fYSkgeworICAgIF9TVExfRVJST1I6Ol9fZGVmYXVsdF9jb25zdHJ1Y3Rvcl9yZXF1aXJlbWVudF92aW9sYXRpb24oX19hKTsKKyAgfQorfTsKKworLyogRXF1YWxpdHlDb21wYXJhYmxlIFJlcXVpcmVtZW50cyAqLworCit0ZW1wbGF0ZSA8Y2xhc3MgX1R5cGU+CitzdHJ1Y3QgX0VxdWFsaXR5Q29tcGFyYWJsZV9jb25jZXB0X3NwZWNpZmljYXRpb24geworICBzdGF0aWMgdm9pZCBfRXF1YWxpdHlDb21wYXJhYmxlX3JlcXVpcmVtZW50X3Zpb2xhdGlvbihfVHlwZSBfX2EpIHsKKyAgICBfU1RMX0VSUk9SOjpfX2VxdWFsaXR5X2NvbXBhcmFibGVfcmVxdWlyZW1lbnRfdmlvbGF0aW9uKF9fYSwgX19hKTsKKyAgfQorfTsKKworLyogTGVzc1RoYW5Db21wYXJhYmxlIFJlcXVpcmVtZW50cyAqLwordGVtcGxhdGUgPGNsYXNzIF9UeXBlPgorc3RydWN0IF9MZXNzVGhhbkNvbXBhcmFibGVfY29uY2VwdF9zcGVjaWZpY2F0aW9uIHsKKyAgc3RhdGljIHZvaWQgX0xlc3NUaGFuQ29tcGFyYWJsZV9yZXF1aXJlbWVudF92aW9sYXRpb24oX1R5cGUgX19hKSB7CisgICAgX1NUTF9FUlJPUjo6X19sZXNzX3RoYW5fY29tcGFyYWJsZV9yZXF1aXJlbWVudF92aW9sYXRpb24oX19hLCBfX2EpOworICB9Cit9OworCisvKiBUcml2aWFsSXRlcmF0b3IgUmVxdWlyZW1lbnRzICovCisKK3RlbXBsYXRlIDxjbGFzcyBfVHJpdmlhbEl0ZXJhdG9yPgorc3RydWN0IF9Ucml2aWFsSXRlcmF0b3JfY29uY2VwdF9zcGVjaWZpY2F0aW9uIHsKK3N0YXRpYyB2b2lkCitfVHJpdmlhbEl0ZXJhdG9yX3JlcXVpcmVtZW50X3Zpb2xhdGlvbihfVHJpdmlhbEl0ZXJhdG9yIF9faSkgeworICB0eXBlZGVmIHR5cGVuYW1lCisgICAgX192YWx1ZV90eXBlX3R5cGVfZGVmaW5pdGlvbl9yZXF1aXJlbWVudF92aW9sYXRpb248X1RyaXZpYWxJdGVyYXRvcj46OgorICAgIHZhbHVlX3R5cGUgX19UOworICAvLyBSZWZpbmVtZW50IG9mIEFzc2lnbmFibGUKKyAgX0Fzc2lnbmFibGVfY29uY2VwdF9zcGVjaWZpY2F0aW9uPF9Ucml2aWFsSXRlcmF0b3I+OjoKKyAgICBfQXNzaWduYWJsZV9yZXF1aXJlbWVudF92aW9sYXRpb24oX19pKTsKKyAgLy8gUmVmaW5lbWVudCBvZiBEZWZhdWx0Q29uc3RydWN0aWJsZQorICBfRGVmYXVsdENvbnN0cnVjdGlibGVfY29uY2VwdF9zcGVjaWZpY2F0aW9uPF9Ucml2aWFsSXRlcmF0b3I+OjoKKyAgICBfRGVmYXVsdENvbnN0cnVjdGlibGVfcmVxdWlyZW1lbnRfdmlvbGF0aW9uKF9faSk7CisgIC8vIFJlZmluZW1lbnQgb2YgRXF1YWxpdHlDb21wYXJhYmxlCisgIF9FcXVhbGl0eUNvbXBhcmFibGVfY29uY2VwdF9zcGVjaWZpY2F0aW9uPF9Ucml2aWFsSXRlcmF0b3I+OjoKKyAgICBfRXF1YWxpdHlDb21wYXJhYmxlX3JlcXVpcmVtZW50X3Zpb2xhdGlvbihfX2kpOworICAvLyBWYWxpZCBFeHByZXNzaW9ucworICBfU1RMX0VSUk9SOjpfX2RlcmVmZXJlbmNlX29wZXJhdG9yX3JlcXVpcmVtZW50X3Zpb2xhdGlvbihfX2kpOworfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9Ucml2aWFsSXRlcmF0b3I+CitzdHJ1Y3QgX011dGFibGVfVHJpdmlhbEl0ZXJhdG9yX2NvbmNlcHRfc3BlY2lmaWNhdGlvbiB7CitzdGF0aWMgdm9pZAorX011dGFibGVfVHJpdmlhbEl0ZXJhdG9yX3JlcXVpcmVtZW50X3Zpb2xhdGlvbihfVHJpdmlhbEl0ZXJhdG9yIF9faSkgeworICBfVHJpdmlhbEl0ZXJhdG9yX2NvbmNlcHRfc3BlY2lmaWNhdGlvbjxfVHJpdmlhbEl0ZXJhdG9yPjo6CisgICAgX1RyaXZpYWxJdGVyYXRvcl9yZXF1aXJlbWVudF92aW9sYXRpb24oX19pKTsKKyAgLy8gVmFsaWQgRXhwcmVzc2lvbnMKKyAgX1NUTF9FUlJPUjo6X19kZXJlZmVyZW5jZV9vcGVyYXRvcl9hbmRfYXNzaWdubWVudF9yZXF1aXJlbWVudF92aW9sYXRpb24oX19pKTsKK30KK307CisKKy8qIElucHV0SXRlcmF0b3IgUmVxdWlyZW1lbnRzICovCisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KK3N0cnVjdCBfSW5wdXRJdGVyYXRvcl9jb25jZXB0X3NwZWNpZmljYXRpb24geworc3RhdGljIHZvaWQKK19JbnB1dEl0ZXJhdG9yX3JlcXVpcmVtZW50X3Zpb2xhdGlvbihfSW5wdXRJdGVyYXRvciBfX2kpIHsKKyAgLy8gUmVmaW5lbWVudCBvZiBUcml2aWFsSXRlcmF0b3IKKyAgX1RyaXZpYWxJdGVyYXRvcl9jb25jZXB0X3NwZWNpZmljYXRpb248X0lucHV0SXRlcmF0b3I+OjoKKyAgICBfVHJpdmlhbEl0ZXJhdG9yX3JlcXVpcmVtZW50X3Zpb2xhdGlvbihfX2kpOworICAvLyBBc3NvY2lhdGVkIFR5cGVzCisgIF9fZGlmZmVyZW5jZV90eXBlX3R5cGVfZGVmaW5pdGlvbl9yZXF1aXJlbWVudF92aW9sYXRpb248X0lucHV0SXRlcmF0b3I+KCk7CisgIF9fcmVmZXJlbmNlX3R5cGVfZGVmaW5pdGlvbl9yZXF1aXJlbWVudF92aW9sYXRpb248X0lucHV0SXRlcmF0b3I+KCk7CisgIF9fcG9pbnRlcl90eXBlX2RlZmluaXRpb25fcmVxdWlyZW1lbnRfdmlvbGF0aW9uPF9JbnB1dEl0ZXJhdG9yPigpOworICBfX2l0ZXJhdG9yX2NhdGVnb3J5X3R5cGVfZGVmaW5pdGlvbl9yZXF1aXJlbWVudF92aW9sYXRpb248X0lucHV0SXRlcmF0b3I+KCk7CisgIC8vIFZhbGlkIEV4cHJlc3Npb25zCisgIF9TVExfRVJST1I6Ol9fcHJlaW5jcmVtZW50X29wZXJhdG9yX3JlcXVpcmVtZW50X3Zpb2xhdGlvbihfX2kpOworICBfU1RMX0VSUk9SOjpfX3Bvc3RpbmNyZW1lbnRfb3BlcmF0b3JfcmVxdWlyZW1lbnRfdmlvbGF0aW9uKF9faSk7Cit9Cit9OworCisvKiBPdXRwdXRJdGVyYXRvciBSZXF1aXJlbWVudHMgKi8KKwordGVtcGxhdGUgPGNsYXNzIF9PdXRwdXRJdGVyYXRvcj4KK3N0cnVjdCBfT3V0cHV0SXRlcmF0b3JfY29uY2VwdF9zcGVjaWZpY2F0aW9uIHsKK3N0YXRpYyB2b2lkCitfT3V0cHV0SXRlcmF0b3JfcmVxdWlyZW1lbnRfdmlvbGF0aW9uKF9PdXRwdXRJdGVyYXRvciBfX2kpIHsKKyAgLy8gUmVmaW5lbWVudCBvZiBBc3NpZ25hYmxlCisgIF9Bc3NpZ25hYmxlX2NvbmNlcHRfc3BlY2lmaWNhdGlvbjxfT3V0cHV0SXRlcmF0b3I+OjoKKyAgICBfQXNzaWduYWJsZV9yZXF1aXJlbWVudF92aW9sYXRpb24oX19pKTsKKyAgLy8gQXNzb2NpYXRlZCBUeXBlcworICBfX2l0ZXJhdG9yX2NhdGVnb3J5X3R5cGVfZGVmaW5pdGlvbl9yZXF1aXJlbWVudF92aW9sYXRpb248X091dHB1dEl0ZXJhdG9yPigpOworICAvLyBWYWxpZCBFeHByZXNzaW9ucworICBfU1RMX0VSUk9SOjpfX2RlcmVmZXJlbmNlX29wZXJhdG9yX3JlcXVpcmVtZW50X3Zpb2xhdGlvbihfX2kpOworICBfU1RMX0VSUk9SOjpfX3ByZWluY3JlbWVudF9vcGVyYXRvcl9yZXF1aXJlbWVudF92aW9sYXRpb24oX19pKTsKKyAgX1NUTF9FUlJPUjo6X19wb3N0aW5jcmVtZW50X29wZXJhdG9yX3JlcXVpcmVtZW50X3Zpb2xhdGlvbihfX2kpOworICBfU1RMX0VSUk9SOjoKKyAgICBfX3Bvc3RpbmNyZW1lbnRfb3BlcmF0b3JfYW5kX2Fzc2lnbm1lbnRfcmVxdWlyZW1lbnRfdmlvbGF0aW9uKF9faSwgKl9faSk7Cit9Cit9OworCisvKiBGb3J3YXJkSXRlcmF0b3IgUmVxdWlyZW1lbnRzICovCisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorc3RydWN0IF9Gb3J3YXJkSXRlcmF0b3JfY29uY2VwdF9zcGVjaWZpY2F0aW9uIHsKK3N0YXRpYyB2b2lkCitfRm9yd2FyZEl0ZXJhdG9yX3JlcXVpcmVtZW50X3Zpb2xhdGlvbihfRm9yd2FyZEl0ZXJhdG9yIF9faSkgeworICAvLyBSZWZpbmVtZW50IG9mIElucHV0SXRlcmF0b3IKKyAgX0lucHV0SXRlcmF0b3JfY29uY2VwdF9zcGVjaWZpY2F0aW9uPF9Gb3J3YXJkSXRlcmF0b3I+OjoKKyAgICBfSW5wdXRJdGVyYXRvcl9yZXF1aXJlbWVudF92aW9sYXRpb24oX19pKTsKK30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorc3RydWN0IF9NdXRhYmxlX0ZvcndhcmRJdGVyYXRvcl9jb25jZXB0X3NwZWNpZmljYXRpb24geworc3RhdGljIHZvaWQKK19NdXRhYmxlX0ZvcndhcmRJdGVyYXRvcl9yZXF1aXJlbWVudF92aW9sYXRpb24oX0ZvcndhcmRJdGVyYXRvciBfX2kpIHsKKyAgX0ZvcndhcmRJdGVyYXRvcl9jb25jZXB0X3NwZWNpZmljYXRpb248X0ZvcndhcmRJdGVyYXRvcj46OgorICAgIF9Gb3J3YXJkSXRlcmF0b3JfcmVxdWlyZW1lbnRfdmlvbGF0aW9uKF9faSk7CisgIC8vIFJlZmluZW1lbnQgb2YgT3V0cHV0SXRlcmF0b3IKKyAgX091dHB1dEl0ZXJhdG9yX2NvbmNlcHRfc3BlY2lmaWNhdGlvbjxfRm9yd2FyZEl0ZXJhdG9yPjo6CisgICAgX091dHB1dEl0ZXJhdG9yX3JlcXVpcmVtZW50X3Zpb2xhdGlvbihfX2kpOworfQorfTsKKworLyogQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIFJlcXVpcmVtZW50cyAqLworCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcj4KK3N0cnVjdCBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yX2NvbmNlcHRfc3BlY2lmaWNhdGlvbiB7CitzdGF0aWMgdm9pZAorX0JpZGlyZWN0aW9uYWxJdGVyYXRvcl9yZXF1aXJlbWVudF92aW9sYXRpb24oX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2kpIHsKKyAgLy8gUmVmaW5lbWVudCBvZiBGb3J3YXJkSXRlcmF0b3IKKyAgX0ZvcndhcmRJdGVyYXRvcl9jb25jZXB0X3NwZWNpZmljYXRpb248X0JpZGlyZWN0aW9uYWxJdGVyYXRvcj46OgorICAgIF9Gb3J3YXJkSXRlcmF0b3JfcmVxdWlyZW1lbnRfdmlvbGF0aW9uKF9faSk7CisgIC8vIFZhbGlkIEV4cHJlc3Npb25zCisgIF9TVExfRVJST1I6Ol9fcHJlZGVjcmVtZW50X29wZXJhdG9yX3JlcXVpcmVtZW50X3Zpb2xhdGlvbihfX2kpOworICBfU1RMX0VSUk9SOjpfX3Bvc3RkZWNyZW1lbnRfb3BlcmF0b3JfcmVxdWlyZW1lbnRfdmlvbGF0aW9uKF9faSk7Cit9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcj4KK3N0cnVjdCBfTXV0YWJsZV9CaWRpcmVjdGlvbmFsSXRlcmF0b3JfY29uY2VwdF9zcGVjaWZpY2F0aW9uIHsKK3N0YXRpYyB2b2lkCitfTXV0YWJsZV9CaWRpcmVjdGlvbmFsSXRlcmF0b3JfcmVxdWlyZW1lbnRfdmlvbGF0aW9uKAorICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19pKQoreworICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yX2NvbmNlcHRfc3BlY2lmaWNhdGlvbjxfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yPjo6CisgICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcl9yZXF1aXJlbWVudF92aW9sYXRpb24oX19pKTsKKyAgLy8gUmVmaW5lbWVudCBvZiBtdXRhYmxlX0ZvcndhcmRJdGVyYXRvcgorICBfTXV0YWJsZV9Gb3J3YXJkSXRlcmF0b3JfY29uY2VwdF9zcGVjaWZpY2F0aW9uPF9CaWRpcmVjdGlvbmFsSXRlcmF0b3I+OjoKKyAgICBfTXV0YWJsZV9Gb3J3YXJkSXRlcmF0b3JfcmVxdWlyZW1lbnRfdmlvbGF0aW9uKF9faSk7CisgIHR5cGVkZWYgdHlwZW5hbWUKKyAgICBfX3ZhbHVlX3R5cGVfdHlwZV9kZWZpbml0aW9uX3JlcXVpcmVtZW50X3Zpb2xhdGlvbjwKKyAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yPjo6dmFsdWVfdHlwZSBfX1Q7CisgIHR5cGVuYW1lIF9NdXRhYmxlX3RyYWl0PF9fVD46Ol9UeXBlKiBfX3RtcF9wdHIgPSAwOworICAvLyBWYWxpZCBFeHByZXNzaW9ucworICBfU1RMX0VSUk9SOjoKKyAgICBfX3Bvc3RpbmNyZW1lbnRfb3BlcmF0b3JfYW5kX2Fzc2lnbm1lbnRfcmVxdWlyZW1lbnRfdmlvbGF0aW9uKF9faSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpfX3RtcF9wdHIpOworfQorfTsKKworLyogUmFuZG9tQWNjZXNzSXRlcmF0b3IgUmVxdWlyZW1lbnRzICovCisKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZEFjY0l0ZXI+CitzdHJ1Y3QgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yX2NvbmNlcHRfc3BlY2lmaWNhdGlvbiB7CitzdGF0aWMgdm9pZAorX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yX3JlcXVpcmVtZW50X3Zpb2xhdGlvbihfUmFuZEFjY0l0ZXIgX19pKSB7CisgIC8vIFJlZmluZW1lbnQgb2YgQmlkaXJlY3Rpb25hbEl0ZXJhdG9yCisgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3JfY29uY2VwdF9zcGVjaWZpY2F0aW9uPF9SYW5kQWNjSXRlcj46OgorICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3JfcmVxdWlyZW1lbnRfdmlvbGF0aW9uKF9faSk7CisgIC8vIFJlZmluZW1lbnQgb2YgTGVzc1RoYW5Db21wYXJhYmxlCisgIF9MZXNzVGhhbkNvbXBhcmFibGVfY29uY2VwdF9zcGVjaWZpY2F0aW9uPF9SYW5kQWNjSXRlcj46OgorICAgIF9MZXNzVGhhbkNvbXBhcmFibGVfcmVxdWlyZW1lbnRfdmlvbGF0aW9uKF9faSk7CisgIHR5cGVkZWYgdHlwZW5hbWUKKyAgICAgICAgX192YWx1ZV90eXBlX3R5cGVfZGVmaW5pdGlvbl9yZXF1aXJlbWVudF92aW9sYXRpb248X1JhbmRBY2NJdGVyPgorICAgICAgICA6OnZhbHVlX3R5cGUKKyAgICB2YWx1ZV90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lCisgICAgICAgIF9fZGlmZmVyZW5jZV90eXBlX3R5cGVfZGVmaW5pdGlvbl9yZXF1aXJlbWVudF92aW9sYXRpb248X1JhbmRBY2NJdGVyPgorICAgICAgICA6OmRpZmZlcmVuY2VfdHlwZQorICAgIF9EaXN0OworICB0eXBlZGVmIHR5cGVuYW1lIF9NdXRhYmxlX3RyYWl0PF9EaXN0Pjo6X1R5cGUgX011dERpc3Q7CisKKyAgLy8gVmFsaWQgRXhwcmVzc2lvbnMKKyAgX1NUTF9FUlJPUjo6X19pdGVyYXRvcl9hZGRpdGlvbl9hc3NpZ25tZW50X3JlcXVpcmVtZW50X3Zpb2xhdGlvbihfX2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX011dERpc3QoKSk7CisgIF9TVExfRVJST1I6Ol9faXRlcmF0b3JfYWRkaXRpb25fcmVxdWlyZW1lbnRfdmlvbGF0aW9uKF9faSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX011dERpc3QoKSk7CisgIF9TVExfRVJST1I6OgorICAgIF9faXRlcmF0b3Jfc3VidHJhY3Rpb25fYXNzaWdubWVudF9yZXF1aXJlbWVudF92aW9sYXRpb24oX19pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX011dERpc3QoKSk7CisgIF9TVExfRVJST1I6Ol9faXRlcmF0b3Jfc3VidHJhY3Rpb25fcmVxdWlyZW1lbnRfdmlvbGF0aW9uKF9faSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX011dERpc3QoKSk7CisgIF9TVExfRVJST1I6Ol9fZGlmZmVyZW5jZV9vcGVyYXRvcl9yZXF1aXJlbWVudF92aW9sYXRpb24oX19pLCBfX2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX011dERpc3QoKSk7CisgIHR5cGVuYW1lIF9NdXRhYmxlX3RyYWl0PHZhbHVlX3R5cGU+OjpfVHlwZSogX19kdW1teV9wdHIgPSAwOworICBfU1RMX0VSUk9SOjpfX2VsZW1lbnRfYWNjZXNzX29wZXJhdG9yX3JlcXVpcmVtZW50X3Zpb2xhdGlvbihfX2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZHVtbXlfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTXV0RGlzdCgpKTsKK30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZEFjY0l0ZXI+CitzdHJ1Y3QgX011dGFibGVfUmFuZG9tQWNjZXNzSXRlcmF0b3JfY29uY2VwdF9zcGVjaWZpY2F0aW9uIHsKK3N0YXRpYyB2b2lkCitfTXV0YWJsZV9SYW5kb21BY2Nlc3NJdGVyYXRvcl9yZXF1aXJlbWVudF92aW9sYXRpb24oX1JhbmRBY2NJdGVyIF9faSkKK3sKKyAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yX2NvbmNlcHRfc3BlY2lmaWNhdGlvbjxfUmFuZEFjY0l0ZXI+OjoKKyAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3JfcmVxdWlyZW1lbnRfdmlvbGF0aW9uKF9faSk7CisgIC8vIFJlZmluZW1lbnQgb2YgbXV0YWJsZV9CaWRpcmVjdGlvbmFsSXRlcmF0b3IKKyAgX011dGFibGVfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yX2NvbmNlcHRfc3BlY2lmaWNhdGlvbjxfUmFuZEFjY0l0ZXI+OjoKKyAgICBfTXV0YWJsZV9CaWRpcmVjdGlvbmFsSXRlcmF0b3JfcmVxdWlyZW1lbnRfdmlvbGF0aW9uKF9faSk7CisgIHR5cGVkZWYgdHlwZW5hbWUKKyAgICAgICAgX192YWx1ZV90eXBlX3R5cGVfZGVmaW5pdGlvbl9yZXF1aXJlbWVudF92aW9sYXRpb248X1JhbmRBY2NJdGVyPgorICAgICAgICA6OnZhbHVlX3R5cGUKKyAgICB2YWx1ZV90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lCisgICAgICAgIF9fZGlmZmVyZW5jZV90eXBlX3R5cGVfZGVmaW5pdGlvbl9yZXF1aXJlbWVudF92aW9sYXRpb248X1JhbmRBY2NJdGVyPgorICAgICAgICA6OmRpZmZlcmVuY2VfdHlwZQorICAgIF9EaXN0OworCisgIHR5cGVuYW1lIF9NdXRhYmxlX3RyYWl0PHZhbHVlX3R5cGU+OjpfVHlwZSogX190bXBfcHRyID0gMDsKKyAgLy8gVmFsaWQgRXhwcmVzc2lvbnMKKyAgX1NUTF9FUlJPUjo6X19lbGVtZW50X2Fzc2lnbm1lbnRfb3BlcmF0b3JfcmVxdWlyZW1lbnRfdmlvbGF0aW9uKF9faSwKKyAgICAgICAgICAgICAgICAgIF9fdG1wX3B0ciwgX0Rpc3QoKSk7Cit9Cit9OworCisjZGVmaW5lIF9TVExQX1RZUEVERUZfUkVRVUlSRU1FTlQoX19SRVFVSVJFTUVOVCkgXAordGVtcGxhdGUgPGNsYXNzIFR5cGU+IFwKK3N0cnVjdCBfXyMjX19SRVFVSVJFTUVOVCMjX190eXBlZGVmX3JlcXVpcmVtZW50X3Zpb2xhdGlvbiB7IFwKKyAgdHlwZWRlZiB0eXBlbmFtZSBUeXBlOjpfX1JFUVVJUkVNRU5UIF9fUkVRVUlSRU1FTlQ7IFwKK307CisKK19TVExQX1RZUEVERUZfUkVRVUlSRU1FTlQodmFsdWVfdHlwZSk7CitfU1RMUF9UWVBFREVGX1JFUVVJUkVNRU5UKGRpZmZlcmVuY2VfdHlwZSk7CitfU1RMUF9UWVBFREVGX1JFUVVJUkVNRU5UKHNpemVfdHlwZSk7CitfU1RMUF9UWVBFREVGX1JFUVVJUkVNRU5UKHJlZmVyZW5jZSk7CitfU1RMUF9UWVBFREVGX1JFUVVJUkVNRU5UKGNvbnN0X3JlZmVyZW5jZSk7CitfU1RMUF9UWVBFREVGX1JFUVVJUkVNRU5UKHBvaW50ZXIpOworX1NUTFBfVFlQRURFRl9SRVFVSVJFTUVOVChjb25zdF9wb2ludGVyKTsKKworCit0ZW1wbGF0ZSA8Y2xhc3MgX0FsbG9jPgorc3RydWN0IF9BbGxvY2F0b3JfY29uY2VwdF9zcGVjaWZpY2F0aW9uIHsKK3N0YXRpYyB2b2lkCitfQWxsb2NhdG9yX3JlcXVpcmVtZW50X3Zpb2xhdGlvbihfQWxsb2MgX19hKSB7CisgIC8vIFJlZmluZW1lbnQgb2YgRGVmYXVsdENvbnN0cnVjdGlibGUKKyAgX0RlZmF1bHRDb25zdHJ1Y3RpYmxlX2NvbmNlcHRfc3BlY2lmaWNhdGlvbjxfQWxsb2M+OjoKKyAgICBfRGVmYXVsdENvbnN0cnVjdGlibGVfcmVxdWlyZW1lbnRfdmlvbGF0aW9uKF9fYSk7CisgIC8vIFJlZmluZW1lbnQgb2YgRXF1YWxpdHlDb21wYXJhYmxlCisgIF9FcXVhbGl0eUNvbXBhcmFibGVfY29uY2VwdF9zcGVjaWZpY2F0aW9uPF9BbGxvYz46OgorICAgIF9FcXVhbGl0eUNvbXBhcmFibGVfcmVxdWlyZW1lbnRfdmlvbGF0aW9uKF9fYSk7CisgIC8vIEFzc29jaWF0ZWQgVHlwZXMKKyAgX192YWx1ZV90eXBlX190eXBlZGVmX3JlcXVpcmVtZW50X3Zpb2xhdGlvbjxfQWxsb2M+KCk7CisgIF9fZGlmZmVyZW5jZV90eXBlX190eXBlZGVmX3JlcXVpcmVtZW50X3Zpb2xhdGlvbjxfQWxsb2M+KCk7CisgIF9fc2l6ZV90eXBlX190eXBlZGVmX3JlcXVpcmVtZW50X3Zpb2xhdGlvbjxfQWxsb2M+KCk7CisgIF9fcmVmZXJlbmNlX190eXBlZGVmX3JlcXVpcmVtZW50X3Zpb2xhdGlvbjxfQWxsb2M+KCk7CisgIF9fY29uc3RfcmVmZXJlbmNlX190eXBlZGVmX3JlcXVpcmVtZW50X3Zpb2xhdGlvbjxfQWxsb2M+KCk7CisgIF9fcG9pbnRlcl9fdHlwZWRlZl9yZXF1aXJlbWVudF92aW9sYXRpb248X0FsbG9jPigpOworICBfX2NvbnN0X3BvaW50ZXJfX3R5cGVkZWZfcmVxdWlyZW1lbnRfdmlvbGF0aW9uPF9BbGxvYz4oKTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnZhbHVlX3R5cGUgX1R5cGU7CisgIF9TVExQX1JFUVVJUkVTX1NBTUVfVFlQRSh0eXBlbmFtZSBfQWxsb2M6OnJlYmluZDxfVHlwZT46Om90aGVyLCBfQWxsb2MpOworfQorfTsKKworI2VuZGlmIC8qIF9TVExQX1VTRV9DT05DRVBUX0NIRUNLUyAqLworCisjZW5kaWYgLyogX19DT05DRVBUX0NIRUNLU19IICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvY29uZmlnL19haXguaCBiL3N0bC9jb25maWcvX2FpeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjYmNiMzIKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvY29uZmlnL19haXguaApAQCAtMCwwICsxIEBACisjZGVmaW5lIF9TVExQX1BMQVRGT1JNICJBSVgiCmRpZmYgLS1naXQgYS9zdGwvY29uZmlnL19hbmRyb2lkLmggYi9zdGwvY29uZmlnL19hbmRyb2lkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE5NTRiZgotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9jb25maWcvX2FuZHJvaWQuaApAQCAtMCwwICsxLDc5IEBACisjaWZuZGVmIF9fc3RsX2NvbmZpZ19fYW5kcm9pZF9oCisjZGVmaW5lIF9fc3RsX2NvbmZpZ19fYW5kcm9pZF9oCisKKyNkZWZpbmUgX1NUTFBfUExBVEZPUk0gIkFuZHJvaWQiCisKKy8vIFRoZSBBbmRyb2lkIEMgbGlicmFyeSBpcyBtb3N0bHkgZ2xpYmMtbGlrZQorI2RlZmluZSBfU1RMUF9VU0VfR0xJQkMgMQorCisvLyAuLi5hbmQgVW5peC1saWtlLgorI2RlZmluZSBfU1RMUF9VTklYIDEKKworLy8gSGF2ZSBwdGhyZWFkcyBzdXBwb3J0LgorI2RlZmluZSBfUFRIUkVBRFMKKworLy8gRG9uJ3QgaGF2ZSBuYXRpdmUgPGNwbHVzcGx1cz4gaGVhZGVycworI2RlZmluZSBfU1RMUF9IQVNfTk9fTkVXX0NfSEVBREVSUyAxCisKKy8vIERvbid0IHVzZSB3Y2hhci5oIGV0YworI2RlZmluZSBfU1RMUF9OT19XQ0hBUl9UIDEKKworLy8gRG9uJ3QgaGF2ZSAod29ya2luZykgbmF0aXZlIHdpZGUgY2hhcmFjdGVyIHN1cHBvcnQuCisjZGVmaW5lIF9TVExQX05PX05BVElWRV9XSURFX0ZVTkNUSU9OUyAxCisKKy8vIERvbid0IHVzZSBtYnN0YXRlX3QsIGRlZmluZSBvdXIgb3duLgorI2RlZmluZSBfU1RMUF9OT19OQVRJVkVfTUJTVEFURV9UIDEKKworLy8gTm8gKHByb3Blcikgd2lkZSBzdHJlYW0gc3VwcG9ydCBpbiBBbmRyb2lkCisjZGVmaW5lIF9TVExQX05PX05BVElWRV9XSURFX1NUUkVBTVMgMQorCisvLyBDIGxpYnJhcnkgaXMgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuCisjZGVmaW5lIF9TVExQX1ZFTkRPUl9HTE9CQUxfQ1NURCAxCisKKy8vIERvbid0IGhhdmUgdW5kZXJseWluZyBsb2NhbCBzdXBwb3J0LgorI3VuZGVmIF9TVExQX1JFQUxfTE9DQUxFX0lNUExFTUVOVEVECisKKy8vIE5vIHB0aHJlYWRfc3BpbmxvY2tfdCBpbiBBbmRyb2lkCisjZGVmaW5lIF9TVExQX0RPTlRfVVNFX1BUSFJFQURfU1BJTkxPQ0sgMQorCisvLyBEbyBub3QgZW5hYmxlIHRocmVhZCBzdXBwb3J0CisjZGVmaW5lIF9OT1RIUkVBRFMgMQorCisvLyBMaXR0bGUgZW5kaWFuIHBsYXRmb3JtLgorI2RlZmluZSBfU1RMUF9MSVRUTEVfRU5ESUFOIDEKKworLy8gTm8gPGV4Y2VwdGlvbj4gaGVhZGVycworI2RlZmluZSBfU1RMUF9OT19FWENFUFRJT05fSEVBREVSIDEKKworLy8gTm8gdGhyb3dpbmcgZXhjZXB0aW9ucworI2RlZmluZSBfU1RMUF9OT19FWENFUFRJT05TIDEKKworLy8gRGlzYWJsZSBhbGwgaW9zdHJlYW1zCisjZGVmaW5lIF9TVExQX05PX0lPU1RSRUFNUyAxCisKKy8vIE5vIG5lZWQgdG8gZGVmaW5lIG91ciBvd24gbmFtZXNwYWNlCisjZGVmaW5lIF9TVExQX05PX09XTl9OQU1FU1BBQ0UgMQorCisvLyBOZWVkIHRoaXMgdG8gZGVmaW5lIFNUTHBvcnQncyBvd24gYmFkX2FsbG9jIGNsYXNzICh3aGljaCB3b24ndCBiZQorLy8gdGhyb3duIGluIGFueSBjYXNlKQorI2RlZmluZSBfU1RMUF9ORVdfRE9OVF9USFJPV19CQURfQUxMT0MgMQorCisvLyBVc2UgX19uZXdfYWxsb2MgaW5zdGVhZCBvZiBfX25vZGVfYWxsb2MsIHNvIHdlIGRvbid0IG5lZWQgc3RhdGljIGZ1bmN0aW9ucy4KKyNkZWZpbmUgX1NUTFBfVVNFX1NJTVBMRV9OT0RFX0FMTE9DIDEKKworLy8gRG9uJ3QgdXNlIGV4dGVybiB2ZXJzaW9ucyBvZiByYW5nZSBlcnJvcnMsIHNvIHdlIGRvbid0IG5lZWQgdG8KKy8vIGNvbXBpbGUgYXMgYSBsaWJyYXJ5LgorI2RlZmluZSBfU1RMUF9VU0VfTk9fRVhURVJOX1JBTkdFX0VSUk9SUyAxCisKKy8vIFRoZSBzeXN0ZW0gbWF0aCBsaWJyYXJ5IGRvZXNuJ3QgaGF2ZSBsb25nIGRvdWJsZSB2YXJpYW50cywgZS5nCisvLyBzaW5sLCBjb3NsLCBldGMKKyNkZWZpbmUgX1NUTFBfTk9fVkVORE9SX01BVEhfTCAxCisKKy8vIERlZmluZSBob3cgdG8gaW5jbHVkZSBvdXIgbmF0aXZlIGhlYWRlcnMuCisjZGVmaW5lIF9TVExQX05BVElWRV9IRUFERVIoaGVhZGVyKSA8bGlic3RkYysrL2luY2x1ZGUvaGVhZGVyPgorI2RlZmluZSBfU1RMUF9OQVRJVkVfQ19IRUFERVIoaGVhZGVyKSA8Li4vaW5jbHVkZS9oZWFkZXI+CisjZGVmaW5lIF9TVExQX05BVElWRV9DUFBfQ19IRUFERVIoaGVhZGVyKSA8bGlic3RkYysrL2luY2x1ZGUvaGVhZGVyPgorI2RlZmluZSBfU1RMUF9OQVRJVkVfT0xEX1NUUkVBTVNfSEVBREVSKGhlYWRlcikgPGxpYnN0ZGMrKy9pbmNsdWRlL2hlYWRlcj4KKyNkZWZpbmUgX1NUTFBfTkFUSVZFX0NQUF9SVU5USU1FX0hFQURFUihoZWFkZXIpIDxsaWJzdGRjKysvaW5jbHVkZS9oZWFkZXI+CisKKyNlbmRpZiAvKiBfX3N0bF9jb25maWdfX2FuZHJvaWRfaCAqLwpkaWZmIC0tZ2l0IGEvc3RsL2NvbmZpZy9fYXBjYy5oIGIvc3RsL2NvbmZpZy9fYXBjYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlOGIxMTUKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvY29uZmlnL19hcGNjLmgKQEAgLTAsMCArMSwzMSBAQAorLy8gU1RMcG9ydCBjb25maWcgZmlsZSBmb3IgQXBvZ2VlIDQueAorCisjZGVmaW5lIF9TVExQX0NPTVBJTEVSICJBcG9nZWUiCisKKyNkZWZpbmUgX1NUTFBfTk9fTkVXX05FV19IRUFERVIgMQorI2RlZmluZSBfU1RMUF9IQVNfTk9fTkVXX0lPU1RSRUFNUyAxCisjZGVmaW5lIF9TVExQX0hBU19OT19ORVdfQ19IRUFERVJTIDEKKworI2lmIGRlZmluZWQoX1hPUEVOX1NPVVJDRSkgJiYgKF9YT1BFTl9WRVJTSU9OIC0gMCA+PSA0KQorIyBkZWZpbmUgX1NUTFBfUkFORDQ4IDEKKyNlbmRpZgorLy8gIyAgZGVmaW5lIF9TVExQX1JBTkQ0OCAxCisjZGVmaW5lIF9TVExQX0xPTkdfTE9ORyBsb25nIGxvbmcKKyNkZWZpbmUgX1NUTFBfTk9fQkFEX0FMTE9DIDEKKyNkZWZpbmUgX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFX0tFWVdPUkQgMQorI2RlZmluZSBfU1RMUF9OT05fVFlQRV9UTVBMX1BBUkFNX0JVRyAxCisvLyAjICBkZWZpbmUgX1NUTFBfTk9fRVhQTElDSVRfRlVOQ1RJT05fVE1QTF9BUkdTIDEKKyNkZWZpbmUgX1NUTFBfTk9fRVhDRVBUSU9OX0hFQURFUiAxCisKKyN1bmRlZiAgX1NUTFBfTElOS19USU1FX0lOU1RBTlRJQVRJT04KKyNkZWZpbmUgX1NUTFBfTElOS19USU1FX0lOU1RBTlRJQVRJT04gMQorCisjaWZkZWYgX19TVERMSUIKKyMgIHVuZGVmIF9TVExQX05PX05FV19DX0hFQURFUlMKKyMgIHVuZGVmIF9TVExQX05PX05FV19ORVdfSEVBREVSCisjICB1bmRlZiBfU1RMUF9OT19CQURfQUxMT0MKKyMgIHVuZGVmIF9TVExQX0xPTkdfTE9ORworI2Vsc2UKKyMgIHVuZGVmICBfU1RMUF9OT19FWENFUFRJT05fU1BFQworIyAgZGVmaW5lIF9TVExQX05PX0VYQ0VQVElPTl9TUEVDIDEKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3RsL2NvbmZpZy9fYXBwbGUuaCBiL3N0bC9jb25maWcvX2FwcGxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMwMzBkYgotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9jb25maWcvX2FwcGxlLmgKQEAgLTAsMCArMSwxMjIgQEAKKy8qIFNUTHBvcnQgY29uZmlndXJhdGlvbiBmaWxlCisgKiBJdCBpcyBpbnRlcm5hbCBTVExwb3J0IGhlYWRlciAtIERPIE5PVCBpbmNsdWRlIGl0IGRpcmVjdGx5CisgKi8KKworLyogY29tbW9uIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgZm9yIEFwcGxlIE1QVyBNckNwcCAvIFNDcHAgKi8KKworI2lmIGRlZmluZWQgKF9fTVJDX18pCisjICBkZWZpbmUgX1NUTFBfQ09NUElMRVIgIk1QVyBNckNwcCIKKyNlbHNlCisjICBkZWZpbmUgX1NUTFBfQ09NUElMRVIgIk1QVyBTQ3BwIgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fTVJDX18pICYmIF9fTVJDX18gPCAweDUwMAorIyBlcnJvciBBcHBsZSdzIE1QVyBNckNwcCB2LjUuMC4wIG9yIGJldHRlciBjb21waWxlciByZXF1aXJlZAorI2VuZGlmCisjaWYgZGVmaW5lZChfX1NDX18pICYmIF9fU0NfXyA8IDB4ODkwCisjIGVycm9yIEFwcGxlJ3MgTVBXIFNDcHAgdi44LjkuMCBvciBiZXR0ZXIgY29tcGlsZXIgcmVxdWlyZWQKKyNlbmRpZgorCisvKiBUT0RPOiBDaGVjayB0aGF0IHRoaXMgY29uZmlnIGlzIG5lY2Vzc2FyeSBmb3IgYWxsIGNvbXBpbGVyIHZlcnNpb25zLgorICogSXQgaXMgaGVyZSBmb3IgaGlzdG9yaWNhbCByZWFzb25zIGZvciB0aGUgbW9tZW50LgorICovCisjZGVmaW5lIF9TVExQX05PX0NPTlRBSU5FUlNfRVhURU5TSU9OCisKKyNpZmRlZiBxTWFjQXBwCisjIGlmbmRlZiBfX0NPTkRJVElPTkFMTUFDUk9TX18gLyogc2tpcCBpbmNsdWRpbmcgQ29uZGl0aW9uYWxNYWNyb3NfQUMuaCBpZiBDb25kaXRpb25hbE1hY3Jvcy5oIGlzIGFscmVhZHkgaW5jbHVkZWQgKi8KKyMgaW5jbHVkZSA8Q29yZVN3aXRjaGVzX0FDLmg+CisjIGluY2x1ZGUgPENvbmRpdGlvbmFsTWFjcm9zX0FDLmg+CisjIGluY2x1ZGUgPFR5cGVzX0FDLmg+CisjIGRlZmluZSBfU1RMUF9GSUxFX18gX0ZJTEVfQUMKKyMgZGVmaW5lIF9TVExQX0RFQlVHX01FU1NBR0UKKyMgZGVmaW5lIF9fc3RsX2RlYnVnX21lc3NhZ2UgUHJvZ3JhbUJyZWFrX0FDCisjIGluY2x1ZGUgPENvbmRpdGlvbmFsTWFjcm9zLmg+CisjIGVuZGlmCisjIGluY2x1ZGUgPFR5cGVzLmg+CisjZWxzZQorIyBpbmNsdWRlIDxDb25kaXRpb25hbE1hY3Jvcy5oPgorIyBpbmNsdWRlIDxUeXBlcy5oPgorI2VuZGlmCisKKyNkZWZpbmUgX1NUTFBfVUlOVDMyX1QgVUludDMyCit0eXBlZGVmIGludCB3aW50X3Q7CisKKyNpZm5kZWYgVFlQRV9CT09MCisjIGVycm9yIDxDb25kaXRpb25hbE1hY3Jvcy5oPiBtdXN0IGJlIGluY2x1ZGVkLiAoVFlQRV9CT09MKQorI2VuZGlmCisjaWYgIVRZUEVfQk9PTAorIyBkZWZpbmUgX1NUTFBfTk9fQk9PTAorIyBkZWZpbmUgX1NUTFBfRE9OVF9VU0VfQk9PTF9UWVBFREVGCisjZW5kaWYKKworI2lmbmRlZiBUWVBFX0xPTkdMT05HCisjIGVycm9yIDxDb25kaXRpb25hbE1hY3Jvcy5oPiBtdXN0IGJlIGluY2x1ZGVkLiAoVFlQRV9MT05HTE9ORykKKyNlbmRpZgorI2lmIFRZUEVfTE9OR0xPTkcKKyMgZGVmaW5lIF9TVExQX0xPTkdfTE9ORyBsb25nIGxvbmcKKyNlbmRpZgorCisjaWYgIV9fb3B0aW9uKGV4Y2VwdGlvbnMpCisjIGRlZmluZSBfU1RMUF9IQVNfTk9fRVhDRVBUSU9OUworI2VuZGlmCisKKyNkZWZpbmUgX1NUTFBfREVCVUdfTUVTU0FHRV9QT1NUIERlYnVnU3RyKCJccFNUTCBkaWFnbm9zaXMgaXNzdWVkLiBTZWUgJ3N0ZGVycicgZm9yIGRldGFpbC4iKTsKKyNkZWZpbmUgX1NUTFBfQVNTRVJUX01TR19UUkFJTEVSICIgIgorCisjaWZkZWYgX1NUTFBfREVCVUcKKyMgICBkZWZpbmUgX1NUTFBfVEhST1coeCkgKERlYnVnU3RyKCJccFNUTCBpcyBhYm91dCB0byB0aHJvdyBleGNlcHRpb246ICIjeCksdGhyb3cgeCkKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX01SQ19fKQorIyBpZm5kZWYgX19zcGlsbGFyZ3MKKyMgIGRlZmluZSBfX3NwaWxsYXJncyAxIC8vIE1yQ3BwIHJlcXVpcmVzIHRoaXMgc3ltYm9sIHRvIGJlIGRlZmluZWQgYXMgMSB0byBwcm9wZXJseSBoYW5kbGUgdmFfc3RhcnQ7IHJlZi5bIGZpbGUgc3RkYXJnLmg7IGxpbmUgMjYgXQorIyBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fU0NfXykKKyNkZWZpbmUgX1NUTFBfVkVORE9SX0xPTkdfRE9VQkxFX01BVEggICAgICAgIC8vKlRZIDEyLzAzLzIwMDAgLSBTQ3BwJ3MgbmF0aXZlIG1hdGggdHlwZSBpcyBsb25nIGRvdWJsZQorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSAorIyBpZiBfX29wdGlvbih1bml4X2luY2x1ZGVzKQorIyAgZGVmaW5lIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEggLi4vQ0luY2x1ZGVzICAgLy8gZXhwZWN0cyB0aGUgYWxpYXMgdG8ge0NJbmNsdWRlc30gdW5kZXIgdGhlIHNhbWUgZm9sZGVyIGFzIHtTVEx9CisjIGVsc2UKKyMgIGRlZmluZSBfU1RMUF9OQVRJVkVfSU5DTFVERV9QQVRIIDo6Q0luY2x1ZGVzICAgLy8gZXhwZWN0cyB0aGUgYWxpYXMgdG8ge0NJbmNsdWRlc30gdW5kZXIgdGhlIHNhbWUgZm9sZGVyIGFzIHtTVEx9CisjIGVuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChfU1RMUF9NQUtFX0hFQURFUikKKyMgaWYgIV9fb3B0aW9uKHVuaXhfaW5jbHVkZXMpCisjICBkZWZpbmUgX1NUTFBfTUFLRV9IRUFERVIocGF0aCwgaGVhZGVyKSA8cGF0aDpoZWFkZXI+IC8vIE1hYyB1c2VzICI6IiBmb3IgZGlyZWN0b3J5IGRlbGltaXRlcgorIyBlbmRpZgorI2VuZGlmCisKKyMgZGVmaW5lIF9TVExEIF9EQkcgIC8vIHRvIGtlZXAgdGhlIGxlbmd0aCBvZiBnZW5lcmF0ZWQgc3ltYm9scyB3aXRoaW4gdGhlIGNvbXBpbGVyIGxpbWl0YXRpb24KKworI2RlZmluZSBfU1RMUF9VU0VfU1RESU9fSU8gMSAgICAgICAvLypUWSAwMi8yNC8yMDAwIC0gc2VlIGFsc28gOyByZWYuWyBmaWxlIF9mc3RyZWFtLmg7IGxpbmUgMzYgXQorI2RlZmluZSBfU1RMUF9OT19USFJFQURTICAgICAgICAgICAvLypUWSAxMi8xNy8yMDAwIC0gbXVsdGktdGhyZWFkIGNhcGFiaWxpdHkgbm90IGV4cGxvcmVkLCB5ZXQuCisjdW5kZWYgX1JFRU5UUkFOVCAgICAgICAgICAgICAgICAgIC8vKnR5IDExLzI0LzIwMDEgLSB0byBtYWtlIHN1cmUgbm8gdGhyZWFkIGZhY2lsaXR5IGlzIGFjdGl2YXRlZAorI2RlZmluZSBfTk9USFJFQURTICAgICAgICAgICAgICAgICAvLyp0eSAxMi8wNy8yMDAxIC0KKworLy8gbmF0aXZlIGxpYnJhcnkgbGltaXRhdGlvbnMKKyNkZWZpbmUgX1NUTFBfVkVORE9SX0dMT0JBTF9TVEQgICAgICAgICAgLy8gbXB3J3MgYysrIGxpYnMgZG8gbm90IHV0aWxpemUgbmFtZXNwYWNlIHN0ZCB5ZXQKKyNkZWZpbmUgX1NUTFBfTk9fQkFEX0FMTE9DICAgICAgICAgICAgICAgLy8ga25vd24gbGltaXRhdGlvbgorI2RlZmluZSBfU1RMUF9IQVNfTk9fTkVXX0NfSEVBREVSUyAgICAgICAvLyBrbm93biBsaW1pdGF0aW9uCisjZGVmaW5lIF9TVExQX05PX05FV19ORVdfSEVBREVSICAgICAgICAgIC8vIGtub3duIGxpbWl0YXRpb24KKyNkZWZpbmUgX1NUTFBfTk9fTkFUSVZFX01CU1RBVEVfVCAgICAgICAgLy8ga25vd24gbGltaXRhdGlvbgorI2RlZmluZSBfU1RMUF9OT19OQVRJVkVfV0lERV9GVU5DVElPTlMgICAvLyBrbm93biBsaW1pdGF0aW9uCisjZGVmaW5lIF9TVExQX05PX05BVElWRV9XSURFX1NUUkVBTVMgICAgIC8vIGtub3duIGxpbWl0YXRpb24KKyNkZWZpbmUgX1NUTFBfTk9fVU5DQVVHSFRfRVhDRVBUX1NVUFBPUlQgLy8ga25vd24gbGltaXRhdGlvbgorI2RlZmluZSBfU1RMUF9CUk9LRU5fRVhDRVBUSU9OX0NMQVNTICAgICAvLyBrbm93biBsaW1pdGF0aW9uCisKKy8vIGNvbXBpbGVyIGxpbWl0YXRpb25zCisjIGRlZmluZSBfU1RMUF9ET05UX1NJTVVMQVRFX1BBUlRJQUxfU1BFQ19GT1JfVFlQRV9UUkFJVFMKKworIyBkZWZpbmUgX1NUTFBfTVBXRklYX1RSWSB0cnl7ICAgICAgICAgICAgICAgICAgICAgIC8vKlRZIDA2LzAxLzIwMDAgLSBleGNlcHRpb24gaGFuZGxpbmcgYnVnIHdvcmthcm91bmQKKyMgZGVmaW5lIF9TVExQX01QV0ZJWF9DQVRDSCB9Y2F0Y2goLi4uKXt0aHJvdzt9ICAgICAgICAgICAgICAvLypUWSAwNi8wMS8yMDAwIC0gZXhjZXB0aW9uIGhhbmRsaW5nIGJ1ZyB3b3JrYXJvdW5kCisjIGRlZmluZSBfU1RMUF9NUFdGSVhfQ0FUQ0hfQUNUSU9OKGFjdGlvbikgfWNhdGNoKC4uLil7YWN0aW9uO3Rocm93O30gIC8vKlRZIDA2LzAxLzIwMDAgLSBleGNlcHRpb24gaGFuZGxpbmcgYnVnIHdvcmthcm91bmQKKyMgZGVmaW5lIF9TVExQX1RIUk9XX1JFVFVSTl9CVUcgICAgICAgICAgICAvLyBrbm93biBsaW1pdGF0aW9uCisjIGRlZmluZSBfU1RMUF9OT19DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OICAgIC8vIGtub3duIGxpbWl0YXRpb24KKyMgZGVmaW5lIF9TVExQX05PX1BBUlRJQUxfU1BFQ0lBTElaQVRJT05fU1lOVEFYICAgIC8vIGtub3duIGxpbWl0YXRpb24KKyMgZGVmaW5lIF9TVExQX05PX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUiAgICAvLyBrbm93biBsaW1pdGF0aW9uCisjIGRlZmluZSBfU1RMUF9OT19SRUxPUFNfTkFNRVNQQUNFICAgICAgICAgIC8vIGtub3duIGxpbWl0YXRpb24KKy8vIGVuZCBvZiBzdGxfYXBwbGUuaApkaWZmIC0tZ2l0IGEvc3RsL2NvbmZpZy9fYXM0MDAuaCBiL3N0bC9jb25maWcvX2FzNDAwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAyNjFhNAotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9jb25maWcvX2FzNDAwLmgKQEAgLTAsMCArMSw1NiBAQAorLy8gU1RMcG9ydCBjb25maWd1cmF0aW9uIGZpbGUKKy8vIEl0IGlzIGludGVybmFsIFNUTHBvcnQgaGVhZGVyIC0gRE8gTk9UIGluY2x1ZGUgaXQgZGlyZWN0bHkKKworLy8gQVMvNDAwIEMrKyBjb25maWcKKworIyBpZmRlZiBfUkVFTlRSQU5UCisjICBkZWZpbmUgX1BUSFJFQURTCisjIGVuZGlmCisKKyMgIGRlZmluZSBfU1RMUF9OT19ORVdfTkVXX0hFQURFUiAxCisKKyMgIGRlZmluZSBfU1RMUF9OT19CT09MCisjICBkZWZpbmUgX1NUTFBfTElNSVRFRF9ERUZBVUxUX1RFTVBMQVRFUworCisjICBkZWZpbmUgX1NUTFBfSEFTX05PX05BTUVTUEFDRVMKKyMgIGRlZmluZSBfU1RMUF9ORUVEX1RZUEVOQU1FCisjICBkZWZpbmUgX1NUTFBfTkVFRF9FWFBMSUNJVAorIyAgZGVmaW5lIF9TVExQX0hBU19OT19FWENFUFRJT05TCisjICBkZWZpbmUgX1NUTFBfTk9fRVhDRVBUSU9OX1NQRUMKKyMgIGRlZmluZSBfU1RMUF9OT19BUlJPV19PUEVSQVRPUgorIyAgZGVmaW5lIF9TVExQX05PX05FV19TVFlMRV9DQVNUUworCisjICBkZWZpbmUgX1NUTFBfTkVFRF9NVVRBQkxFCisjICBkZWZpbmUgX1NUTFBfTk9fUEFSVElBTF9TUEVDSUFMSVpBVElPTl9TWU5UQVgKKyMgIGRlZmluZSBfU1RMUF9OT19CQURfQUxMT0MKKyMgIGRlZmluZSBfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVTCisjICBkZWZpbmUgX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFX0NMQVNTRVMKKyMgIGRlZmluZSBfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVfS0VZV09SRAorIyAgZGVmaW5lIF9TVExQX05PX0ZSSUVORF9URU1QTEFURVMKKyMgIGRlZmluZSBfU1RMUF9OT19RVUFMSUZJRURfRlJJRU5EUworIyAgZGVmaW5lIF9TVExQX05PX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04KKyMgIGRlZmluZSBfU1RMUF9OT19GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIKKworIyAgZGVmaW5lIF9TVExQX05PX01FVEhPRF9TUEVDSUFMSVpBVElPTgorIyAgZGVmaW5lIF9TVExQX05PX0VYUExJQ0lUX0ZVTkNUSU9OX1RNUExfQVJHUworCisvLyAjICBkZWZpbmUgX1NUTFBfTk9fRVhDRVBUSU9OX0hFQURFUgorCisjICBkZWZpbmUgX1NUTFBfSEFTX05PX05FV19DX0hFQURFUlMKKworIyAgZGVmaW5lIF9TVExQX1NUQVRJQ19DT05TVF9JTklUX0JVRworIyAgZGVmaW5lIF9TVExQX1RIUk9XX1JFVFVSTl9CVUcKKyMgIGRlZmluZSBfU1RMUF9MSU5LX1RJTUVfSU5TVEFOVElBVElPTgorIyAgZGVmaW5lIF9TVExQX05PX1RFTVBMQVRFX0NPTlZFUlNJT05TCisKKyMgIGRlZmluZSBfU1RMUF9OT05fVFlQRV9UTVBMX1BBUkFNX0JVRyAxCisjICBkZWZpbmUgX1NUTFBfVFJJVklBTF9ERVNUUlVDVE9SX0JVRyAgMQorCisjICBpZiBkZWZpbmVkKF9MT05HX0xPTkcpCisjICAgIGRlZmluZSBfU1RMUF9MT05HX0xPTkcgbG9uZyBsb25nCisjICBlbmRpZgorIyAgaWYgZGVmaW5lZChfUFRIUkVBRFMpCisjICAgIGRlZmluZSBfTVVMVElfVEhSRUFERUQKKyMgIGVuZGlmCisvLyBmYnAgOiB0byBmaXggX19wYXJ0aXRpb24oKSBwcm9ibGVtCisjIGRlZmluZSBfU1RMUF9OT05URU1QTF9CQVNFX01BVENIX0JVRyAxCmRpZmYgLS1naXQgYS9zdGwvY29uZmlnL19hdXRvX2xpbmsuaCBiL3N0bC9jb25maWcvX2F1dG9fbGluay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyYjUyMzIKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvY29uZmlnL19hdXRvX2xpbmsuaApAQCAtMCwwICsxLDU3IEBACisvKiBXZSBkbyBub3QgdXNlIGF1dG8gbGluayBmZWF0dXJlIHdoZW46CisgKiAgLSB1c2VyIGFza2VkIG5vdCB0byB1c2UgaXQgKF9TVExQX0RPTlRfVVNFX0FVVE9fTElOSykKKyAqICAtIFNUTHBvcnQgaXMgdXNlZCBvbmx5IGFzIGEgU1RMIGxpYnJhcnkgKF9TVExQX05PX0lPU1RSRUFNUyB8fCBfU1RMUF9VU0VfTk9fSU9TVFJFQU1TKQorICogIC0gd2UgYXJlIGJ1aWxkaW5nIGEgQyB0cmFuc2xhdGlvbiB1bml0LCBTVExwb3J0IGlzIGEgQysrIFN0YW5kYXJkIGxpYnJhcnkgaW1wbGVtZW50YXRpb24KKyAqLworI2lmICFkZWZpbmVkIChfX0JVSUxESU5HX1NUTFBPUlQpICYmICFkZWZpbmVkIChfU1RMUF9ET05UX1VTRV9BVVRPX0xJTkspICYmIFwKKyAgICAhZGVmaW5lZCAoX1NUTFBfTk9fSU9TVFJFQU1TKSAmJiAhZGVmaW5lZCAoX1NUTFBfVVNFX05PX0lPU1RSRUFNUykgJiYgXAorICAgIGRlZmluZWQgKF9fY3BsdXNwbHVzKQorCisjICBkZWZpbmUgX1NUTFBfU1RSSU5HSVpFKFgpIF9TVExQX1NUUklOR0laRV9BVVgoWCkKKyMgIGRlZmluZSBfU1RMUF9TVFJJTkdJWkVfQVVYKFgpICNYCisKKyMgIGlmIGRlZmluZWQgKF9TVExQX0RFQlVHKQorIyAgICBkZWZpbmUgX1NUTFBfTElCX09QVElNX01PREUgInN0bGQiCisjICBlbGlmIGRlZmluZWQgKF9ERUJVRykKKyMgICAgZGVmaW5lIF9TVExQX0xJQl9PUFRJTV9NT0RFICJkIgorIyAgZWxzZQorIyAgICBkZWZpbmUgX1NUTFBfTElCX09QVElNX01PREUgIiIKKyMgIGVuZGlmCisKKyMgIGlmIGRlZmluZWQgKF9TVExQX0xJQl9OQU1FX01PVElGKQorIyAgICBkZWZpbmUgX1NUTFBfTElCX01PVElGICJfIl9TVExQX0xJQl9OQU1FX01PVElGCisjICBlbHNlCisjICAgIGRlZmluZSBfU1RMUF9MSUJfTU9USUYgIiIKKyMgIGVuZGlmCisKKyMgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9EWU5BTUlDX0xJQikKKyMgICAgaWYgZGVmaW5lZCAoX1NUTFBfVVNJTkdfQ1JPU1NfTkFUSVZFX1JVTlRJTUVfTElCKQorIyAgICAgIGRlZmluZSBfU1RMUF9MSUJfVFlQRSAiX3giCisjICAgIGVsc2UKKyMgICAgICBkZWZpbmUgX1NUTFBfTElCX1RZUEUgIiIKKyMgICAgZW5kaWYKKyMgIGVsc2UKKyMgICAgaWYgZGVmaW5lZCAoX1NUTFBfVVNJTkdfQ1JPU1NfTkFUSVZFX1JVTlRJTUVfTElCKQorIyAgICAgIGRlZmluZSBfU1RMUF9MSUJfVFlQRSAiX3N0YXRpeCIKKyMgICAgZWxzZQorIyAgICAgIGRlZmluZSBfU1RMUF9MSUJfVFlQRSAiX3N0YXRpYyIKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisKKyMgIGRlZmluZSBfU1RMUF9WRVJTSU9OX1NUUiBfU1RMUF9TVFJJTkdJWkUoX1NUTFBPUlRfTUFKT1IpIi4iX1NUTFBfU1RSSU5HSVpFKF9TVExQT1JUX01JTk9SKQorCisjICBkZWZpbmUgX1NUTFBfU1RMUE9SVF9MSUIgInN0bHBvcnQiX1NUTFBfTElCX09QVElNX01PREUiIl9TVExQX0xJQl9UWVBFIiJfU1RMUF9MSUJfTU9USUYiLiJfU1RMUF9WRVJTSU9OX1NUUiIubGliIgorCisjICBpZiBkZWZpbmVkIChfU1RMUF9WRVJCT1NFX0FVVE9fTElOSykKKyMgICAgcHJhZ21hIG1lc3NhZ2UgKCJTVExwb3J0OiBBdXRvIGxpbmtpbmcgdG8gIl9TVExQX1NUTFBPUlRfTElCKQorIyAgZW5kaWYKKyMgIHByYWdtYSBjb21tZW50IChsaWIsIF9TVExQX1NUTFBPUlRfTElCKQorCisjICB1bmRlZiBfU1RMUF9TVExQT1JUX0xJQgorIyAgdW5kZWYgX1NUTFBfTElCX09QVElNX01PREUKKyMgIHVuZGVmIF9TVExQX0xJQl9UWVBFCisjICB1bmRlZiBfU1RMUF9TVFJJTkdJWkVfQVVYCisjICB1bmRlZiBfU1RMUF9TVFJJTkdJWkUKKworI2VuZGlmIC8qIF9TVExQX0RPTlRfVVNFX0FVVE9fTElOSyAqLworCmRpZmYgLS1naXQgYS9zdGwvY29uZmlnL19iYy5oIGIvc3RsL2NvbmZpZy9fYmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTZkZTA3Ci0tLSAvZGV2L251bGwKKysrIGIvc3RsL2NvbmZpZy9fYmMuaApAQCAtMCwwICsxLDEyNSBAQAorLy8gU1RMcG9ydCBjb25maWd1cmF0aW9uIGZpbGUKKy8vIEl0IGlzIGludGVybmFsIFNUTHBvcnQgaGVhZGVyIC0gRE8gTk9UIGluY2x1ZGUgaXQgZGlyZWN0bHkKKworLy8jZGVmaW5lIF9TVExQX1ZFUkJPU0UKKworI2RlZmluZSBfU1RMUF9DT01QSUxFUiAiQm9ybGFuZCIKKworI2lmIChfX0JPUkxBTkRDX18gPCAweDU1MSkKKyMgIGVycm9yIC0gQm9ybGFuZCBjb21waWxlcnMgYmVsb3cgdmVyc2lvbiA1LjUuMSBub3Qgc3VwcG9ydGVkLgorI2VuZGlmCisKKyNpZiAoX19CT1JMQU5EQ19fID49IDB4NTgwKSAmJiAoX19CT1JMQU5EQ19fIDwgMHg1OTApCisjICBkZWZpbmUgX1NUTFBfTk9fTkVXX0NfSEVBREVSUworIyAgZGVmaW5lIF9TVExQX05BVElWRV9DUFBfUlVOVElNRV9IRUFERVIoaGVhZGVyKSA8Li4vaW5jbHVkZS9kaW5rdW13YXJlLyMjaGVhZGVyPgorIyAgZGVmaW5lIF9TVExQX05PX0ZPUkNFX0lOU1RBTlRJQVRFCisjZW5kaWYKKworI2lmIChfX0JPUkxBTkRDX18gPj0gMHg1NjApICYmIChfX0JPUkxBTkRDX18gPCAweDU3MCkKKyMgIGRlZmluZSBfVVNFX09MRF9SV19TVEwKKyNlbmRpZgorCisjaWYgKF9fQk9STEFORENfXyA+PSAweDU2MCkKKyMgIGRlZmluZSBOT1dJTkJBU0VJTlRFUkxPQ0sgIC8vIHNyYy9mc3RyZWFtLmNwcCBlcnJvciBpbiB3aW5iYXNlLmgKKyNlbmRpZgorCisjaWYgKF9fQk9STEFORENfXyA8IDB4NTY0KQorIyAgZGVmaW5lIF9TVExQX1FVQUxJRklFRF9TUEVDSUFMSVpBVElPTl9CVUcKKyNlbmRpZgorCisjaWYgKF9fQk9STEFORENfXyA8IDB4NTYwKQorIyAgZGVmaW5lIF9TVExQX05PX0NPTlRBSU5FUlNfRVhURU5TSU9OCisjZW5kaWYKKworI2RlZmluZSBfU1RMUF9OT19GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIKKyNkZWZpbmUgX1NUTFBfRE9OVF9VU0VfUFJJVl9OQU1FU1BBQ0UKKyNkZWZpbmUgX1NUTFBfTk9fVkVORE9SX1NURExJQl9MCisjZGVmaW5lIF9TVExQX05PX1ZFTkRPUl9NQVRIX0YKKyNkZWZpbmUgX1NUTFBfRE9OVF9VU0VfU0hPUlRfU1RSSU5HX09QVElNIDEKKyNkZWZpbmUgX1NUTFBfTk9fTkFUSVZFX01CU1RBVEVfVAorI2RlZmluZSBfU1RMUF9ETExFWFBPUlRfTkVFRFNfUFJFREVDTEFSQVRJT04KKyN1bmRlZiBfU1RMUF9OT19VTkVYUEVDVEVEX0VYQ0VQVF9TVVBQT1JUCisjaWYgKF9fQk9STEFORENfXyA8IDB4NTgwKSAmJiAhZGVmaW5lZCAoX1JUTERMTCkKKyMgIGRlZmluZSBfVU5DQVVHSFRfRVhDRVBUSU9OIDEKKyNlbmRpZgorCisvLyA8bGltaXRzPiBwcm9ibGVtCisjZGVmaW5lIF9TVExQX1NUQVRJQ19DT05TVF9JTklUX0JVRworCisvLyA8Yml0c2V0PiBwcm9ibGVtcworI2RlZmluZSBfU1RMUF9NRU1CRVJfU1BFQ0lBTElaQVRJT05fQlVHIDEKKyNkZWZpbmUgX1NUTFBfSEFTX1NQRUNJRklDX1BST0xPR19FUElMT0cgMQorCisjZGVmaW5lIF9TVExQX0xPTkdfTE9ORyAgX19pbnQ2NAorCisvLyBhdXRvIGVuYWJsZSB0aHJlYWQgc2FmZXR5IGFuZCBleGNlcHRpb25zOgorI2lmbmRlZiBfQ1BQVU5XSU5ECisjICBkZWZpbmUgX1NUTFBfSEFTX05PX0VYQ0VQVElPTlMKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19NVF9fKSAmJiAhZGVmaW5lZCAoX05PVEhSRUFEUykgJiYgIWRlZmluZWQgKF9SRUVOVFJBTlQpCisjICBpZiBkZWZpbmVkIChfU1RMUF9WRVJCT1NFKQorIyAgICBwcmFnbWEgbWVzc2FnZSAoIm11bHRpIHRocmVhZGVkIikKKyMgIGVuZGlmCisjICBkZWZpbmUgX1JFRU5UUkFOVCAxCisjZWxzZQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfVkVSQk9TRSkKKyMgICAgcHJhZ21hIG1lc3NhZ2UgKCJzaW5nbGUgdGhyZWFkZWQiKQorIyAgZW5kaWYKKyNlbmRpZgorCisjZGVmaW5lIF9TVExQX0VYUE9SVF9ERUNMU1BFQyBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyNkZWZpbmUgX1NUTFBfSU1QT1JUX0RFQ0xTUEVDIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorCisjZGVmaW5lIF9TVExQX0NMQVNTX0VYUE9SVF9ERUNMU1BFQyBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyNkZWZpbmUgX1NUTFBfQ0xBU1NfSU1QT1JUX0RFQ0xTUEVDIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorCisjaWYgZGVmaW5lZCAoX0RMTCkKKyMgIGRlZmluZSBfU1RMUF9ETEwKKyNlbmRpZgorI2lmIGRlZmluZWQgKF9SVExETEwpCisjICBkZWZpbmUgX1NUTFBfUlVOVElNRV9ETEwKKyNlbmRpZgorI2luY2x1ZGUgPHN0bC9jb25maWcvX2RldGVjdF9kbGxfb3JfbGliLmg+CisjdW5kZWYgX1NUTFBfUlVOVElNRV9ETEwKKyN1bmRlZiBfU1RMUF9ETEwKKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9EWU5BTUlDX0xJQikKKyMgIGlmIGRlZmluZWQgKF9TVExQX1ZFUkJPU0UpCisjICAgIHByYWdtYSBtZXNzYWdlICgiVXNpbmcvQnVpbGRpbmcgU1RMcG9ydCBkbGwiKQorIyAgZW5kaWYKKyNlbGlmIGRlZmluZWQgKF9TVExQX1VTRV9TVEFUSUNfTElCKQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfVkVSQk9TRSkKKyMgICAgcHJhZ21hIG1lc3NhZ2UgKCJVc2luZy9CdWlsZGluZyBTVExwb3J0IGxpYiIpCisjICBlbmRpZgorI2Vsc2UKKyMgIGVycm9yIFVua25vd24gU1RMcG9ydCB1c2FnZSBjb25maWcgKGRsbC9saWI/KQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0lOR19DUk9TU19OQVRJVkVfUlVOVElNRV9MSUIpCisjICBpZiBkZWZpbmVkIChfU1RMUF9WRVJCT1NFKQorIyAgICBwcmFnbWEgbWVzc2FnZSAoIlVzaW5nIGNyb3NzIHZlcnNpb24gb2YgbmF0aXZlIHJ1bnRpbWUiKQorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKF9TVExQX0lNUE9SVF9URU1QTEFURV9LRVlXT1JEKQorLy8jICBkZWZpbmUgX1NUTFBfSU1QT1JUX1RFTVBMQVRFX0tFWVdPUkQgX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjZW5kaWYKKy8vI2RlZmluZSBfU1RMUF9FWFBPUlRfVEVNUExBVEVfS0VZV09SRCBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9EWU5BTUlDX0xJQikKKyMgIGRlZmluZSBfU1RMUF9VU0VfREVDTFNQRUMgMQorIyAgaWYgKF9fQk9STEFORENfXyA8IDB4NTgwKQorIyAgaWYgZGVmaW5lZCAoX19CVUlMRElOR19TVExQT1JUKQorIyAgICBkZWZpbmUgX1NUTFBfQ0FMTCBfX2NkZWNsIF9fZXhwb3J0CisjICBlbHNlCisjICAgIGRlZmluZSAgX1NUTFBfQ0FMTCBfX2NkZWNsIF9faW1wb3J0CisjICBlbmRpZgorI2Vsc2UKKyMgIGRlZmluZSAgX1NUTFBfQ0FMTCBfX2NkZWNsCisjZW5kaWYKKyNlbHNlCisjICBkZWZpbmUgIF9TVExQX0NBTEwgX19jZGVjbAorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGwvY29uZmlnL19hdXRvX2xpbmsuaD4KZGlmZiAtLWdpdCBhL3N0bC9jb25maWcvX2NvbW8uaCBiL3N0bC9jb25maWcvX2NvbW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDc2Zjg4Ci0tLSAvZGV2L251bGwKKysrIGIvc3RsL2NvbmZpZy9fY29tby5oCkBAIC0wLDAgKzEsMjA3IEBACisKKy8vIFNUTHBvcnQgY29uZmlndXJhdGlvbiBmaWxlCisvLyBJdCBpcyBpbnRlcm5hbCBTVExwb3J0IGhlYWRlciAtIERPIE5PVCBpbmNsdWRlIGl0IGRpcmVjdGx5CisKKyNkZWZpbmUgX1NUTFBfQ09NUElMRVIgIkNvbWVhdSIKKworI2luY2x1ZGUgPHN0bC9jb25maWcvX25hdGl2ZV9oZWFkZXJzLmg+CisKKyNkZWZpbmUgX1NUTFBfVUlOVDMyX1QgdW5zaWduZWQgaW50CisKKyNkZWZpbmUgX1NUTFBfSEFTX05PX05FV19DX0hFQURFUlMKKy8vICNkZWZpbmUgX1NUTFBfVkVORE9SX0dMT0JBTF9FWENFUFRfU1RECisjZGVmaW5lIF9TVExQX0xPTkdfTE9ORyBsb25nIGxvbmcKKworCisvLworLy8gQURESVRJT05TIEZPUiBDT01FQVUgQysrLCBtYWRlIGJ5IENvbWVhdSBDb21wdXRpbmcuCisvLyBXZSBjYW4gYmUgcmVhY2hlZCB0aHJvdWdoIGNvbWVhdUBjb21lYXVjb21wdXRpbmcuY29tCisvLyBZb3Ugc2hvdWxkbid0IG5lZWQgdG8gY2hhbmdlIGFueXRoaW5nIGJlbG93IGhlcmUgZm9yIENvbWVhdSBDKysuCisvLyBJZiB5b3UgZG8sIHBsZWFzZSB0ZWxsIHVzIGF0IGNvbWVhdUBjb21lYXVjb21wdXRpbmcuY29tCisvLworLy8gQ2hhbmdlcyBtYWRlIGhlcmUsIEFORCBUSFJPVUdIIEFMTCBGSUxFUywgYmFzZWQgdXBvbiB0aGUgX19DT01PX18gbWFjcm8KKy8vIChhbmQgU0lNSUxBUiBOQU1FUyBJTlZPTFZJTkcgQ09NTykuLi4uIG5vIGRvdWJ0IHNvbWUgb2YgdGhpcyB3aWxsCisvLyBjaGFuZ2UgYXMgU0dJIGludGVncmF0ZXMgdGhlIGNoYW5nZXMgaW50byB0aGVpciBjb2RlIGJhc2Ugc2luY2UKKy8vIHNvbWUgY2hhbmdlcyBhcmUgbm90IHJlYWxseSBDb21lYXUgQysrIHNwZWNpZmljLCBidXQgcmVxdWlyZWQgdG8KKy8vIG1ha2UgdGhlIFNHSSBjb2RlIGNvbXBsaWFudCB3aXRoIFN0YW5kYXJkIEMrKykuCisvLworLy8gVGVzdGluZyB3YXMgZG9uZSB3aXRoIENvbWVhdSBDKysgNC4yLjQ0IGFuZCA0LjIuNDUuMi4gIENoYW5nZXMgd2VyZSBtYWRlIGZvcgorLy8gYm90aCBDb21lYXUgcmVsYXhlZCBtb2RlIGFuZCBDb21lYXUgc3RyaWN0IG1vZGUsIGVzcGVjaWFsbHkgZm9yIGVuZCB1c2VyIGNvZGUKKy8vICh0aGF0IGlzLCBzb21lIG9mIHRoZSAuY3h4IGZpbGVzIGNhbm5vdCBjb21waWxlIGluIHN0cmljdCBtb2RlLCBiZWNhdXNlIHRoZXkKKy8vIGNvbnRhaW4gZXh0ZW5zaW9ucyB0byBTdGFuZGFyZCBDKyssIGhvd2V2ZXIgdGhlaXIgb2JqZWN0IGNvZGUgZm9ybXMgY2FuCisvLyBiZSB1c2VkIG9uY2UgY29tcGlsZWQgaW4gcmVsYXhlZCBtb2RlLCBldmVuIGlmIHRoZSBlbmQgdXNlciBjb2RlIHVzZXMKKy8vIHN0cmljdCBtb2RlKS4KKy8vCisvLyBUaGVzZSBjaGFuZ2VzIG1heSBhbHNvIHdvcmsgZm9yIHNvbWUgZWFybGllciB2ZXJzaW9ucyBvZiBDb21lYXUgQysrLAorLy8gdGhvdWdoIHdlIGhhdmUgbm90IHRlc3RlZCB0aGVtLgorLy8KKy8vIEFjdHVhbCBtb2RzIG1hZGUgdW5kZXIgUmVkSGF0IDYuMSBMSU5VWCwgc2hvdWxkIGJlIG9rIHdpdGggU3VTRSB0b28gYW5kCisvLyBvdGhlciBMSU5VWCdzLCBhbmQgb2xkZXIgQ2FsZGVyYSBMSU5VWCwgU29sYXJpcy9TUEFSQywgU3VuT1MsIFNDTyBVTklYLAorLy8gYW5kIE5ldEJTRC4gT3RoZXIgcGxhdGZvcm1zIG1heSBiZSBhZGRlZC4gIENvbWVhdSB3aWxsIGFsc28gcGVyZm9ybQorLy8gY3VzdG9tIHBvcnRzIGZvciB5b3UuCisvLworLy8gQ2hlY2sgbGliY29tbyBkZXRhaWxzIGF0IGh0dHA6Ly93d3cuY29tZWF1Y29tcHV0aW5nLmNvbS9saWJjb21vIGFuZAorLy8gaHR0cDovL3d3dy5jb21lYXVjb21wdXRpbmcuY29tCisvLworLy8gSGlzdG9yeSBvZiBDb21lYXUgY2hhbmdlcyAodGhpcyBpcyByb3VnaCwgYXMgd29yayB3YXMgb2Z0ZW4gZ29pbmcgb24gaW4gcGFyYWxsZWwpOgorLy8gQkVUQTEgSnVseSAxNCwgMjAwMCwgSW5pdGlhbCBwb3J0IGZvciBSZWRIYXQgNi4xIElOVEVML0VMRgorLy8gQkVUQTIgQXVnICAgNCwgMjAwMCwgU3Ryb25nZXIgUmVkSGF0IHN1cHBvcnQKKy8vICAgICAgICAgICAgICAgICAgICAgIFN1cHBvcnQgZm9yIENvbWVhdSBzdHJpY3QgbW9kZSBmb3IgZW5kIHVzZXIgY29kZQorLy8gQkVUQTMgQXVnICAyMiwgMjAwMCwgU3VwcG9ydCBmb3Igb3RoZXIgTElOVVgvSU5URUwvRUxGJ3MsIGluY2x1ZGluZyBvbGRlciBvbmVzCisvLyBCRVRBNCBTZXB0ICAyLCAyMDAwLCBJbml0aWFsIHN1cHBvcnQgZm9yIFNDTyBVTklYICsgb3RoZXIgVU5JWCB4ODYgU1ZSMydzCisvLyAgICAgICAgICAgICAgICAgICAgICBTdHJvbmdlciBzdXBwb3J0IGZvciBlbmQgdXNlciBDb21lYXUgc3RyaWN0IG1vZGUKKy8vIEJFVEE1IE9jdCAgIDUsIDIwMDAsIEluaXRpYWwgc3VwcG9ydCBmb3IgU29sYXJpcy9TUEFSQworLy8gICAgICAgICAgICAgICAgICAgICAgTW9yZSBTQ08gc3VwcG9ydCAodGhvdWdoIHN0aWxsIGluY29tcGxldGUpCisvLyBCRVRBNiBGZWIgICA1LCAyMDAxLCBNaW5vciBtb2RzIHRvIGFjY29tb2RhdGUgQ29tZWF1IEMrKyA0LjIuNDUuMQorLy8gQkVUQTcgTWFyICAxMywgMjAwMSwgVmVyaWZpZWQgd2l0aCBDb21lYXUgQysrIDQuMi40NS4yCisvLyAgICAgICAgICAgICAgICAgICAgICBNaW5vciBOZXRCU0Qgc3VwcG9ydAorLy8gQkVUQTggQXByICAgMS4gMjAwMSwgSW5pdGlhbCBzdXBwb3J0IGZvciBTdW5PUy9TUEFSQworLy8gQkVUQTkgQXByICAgNywgMjAwMSwgU3Ryb25nZXIgU0NPIHN1cHBvcnQgKyBvdGhlciBVTklYIHg4NiBTVlIzJ3MKKy8vICAgICAgICAgICAgICAgICAgICAgIE1vZHMgZm9yIGFuIGZwb3NfdCBwcm9ibGVtIGZvciBzb21lIExJTlVYZXMKKy8vICAgICAgICAgICAgICAgICAgICAgIE1vZHMgc2luY2UgRGVzdHJveSBkaWQgbm90IHdvcmsgaW4gc3RyaWN0IG1vZGUKKy8vIEJFVEExMCBBcHIgIDEyLiAyMDAxLCBTdHJvbmdlciBOZXRCU0Qgc3VwcG9ydAorLy8KKy8vIFBMQU5ORUQ6CisvLyBCRVRBeCBUQkEgIFRCQSwgMjAwMSwgTmV0QlNELCBVTklYV0FSRSwgYW5kIFdpbmRvd3Mgc3VwcG9ydCBleHBlY3RlZAorLy8KKworCisjaWZkZWYgX19saW51eF9fCisKKyMgICBkZWZpbmUgX1NUTFBfTk9fTkFUSVZFX01CU1RBVEVfVCAgICAgIDEKKyMgICBkZWZpbmUgX1NUTFBfTk9fTkFUSVZFX1dJREVfRlVOQ1RJT05TIDEKKyMgICBkZWZpbmUgX1NUTFBfTk9fTkFUSVZFX1dJREVfU1RSRUFNUyAgIDEKKyMgICBkZWZpbmUgX1NUTFBfTk9fTE9OR19ET1VCTEUgICAxCisKKy8vIENvbWVhdSBDKysgdW5kZXIgTElOVVgvSU5URUwvRUxGCisvLyBQcmVwcm9jZXNzIGF3YXkgImxvbmcgbG9uZyIgcm91dGluZXMgZm9yIG5vdywgZXZlbiBpbiByZWxheGVkIG1vZGUKKyMgZGVmaW5lIF9fd2NzdG91bGxfaW50ZXJuYWxfZGVmaW5lZCAgMQorIyBkZWZpbmUgX193Y3N0b2xsX2ludGVybmFsX2RlZmluZWQgIDEKKworI2VuZGlmIC8qIF9fQ09NT19fIHVuZGVyIF9fbGludXhfXyAqLworCisjaWZkZWYgX19VU0lOR194ODZTVlIzeF9XSVRIX0NPTU8gLyogU0NPIGV0IGFsICovCisvKiBVTklYIDM4NisgU1ZSMyBtb2RzIG1hZGUgd2l0aCBfX1VTSU5HX3g4NlNWUjN4X1dJVEhfQ09NTworICAgaW4gb3RoZXIgc291cmNlcywgbm90IGhlcmUgKi8KKyMgICAgZGVmaW5lIGF0YW4ybCBhdGFuMgorIyAgICBkZWZpbmUgY29zbCBjb3MKKyMgICAgZGVmaW5lIHNpbmwgc2luCisjICAgIGRlZmluZSBzcXJ0bCBzcXJ0CisjICAgIGluY2x1ZGUgPG1hdGguaD4KKyAgICAgaW5saW5lIGxvbmcgZG91YmxlIGV4cGwobG9uZyBkb3VibGUgYXJnKSB7IHJldHVybiBleHAoYXJnKTsgfQorICAgICBpbmxpbmUgbG9uZyBkb3VibGUgbG9nbChsb25nIGRvdWJsZSBhcmcpIHsgcmV0dXJuIGxvZyhhcmcpOyB9CisjICAgIGRlZmluZSBsb2cxMGwgbG9nMTAKKworIyAgICBkZWZpbmUgc2luaGwgc2luaAorIyAgICBkZWZpbmUgY29zaGwgY29zaAorIyAgICBkZWZpbmUgZmFic2wgZmFicworbmFtZXNwYWNlIHN0ZCB7CisgaW5saW5lIGludCBtaW4oaW50IGEsIGludCBiKSB7IHJldHVybiBhPmIgPyBiIDogYTsgfQorfQorI2VuZGlmCisKKyNpZmRlZiBzdW4KKy8vIENvbWVhdSBDKysgdW5kZXIgU29sYXJpcy9TUEFSQyBvciBTdW5PUworCisjaWZkZWYgc29sYXJpc3NwYXJjCisjZGVmaW5lIF9fVVNJTkdfU09MQVJJU19TUEFSQ19XSVRIX0NPTU8gLyogc2hvdyB0aGlzIGluIHRoZSBzb3VyY2Ugd2hlbiBncmVwJ2luZyBmb3IgQ09NTyAqLworLy8gTm90ZSBjb21vd2NoYXIuaCBmb3IgU29sYXJpcy9TUEFSQyB3Y2hhciBzdHVmZgorCisjaW5jbHVkZSA8bWF0aC5oPgorIyAgICBkZWZpbmUgc2luZiBzaW4KKyMgICAgZGVmaW5lIHNpbmwgc2luCisjICAgIGRlZmluZSBzaW5oZiBzaW5oCisjICAgIGRlZmluZSBzaW5obCBzaW5oCisjICAgIGRlZmluZSBjb3NmIGNvcworIyAgICBkZWZpbmUgY29zbCBjb3MKKyMgICAgZGVmaW5lIGNvc2hmIGNvc2gKKyMgICAgZGVmaW5lIGNvc2hsIGNvc2gKKyMgICAgZGVmaW5lIGF0YW4ybCBhdGFuMgorIyAgICBkZWZpbmUgYXRhbjJmIGF0YW4yCisgICAgIGlubGluZSBmbG9hdCBsb2dmKGZsb2F0IGFyZykgeyByZXR1cm4gbG9nKGFyZyk7IH0KKyAgICAgaW5saW5lIGxvbmcgZG91YmxlIGxvZ2wobG9uZyBkb3VibGUgYXJnKSB7IHJldHVybiBsb2coYXJnKTsgfQorIyAgICBkZWZpbmUgbG9nMTBmIGxvZzEwCisjICAgIGRlZmluZSBsb2cxMGwgbG9nMTAKKyMgICAgZGVmaW5lIGV4cGYgZXhwCisgICAgIGlubGluZSBsb25nIGRvdWJsZSBleHBsKGxvbmcgZG91YmxlIGFyZykgeyByZXR1cm4gZXhwKGFyZyk7IH0KKyMgICAgZGVmaW5lIHNxcnRmIHNxcnQKKyMgICAgZGVmaW5lIHNxcnRsIHNxcnQKKyMgICAgZGVmaW5lIGZhYnNmIGZhYnMKKyMgICAgZGVmaW5lIGZhYnNsIGZhYnMKKyNlbHNlCisjZGVmaW5lIF9fVVNJTkdfU1VOT1NfV0lUSF9DT01PCisKKyNkZWZpbmUgX191bml4IDEKKyNkZWZpbmUgX19FWFRFTlNJT05TX18gLyogVGhpcyBtaWdodCBjcmVhdGUgdW5kdWUgbm9pc2Ugc29tZXdoZXJlICovCisjZW5kaWYKKyNlbmRpZiAvKiBzdW4gKi8KKworI2lmIGRlZmluZWQoX19OZXRCU0RfXykKKy8vIEZyb20gbm9uLWNvbW8gI2lmZGVmIF9fR05VQ19fIGFib3ZlCisjdW5kZWYgX1NUTFBfTk9fRlVOQ1RJT05fUFRSX0lOX0NMQVNTX1RFTVBMQVRFCisjZGVmaW5lIF9fdW5peCAxCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKy8vIFNvbWUgam9rZXIgI2RlZmluZSdkIF9fRU5EX0RFQ0xTIGFzIH07CisjdW5kZWYgX19FTkRfREVDTFMKKyNkZWZpbmUgX19FTkRfREVDTFMgfQorCisvLyA8c3lzL3N0YXQuaD4gcHJvYgorI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorI3VuZGVmIF9fUkVOQU1FCisjZGVmaW5lIF9fUkVOQU1FKHgpCisKKyNkZWZpbmUgd2NoYXJfdCBfX0NPTU9fV0NIQVJfVAorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI3VuZGVmIHdjaGFyX3QKKworI2luY2x1ZGUgPG1hdGguaD4KKyMgaWZkZWYgQk9SSVNfRElTQUJMRUQKKyMgICAgZGVmaW5lIGF0YW4ybCBhdGFuMgorIyAgICBkZWZpbmUgY29zbCBjb3MKKyMgICAgZGVmaW5lIHNpbmwgc2luCisjICAgIGRlZmluZSBzcXJ0bCBzcXJ0CisgICAgIGlubGluZSBsb25nIGRvdWJsZSBleHBsKGxvbmcgZG91YmxlIGFyZykgeyByZXR1cm4gZXhwKGFyZyk7IH0KKyAgICAgaW5saW5lIGxvbmcgZG91YmxlIGxvZ2wobG9uZyBkb3VibGUgYXJnKSB7IHJldHVybiBsb2coYXJnKTsgfQorIyAgICBkZWZpbmUgbG9nMTBsIGxvZzEwCisjICAgIGRlZmluZSBzaW5obCBzaW5oCisjICAgIGRlZmluZSBjb3NobCBjb3NoCisjICAgIGRlZmluZSBmYWJzbCBmYWJzCisjIGVuZGlmCisjZW5kaWYgLyogX19OZXRCU0RfXyB1bmRlciBfX0NPTU9fXyAqLworCisvLyBTaG91bGRuJ3QgbmVlZCB0byBjaGFuZ2UgYW55dGhpbmcgYmVsb3cgaGVyZSBmb3IgQ29tZWF1IEMrKworLy8gSWYgc28sIHRlbGwgdXMgYXQgY29tZWF1QGNvbWVhdWNvbXB1dGluZy5jb20KKworI2RlZmluZSBfU1RMUF9OT19EUkFORDQ4CisKKyNkZWZpbmUgX1NUTFBfUEFSVElBTF9TUEVDSUFMSVpBVElPTl9TWU5UQVgKKyNkZWZpbmUgX1NUTFBfTk9fVVNJTkdfQ0xBVVNFX0lOX0NMQVNTCisKKyNpZiBfX0NPTU9fVkVSU0lPTl9fIDwgNDMwMAorI2lmIF9fQ09NT19WRVJTSU9OX18gPj0gNDI0NQorI2RlZmluZSBfU1RMUF9OT19FWENFUFRJT05fSEVBREVSIC8qKi8KKyAgICAvLyBJcyB0aGlzIG5lZWRlZD8KKyMgICBpbmNsdWRlIDxzdGRleGNlcHQuc3RkaD4KKyNlbmRpZgorI2RlZmluZSBfU1RMUF9OT19CQURfQUxMT0MgLyoqLworI2RlZmluZSBfU1RMUF9VU0VfQVVUT19QVFJfQ09OVkVSU0lPTlMgLyoqLworI2VuZGlmCisKKy8vIHRoaXMgb25lIGlzIHRydWUgb25seSB3aXRoIE1TCisjIGlmIGRlZmluZWQgKF9NU0NfVkVSKQorIyAgZGVmaW5lIF9TVExQX1dDSEFSX1RfSVNfVVNIT1JUIDEKKyMgIGlmIF9NU0NfVkVSIDw9IDEyMDAKKyMgICBkZWZpbmUgX1NUTFBfVkVORE9SX0dMT0JBTF9DU1RECisjICBlbmRpZgorIyAgaWYgX01TQ19WRVIgPCAxMTAwCisjICAgZGVmaW5lIF9TVExQX05PX0JBRF9BTExPQyAxCisjICAgZGVmaW5lIF9TVExQX05PX0VYQ0VQVElPTl9IRUFERVIgMQorIyAgIGRlZmluZSBfU1RMUF9OT19ORVdfTkVXX0hFQURFUiAxCisjICAgZGVmaW5lIF9TVExQX1VTRV9OT19JT1NUUkVBTVMgMQorIyAgZW5kaWYKKyMgZW5kaWYKKworLy8gIyBkZWZpbmUgX19FREdfU1dJVENIRVMKKworCmRpZmYgLS1naXQgYS9zdGwvY29uZmlnL19jcmF5LmggYi9zdGwvY29uZmlnL19jcmF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJhYmQ0ZgotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9jb25maWcvX2NyYXkuaApAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBNb3Njb3cgQ2VudGVyIGZvciBTUEFSQyBUZWNobm9sb2d5CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2RlZmluZSBfU1RMUF9DT01QSUxFUiAiQ0MiCisKKy8vIE1vc3RseSBjb3JyZWN0IGd1ZXNzLCBjaGFuZ2UgaXQgZm9yIEFscGhhIChhbmQgb3RoZXIgZW52aXJvbm1lbnRzCisvLyB0aGF0IGhhcyA2NC1iaXQgImxvbmciKQorIyAgZGVmaW5lIF9TVExQX1VJTlQzMl9UIHVuc2lnbmVkIGxvbmcKKworLy8gVW5jb21tZW50IGlmIGxvbmcgbG9uZyBpcyBhdmFpbGFibGUKKyMgIGRlZmluZSBfU1RMUF9MT05HX0xPTkcgbG9uZyBsb25nCisKKy8vIFVuY29tbWVudCB0aGlzIGlmIHlvdXIgY29tcGlsZXIgY2FuJ3QgaW5saW5lIHdoaWxlKCksIGZvcigpCisjICBkZWZpbmUgX1NUTFBfTE9PUF9JTkxJTkVfUFJPQkxFTVMgMQorCisvLyBVbmNvbW1lbnQgdGhpcyBpZiB5b3VyIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgZXhjZXB0aW9ucworLy8gQ3JheSBDKysgc3VwcG9ydHMgZXhjZXB0aW9ucyB3aGVuICctaCBleGNlcHRpb25zJyBvcHRpb24gaXMgdXNlcjsKKy8vIHRoZXJlZm9yZSAnLURfU1RMUF9IQVNfTk9fRVhDRVBUSU9OUycgbXVzdCBiZSB1c2VkIHdoZW4gJy1oIGV4Y2VwdGlvbnMnCisvLyBpcyBOT1QgdXNlZC4KKy8vIyAgZGVmaW5lIF9TVExQX0hBU19OT19FWENFUFRJT05TIDEKKworLy8gRGVsZXRlPworLy8gRGVmaW5lIHRoaXMgaWYgY29tcGlsZXIgbGFja3MgPGV4Y2VwdGlvbj4gaGVhZGVyCisvLyMgIGRlZmluZSBfU1RMUF9OT19FWENFUFRJT05fSEVBREVSIDEKKworLy8gVW5jb21tZW50IHRoaXMgaWYgeW91ciBDIGxpYnJhcnkgaGFzIGxyYW5kNDgoKSBmdW5jdGlvbgorIyAgZGVmaW5lIF9TVExQX1JBTkQ0OCAxCisKKy8vIFVuY29tbWVudCBpZiBuYXRpdmUgbmV3LXN0eWxlIEMgbGlicmFyeSBoZWFkZXJzIGxpbGUgPGNzdGRkZWY+LCBldGMgYXJlIG5vdCBhdmFpbGFibGUuCisjICAgZGVmaW5lIF9TVExQX0hBU19OT19ORVdfQ19IRUFERVJTIDEKKworLy8gdW5jb21tZW50IGlmIG5ldy1zdHlsZSBoZWFkZXJzIDxuZXc+IGlzIGF2YWlsYWJsZQorIyAgIGRlZmluZSBfU1RMUF9OT19ORVdfTkVXX0hFQURFUiAxCisKKy8vIHVuY29tbWVudCB0aGlzIGlmIDxpb3N0cmVhbT4gYW5kIG90aGVyIFNURCBoZWFkZXJzIHB1dCB0aGVpciBzdHVmZiBpbiA6Om5hbWVzcGFjZSwKKy8vIG5vdCBzdGQ6OgorIyAgZGVmaW5lIF9TVExQX1ZFTkRPUl9HTE9CQUxfU1RECisKKy8vIHVuY29tbWVudCB0aGlzIGlmIDxjc3RkaW8+IGFuZCB0aGUgbGlrZSBwdXQgc3R1ZmYgaW4gOjpuYW1lc3BhY2UsCisvLyBub3Qgc3RkOjoKKyMgIGRlZmluZSBfU1RMUF9WRU5ET1JfR0xPQkFMX0NTVEQKKworIyBkZWZpbmUgX1NUTFBfTkFUSVZFX0NfSEVBREVSKF9feCkgPC91c3IvaW5jbHVkZS8jI19feD4KKy8vIFdBUk5JTkc6IEZvbGxvd2luZyBpcyBoYXJkY29kZWQgdG8gdGhlIHN5c3RlbSBkZWZhdWx0IEMrKyBpbmNsdWRlIGZpbGVzCisjIGRlZmluZSBfU1RMUF9OQVRJVkVfQ1BQX1JVTlRJTUVfSEVBREVSKF9feCkgPC9vcHQvY3RsL0NDL0NDL2luY2x1ZGUvIyNfX3g+CisKKworIyBkZWZpbmUgX1NUTFBfTk9fTkFUSVZFX01CU1RBVEVfVAorIyBkZWZpbmUgX1NUTFBfTk9fVVNJTkdfRk9SX0dMT0JBTF9GVU5DVElPTlMKKy8vIyBkZWZpbmUgX1NUTFBfVkVORE9SX0dMT0JBTF9FWENFUFRfU1RECisKKyNpZiAhZGVmaW5lZCAoX0NSQVlJRUVFKQorIyAgZGVmaW5lIF9TVExQX05PX0lFQzU1OV9TVVBQT1JUIDEKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3RsL2NvbmZpZy9fY3lnd2luLmggYi9zdGwvY29uZmlnL19jeWd3aW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTYwZDAxCi0tLSAvZGV2L251bGwKKysrIGIvc3RsL2NvbmZpZy9fY3lnd2luLmgKQEAgLTAsMCArMSw2IEBACisjZGVmaW5lIF9TVExQX1BMQVRGT1JNICJDeWd3aW4iCisKKy8qIEdsaWJjIGlzIHRoZSBwbGF0Zm9ybSBBUEkgKi8KKyNpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX0dMSUJDKQorIyAgZGVmaW5lIF9TVExQX1VTRV9HTElCQworI2VuZGlmCmRpZmYgLS1naXQgYS9zdGwvY29uZmlnL19kZWMuaCBiL3N0bC9jb25maWcvX2RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNzMyZDkKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvY29uZmlnL19kZWMuaApAQCAtMCwwICsxLDEwNyBAQAorI2RlZmluZSBfU1RMUF9DT01QSUxFUiAiRGVjIgorCisjIGRlZmluZSBfU1RMUF9IQVNfU1BFQ0lGSUNfUFJPTE9HX0VQSUxPRworCisjIGRlZmluZSBfU1RMUF9OQVRJVkVfSEVBREVSKGhlYWRlcikgPC4uL2N4eC8jI2hlYWRlcj4KKyMgZGVmaW5lIF9TVExQX05BVElWRV9DX0hFQURFUih4KSA8Li4vaW5jbHVkZS8jI3g+CisKKyNpZiAoX19ERUNDWFhfVkVSIDwgNjAzMDAwMDApCisjIGRlZmluZSBfU1RMUF9OQVRJVkVfQ1BQX0NfSEVBREVSKGhlYWRlcikgPC4uL2N4eC8jI2hlYWRlcj4KKyNlbHNlCisjIGRlZmluZSBfU1RMUF9OQVRJVkVfQ1BQX0NfSEVBREVSKGhlYWRlcikgPC91c3IvaW5jbHVkZS9jeHhfY25hbWUvIyNoZWFkZXI+CisjZW5kaWYKKworIyBkZWZpbmUgX1NUTFBfTkFUSVZFX09MRF9TVFJFQU1TX0hFQURFUihoZWFkZXIpIDwuLi9jeHgvIyNoZWFkZXI+CisjIGRlZmluZSBfU1RMUF9OQVRJVkVfQ1BQX1JVTlRJTUVfSEVBREVSKGhlYWRlcikgPC4uL2N4eC8jI2hlYWRlcj4KKworLy8gQWxwaGEgaXMgbGl0dGxlLWVuZGlhbgorIyBkZWZpbmUgX1NUTFBfTElUVExFX0VORElBTgorCisvLyBjb2xsaXNpb25zCisjIGRlZmluZSBfU1RMUF9ET05UX1BVVF9TVExQT1JUX0lOX1NURAorCisjaWYgKF9fREVDQ1hYX1ZFUiA8IDYwMDAwMDAwKQorCisvLyBhdXRvbWF0aWMgdGVtcGxhdGUgaW5zdGFudGlhdGlvbiBkb2VzIG5vdAorLy8gd29yayB3aXRoIG5hbWVzcGFjZXMgOygKKyMgZGVmaW5lIF9TVExQX0hBU19OT19OQU1FU1BBQ0VTIDEKKworIyBkZWZpbmUgX1NUTFBfTk9fTkVXX05FV19IRUFERVIgMQorCisjIGRlZmluZSBfU1RMUF9OT19XQ0hBUl9UICAxCisjIGRlZmluZSBfU1RMUF9ORUVEX0VYUExJQ0lUICAxCisKKyMgZGVmaW5lIF9TVExQX05PX0JPT0wgIDEKKyMgZGVmaW5lIF9TVExQX05FRURfVFlQRU5BTUUgMQorIyBkZWZpbmUgX1NUTFBfTk9fTkVXX1NUWUxFX0NBU1RTIDEKKyMgZGVmaW5lIF9TVExQX05FRURfTVVUQUJMRSAxCisjIGRlZmluZSBfU1RMUF9OT19CQURfQUxMT0MgMQorCisKKyMgZGVmaW5lIF9TVExQX05PX1BBUlRJQUxfU1BFQ0lBTElaQVRJT05fU1lOVEFYIDEKKworIyBkZWZpbmUgX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFUyAxCisjIGRlZmluZSBfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVfQ0xBU1NFUyAxCisjIGRlZmluZSBfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVfS0VZV09SRCAxCisjIGRlZmluZSBfU1RMUF9OT19GUklFTkRfVEVNUExBVEVTIDEKKyMgZGVmaW5lIF9TVExQX05PX1FVQUxJRklFRF9GUklFTkRTIDEKKyMgZGVmaW5lIF9TVExQX05PX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04gMQorIyBkZWZpbmUgX1NUTFBfTk9fRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSIDEKKyMgZGVmaW5lIF9TVExQX05PTl9UWVBFX1RNUExfUEFSQU1fQlVHIDEKKyMgZGVmaW5lIF9TVExQX0JST0tFTl9VU0lOR19ESVJFQ1RJVkUgMQorIyBkZWZpbmUgX1NUTFBfTk9fRVhDRVBUSU9OX0hFQURFUiAxCisjIGRlZmluZSBfU1RMUF9ERUZfQ09OU1RfUExDVF9ORVdfQlVHIDEKKyMgZGVmaW5lIF9TVExQX0RFRl9DT05TVF9ERUZfUEFSQU1fQlVHIDEKKworI2VuZGlmCisKKworI2lmZGVmIF9fTk9fVVNFX1NURF9JT1NUUkVBTQorIyAgZGVmaW5lIF9TVExQX0hBU19OT19ORVdfSU9TVFJFQU1TIDEKKyMgZWxzZQorLy8gZGVmYXVsdCBpcyB0byB1c2UgbmV3IGlvc3RyZWFtcywgYW55d2F5CisjIGlmbmRlZiBfX1VTRV9TVERfSU9TVFJFQU0KKyMgIGRlZmluZSBfX1VTRV9TVERfSU9TVFJFQU0KKyMgZW5kaWYKKyNlbmRpZgorCisvLyMgaWZuZGVmIF9fU1REX1NUUklDVF9BTlNJX0VSUk9SUworLy8jIGVuZGlmCisKKyNpZm5kZWYgX19FWENFUFRJT05TCisjIGRlZmluZSBfU1RMUF9IQVNfTk9fRVhDRVBUSU9OUyAxCisjZW5kaWYKKworIyBpZmRlZiBfX0lNUExJQ0lUX0lOQ0xVREVfRU5BQkxFRAorCisvLyBidXQsIHdvcmtzIHdpdGggb3VycyA7KS4KKyMgIGRlZmluZSBfU1RMUF9MSU5LX1RJTUVfSU5TVEFOVElBVElPTiAxCisjIGVsc2UKKyMgIHVuZGVmIF9TVExQX0xJTktfVElNRV9JTlNUQU5USUFUSU9OCisjIGVuZGlmCisKKyMgaWYgZGVmaW5lZCAoX19JTVBMSUNJVF9VU0lOR19TVEQpICYmICFkZWZpbmVkIChfX05PX1VTRV9TVERfSU9TVFJFQU0pCisvLyB3ZSBzaG91bGQgYmFuIHRoYXQgIQorLy8gIyAgZXJyb3IgIlNUTHBvcnQgd29uJ3Qgd29yayB3aXRoIG5ldyBpb3N0cmVhbXMgYW5kIHN0ZDo6IGJlaW5nIGltcGxpY2l0bHkgaW5jbHVkZWQuIFBsZWFzZSB1c2UgLXN0ZCBzdHJpY3RfYW5zaVtfZXJyb3JzXSBvciBzcGVjaWZ5IF9fTk9fVVNFX1NURF9JT1NUUkVBTSIKKyMgZW5kaWYKKworIyBpZiAoZGVmaW5lZCAoX19TVERfU1RSSUNUX0FOU0kpIHx8IGRlZmluZWQgKF9fU1REX1NUUklDVF9BTlNJX0VSUk9SUykpCisjICBkZWZpbmUgX1NUTFBfU1RSSUNUX0FOU0kgMQorIyBlbHNlCisvLyB3ZSB3YW50IHRvIGVuZm9yY2UgaXQKKyMgIGRlZmluZSBfU1RMUF9MT05HX0xPTkcgbG9uZyBsb25nCisjIGVuZGlmCisKKy8vIHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VyIHR5cGUKKyMgIGRlZmluZSBfU1RMUF9VSU5UMzJfVCB1bnNpZ25lZCBpbnQKKyNpZiBkZWZpbmVkKF9YT1BFTl9TT1VSQ0UpICYmIChfWE9QRU5fVkVSU0lPTiAtIDAgPj0gNCkKKyMgZGVmaW5lIF9TVExQX1JBTkQ0OCAxCisjZW5kaWYKKy8vICMgIGRlZmluZSBfU1RMUF9SQU5ENDggMQorCisjICBkZWZpbmUgX1NUTFBfTk9fRVhQTElDSVRfRlVOQ1RJT05fVE1QTF9BUkdTIDEKKworIyBpZiAoX19ERUNDWFhfVkVSIDw9IDYwNjAwMDAwKQorIyAgZGVmaW5lIF9TVExQX0hBU19OT19ORVdfQ19IRUFERVJTIDEKKyMgZW5kaWYKKwpkaWZmIC0tZ2l0IGEvc3RsL2NvbmZpZy9fZGVjX3Ztcy5oIGIvc3RsL2NvbmZpZy9fZGVjX3Ztcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkZjhkMjYKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvY29uZmlnL19kZWNfdm1zLmgKQEAgLTAsMCArMSw5MCBAQAorLy8gT3BlblZNUyB2ZXJzaW9uCisKKyNkZWZpbmUgX1NUTFBfQ09NUElMRVIgIkRlYyBWbXMiCisKKyMgZGVmaW5lIF9TVExQX05BVElWRV9IRUFERVIoaGVhZGVyKSA8c3lzJGxpYnJhcnk6IyNoZWFkZXI+CisjIGRlZmluZSBfU1RMUF9OQVRJVkVfQ19IRUFERVIoeCkgPHN5cyRsaWJyYXJ5OiMjeD4KKyMgZGVmaW5lIF9TVExQX05BVElWRV9DUFBfQ19IRUFERVIoaGVhZGVyKSA8c3lzJGxpYnJhcnk6IyNoZWFkZXI+CisjIGRlZmluZSBfU1RMUF9OQVRJVkVfQ1BQX1JVTlRJTUVfSEVBREVSKGhlYWRlcikgPHN5cyRsaWJyYXJ5OiMjaGVhZGVyPgorCisjaWYgKF9fREVDQ1hYX1ZFUiA8IDYwMDAwMDAwKQorCisvLyBhdXRvbWF0aWMgdGVtcGxhdGUgaW5zdGFudGlhdGlvbiBkb2VzIG5vdAorLy8gd29yayB3aXRoIG5hbWVzcGFjZXMgOygKKyMgZGVmaW5lIF9TVExQX0hBU19OT19OQU1FU1BBQ0VTIDEKKworIyBkZWZpbmUgX1NUTFBfTk9fV0NIQVJfVCAgMQorIyBkZWZpbmUgX1NUTFBfTkVFRF9FWFBMSUNJVCAgMQorCisjIGRlZmluZSBfU1RMUF9OT19CT09MICAxCisjIGRlZmluZSBfU1RMUF9ORUVEX1RZUEVOQU1FIDEKKyMgZGVmaW5lIF9TVExQX05PX05FV19TVFlMRV9DQVNUUyAxCisjIGRlZmluZSBfU1RMUF9ORUVEX01VVEFCTEUgMQorIyBkZWZpbmUgX1NUTFBfTk9fQkFEX0FMTE9DIDEKKworIyBkZWZpbmUgX1NUTFBfTk9fTkVXX05FV19IRUFERVIgMQorIyBkZWZpbmUgX1NUTFBfTk9fUEFSVElBTF9TUEVDSUFMSVpBVElPTl9TWU5UQVggMQorCisjIGRlZmluZSBfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVTIDEKKyMgZGVmaW5lIF9TVExQX05PX01FTUJFUl9URU1QTEFURV9DTEFTU0VTIDEKKyMgZGVmaW5lIF9TVExQX05PX01FTUJFUl9URU1QTEFURV9LRVlXT1JEIDEKKyMgZGVmaW5lIF9TVExQX05PX0ZSSUVORF9URU1QTEFURVMgMQorIyBkZWZpbmUgX1NUTFBfTk9fUVVBTElGSUVEX0ZSSUVORFMgMQorIyBkZWZpbmUgX1NUTFBfTk9fQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTiAxCisjIGRlZmluZSBfU1RMUF9OT19GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIgMQorIyBkZWZpbmUgX1NUTFBfTk9OX1RZUEVfVE1QTF9QQVJBTV9CVUcgMQorIyBkZWZpbmUgX1NUTFBfQlJPS0VOX1VTSU5HX0RJUkVDVElWRSAxCisjIGRlZmluZSBfU1RMUF9OT19FWENFUFRJT05fSEVBREVSIDEKKyMgZGVmaW5lIF9TVExQX0RFRl9DT05TVF9QTENUX05FV19CVUcgMQorIyBkZWZpbmUgX1NUTFBfREVGX0NPTlNUX0RFRl9QQVJBTV9CVUcgMQorCisjZW5kaWYKKworCisjaWZkZWYgX19OT19VU0VfU1REX0lPU1RSRUFNCisjICBkZWZpbmUgX1NUTFBfVVNFX05PX0lPU1RSRUFNUyAxCisjIGVsc2UKKy8vIGRlZmF1bHQgaXMgdG8gdXNlIG5ldyBpb3N0cmVhbXMsIGFueXdheQorIyBpZm5kZWYgX19VU0VfU1REX0lPU1RSRUFNCisjICBkZWZpbmUgX19VU0VfU1REX0lPU1RSRUFNCisjIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBfX0VYQ0VQVElPTlMKKyMgZGVmaW5lIF9TVExQX0hBU19OT19FWENFUFRJT05TIDEKKyNlbmRpZgorCisjIGlmZGVmIF9fSU1QTElDSVRfSU5DTFVERV9FTkFCTEVECisKKyNpZmRlZiBfU1RMUF9VU0VfTk9fSU9TVFJFQU1TCisvLyBpbXBsaWNpdCBpbmNsdWRlIGludHJvZHVjZXMgY29uZmxpY3RzCisvLyBiZXR3ZWVuIHN0bHBvcnQgYW5kIG5hdGl2ZSBsaWIuCisjIHVuZGVmIF9fSU1QTElDSVRfSU5DTFVERV9FTkFCTEVECisjZW5kaWYKKworLy8gYnV0LCB3b3JrcyB3aXRoIG91cnMgOykuCisjICBkZWZpbmUgX1NUTFBfTElOS19USU1FX0lOU1RBTlRJQVRJT04gMQorCisjIGVuZGlmCisKKyMgaWYgZGVmaW5lZCAoX19JTVBMSUNJVF9VU0lOR19TVEQpICYmICFkZWZpbmVkIChfX05PX1VTRV9TVERfSU9TVFJFQU0pCisvLyB3ZSBzaG91bGQgYmFuIHRoYXQgIQorIyAgZXJyb3IgIlNUTHBvcnQgd29uJ3Qgd29yayB3aXRoIG5ldyBpb3N0cmVhbXMgYW5kIHN0ZDo6IGJlaW5nIGltcGxpY2l0bHkgaW5jbHVkZWQuIFBsZWFzZSB1c2UgLXN0ZCBzdHJpY3RfYW5zaVtfZXJyb3JzXSBvciBzcGVjaWZ5IF9fTk9fVVNFX1NURF9JT1NUUkVBTSIKKyMgZW5kaWYKKworIyBpZiAhKGRlZmluZWQgKF9fU1REX1NUUklDVF9BTlNJKSB8fCBkZWZpbmVkIChfX1NURF9TVFJJQ1RfQU5TSV9FUlJPUlMpKQorLy8gd2Ugd2FudCB0byBlbmZvcmNlIGl0CisjICBkZWZpbmUgX1NUTFBfTE9OR19MT05HIGxvbmcgbG9uZworIyBlbmRpZgorCisvLyB1bnNpZ25lZCAzMi1iaXQgaW50ZWdlciB0eXBlCisjICBkZWZpbmUgX1NUTFBfVUlOVDMyX1QgdW5zaWduZWQgaW50CisjaWYgZGVmaW5lZChfWE9QRU5fU09VUkNFKSAmJiAoX1hPUEVOX1ZFUlNJT04gLSAwID49IDQpCisjIGRlZmluZSBfU1RMUF9SQU5ENDggMQorI2VuZGlmCisvLyAjICBkZWZpbmUgX1NUTFBfUkFORDQ4IDEKKworIyAgZGVmaW5lIF9TVExQX05PX0VYUExJQ0lUX0ZVTkNUSU9OX1RNUExfQVJHUyAxCisKKyNkZWZpbmUgX1NUTFBfSEFTX05PX05FV19DX0hFQURFUlMgMQorCmRpZmYgLS1naXQgYS9zdGwvY29uZmlnL19kZXRlY3RfZGxsX29yX2xpYi5oIGIvc3RsL2NvbmZpZy9fZGV0ZWN0X2RsbF9vcl9saWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTA0OWZhCi0tLSAvZGV2L251bGwKKysrIGIvc3RsL2NvbmZpZy9fZGV0ZWN0X2RsbF9vcl9saWIuaApAQCAtMCwwICsxLDcwIEBACisvKiBGaWxlIHVzZWQgdG8gZGVmaW5lIG1hY3JvczoKKyAqIF9TVExQX1VTRV9EWU5BTUlDX0xJQjogVG8gc2lnbmFsIHVzZSBTVExwb3J0IGFzIGEgZGxsIG9yIGJ1aWxkIG9mIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICBTVExwb3J0IGRsbHMuCisgKiBfU1RMUF9VU0VfU1RBVElDX0xJQjogVG8gc2lnbmFsIHVzZSBvZiBTVExwb3J0IGFzIGEgc3RhdGljIGxpYiBvciBidWlsZCBvZgorICogICAgICAgICAgICAgICAgICAgICAgIHRoZSBTVExwb3J0IHN0YXRpYyBsaWJzLgorICogX1NUTFBfVVNJTkdfQ1JPU1NfTkFUSVZFX1JVTlRJTUVfTElCOiBTaWduYWwgdGhhdCB3ZSBhcmUgdXNpbmcgYSBuYXRpdmUgcnVudGltZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBhIHZlcnNpb24gZGlmZmVyZW50IGZyb20gdGhlIFNUTHBvcnQgb25lLgorICogSWYgX1NUTFBfVVNFX0RZTkFNSUNfTElCIG9yIF9TVExQX1VTRV9TVEFUSUNfTElCIGlzIGFscmVkYXkgZGVmaW5lZCBpdCBtZWFucyB0aGF0CisgKiB1c2VyIGZvcmNlcyB1c2Ugb2YgYSBzcGVjaWZpYyB2ZXJzaW9uLiBJbiB0aGlzIGNhc2UgX1NUTFBfVVNJTkdfQ1JPU1NfTkFUSVZFX1JVTlRJTUVfTElCCisgKiB3aWxsIHN1cmVseSBiZSBkZWZpbmVkIG90aGVyd2lzZSB0aGVyZSBpcyBubyBuZWVkIHRvIGZvcmNlIG1hY3JvIGRlZmluZXMuCisgKgorICogQmVmb3JlIGluY2x1ZGluZyB0aGlzIGZpbGUgdGhlIGNvbXBpbGVyIG11c3QgZGVmaW5lOgorICogX1NUTFBfRExMOiBJZiB3ZSBhcmUgYnVpbGRpbmcgYSBkbGwKKyAqIF9TVExQX1JVTlRJTUVfRExMOiBJZiB3ZSBhcmUgdXNpbmcgbmF0aXZlIHJ1bnRpbWUgYXMgYSBkbGwKKyAqLworI2lmIGRlZmluZWQgKF9fQlVJTERJTkdfU1RMUE9SVCkKKyMgIHVuZGVmIF9TVExQX1VTRV9EWU5BTUlDX0xJQgorIyAgdW5kZWYgX1NUTFBfVVNFX1NUQVRJQ19MSUIKKyMgIGlmIGRlZmluZWQgKF9TVExQX0RMTCkKKy8qIFdlIGFyZSBidWlsZGluZyB0aGUgU1RMcG9ydCBkbGwgKi8KKyMgICAgZGVmaW5lIF9TVExQX1VTRV9EWU5BTUlDX0xJQgorIyAgICBpZiAhZGVmaW5lZCAoX1NUTFBfUlVOVElNRV9ETEwpCisjICAgICAgZGVmaW5lIF9TVExQX1VTSU5HX0NST1NTX05BVElWRV9SVU5USU1FX0xJQgorIyAgICBlbmRpZgorIyAgZWxzZQorIyAgICBkZWZpbmUgX1NUTFBfVVNFX1NUQVRJQ19MSUIKKyMgICAgaWYgZGVmaW5lZCAoX1NUTFBfUlVOVElNRV9ETEwpCisjICAgICAgZGVmaW5lIF9TVExQX1VTSU5HX0NST1NTX05BVElWRV9SVU5USU1FX0xJQgorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbHNlCisjICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fSU9TVFJFQU1TKQorLyogU1RMcG9ydCB1c2Ugb25seSBkZXBlbmQgb24gX1NUTFBfUlVOVElNRV9ETEwgYXMgd2UgYXJlIHJlcGxhY2luZworICogdGhlIG5hdGl2ZSBydW50aW1lLgorICovCisjICAgIGlmIGRlZmluZWQgKF9TVExQX1JVTlRJTUVfRExMKQorIyAgICAgIGlmICFkZWZpbmVkIChfU1RMUF9VU0VfU1RBVElDX0xJQikKKyMgICAgICAgIGlmICFkZWZpbmVkIChfU1RMUF9VU0VfRFlOQU1JQ19MSUIpCisjICAgICAgICAgIGRlZmluZSBfU1RMUF9VU0VfRFlOQU1JQ19MSUIKKyMgICAgICAgIGVuZGlmCisjICAgICAgZWxzZQorLyogVGhlIHVzZXIgaXMgZm9yY2luZyB1c2Ugb2YgU1RMcG9ydCBhcyBhIGR5bmFtaWMgbGlicmFyeS4gV2Ugc2lnbmFsIGl0IHNvCisgKiB0aGF0IHRoZSBTVExwb3J0IG5hbWVzcGFjZSB3aWxsIGJlIG1vZGlmeSB0byByZXBvcnQgc3VjaCBhIGNvbWJpbmF0aW9uCisgKiBhbmQgZm9yY2UgdGhlIHVzZXIgdG8gbGluayB3aXRoIHRoZSByZWJ1aWx0IFNUTHBvcnQgbGlicmFyeS4KKyAqLworIyAgICAgICAgZGVmaW5lIF9TVExQX1VTSU5HX0NST1NTX05BVElWRV9SVU5USU1FX0xJQgorIyAgICAgIGVuZGlmCisjICAgIGVsc2UKKyMgICAgICBpZiAhZGVmaW5lZChfU1RMUF9VU0VfRFlOQU1JQ19MSUIpCisjICAgICAgICBpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX1NUQVRJQ19MSUIpCisjICAgICAgICAgIGRlZmluZSBfU1RMUF9VU0VfU1RBVElDX0xJQgorIyAgICAgICAgZW5kaWYKKyMgICAgICBlbHNlCisvKiBJZGVtIHByZXZpb3VzIHJlbWFyayBidXQgdGhlIHVzZXIgZm9yY2VzIHVzZSBvZiB0aGUgc3RhdGljIG5hdGl2ZSBydW50aW1lLgorICovCisjICAgICAgICBkZWZpbmUgX1NUTFBfVVNJTkdfQ1JPU1NfTkFUSVZFX1JVTlRJTUVfTElCCisjICAgICAgZW5kaWYKKyMgICAgZW5kaWYKKyMgIGVsc2UKKy8qIElmIHdlIGRvIG5vdCBidWlsZCBhbmQgdXNlIFNUTHBvcnQgbGlicyB3ZSBjb25zaWRlciB0aGF0IHdlIGFyZSBpbiBhIHN0YXRpYyBsaWIKKyAqIG1vZGUgYXMgb25seSBkeW5hbWljIGxpYiBuZWVkcyBhZGRpdGlvbmFsIGV4cG9ydC9pbXBvcnQgc3BlY2lmaWVyLgorICovCisjICAgIGRlZmluZSBfU1RMUF9VU0VfU1RBVElDX0xJQgorIyAgZW5kaWYKKyNlbmRpZgorCisvKiB3ZSBkb24ndCBoYXZlIGEgc3RhdGljIG5hdGl2ZSBydW50aW1lIGxpYnJhcnkgb24gZXZjMy9ldmM0ICovCisjaWZkZWYgX1NUTFBfV0NFCisjICB1bmRlZiBfU1RMUF9VU0lOR19DUk9TU19OQVRJVkVfUlVOVElNRV9MSUIKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3RsL2NvbmZpZy9fZG0uaCBiL3N0bC9jb25maWcvX2RtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWEwMjdhOQotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9jb25maWcvX2RtLmgKQEAgLTAsMCArMSwxMDkgQEAKKy8vIFNUTHBvcnQgY29uZmlndXJhdGlvbiBmaWxlIGZvciBEaWdpdGFsIE1hcnMgQysrCisKKy8vI2RlZmluZSBfU1RMUF9WRVJCT1NFCisKKyNkZWZpbmUgX1NUTFBfQ09NUElMRVIgIkRNQyIKKworI2lmIGRlZmluZWQgKF9TVExQX1ZFUkJPU0UpCisjICBwcmFnbWEgbWVzc2FnZSBfX0RNQ19WRVJTSU9OX1NUUklOR19fCisjZW5kaWYKKworI2lmIChfX0RNQ19fIDwgMHg4NDYpCisjICBlcnJvciAiRGlnaXRhbCBNYXJzIEMrKyB2ZXJzaW9ucyBwcmlvciB0byA4LjQ2IGFyZSBub3Qgc3VwcG9ydGVkISIKKyNlbmRpZgorCisjaWZuZGVmIF9DUFBVTldJTkQKKyMgIGRlZmluZSBfU1RMUF9OT19FWENFUFRJT05TCisjZW5kaWYKKyNkZWZpbmUgX1NUTFBfVkVORE9SX0dMT0JBTF9DU1RECisKKy8vRE1DIHByZWZlciBlbnVtIHRvIHJlYWwgc3RhdGljIGNvbnN0IHZhcmlhYmxlIGJlY2F1c2UgaXQgZG8gbm90IGNvbnNpZGVyCisvL3N0YXRpYyBjb25zdCBhcyBjb25zdCBlbm91Z2ggdG8gYmUgdXNlZCBpbiBzd2l0Y2ggZGVjbGFyYXRpb24uLi4KKyNkZWZpbmUgX1NUTFBfU1RBVElDX0NPTlNUX0lOSVRfQlVHCisKKyNpZiAhZGVmaW5lZCAoX1dJTjMyKQorLy8gaXQncyBub3QgZnVsbHkgc3VwcG9ydGVkIG9uIG5vbi1XaW4zMiBwbGF0Zm9ybXMKKyMgIGRlZmluZSBfU1RMUF9OT19OQVRJVkVfV0lERV9GVU5DVElPTlMKKyNlbmRpZgorCisvKiBfU1RMUF9OT19PV05fTkFNRVNQQUNFIGlzIGRlZmluZWQgYmVjYXVzZSBEaWdpdGFsIE1hcnMnIGxpbmtlciBhbmQgbGliYXJpYW4KKyAgIGFwcGVhciB0byBoYXZlIHByb2JsZW1zIHdpdGggU1RMcG9ydCBuYW1lc3BhY2VzLiBTdW1tYXJ5IG9mIHRoZSBpc3N1ZXM6CisKKyAgIFNUQVRJQzogRGlnaXRhbCBNYXJzJyBsaWJyYXJpYW4gKGxpYi5leGUpIG1heSBmYWlsIHdpdGggImxlbiA8PSBJRE1BWCIgZXJyb3IKKyAgIGlmIF9TVExQX0RFQlVHIGlzIGRlZmluZWQuICBUaGlzIGlzIGJlY2F1c2UgRGlnaXRhbCBNYXJzJyBsaWJyYXJpYW4gdXNlcworICAgTWljcm9zb2Z0IE9NRiBmb3JtYXQsIHdoaWNoIGxpbWl0cyBpZGVudGlmaWVyIGxlbmd0aCB0byBhYm91dCA1MTIgYnl0ZXMuCisgICBXaXRoIFNUTHBvcnQgbmFtZXNwYWNlcywgc29tZSBpZGVudGlmaWVycyBzdWNoIGFzIENhdGVnb3J5X01hcCBpbgorICAgc3JjL2xvY2FsZV9jYXRhbG9nLmNwcCBtYXkgZXhjZWVkIHRoZSBtYXhpbXVtIE9NRiBpZGVudGlmaWVyIGxlbmd0aC4KKworICAgRFlOQU1JQzogRXhwb3J0IGlzc3VlcyB3aXRoIGNpbiwgY291dCwgY2VyciwgY2xvZyBpbiBzcmMvaW9zdHJlYW0uY3BwLgorICAgRXhwb3J0cyBpbiBEaWdpdGFsIE1hcnMgJ2RlZicgZmlsZSBtdXN0IG1hdGNoIG1hbmdsZWQgbmFtZXMgaW4gaW9zdHJlYW0uY3BwLgorICAgV2l0aCBTVExwb3J0IG5hbWVzcGFjZXMsIHRoZSBtYW5nbGVkIG5hbWVzIGluIHRoZSBpbnRlcm1lZGlhdGUgZmlsZXMgbm8KKyAgIGxvbmdlciBtYXRjaCB0aGVzZSBwcmUtZGVmaW5lZCBleHBvcnRzLiBUbyB1c2UgU1RMcG9ydCBkeW5hbWljIGxpYnJhcmllcworICAgYW5kIFNUTHBvcnQgbmFtZXNwYWNlcyB3aXRoIERpZ2l0YWwgTWFycywgdGhlIHByZS1kZWZpbmVkIGV4cG9ydHMgaW4KKyAgIHNyYy9pb3N0cmVhbS5jcHAgYW5kIHRoZSByZWxhdGVkIERpZ2l0YWwgTWFycyAnZGVmJyBmaWxlcyB3b3VsZCBuZWVkIHRvIGJlCisgICByZXZpc2VkLiAqLworI2RlZmluZSBfU1RMUF9OT19PV05fTkFNRVNQQUNFIDEKKworLy8gc2VsZWN0IHRocmVhZHMgc3RyYXRlZ3kKKyNpZiBkZWZpbmVkIChfTVQpICYmICFkZWZpbmVkIChfTk9USFJFQURTKQorIyAgZGVmaW5lIF9SRUVOVFJBTlQKKyNlbHNlCisjICBkZWZpbmUgX05PVEhSRUFEUworI2VuZGlmCisKKyNpZm5kZWYgX0JPT0xfREVGSU5FRAorIyAgZGVmaW5lIF9TVExQX05PX0JPT0wKKyNlbHNlCisjICBkZWZpbmUgX1NUTFBfRE9OVF9VU0VfQk9PTF9UWVBFREVGCisjZW5kaWYKKworI2lmIF9JTlRFR1JBTF9NQVhfQklUUyA+PSA2NAorIyAgZGVmaW5lIF9TVExQX0xPTkdfTE9ORyBsb25nIGxvbmcKKyNlbmRpZgorCisjZGVmaW5lIF9TVExQX0RPTlRfVVNFX1BSSVZfTkFNRVNQQUNFCisjZGVmaW5lIF9TVExQX05PX0JBRF9BTExPQworI2RlZmluZSBfU1RMUF9USFJPV19SRVRVUk5fQlVHCisKKyNpZiAhZGVmaW5lZCAoX0RMTCkKKyMgIHVuZGVmIF9TVExQX05PX1VORVhQRUNURURfRVhDRVBUX1NVUFBPUlQKKyNlbmRpZgorCisjZGVmaW5lIF9TVExQX1VTRV9BQkJSRVZTCisjZGVmaW5lIF9TVExQX05PX0NPTlRBSU5FUlNfRVhURU5TSU9OCisjZGVmaW5lIF9TVExQX05PX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUgorCisjZGVmaW5lIF9TVExQX0VYUE9SVF9ERUNMU1BFQyBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyNkZWZpbmUgX1NUTFBfSU1QT1JUX0RFQ0xTUEVDIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorCisjZGVmaW5lIF9TVExQX0NMQVNTX0VYUE9SVF9ERUNMU1BFQyBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyNkZWZpbmUgX1NUTFBfQ0xBU1NfSU1QT1JUX0RFQ0xTUEVDIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorCisjZGVmaW5lIF9TVExQX0lNUE9SVF9URU1QTEFURV9LRVlXT1JEIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorI2RlZmluZSBfU1RMUF9FWFBPUlRfVEVNUExBVEVfS0VZV09SRCBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKworI2lmIGRlZmluZWQgKF9XSU5ETEwpCisjICBkZWZpbmUgX1NUTFBfRExMCisjZW5kaWYKKyNpZiBkZWZpbmVkIChfRExMKQorIyAgZGVmaW5lIF9TVExQX1JVTlRJTUVfRExMCisjZW5kaWYKKyNpbmNsdWRlIDxzdGwvY29uZmlnL19kZXRlY3RfZGxsX29yX2xpYi5oPgorI3VuZGVmIF9TVExQX1JVTlRJTUVfRExMCisjdW5kZWYgX1NUTFBfRExMCisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfRFlOQU1JQ19MSUIpCisjICBkZWZpbmUgX1NUTFBfVVNFX0RFQ0xTUEVDIDEKKyMgIGlmIGRlZmluZWQgKF9fQlVJTERJTkdfU1RMUE9SVCkKKyMgICAgZGVmaW5lIF9TVExQX0NBTEwgX19leHBvcnQKKyMgIGVsc2UKKyMgICAgZGVmaW5lIF9TVExQX0NBTEwKKyMgIGVuZGlmCisjZWxzZQorIyAgZGVmaW5lIF9TVExQX0NBTEwKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RsL2NvbmZpZy9fYXV0b19saW5rLmg+CisKKyMgIHVuZGVmIF9fU0NfXworCmRpZmYgLS1naXQgYS9zdGwvY29uZmlnL19lcGlsb2cuaCBiL3N0bC9jb25maWcvX2VwaWxvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjYmFjZTUKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvY29uZmlnL19lcGlsb2cuaApAQCAtMCwwICsxLDMyIEBACisjaWYgZGVmaW5lZCAoX1NUTFBfTVNWQykgfHwgZGVmaW5lZCAoX19JQ0wpIHx8IGRlZmluZWQgKF9fQk9STEFORENfXykKKworI2lmIGRlZmluZWQgKF9fQk9STEFORENfXykKKyMgIHByYWdtYSBvcHRpb24gcG9wCisjICBwcmFnbWEgb3B0aW9uIC13LXBvdyAgICAgLy8gLXctODA2MiBQcmV2aW91cyBvcHRpb25zIGFuZCB3YXJuaW5ncyBub3QgcmVzdG9yZWQKKyNlbHNlCisjICBpZiAhKGRlZmluZWQgKF9TVExQX01TVkMpICYmIChfU1RMUF9NU1ZDIDwgMTIwMCkpCisjICAgIHByYWdtYSB3YXJuaW5nIChwb3ApCisjICBlbmRpZgorIyAgcHJhZ21hIHBhY2sgKHBvcCkKKyNlbmRpZgorCisjZWxpZiBkZWZpbmVkIChfX3NnaSkgJiYgIWRlZmluZWQgKF9fR05VQ19fKSAmJiAoX01JUFNfU0lNICE9IF9NSVBTX1NJTV9BQkkzMikKKworIyAgcHJhZ21hIHJlc2V0IHdvZmYgMTE3NAorIyAgcHJhZ21hIHJlc2V0IHdvZmYgMTM3NQorIyAgcHJhZ21hIHJlc2V0IHdvZmYgMTIwOQorLyogZnJvbSBpdGVyYXRvcl9iYXNlLmggKi8KKyMgIHByYWdtYSByZXNldCB3b2ZmIDExODMKKworI2VsaWYgZGVmaW5lZCAoX19ERUNDWFgpCisKKyMgIGlmZGVmIF9fUFJBR01BX0VOVklST05NRU5UCisjICAgIHByYWdtYSBfX2Vudmlyb25tZW50IF9fcmVzdG9yZQorIyAgZW5kaWYKKworI2VsaWYgZGVmaW5lZCAoX19JQk1DUFBfXykKKworIyAgcHJhZ21hIGluZm8ocmVzdG9yZSkKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL3N0bC9jb25maWcvX2V2Yy5oIGIvc3RsL2NvbmZpZy9fZXZjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg4MWE5YQotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9jb25maWcvX2V2Yy5oCkBAIC0wLDAgKzEsMzU0IEBACisvKgorICogRmlsZSB0byBoYXZlIE1pY3Jvc29mdCBlTWJlZGRlZCBWaXN1YWwgQysrIDMuMCBhbmQgLk5FVCB3b3JraW5nIHdpdGggU1RMcG9ydAorICogTWF5IDIwMDQKKyAqIE9yaWdpbiA6IFpkZW5layBOZW1lYyAtIHplcm9AbWFwZmFjdG9yLmNvbQorICogICAgICAgICAgTWljaGFlbCBGaW5rIC0gdml2aWRvc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQKKyAqLworCisjaWZuZGVmIF9TVExQX0VWQ19ICisjZGVmaW5lIF9TVExQX0VWQ19ICisKKyNkZWZpbmUgX1NUTFBfQ09NUElMRVIgImVNYmVkZGVkIFZpc3VhbCBDKysiCisKKy8vIFRoaXMgZmxhZyBpcyBiZWluZyB1c2VkIGJ5IFNUTHBvcnQgdG8gc3VwcG9ydAorLy8gb2xkLWZhc2hpb25lZCBXaW5kb3dzIENFIFNESyAoc2VlIHN0bF93aW5jZS5oKQorLy8gZG8gbm90IHVzZSB3aXRoIGVNZWJlZGRlZCBWaXN1YWwgQysrIDMgb3IgNCEKKyNpZmRlZiBfU1RMUF9XSU5DRQorIyAgdW5kZWYgX1NUTFBfV0lOQ0UKKyNlbmRpZgorCisvKiBDb21waWxlciBkZXBlbmRlbnQgZGVmaW5lLiBUaGUgZm9sbG93aW5nIGRlZmluZXMgbWF5IGJlIGF2YWlsYWJsZToKKyAqIF9TVExQX1dDRV9FVkMzIHdoZW4gY29tcGlsaW5nIHVuZGVyIGVNYmVkZGVkIFZpc3VhbCBDKysgMworICogX1NUTFBfV0NFX05FVCAgd2hlbiBjb21waWxpbmcgdW5kZXIgZU1iZWRkZWQgVmlzdWFsIEMrKyAuTkVUCisgKiBfU1RMUF9XQ0UgICAgICBhbHdheXMgZGVmaW5lZCB3aGVuIGNvbXBpbGluZyB3aXRoIG9uZSBvZiB0aGUgYWJvdmUKKyAqLworI3VuZGVmIF9TVExQX1dDRV9FVkMzCisjdW5kZWYgX1NUTFBfV0NFX05FVAorCisjaWYgKF9XSU4zMl9XQ0UgPiAzMDApCisjICBkZWZpbmUgX1NUTFBfV0NFX05FVCBVTkRFUl9DRQorI2VsaWYgKF9XSU4zMl9XQ0UgPT0gMzAwKQorIyAgZGVmaW5lIF9TVExQX1dDRV9FVkMzIFVOREVSX0NFCisjZWxzZQorIyAgZXJyb3IgTm8gc3VwcG9ydCBmb3IgV2luZG93cyBDRSBiZWxvdyAzLjAhCisjZW5kaWYKKworLy8gVGhpcyBpcyBkZWZpbmVkIGZvciBhbGwgcGxhdGZvcm1zIHVzaW5nIFdpbmRvd3MgQ0UKKyNkZWZpbmUgX1NUTFBfV0NFCisKKy8qIEFsbCBXaW5kb3dzIENFIHZlcnNpb25zIHVwIHRvIGF0IGxlYXN0IHZlcnNpb24gNSBhcmUgbGl0dGxlLWVuZGlhbiwgZXZlbgorICogaWYgdGhlIGhhcmR3YXJlIChsaWtlIGUuZy4gTUlQUykgY2FuIGJlIGNvbmZpZ3VyZWQgZm9yIGJpZy1lbmRpYW4sIHRvby4gKi8KKyNkZWZpbmUgX1NUTFBfTElUVExFX0VORElBTgorCisvLyBFbnN1cmUgX0RFQlVHIGlzIGRlZmluZWQuCisjaWYgZGVmaW5lZCAoREVCVUcpICYmICFkZWZpbmVkIChfREVCVUcpCisjICBkZWZpbmUgX0RFQlVHCisjZW5kaWYKKworLy8gaW4gZXZjMy80LCBvbiBBUk0sIGNoZWNrIHRoYXQgX1NUTFBfREVCVUcgaXMgbm90IGRlZmluZWQKKy8vIHRoZSBBUk0gY29tcGlsZXIgaGFzIGEgYnVnIHRoYXQgcHJldmVudHMgdGhhdCBkZWJ1ZyBtb2RlIGZyb20gd29ya2luZworI2lmIF9XSU4zMl9XQ0UgPCA1MDAgJiYgZGVmaW5lZChBUk0pICYmIGRlZmluZWQoX1NUTFBfREVCVUcpCisjICBlcnJvciBfU1RMUF9ERUJVRyBtb2RlIGlzIG5vdCBzdXBwb3J0ZWQgaW4gZXZjMyBhbmQgZXZjNCBvbiB0aGUgQVJNIHBsYXRmb3JtIQorI2VuZGlmCisKKy8vIGluaGVyaXQgYWxsIG1zdmM2IG9wdGlvbnMKKyNpbmNsdWRlIDxzdGwvY29uZmlnL19tc3ZjLmg+CisKKy8vIENFIHVwIHRvIGF0IGxlYXN0IHZlcnNpb24gNSBoYXMgbm8gQyBsb2NhbGUgc3VwcG9ydAorI2RlZmluZSBfU1RMUF9OT19MT0NBTEVfU1VQUE9SVAorCisjaWYgX1dJTjMyX1dDRSA+PSAweDUwMAorICAgLy8gU0RLcyBidWlsdCB3aXRoIFBCNSBoYXZlIHRlcm1pbmF0ZSZjbyBpbiBuYW1lc3BhY2Ugc3RkLi4uCisjICBkZWZpbmUgX1NUTFBfVkVORE9SX1RFUk1JTkFURV9TVEQgX1NUTFBfVkVORE9SX1NURAorIyAgZGVmaW5lIF9TVExQX1ZFTkRPUl9VTkNBVUdIVF9FWENFUFRJT05fU1REIF9TVExQX1ZFTkRPUl9TVEQKKyAgIC8vIC4uLmFuZCBuZXdfaGFuZGxlci9zZXRfbmV3X2hhbmRsZXIgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuCisjICBkZWZpbmUgX1NUTFBfR0xPQkFMX05FV19IQU5ETEVSIDEKKyNlbmRpZgorCisvLyBBbHdheXMgdGhyZWFkZWQgaW4gZU1iZWRkZWQgVmlzdWFsIEMrKyAzLjAgYW5kIC5ORVQKKyNpZm5kZWYgX01UCisjICBkZWZpbmUgX01UCisjZW5kaWYKKworLy8gd2UgZG9uJ3QgaGF2ZSBhIHN0YXRpYyBuYXRpdmUgcnVudGltZSBsaWJyYXJ5CisjdW5kZWYgX1NUTFBfVVNJTkdfQ1JPU1NfTkFUSVZFX1JVTlRJTUVfTElCCisKKyNpZiBfV0lOMzJfV0NFIDwgNDAwCisvLyBubyBsb25nIGRvdWJsZSB1bmRlciBDRTMgYW5kIG9sZGVyCisjICBkZWZpbmUgX1NUTFBfTk9fTE9OR19ET1VCTEUKKyNlbmRpZgorCisvLyBubyAqZiBhbmQgKmwgbWF0aCBmdW5jdGlvbnMgYXZhaWxhYmxlCisjZGVmaW5lIF9TVExQX05PX1ZFTkRPUl9NQVRIX0YKKyNkZWZpbmUgX1NUTFBfTk9fVkVORE9SX01BVEhfTAorCisvKgorICogUmVkaXJlY3QgY291dCwgY2VyciBhbmQgY2xvZzoKKyAqIElmIGRlZmluZWQgcmVkaXJlY3QgY291dCwgY2VyciBhbmQgY2xvZyB0bworICogZmlsZXMgc3Rkb3V0LnR4dCwgc3RkZXJyLnR4dCBhbmQgc3RkbG9nLnR4dAorICovCisvLyMgZGVmaW5lIF9TVExQX1JFRElSRUNUX1NURFNUUkVBTVMKKworLyoKKyAqIFN0YXRpYyBjbGFzcyBtZW1iZXJzIG1heSBnZW5lcmF0ZSBMTksxMTc5OgorICogV3JvbmcgQ09NREFUIHBhY2tpbmcgbWF5IGNhdXNlIExOSzExNzkgZXJyb3IuCisgKiBGb3IgZGV0YWlscyBzZWUgaHR0cDovL2dyb3Vwcy5nb29nbGUuY29tL2dyb3Vwcz90aD04YTA1YzgyYzRmZmVlMjgwCisgKiBleGFtcGxlIFA3OC4gVGhpcyBkZWZpbmUgaXMgbm90IHVzZWQvbmVlZGVkIGF0IHRoaXMgbW9tZW50CisgKiBidXQgbWF5IGNhbWUgaGFuZHkgaW4gZnV0dXJlLi4uCisgKi8KKy8vIyBkZWZpbmUgX1NUTFBfU1RBVElDX01FTUJFUlNfQlVHCisKKy8vIFVzZSB3aWRlLXN0cmluZyBpbnRlcmZhY2Ugb2Ygd2luZG93cyBuYXRpdmUgZnVuY3Rpb25zIChDcmVhdGVGaWxlLi4uKS4KKy8vIE5vdGUgdGhhdCB0aGlzIHNob3VsZCBiZSBkZWZpbmVkIGFsbCB0aGUgdGltZSB3aGlsZSB1bmRlciBDRS4KKyNpZiBkZWZpbmVkIChVTklDT0RFKQorIyAgZGVmaW5lIF9TVExQX1VTRV9XSURFX0lOVEVSRkFDRQorI2VuZGlmCisKKy8vIEZvcmNlIGV4Y2VwdGlvbiBzdGQgdG8gc3RkIGluc3RlYWQgb2YgX19zdGRfYWxpYXMuCisjaWYgZGVmaW5lZCAoX19jcGx1c3BsdXMpICYmICFkZWZpbmVkIChfU1RMUF9IQVNfTk9fTkFNRVNQQUNFUykKKyMgIGlmZGVmIF9TVExQX1ZFTkRPUl9FWENFUFRfU1RECisjICAgIHVuZGVmIF9TVExQX1ZFTkRPUl9FWENFUFRfU1RECisjICBlbmRpZgorIyAgZGVmaW5lIF9TVExQX1ZFTkRPUl9FWENFUFRfU1REIHN0ZAorI2VuZGlmCisKKy8vIHNob3J0IHN0cmluZyBvcHRpbWl6YXRpb24gYnVnIHVuZGVyIGV2YzMsIGV2YzQgdXNpbmcgQVJNIGNvbXBpbGVyCisjaWYgX01TQ19WRVI8MTQwMCAmJiAoZGVmaW5lZCAoQVJNKSB8fCBkZWZpbmVkIChfQVJNXykpCisjICBkZWZpbmUgX1NUTFBfRE9OVF9VU0VfU0hPUlRfU1RSSU5HX09QVElNCisjZW5kaWYKKworLy8gd2hlbiB1c2luZyBNRkMsIGRpc2FibGUgYW5vdGhlciBwbGFjZW1lbnQgbmV3IGRlY2xhcmF0aW9uLCBzaW5jZSB0aGVyZSBpcyBvbmUgaW4gd2NlYWx0LmgKKyNpZiAhZGVmaW5lZCAoX19CVUlMRElOR19TVExQT1JUKSAmJiBkZWZpbmVkIChfTUZDX1ZFUikKKyMgIGRlZmluZSBfX1BMQUNFTUVOVF9ORVdfSU5MSU5FCisjZW5kaWYKKworLy8gdGhyZWFkcworI3VuZGVmIF9SRUVOVFJBTlQKKyNkZWZpbmUgX1JFRU5UUkFOVAorI3VuZGVmIF9OT1RIUkVBRFMKKworLy8gVXNlIG9sZCBmYXNoaW9uZWQgaGVhZGVycyAoY3RpbWUgdnMuIHRpbWUuaCkuCisjdW5kZWYgX1NUTFBfTk9fTkVXX0NfSEVBREVSUworI2RlZmluZSBfU1RMUF9OT19ORVdfQ19IRUFERVJTCisKKy8vIGV4Y2VwdGlvbiBoYW5kbGluZyBzdXBwb3J0OiBvbmx5IG9uIGV2YzQgYW5kIHVzZXIgYWRkZWQgL0dYIHRvIHByb2plY3Qgc2V0dGluZ3MKKyNpZiBkZWZpbmVkIChfU1RMUF9XQ0VfRVZDMykgfHwgIWRlZmluZWQgKF9DUFBVTldJTkQpCisjICBkZWZpbmUgX1NUTFBfTk9fRVhDRVBUSU9OX0hFQURFUgorIyAgZGVmaW5lIF9TVExQX05PX0VYQ0VQVElPTlMKKyMgIHVuZGVmIF9TVExQX1VTRV9FWENFUFRJT05TCisjICBpZm5kZWYgX19USFJPV19CQURfQUxMT0MKKyMgICAgZGVmaW5lIF9fVEhST1dfQkFEX0FMTE9DIHsgX1NUTFBfV0lOQ0VfVFJBQ0UoTCJvdXQgb2YgbWVtb3J5Iik7IEV4aXRUaHJlYWQoMSk7IH0KKyMgIGVuZGlmCisjZW5kaWYKKworI2RlZmluZSBfU1RMUF9XSU5DRV9UUkFDRShtc2cpIE91dHB1dERlYnVnU3RyaW5nKG1zZykKKworLyoKKyAqIGVNYmVkZGVkIFZpc3VhbCBDKysgLk5FVCBzcGVjaWZpYyBzZXR0aW5ncworICovCisjaWYgZGVmaW5lZCAoX1NUTFBfV0NFX05FVCkKKworLy8gZXZjNCBoYXMgbm8gbG9jYWxlIGFuZCB0aW1lIHN1cHBvcnQKKyMgIGRlZmluZSBfU1RMUF9OT19MT0NBTEVfU1VQUE9SVAorIyAgZGVmaW5lIF9TVExQX05PX1RJTUVfU1VQUE9SVAorCisvLyBwdHJkaWZmX3QgaXMgbm90IGRlZmluZWQgaW4gZXZjNCBoZWFkZXJzCisjICBpZm5kZWYgX1BUUkRJRkZfVF9ERUZJTkVECisgICB0eXBlZGVmIGludCBwdHJkaWZmX3Q7CisjICAgIGRlZmluZSBfUFRSRElGRl9UX0RFRklORUQKKyMgIGVuZGlmCisKKy8qCisgKiBIZWxwZXIgbWFjcm9zIGZvciBpbmNsdWRpbmcgdGhlIG5hdGl2ZSBoZWFkZXJzIGluIGNhc2VzIHdoZXJlIGEgZmlsZSB3aXRoCisgKiB0aGUgc2FtZSBuYW1lIGFsc28gZXhpc3RzIGluIHRoZSBTVExwb3J0IGluY2x1ZGUgZm9sZGVyLiBUaGUgaWRlYSBiZWhpbmQKKyAqIHRoaXMgaXMgdGhhdCB3ZSBmaXJzdCBnbyB1cCBvbmUgZGlyZWN0b3J5IGFuZCB0aGVuIGRvd24gaW50byBhIGRpciB0aGF0CisgKiBpcyBvbmx5IHByZXNlbnQgaW4gdGhlIG5hdGl2ZSBpbnN0YWxsIGJ1dCBub3QgaW4gU1RMcG9ydC4KKyAqCisgKi8KKyMgIGlmICFkZWZpbmVkIChfU1RMUF9OQVRJVkVfSU5DTFVERV9QQVRIKQorIyAgICBpZiBkZWZpbmVkIChfWDg2XykKKyMgICAgICBpZiBkZWZpbmVkIChfU1RMUF9XQ0VfVEFSR0VUX1BST0NfU1VCVFlQRV9FTVVMQVRPUikKKyMgICAgICAgIGRlZmluZSBfU1RMUF9OQVRJVkVfSU5DTFVERV9QQVRIIC4uL0VtdWxhdG9yCisjICAgICAgZWxzZQorIyAgICAgICAgZGVmaW5lIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEggLi4vWDg2CisjICAgICAgZW5kaWYKKyMgICAgZWxpZiBkZWZpbmVkIChfQVJNXykKKyMgICAgICBpZiBfTVNDX1ZFUiA8IDE0MDAKKyAgICAgICAgIC8vIGVWQzMvNAorIyAgICAgICAgaWYgZGVmaW5lZCAoQVJNVjQpCisjICAgICAgICAgIGRlZmluZSBfU1RMUF9OQVRJVkVfSU5DTFVERV9QQVRIIC4uL0FybXY0CisjICAgICAgICBlbGlmIGRlZmluZWQgKEFSTVY0SSkKKyMgICAgICAgICAgZGVmaW5lIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEggLi4vQXJtdjRpCisjICAgICAgICBlbGlmIGRlZmluZWQgKEFSTVY0VCkKKyMgICAgICAgICAgZGVmaW5lIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEggLi4vQXJtdjR0CisjICAgICAgICBlbHNlCisjICAgICAgICAgIGVycm9yIFVua25vd24gQVJNIFNESy4KKyMgICAgICAgIGVuZGlmCisjICAgICAgZWxzZQorICAgICAgICAgLy8gVkM4IGNyb3NzY29tcGlsaW5nIGZvciBDRQorIyAgICAgICAgaWYgZGVmaW5lZCAoQVJNVjQpCisjICAgICAgICAgIGRlZmluZSBfU1RMUF9OQVRJVkVfSU5DTFVERV9QQVRIIC4uL0FybXY0CisjICAgICAgICBlbGlmIGRlZmluZWQoQVJNVjRJKSB8fCBkZWZpbmVkKEFSTVY0VCkKKyMgICAgICAgICAgZGVmaW5lIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEggLi4vQXJtdjRpCisjICAgICAgICBlbHNlCisjICAgICAgICAgIGVycm9yIFVua25vd24gQVJNIFNESy4KKyMgICAgICAgIGVuZGlmCisjICAgICAgZW5kaWYKKyMgICAgZWxpZiBkZWZpbmVkIChfTUlQU18pCisjICAgICAgaWYgZGVmaW5lZCAoTUlQUzE2KQorIyAgICAgICAgZGVmaW5lIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEggLi4vbWlwczE2CisjICAgICAgZWxpZiBkZWZpbmVkIChNSVBTSUkpCisjICAgICAgICBkZWZpbmUgX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSCAuLi9taXBzSUkKKyMgICAgICBlbGlmIGRlZmluZWQgKE1JUFNJSV9GUCkKKyMgICAgICAgIGRlZmluZSBfU1RMUF9OQVRJVkVfSU5DTFVERV9QQVRIIC4uL21pcHNJSV9mcAorIyAgICAgIGVsaWYgZGVmaW5lZCAoTUlQU0lWKQorIyAgICAgICAgZGVmaW5lIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEggLi4vbWlwc0lWCisjICAgICAgZWxpZiBkZWZpbmVkIChNSVBTSVZfRlApCisjICAgICAgICBkZWZpbmUgX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSCAuLi9taXBzSVZfZnAKKyMgICAgICBlbHNlCisjICAgICAgICBlcnJvciBVbmtub3duIE1JUFMgU0RLLgorIyAgICAgIGVuZGlmCisjICAgIGVsaWYgZGVmaW5lZCAoU0h4KQorIyAgICAgIGlmIGRlZmluZWQgKFNIMykKKyMgICAgICAgIGRlZmluZSBfU1RMUF9OQVRJVkVfSU5DTFVERV9QQVRIIC4uL3NoMworIyAgICAgIGVsaWYgZGVmaW5lZCAoU0g0KQorIyAgICAgICAgZGVmaW5lIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEggLi4vc2g0CisjICAgICAgZWxzZQorIyAgICAgICAgZXJyb3IgVW5rbm93biBTSHggU0RLLgorIyAgICAgIGVuZGlmCisjICAgIGVsc2UKKyMgICAgICBlcnJvciBVbmtub3duIFNESy4KKyMgICAgZW5kaWYKKyMgIGVuZGlmIC8qICFfU1RMUF9OQVRJVkVfSU5DTFVERV9QQVRIICovCisKKy8qIFdvcmthcm91bmQgd2hlbiB1c2luZyBNRkNDRSBhbmQgdXNpbmcgPG5ldz4gdG9nZXRoZXI6IE1GQ0NFJ3Mgd2NlYWx0LmggZG9lc24ndAorICogY2hlY2sgZm9yIF9fUExBQ0VNRU5UX05FV19JTkxJTkUgYmVmb3JlIGRlZmluaW5nIG9wZXJhdG9yIG5ldywgc28gd2hlbiA8bmV3PgorICogZGVmaW5lcyB0aGUgb3BlcmF0b3JlIGJlZm9yZSwgdGhlcmUgd2lsbCBiZSBhbiBlcnJvciBDMjA4NDoKKyAqICJmdW5jdGlvbiAndm9pZCAqX19jZGVjbCBvcGVyYXRvciBuZXcodW5zaWduZWQgaW50LHZvaWQgKiknIGFscmVhZHkgaGFzIGEgYm9keSIuCisgKi8KKyMgIGlmZGVmIF9TVExQX1VTRV9NRkMKKyMgICAgZGVmaW5lIF9fUExBQ0VNRU5UX05FV19JTkxJTkUKKyMgIGVuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9XQ0VfTkVUICovCisKKy8qIFdvcmthcm91bmQgaW4gX3dpbmRvd3MuaCBuZWVkcyBuYXRpdmUgaGVhZGVycyBhY2Nlc3MgbWFjcm9zCisgKiB0byBiZSBkZWZpbmVkICovCisjaW5jbHVkZSA8c3RsL2NvbmZpZy9fbmF0aXZlX2hlYWRlcnMuaD4KKworLyoKKyAqIGVNYmVkZGVkIFZpc3VhbCBDKysgMy4wIHNwZWNpZmljIHNldHRpbmdzCisgKi8KKyNpZiBkZWZpbmVkIChfU1RMUF9XQ0VfRVZDMykKKworIyAgZGVmaW5lIF9TVExQX05PX05BVElWRV9NQlNUQVRFX1QKKworLy8gZXZjMyBoYXMgbm8gbG9jYWxlIGFuZCB0aW1lIHN1cHBvcnQKKyMgIGRlZmluZSBfU1RMUF9OT19MT0NBTEVfU1VQUE9SVAorIyAgZGVmaW5lIF9TVExQX05PX1RJTUVfU1VQUE9SVAorCisvLyBldmMzIGhhcyBuZXcsIGJ1dCBubyBleHBsaWNpdCBoZWFkZXIKKyMgIGRlZmluZSBfU1RMUF9OT19ORVdfSEVBREVSCisjICBkZWZpbmUgX1NUTFBfTk9fTkVXX05FV19IRUFERVIKKworLy8gZXZjMyBoYXMgbm8gYmFkX2FsbG9jIGFuZCBubyB0eXBlaW5mbworIyAgdW5kZWYgX1NUTFBfTk9fQkFEX0FMTE9DCisjICBkZWZpbmUgX1NUTFBfTk9fQkFEX0FMTE9DCisKKyMgIHVuZGVmIF9TVExQX05PX1RZUEVJTkZPCisjICBkZWZpbmUgX1NUTFBfTk9fVFlQRUlORk8KKworLy8gbWlzc2luZyB0aGluZ3MgaW4gZU1iZWRkZWQgVmlzdWFsIEMrKyAzLjAgaGVhZGVycworIyAgaWZuZGVmIF9TSVpFX1RfREVGSU5FRAorICAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgc2l6ZV90OworIyAgICBkZWZpbmUgX1NJWkVfVF9ERUZJTkVECisjICBlbmRpZgorCisjICBpZm5kZWYgX1dDSEFSX1RfREVGSU5FRAorICAgdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB3Y2hhcl90OworIyAgICBkZWZpbmUgX1dDSEFSX1RfREVGSU5FRAorIyAgZW5kaWYKKworLy8gcHRyZGlmZl90IGlzIG5vdCBkZWZpbmVkIGluIGV2YzMgaGVhZGVycworIyAgaWZuZGVmIF9QVFJESUZGX1RfREVGSU5FRAorICAgdHlwZWRlZiBpbnQgcHRyZGlmZl90OworIyAgICBkZWZpbmUgX1BUUkRJRkZfVF9ERUZJTkVECisjICBlbmRpZgorCisvLyBjbG9ja190IGlzIG5vdCBkZWZpbmVkIGluIGV2YzMgaGVhZGVycworIyAgaWZuZGVmIF9DTE9DS19UX0RFRklORUQKKyAgIHR5cGVkZWYgbG9uZyBjbG9ja190OworIyAgICBkZWZpbmUgX0NMT0NLX1RfREVGSU5FRAorIyAgZW5kaWYKKworLy8gU3RydWN0IHRtIGlzIG5vdCBkZWZpbmVkIGluIGV2YzMgaGVhZGVycworIyAgaWZuZGVmIF9UTV9ERUZJTkVECitzdHJ1Y3QgdG0geworICAgaW50IHRtX3NlYzsgICAgIC8qIHNlY29uZHMgYWZ0ZXIgdGhlIG1pbnV0ZSAtIFswLDU5XSAqLworICAgaW50IHRtX21pbjsgICAgIC8qIG1pbnV0ZXMgYWZ0ZXIgdGhlIGhvdXIgLSBbMCw1OV0gKi8KKyAgIGludCB0bV9ob3VyOyAgICAvKiBob3VycyBzaW5jZSBtaWRuaWdodCAtIFswLDIzXSAqLworICAgaW50IHRtX21kYXk7ICAgIC8qIGRheSBvZiB0aGUgbW9udGggLSBbMSwzMV0gKi8KKyAgIGludCB0bV9tb247ICAgICAvKiBtb250aHMgc2luY2UgSmFudWFyeSAtIFswLDExXSAqLworICAgaW50IHRtX3llYXI7ICAgIC8qIHllYXJzIHNpbmNlIDE5MDAgKi8KKyAgIGludCB0bV93ZGF5OyAgICAvKiBkYXlzIHNpbmNlIFN1bmRheSAtIFswLDZdICovCisgICBpbnQgdG1feWRheTsgICAgLyogZGF5cyBzaW5jZSBKYW51YXJ5IDEgLSBbMCwzNjVdICovCisgICBpbnQgdG1faXNkc3Q7ICAgLyogZGF5bGlnaHQgc2F2aW5ncyB0aW1lIGZsYWcgKi8KK307CisjICAgIGRlZmluZSBfVE1fREVGSU5FRAorIyAgZW5kaWYKKworLy8gZGVmaW5lIHBsYWNlbWVudCBuZXcgYW5kIGRlbGV0ZSBvcGVyYXRvcgorLy8gbm90ZTogd2hlbiBNRkNDRSBoZWFkZXJzIGFyZSBpbmNsdWRlZCBmaXJzdCwgZG9uJ3QgZGVmaW5lIHRoZSBuZXcgb3BlcmF0b3IsCisvLyAgICAgICBzaW5jZSBpdCB3YXMgYWxyZWFkeSBkZWZpbmVkIGluIHdjZWFsdC5oCisjICBpZmRlZiBfX2NwbHVzcGx1cworIyAgICBpZm5kZWYgX19QTEFDRU1FTlRfTkVXX0lOTElORQorIyAgICAgIGlmbmRlZiBfTUZDX1ZFUgoraW5saW5lIHZvaWQgKl9fY2RlY2wgb3BlcmF0b3IgbmV3KHNpemVfdCwgdm9pZCAqX1ApIHsgcmV0dXJuIChfUCk7IH0KKyMgICAgICBlbmRpZiAvKiBfTUZDX1ZFUiAqLworaW5saW5lIHZvaWQgX19jZGVjbCBvcGVyYXRvciBkZWxldGUodm9pZCAqLCB2b2lkICopIHsgcmV0dXJuOyB9CisjICAgICAgZGVmaW5lIF9fUExBQ0VNRU5UX05FV19JTkxJTkUKKyMgICAgZW5kaWYKKyMgIGVuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKy8vIGV2YzMgZG9lc24ndCBoYXZlIG5hdGl2ZSB3aWRlIGZ1bmN0aW9ucywgZS5nLiBmZ2V0d2MsIHdtZW1tb3ZlCisjICBkZWZpbmUgX1NUTFBfTk9fTkFUSVZFX1dJREVfRlVOQ1RJT05TCisKKy8vIGV2YzMgZG9lc24ndCBoYXZlIGFzc2VydC5oCisjICBpZm5kZWYgX0FTU0VSVF9ERUZJTkVECisjICAgIGRlZmluZSBhc3NlcnQoZXhwcikgX1NUTFBfQVNTRVJUKGV4cHIpCisjICAgIGRlZmluZSBfQVNTRVJUX0RFRklORUQKKyMgIGVuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9XQ0VfRVZDMyAqLworCisvLyBNaW5pbWl6ZSB3aW5kb3dzLmggaW5jbHVkZXMKKyNpZiAhZGVmaW5lZCAoV0lOMzJfTEVBTl9BTkRfTUVBTikKKyMgIGRlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCisjZW5kaWYKKyNpZiAhZGVmaW5lZCAoVkNfRVhUUkFMRUFOKQorIyAgZGVmaW5lIFZDX0VYVFJBTEVBTgorI2VuZGlmCisjaWYgIWRlZmluZWQgKFNUUklDVCkKKyMgIGRlZmluZSBTVFJJQ1QKKyNlbmRpZgorCisvLyBEb24ndCBsZXQgd2luZG93cy5oIGRlZmluZSBpdHMgbWluIGFuZCBtYXggbWFjcm9zLgorI2lmICFkZWZpbmVkIChOT01JTk1BWCkKKyMgIGRlZmluZSBOT01JTk1BWAorI2VuZGlmCisKKy8qCisgKiBvcmlnaW5hbCBjYWxsOiBUZXJtaW5hdGVQcm9jZXNzKEdldEN1cnJlbnRQcm9jZXNzKCksIDApOworICogd2Ugc3Vic3RpdHV0ZSB0aGUgR2V0Q3VycmVudFByb2Nlc3MoKSB3aXRoIHRoZSByZXN1bHQgb2YgdGhlIGlubGluZSBmdW5jdGlvbgorICogZGVmaW5lZCBpbiBrZnVuY3MuaCwgc2luY2Ugd2UgdGhlbiBjYW4gYXZvaWQgaW5jbHVkaW5nIDx3aW5kb3dzLmg+IGF0IGFsbC4KKyAqIGFsbCBuZWVkZWQgV2luMzIgQVBJIGZ1bmN0aW9ucyBhcmUgZGVmaW5lZCBpbiA8c3RsL193aW5kb3dzLmg+CisgKi8KKyNpZm5kZWYgX0FCT1JUX0RFRklORUQKKyMgIGRlZmluZSBfU1RMUF9BQk9SVCgpIFRlcm1pbmF0ZVByb2Nlc3MocmVpbnRlcnByZXRfY2FzdDxIQU5ETEU+KDY2KSwgMCkKKyMgIGRlZmluZSBfQUJPUlRfREVGSU5FRAorI2VuZGlmCisKKy8vIE5vdGljZTogd2luZG93cy5oIGlzbid0IGluY2x1ZGVkIGhlcmUgYW55bW9yZTsgYWxsIG5lZWRlZCBkZWZpbmVzIGFyZSBpbgorLy8gc3RsL193aW5kb3dzLmggbm93CisKKyNlbmRpZiAvKiBfU1RMUF9FVkNfSCAqLwpkaWZmIC0tZ2l0IGEvc3RsL2NvbmZpZy9fZnJlZWJzZC5oIGIvc3RsL2NvbmZpZy9fZnJlZWJzZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiYjZiNTgKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvY29uZmlnL19mcmVlYnNkLmgKQEAgLTAsMCArMSBAQAorI2RlZmluZSBfU1RMUF9QTEFURk9STSAiRnJlZSBCU0QiCmRpZmYgLS1naXQgYS9zdGwvY29uZmlnL19mdWppdHN1LmggYi9zdGwvY29uZmlnL19mdWppdHN1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y5MWUwNQotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9jb25maWcvX2Z1aml0c3UuaApAQCAtMCwwICsxLDcgQEAKKy8qIFNUTHBvcnQgY29uZmlndXJhdGlvbiBmb3IgRnVqaXRzdSBjb21waWxlciA6IGxvb2tzIGxpa2UgYSBwZXJmZWN0IG9uZSAhICovCisjZGVmaW5lIF9TVExQX0NPTVBJTEVSICJGdWppdHN1IgorCisjZGVmaW5lIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEggLi4vc3RkCisjZGVmaW5lIF9TVExQX1VJTlQzMl9UIHVuc2lnbmVkIGludAorI2RlZmluZSBfU1RMUF9MT05HX0xPTkcgbG9uZyBsb25nCisjZGVmaW5lIF9TVExQX1dDSEFSX1NVTlBST19FWENMVURFIDEKZGlmZiAtLWdpdCBhL3N0bC9jb25maWcvX2djYy5oIGIvc3RsL2NvbmZpZy9fZ2NjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRhZTQ1MgotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9jb25maWcvX2djYy5oCkBAIC0wLDAgKzEsNDYyIEBACisvKiBTVExwb3J0IGNvbmZpZ3VyYXRpb24gZmlsZQorICogSXQgaXMgaW50ZXJuYWwgU1RMcG9ydCBoZWFkZXIgLSBETyBOT1QgaW5jbHVkZSBpdCBkaXJlY3RseQorICovCisKKyNkZWZpbmUgX1NUTFBfQ09NUElMRVIgImdjYyIKKworLyogU3lzdGVtcyBoYXZpbmcgR0xJQkMgaW5zdGFsbGVkIGhhdmUgZGlmZmVyZW50IHRyYWl0cyAqLworI2lmIGRlZmluZWQgKF9fbGludXhfXykKKyMgIGlmbmRlZiBfU1RMUF9VU0VfR0xJQkMKKyMgICAgZGVmaW5lIF9TVExQX1VTRV9HTElCQyAxCisjICBlbmRpZgorIyAgaWYgZGVmaW5lZCAoX19VQ0xJQkNfXykgJiYgIWRlZmluZWQgKF9TVExQX1VTRV9VQ0xJQkMpCisjICAgIGRlZmluZSBfU1RMUF9VU0VfVUNMSUJDIDEKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fQ1lHV0lOX18pICYmIFwKKyAgICAgKF9fR05VQ19fID49IDMpICYmIChfX0dOVUNfTUlOT1JfXyA+PSAzKSAmJiAhZGVmaW5lZCAoX0dMSUJDUFBfVVNFX0M5OSkKKyMgIGRlZmluZSBfU1RMUF9OT19WRU5ET1JfTUFUSF9MCisjICBkZWZpbmUgX1NUTFBfTk9fVkVORE9SX1NURExJQl9MCisjZW5kaWYKKworI2lmIChfX0dOVUNfXyA8IDMpCisjICBkZWZpbmUgX1NUTFBfTk9fVkVORE9SX1NURExJQl9MCisjZW5kaWYKKworLyogV2UgZ3Vlc3MgaWYgd2UgYXJlIHVzaW5nIHRoZSBjeWd3aW4gZGlzdHJpYiB0aGF0IGhhcyBhIHNwZWNpYWwgaW5jbHVkZSBzY2hlbWEuCisgKiBUaGVyZSBpcyBubyB3YXkgdG8gZGlzdGluZ3Vpc2ggYSBjeWd3aW4gZGlzdHJpYiB1c2VkIGluIG5vLWN5Z3dpbiBtb2RlIGZyb20gYQorICogbWluZ3cgaW5zdGFsbC4gV2UgYXJlIGZvcmNlZCB0byB1c2UgYSBjb25maWd1cmF0aW9uIG9wdGlvbgorICovCisjaWYgIWRlZmluZWQgKF9TVExQX05BVElWRV9JTkNMVURFX1BBVEgpICYmIFwKKyAgICAoZGVmaW5lZCAoX19DWUdXSU5fXykgfHwgZGVmaW5lZCAoX19NSU5HVzMyX18pICYmIGRlZmluZWQgKF9TVExQX05PX0NZR1dJTikpCisjICBpZiAoX19HTlVDX18gPiAzKSB8fCAoKF9fR05VQ19fID09IDMpICYmIChfX0dOVUNfTUlOT1JfXyA+IDMpKQorIyAgICBkZWZpbmUgX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSCAuLi8uLi8uLi9fX0dOVUNfXy5fX0dOVUNfTUlOT1JfXy5fX0dOVUNfUEFUQ0hMRVZFTF9fL2luY2x1ZGUvYysrCisjICBlbGlmIGRlZmluZWQgKF9TVExQX05PX0NZR1dJTikKKyMgICAgZGVmaW5lIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEggLi4vbWluZ3cKKy8qIyAgZWxzZQorICogQmVmb3JlIHZlcnNpb24gZ2NjIDMuNCwgdGhlIGN5Z3dpbiBwYWNrYWdlIGluY2x1ZGUgcGF0aCB3YXMgY29uZm9ybSB0byB0aGUKKyAqIEdOVSBjb252ZW50aW9uIHdoaWNoIGlzIHNldCBsYXRlciBpbiB0aGlzIGZpbGUuCisgKi8KKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIChfX0dOVUNfXyA8IDMpIHx8ICgoX19HTlVDX18gPT0gMykgJiYgKF9fR05VQ19NSU5PUl9fIDwgNCkpCisvKiBkZWZpbmUgZm9yIGdjYyB2ZXJzaW9ucyBiZWZvcmUgMy40LjAuICovCisjICBkZWZpbmUgX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFX0tFWVdPUkQKKyNlbmRpZgorCisvKiBhem92OiBnY2Mgb24gbHlueCBoYXZlIGEgYnVnIHRoYXQgY2F1c2VzIGludGVybmFsCisgKiBjb21waWxlciBlcnJvcnMgd2hlbiBjb21waWxpbmcgU1RMcG9ydCB3aXRoIG5hbWVzcGFjZXMgdHVybmVkIG9uLgorICogV2hlbiB0aGUgY29tcGlsZXIgZ2V0cyBiZXR0ZXIgLSBjb21tZW50IG91dCBfU1RMUF9IQVNfTk9fTkFNRVNQQUNFUworICovCisjaWYgZGVmaW5lZCAoX19MeW54X18pICYmIChfX0dOVUNfXyA8IDMpCisjICBkZWZpbmUgX1NUTFBfSEFTX05PX05BTUVTUEFDRVMgMQorIyAgZGVmaW5lIF9TVExQX05PX1NUQVRJQ19URU1QTEFURV9EQVRBIDEKKy8qIHR1cm4gb2ZmIHVzZWxlc3Mgd2FybmluZyBhYm91dCBpbmNsdWRpbmcgc3lzdGVtIGhlYWRlcnMgKi8KKyMgIGRlZmluZSBfX05PX0lOQ0xVREVfV0FSTl9fIDEKKyNlbmRpZgorCisvKiBUcnU2NCBVbml4LCBBSVgsIEhQIDogZ2NjIHRoZXJlIGJ5IGRlZmF1bHQgdXNlcyBuYXRpdmUgbGQgYW5kIGhlbmNlIGNhbm5vdCBhdXRvLWluc3RhbnRpYXRlCisgICBzdGF0aWMgdGVtcGxhdGUgZGF0YS4gSWYgeW91IGFyZSB1c2luZyBHTlUgbGQsIHBsZWFzZSBzYXkgc28gaW4gdXNlcl9jb25maWcuaCBoZWFkZXIgKi8KKyNpZiAoX19HTlVDX18gPCAzKSAmJiAhZGVmaW5lZChfU1RMUF9HQ0NfVVNFU19HTlVfTEQpICYmIFwKKyAgICgoZGVmaW5lZCAoX19vc2ZfXykgJiYgZGVmaW5lZCAoX19hbHBoYV9fKSkgfHwgZGVmaW5lZCAoX0FJWCkgfHwgZGVmaW5lZCAoX19ocHV4KSB8fCBkZWZpbmVkKF9fYW1pZ2Fvc19fKSApCisjICBkZWZpbmUgX1NUTFBfTk9fU1RBVElDX1RFTVBMQVRFX0RBVEEKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKF9SRUVOVFJBTlQpICYmIChkZWZpbmVkIChfVEhSRUFEX1NBRkUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmluZWQgKF9fT3BlbkJTRF9fKSAmJiBkZWZpbmVkIChfUE9TSVhfVEhSRUFEUykpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmluZWQgKF9fTUlOR1czMl9fKSAmJiBkZWZpbmVkIChfTVQpKSkKKyMgIGRlZmluZSBfUkVFTlRSQU5UCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fREpHUFApCisjICBkZWZpbmUgX1NUTFBfUkFORDQ4ICAgIDEKKyMgIGRlZmluZSBfTk9USFJFQURTICAgIDEKKyMgIHVuZGVmICBfUFRIUkVBRFMKKyMgIGRlZmluZSBfU1RMUF9MSVRUTEVfRU5ESUFOCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fTUlOR1czMl9fKQorLyogTWluZ3czMiwgZWdjcyBjb21waWxlciB1c2luZyB0aGUgTWljcm9zb2Z0IEMgcnVudGltZSAqLworIyAgZGVmaW5lIF9TVExQX1ZFTkRPUl9HTE9CQUxfQ1NURAorIyAgdW5kZWYgIF9TVExQX05PX0RSQU5ENDgKKyMgIGRlZmluZSBfU1RMUF9OT19EUkFORDQ4CisjICBkZWZpbmUgX1NUTFBfQ0FMTAorCisjICBpZiBkZWZpbmVkIChfU1RMUF9ORVdfUExBVEZPUk1fU0RLKQorLyogRm9yIHRoZSBtb21lbnQgdGhlIFdpbmRvd3MgU0RLIGNvbWluZyB3aXRoIE1pbmd3IHN0aWxsIG1pbWlrIHRoZSBvbGQgcGxhdGZvcm0gU0RLLiAqLworIyAgICB1bmRlZiBfU1RMUF9ORVdfUExBVEZPUk1fU0RLCisjICBlbmRpZgorI2VuZGlmIC8qIF9fTUlOR1czMl9fICovCisKKyNpZiBkZWZpbmVkIChfX0NZR1dJTl9fKSB8fCBkZWZpbmVkIChfX01JTkdXMzJfXykKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9VU0VfU1RBVElDX0xJQikKKyMgICAgZGVmaW5lIF9TVExQX1VTRV9ERUNMU1BFQyAxCisjICAgIGlmICFkZWZpbmVkIChfU1RMUF9VU0VfRFlOQU1JQ19MSUIpCisjICAgICAgZGVmaW5lIF9TVExQX1VTRV9EWU5BTUlDX0xJQgorIyAgICBlbmRpZgorIyAgICBkZWZpbmUgX1NUTFBfRVhQT1JUX0RFQ0xTUEVDIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQorIyAgICBkZWZpbmUgX1NUTFBfQ0xBU1NfRVhQT1JUX0RFQ0xTUEVDIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQorIyAgICBkZWZpbmUgX1NUTFBfQ0xBU1NfSU1QT1JUX0RFQ0xTUEVDIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorIyAgZW5kaWYKKy8qIFRoZSBmb2xsb3dpbmcgaXMgZGVmaW5lZCBpbmRlcGVuZGVudGx5IG9mIF9TVExQX1VTRV9TVEFUSUNfTElCIGJlY2F1c2UgaXQgaXMgYWxzbworICogdXNlZCB0byBpbXBvcnQgc3ltYm9scyBmcm9tIFBTREsgdW5kZXIgTWluR1cKKyAqLworIyAgZGVmaW5lIF9TVExQX0lNUE9SVF9ERUNMU1BFQyBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19DWUdXSU5fXykgfHwgZGVmaW5lZCAoX19NSU5HVzMyX18pIHx8ICEoZGVmaW5lZCAoX1NUTFBfVVNFX0dMSUJDKSB8fCBkZWZpbmVkIChfX3N1bikgfHwgZGVmaW5lZChfX0FQUExFX18pKQorIyAgaWYgIWRlZmluZWQgKF9fTUlOR1czMl9fKSAmJiAhZGVmaW5lZCAoX19DWUdXSU5fXykKKyMgICAgZGVmaW5lIF9TVExQX05PX05BVElWRV9NQlNUQVRFX1QgICAgMQorIyAgZW5kaWYKKyMgIGlmICFkZWZpbmVkIChfX01JTkdXMzJfXykgfHwgKF9fR05VQ19fIDwgMykgfHwgKF9fR05VQ19fID09IDMpICYmIChfX0dOVUNfTUlOT1JfXyA8IDQpCisjICAgIGRlZmluZSBfU1RMUF9OT19OQVRJVkVfV0lERV9GVU5DVElPTlMgMQorIyAgZW5kaWYKKyMgIGRlZmluZSBfU1RMUF9OT19OQVRJVkVfV0lERV9TVFJFQU1TICAgMQorI2VuZGlmCisKKyNkZWZpbmUgX1NUTFBfTk9SRVRVUk5fRlVOQ1RJT04gX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKQorCisvKiBNYWMgT1MgWCBpcyBhIGxpdHRsZSBkaWZmZXJlbnQgd2l0aCBuYW1lc3BhY2VzIGFuZCBjYW5ub3QgaW5zdGFudGlhdGUKKyAqIHN0YXRpYyBkYXRhIG1lbWJlcnMgaW4gdGVtcGxhdGUgY2xhc3NlcyAqLworI2lmIGRlZmluZWQgKF9fQVBQTEVfXykKKyMgIGlmICgoX19HTlVDX18gPCAzKSB8fCAoKF9fR05VQ19fID09IDMpICYmIChfX0dOVUNfTUlOT1JfXyA8IDMpKSkKKy8qIE1hYyBPUyBYIGlzIG1pc3NpbmcgYSByZXF1aXJlZCB0eXBlZGVmIGFuZCBzdGFuZGFyZCBtYWNybyAqLwordHlwZWRlZiB1bnNpZ25lZCBpbnQgd2ludF90OworIyAgZW5kaWYKKworIyAgZGVmaW5lIF9fdW5peAorCisjICBpZiAoX19HTlVDX18gPCAzKQorCisgLyogTWFjIE9TIFggbmVlZHMgb25lIGFuZCBvbmx5IG9uZSBzb3VyY2UgZmlsZSB0byBpbml0aWFsaXplIGFsbCBzdGF0aWMgZGF0YQorICAqIG1lbWJlcnMgaW4gdGVtcGxhdGUgY2xhc3Nlcy4gT25seSBvbmUgc291cmNlIGZpbGUgaW4gYW4gZXhlY3V0YWJsZSBvcgorICAqIGxpYnJhcnkgY2FuIGRlY2xhcmUgaW5zdGFuY2VzIGZvciBzdWNoIGRhdGEgbWVtYmVycywgb3RoZXJ3aXNlIGR1cGxpY2F0ZQorICAqIHN5bWJvbHMgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisKKyMgICAgZGVmaW5lIF9TVExQX05PX1NUQVRJQ19URU1QTEFURV9EQVRBCisjICAgIGRlZmluZSBfU1RMUF9TVEFUSUNfQ09OU1RfSU5JVF9CVUcgMQorIyAgICBkZWZpbmUgX1NUTFBfU1RBVElDX1RFTVBMQVRFX0RBVEEgMAorIyAgICBkZWZpbmUgX1NUTFBfV0VBS19BVFRSSUJVVEUgMQorIC8qIFdvcmthcm91bmQgZm9yIHRoZSBicm9rZW4gTWFjIE9TIFggQysrIHByZXByb2Nlc3NvciB3aGljaCBjYW5ub3QgaGFuZGxlCisgICogcGFyYW1ldGVyaXplZCBtYWNyb3MgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyAqLworIyAgICBkZWZpbmUgX1NUTFBfTkFUSVZFX0hFQURFUihoZWFkZXIpIDwuLi9nKysvIyNoZWFkZXIjIz4KKyMgICAgZGVmaW5lIF9TVExQX05BVElWRV9DX0hFQURFUihoZWFkZXIpIDwuLi9pbmNsdWRlLyMjaGVhZGVyIyM+CisjICAgIGRlZmluZSBfU1RMUF9OQVRJVkVfQ1BQX0NfSEVBREVSKGhlYWRlcikgPC4uL2crKy8jI2hlYWRlciMjPgorIyAgICBkZWZpbmUgX1NUTFBfTkFUSVZFX09MRF9TVFJFQU1TX0hFQURFUihoZWFkZXIpIDwuLi9nKysvIyNoZWFkZXIjIz4KKyMgICAgZGVmaW5lIF9TVExQX05BVElWRV9DUFBfUlVOVElNRV9IRUFERVIoaGVhZGVyKSA8Li4vZysrLyMjaGVhZGVyIyM+CisjICBlbmRpZiAvKiBfX0dOVUNfXyA8IDMgKi8KKworIyAgZGVmaW5lIF9TVExQX05PX0xPTkdfRE9VQkxFCisKKy8qIE1hYyBPUyBYIG5lZWRzIGFsbCAiOjoiIHNjb3BlIHJlZmVyZW5jZXMgdG8gYmUgInN0ZDo6IiAqLworIyAgZGVmaW5lIF9TVExQX1VTRV9ORVdfQ19IRUFERVJTCisKKyMgIGRlZmluZSBfU1RMUF9OT19WRU5ET1JfU1RETElCX0wKKworI2VuZGlmIC8qIF9fQVBQTEVfXyAqLworCisKKyNpZiBkZWZpbmVkKF9fQkVPU19fKSAmJiBkZWZpbmVkKF9fSU5URUxfXykKKyMgIGRlZmluZSBfU1RMUF9OQVRJVkVfSEVBREVSKGhlYWRlcikgPC4uL3N0bHBvcnQvYmVvcy8jI2hlYWRlciMjPgorIyAgZGVmaW5lIF9TVExQX05BVElWRV9DX0hFQURFUihoZWFkZXIpIDwuLi9zdGxwb3J0L2Jlb3MvIyNoZWFkZXIjIz4KKyMgIGRlZmluZSBfU1RMUF9OQVRJVkVfQ1BQX0NfSEVBREVSKGhlYWRlcikgPC4uL3N0bHBvcnQvYmVvcy8jI2hlYWRlciMjPgorIyAgZGVmaW5lIF9TVExQX05BVElWRV9PTERfU1RSRUFNU19IRUFERVIoaGVhZGVyKSA8Li4vc3RscG9ydC9iZW9zLyMjaGVhZGVyIyM+CisjICBkZWZpbmUgX1NUTFBfTkFUSVZFX0NQUF9SVU5USU1FX0hFQURFUihoZWFkZXIpIDwuLi9zdGxwb3J0L2Jlb3MvIyNoZWFkZXIjIz4KKyMgIGRlZmluZSBfU1RMUF9OT19OQVRJVkVfV0lERV9GVU5DVElPTlMgMQorIyAgZGVmaW5lIF9TVExQX05PX05BVElWRV9XSURFX1NUUkVBTVMgICAxCisvKgorIyAgZGVmaW5lIF9OT1RIUkVBRFMgMQorKi8KKyMgIGlmZGVmIF9QVEhSRUFEUworIyAgICB1bmRlZiAgX1BUSFJFQURTCisjICBlbmRpZgorIyAgaWZkZWYgX1NUTFBfUFRIUkVBRFMKKyMgICAgdW5kZWYgX1NUTFBfUFRIUkVBRFMKKyMgIGVuZGlmCisjICBkZWZpbmUgX1NUTFBfVVNFX1NURElPX0lPIDEKKyMgIGRlZmluZSBfU1RMUF9VU0VfR0xJQkMgMQorI2VuZGlmCisKKy8qIGcrKyAyLjcueCBhbmQgYWJvdmUgKi8KKyNkZWZpbmUgX1NUTFBfTE9OR19MT05HIGxvbmcgbG9uZworCisjaWZkZWYgX1NUTFBfVVNFX1VDTElCQworLyoKKyMgIGlmbmRlZiBfX0RPX0M5OV9NQVRIX18KKyovCisgIC8qIE5vICpmIG1hdGggZnVjdGlvbnMgdmFyaWFudHMgKGkuZS4gc3FydGYsIGZhYnNmLCBldGMuKSAqLworIyAgZGVmaW5lIF9TVExQX05PX1ZFTkRPUl9NQVRIX0YKKyAgLyogTm8gKmwgbWF0aCBmdWN0aW9ucyB2YXJpYW50cyAoaS5lLiBzcXJ0bCwgZmFic2wsIGV0Yy4pICovCisjICBkZWZpbmUgX1NUTFBfTk9fVkVORE9SX01BVEhfTAorIyAgZGVmaW5lIF9TVExQX05PX0xPTkdfRE9VQkxFCisvKgorIyAgZW5kaWYKKyovCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fT3BlbkJTRF9fKSB8fCBkZWZpbmVkIChfX0ZyZWVCU0RfXykKKyMgIGRlZmluZSBfU1RMUF9OT19WRU5ET1JfTUFUSF9MCisjICBkZWZpbmUgX1NUTFBfTk9fVkVORE9SX1NURExJQl9MIC8qIG5vIGxsYWJzICovCisjICBpZm5kZWYgX191bml4CisjICAgIGRlZmluZSBfX3VuaXgKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fYWxwaGFfXykKKyMgIGRlZmluZSBfU1RMUF9OT19WRU5ET1JfTUFUSF9MCisjICBkZWZpbmUgX1NUTFBfTk9fSUVDNTU5X1NVUFBPUlQKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19ocHV4KQorIyAgZGVmaW5lIF9TVExQX05PX1ZFTkRPUl9TVERMSUJfTCAvKiBubyBsbGFicyAqLworICAvKiBObyAqZiBtYXRoIGZ1Y3Rpb25zIHZhcmlhbnRzIChpLmUuIHNxcnRmLCBmYWJzZiwgZXRjLikgKi8KKyMgIGRlZmluZSBfU1RMUF9OT19WRU5ET1JfTUFUSF9GCisjZW5kaWYKKworI2lmIChfX0dOVUNfXyA+PSAzKQorIyAgaWZuZGVmIF9TVExQX0hBU19OT19ORVdfQ19IRUFERVJTCisvKgorIyAgICBpZm5kZWYgX1NUTFBfVVNFX1VDTElCQworKi8KKyMgICAgZGVmaW5lIF9TVExQX0hBU19OQVRJVkVfRkxPQVRfQUJTCisvKgorIyAgICBlbmRpZgorKi8KKyMgIGVsc2UKKyMgICAgaWZkZWYgX1NUTFBfVVNFX0dMSUJDCisjICAgICAgZGVmaW5lIF9TVExQX1ZFTkRPUl9MT05HX0RPVUJMRV9NQVRIICAxCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAoX19HTlVDX18gPCAzKQorIyAgZGVmaW5lIF9TVExQX0hBU19OT19ORVdfQ19IRUFERVJTICAgICAxCisjICBkZWZpbmUgX1NUTFBfVkVORE9SX0dMT0JBTF9DU1REICAgICAgIDEKKyMgIGRlZmluZSBfU1RMUF9ET05UX1VTRV9QVEhSRUFEX1NQSU5MT0NLIDEKKyMgIGlmbmRlZiBfX0hPTk9SX1NURAorIyAgICBkZWZpbmUgX1NUTFBfVkVORE9SX0dMT0JBTF9FWENFUFRfU1REIDEKKyMgIGVuZGlmCisvKiBlZ2NzIGZhaWxzIHRvIGluaXRpYWxpemUgYnVpbHRpbiB0eXBlcyBpbiBleHByLiBsaWtlIHRoaXMgOiBuZXcocCkgY2hhcigpOyAgKi8KKyMgIGRlZmluZSBfU1RMUF9ERUZfQ09OU1RfUExDVF9ORVdfQlVHIDEKKyNlbmRpZgorCisvKgorI2RlZmluZSBfU1RMUF9WRU5ET1JfR0xPQkFMX0NTVEQgMQorKi8KKworI2lmIChfX0dOVUNfXyA9PSAyKSAmJiAoX19HTlVDX01JTk9SX18gPCA5NSkKKyMgIGRlZmluZSBfU1RMUF9OT19VTkNBVUdIVF9FWENFUFRfU1VQUE9SVAorIyAgZGVmaW5lIF9TVExQX05PX1VORVhQRUNURURfRVhDRVBUX1NVUFBPUlQKKyMgIGRlZmluZSBfU1RMUF9ERUZfQ09OU1RfREVGX1BBUkFNX0JVRyAxCisjZWxpZiAhZGVmaW5lZCAoQU5EUk9JRCkKKy8vIERvbid0IGRyYWcgaW4gdGhlc2UgZXh0ZXJuYWxzIG9uIEFuZHJvaWQuCisjICB1bmRlZiBfU1RMUF9OT19VTkNBVUdIVF9FWENFUFRfU1VQUE9SVAorIyAgdW5kZWYgX1NUTFBfTk9fVU5FWFBFQ1RFRF9FWENFUFRfU1VQUE9SVAorI2VuZGlmCisKKyNpZiAoX19HTlVDX01JTk9SX18gPCA5KSAgJiYgKF9fR05VQ19fIDwgMykgLyogZ2NjIDIuOCAqLworIyAgZGVmaW5lIF9TVExQX05PX1RFTVBMQVRFX0NPTlZFUlNJT05TCisjICBkZWZpbmUgX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFX0NMQVNTRVMgMQorIyAgZGVmaW5lIF9TVExQX05PX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUiAxCisjICBkZWZpbmUgX1NUTFBfTk9fRlJJRU5EX1RFTVBMQVRFUyAxCisjICBkZWZpbmUgX1NUTFBfSEFTX05PX05BTUVTUEFDRVMgMQorIyAgZGVmaW5lIF9TVExQX05PX01FVEhPRF9TUEVDSUFMSVpBVElPTiAxCisjICBkZWZpbmUgX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFUyAxCisjICBkZWZpbmUgX1NUTFBfTk9fQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTiAxCisjICBkZWZpbmUgX1NUTFBfRE9OVF9TSU1VTEFURV9QQVJUSUFMX1NQRUNfRk9SX1RZUEVfVFJBSVRTCisvKiAgREpHUFAgZG9lc24ndCBzZWVtIHRvIGltcGxlbWVudCBpdCBpbiAyLjgueCAqLworIyAgaWZkZWYgREpHUFAKKyMgICAgZGVmaW5lICBfU1RMUF9OT19TVEFUSUNfVEVNUExBVEVfREFUQSAxCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiBfX0dOVUNfXyA8PSAyICYmIF9fR05VQ19NSU5PUl9fIDw9IDcgJiYgIWRlZmluZWQgKF9fQ1lHV0lOMzJfXykKKy8qIFdpbGwgaXQgd29yayB3aXRoIDIuNiA/IEkgZG91YnQgaXQuICovCisjICBpZiAoIF9fR05VQ19NSU5PUl9fIDwgNiApCitfX0dJVkVfVVBfV0lUSF9TVEwoR0NDXzI3Mik7CisjICBlbmRpZgorCisjICBkZWZpbmUgIF9TVExQX05PX1JFTE9QU19OQU1FU1BBQ0UKKyMgIGRlZmluZSAgX1NUTFBfTk9OX1RZUEVfVE1QTF9QQVJBTV9CVUcKKyMgIGRlZmluZSAgX1NUTFBfTElNSVRFRF9ERUZBVUxUX1RFTVBMQVRFUyAxCisjICBkZWZpbmUgIF9TVExQX0RFRkFVTFRfVFlQRV9QQVJBTSAxCisjICBkZWZpbmUgIF9TVExQX05PX0JBRF9BTExPQworIyAgZGVmaW5lICBfU1RMUF9OT19BUlJPV19PUEVSQVRPUiAxCisjICBpZm5kZWYgX1NUTFBfTk9fU1RBVElDX1RFTVBMQVRFX0RBVEEKKyMgICAgZGVmaW5lICBfU1RMUF9OT19TVEFUSUNfVEVNUExBVEVfREFUQQorIyAgZW5kaWYKKyMgIGRlZmluZSAgX1NUTFBfU1RBVElDX0NPTlNUX0lOSVRfQlVHIDEKKyMgIGRlZmluZSAgX1NUTFBfTk9fTUVUSE9EX1NQRUNJQUxJWkFUSU9OIDEKKworIyAgaWYgIWRlZmluZWQgKF9fQ1lHV0lOMzJfXykKKyMgICAgZGVmaW5lIF9TVExQX05FU1RFRF9UWVBFX1BBUkFNX0JVRyAgIDEKKyMgICAgZGVmaW5lIF9TVExQX0JBU0VfTUFUQ0hfQlVHICAgICAgIDEKKy8qICB1bnVzZWQgb3BlcmF0b3JzIGFyZSByZXF1aXJlZCAoZm9yd2FyZCkgKi8KKyMgICAgZGVmaW5lICBfU1RMUF9DT05TVF9DT05TVFJVQ1RPUl9CVUcKKyMgICAgZGVmaW5lIF9TVExQX05PX0RFRkFVTFRfTk9OX1RZUEVfUEFSQU0KKyMgIGVuZGlmCisjICBkZWZpbmUgX1NUTFBfTk9fUEFSVElBTF9TUEVDSUFMSVpBVElPTl9TWU5UQVggMQorIyAgZGVmaW5lIF9TVExQX05PX0VYUExJQ0lUX0ZVTkNUSU9OX1RNUExfQVJHUyAxCisjICBkZWZpbmUgX1NUTFBfTk9fRVhDRVBUSU9OX0hFQURFUiAxCisjZWxzZSAvKiAhIDw9IDIuNy4qICovCisjZW5kaWYgLyogISA8PSAyLjcuKiAqLworCisvKiBzdGF0aWMgdGVtcGxhdGUgZGF0YSBtZW1iZXJzIHdvcmthcm91bmQgc3RyYXRlZ3kgZm9yIGdjYyB0cmllcworICogdG8gdXNlIHdlYWsgc3ltYm9scy4KKyAqIGlmIHlvdSBkb24ndCB3YW50IHRvIHVzZSB0aGF0LCAjZGVmaW5lIF9TVExQX1dFQUtfQVRUUklCVVRFPTAgKCB5b3UnbGwKKyAqIGhhdmUgdG8gcHV0ICIjZGVmaW5lIF9fUFVUX1NUQVRJQ19EQVRBX01FTUJFUlNfSEVSRSIgbGluZSBpbiBvbmUgb2YgeW91cgorICogY29tcGlsYXRpb24gdW5pdCAoIG9yIENGTEFHUyBmb3IgaXQgKSBfYmVmb3JlXyBpbmNsdWRpbmcgYW55IFNUTCBoZWFkZXIgKS4KKyAqLworI2lmIGRlZmluZWQgKF9TVExQX05PX1NUQVRJQ19URU1QTEFURV9EQVRBKSAmJiAhIGRlZmluZWQgKF9TVExQX1dFQUtfQVRUUklCVVRFICkKKy8qIHN5c3RlbXMgdXNpbmcgR05VIGxkIG9yIGZvcm1hdCB0aGF0IHN1cHBvcnRzIHdlYWsgc3ltYm9scworICAgbWF5IHVzZSAid2VhayIgYXR0cmlidXRlCisgICBMaW51eCAmIFNvbGFyaXMgKCB4ODYgJiBTUEFSQyApIGFyZSBiZWluZyBhdXRvLXJlY29nbml6ZWQgaGVyZSAqLworIyAgaWYgZGVmaW5lZChfU1RMUF9HTlVfTEQpIHx8IGRlZmluZWQoX19FTEZfXykgfHwgZGVmaW5lZCAoX19DWUdXSU5fXykgfHwgXAorICAgICAoKCBkZWZpbmVkIChfX1NWUjQpIHx8IGRlZmluZWQgKCBfX3N2cjRfXyApKSAmJiBcCisgICAgICAoIGRlZmluZWQgKHN1bikgfHwgZGVmaW5lZCAoIF9fc3VuX18gKSkpCisjICAgIGRlZmluZSBfU1RMUF9XRUFLX0FUVFJJQlVURSAxCisjICBlbmRpZgorI2VuZGlmIC8qIF9TVExQX1dFQUtfQVRUUklCVVRFICovCisKKworLyogc3RyaWN0IEFOU0kgcHJvaGliaXRzICJsb25nIGxvbmciICggZ2NjKSAqLworI2lmIGRlZmluZWQgKCBfX1NUUklDVF9BTlNJX18gKQorIyAgdW5kZWYgX1NUTFBfTE9OR19MT05HCisvKgorIyAgICBkZWZpbmUgX1NUTFBfU1RSSUNUX0FOU0kgMQorKi8KKyNlbmRpZgorCisvKgorI2lmICFkZWZpbmVkIChfX1NUUklDVF9BTlNJX18pIHx8IGRlZmluZWQgKF9fQlVJTERJTkdfU1RMUE9SVCkKKyMgIGRlZmluZSBfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUCisjICBkZWZpbmUgX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0tFWVdPUkQgZXh0ZXJuCisjICBkZWZpbmUgX1NUTFBfSU1QT1JUX1RFTVBMQVRFX0tFWVdPUkQgZXh0ZXJuCisjZW5kaWYKKyovCisKKyNpZm5kZWYgX19FWENFUFRJT05TCisjICB1bmRlZiAgX1NUTFBfRE9OVF9VU0VfRVhDRVBUSU9OUworIyAgZGVmaW5lIF9TVExQX0RPTlRfVVNFX0VYQ0VQVElPTlMgMQorI2VuZGlmCisKKyNpZiAoX19HTlVDX18gPj0gMykKKworIyAgaWYgIWRlZmluZWQgKF9TVExQX05BVElWRV9JTkNMVURFX1BBVEgpCisjICAgIGlmICggKF9fR05VQ19fID09IDMgKSAmJiAoKF9fR05VQ19NSU5PUl9fID09IDApIHx8ICgoX19HTlVDX01JTk9SX18gPCAzKSAmJiBkZWZpbmVkKF9fQVBQTEVfQ0NfXykpKSkKKyMgICAgICBkZWZpbmUgX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSCAuLi9nKystdjMKKyMgICAgZWxzZQorIyAgICAgIGlmICggKChfX0dOVUNfXyA9PSA0ICkgfHwgKF9fR05VQ19NSU5PUl9fID49IDMpKSAmJiBkZWZpbmVkKF9fQVBQTEVfQ0NfXykpCisjICAgICAgICBkZWZpbmUgX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSCAuLi9jKysKKy8qCisqIEJlZm9yZSB2ZXJzaW9uIDMuNC4wIHRoZSAwIHBhdGNoIGxldmVsIHdhcyBub3QgcGFydCBvZiB0aGUgaW5jbHVkZSBwYXRoOgorKi8KKyMgICAgICBlbGlmIGRlZmluZWQgKF9fR05VQ19QQVRDSExFVkVMX18pICYmICgoX19HTlVDX1BBVENITEVWRUxfXyA+IDApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19HTlVDX18gPT0gMyAmJiBfX0dOVUNfTUlOT1JfXyA+PSA0KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fR05VQ19fID4gMykpCisjICAgICAgICBkZWZpbmUgX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSCAuLi9fX0dOVUNfXy5fX0dOVUNfTUlOT1JfXy5fX0dOVUNfUEFUQ0hMRVZFTF9fCisjICAgICAgZWxzZQorIyAgICAgICAgZGVmaW5lIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEggLi4vX19HTlVDX18uX19HTlVDX01JTk9SX18KKyMgICAgICBlbmRpZgorIyAgICBlbmRpZgorIyAgZW5kaWYKKworLyogSW5zdGFudGlhdGlvbiBzY2hlbWUgdGhhdCB1c2VkIChkZWZhdWx0KSBpbiBnY2MgMyBtYWRlIHZvaWQgb2Ygc2Vuc2UgZXhwbGljaXQKKyAgIGluc3RhbnRpYXRpb24gd2l0aGluIGxpYnJhcnk6IG5vdGhpbmcgZXhjZXB0IGluY3JlYXNlZCBsaWJyYXJ5IHNpemUuIC0gcHRyCisgKi8KKyMgIGRlZmluZSBfU1RMUF9OT19GT1JDRV9JTlNUQU5USUFURQorCisjZWxpZiAoX19HTlVDX01JTk9SX18gPCA4KQorCisjICBpZiAhZGVmaW5lZCAoX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSCkKKyMgICAgZGVmaW5lIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEggLi4vZysrLWluY2x1ZGUKKyMgIGVuZGlmCisKKy8qIHR1bmluZyBvZiBzdGF0aWMgdGVtcGxhdGUgZGF0YSBtZW1iZXJzIHdvcmthcm91bmQgKi8KKyMgIGlmICggX1NUTFBfU1RBVElDX1RFTVBMQVRFX0RBVEEgPCAxICkKKyMgICAgaWYgKCBfU1RMUF9XRUFLX0FUVFJJQlVURSA+IDAgKQorIyAgICAgIGRlZmluZSBfU1RMUF9XRUFLIF9fYXR0cmlidXRlX18gKCggd2VhayApKQorIyAgICBlbHNlCisjICAgICAgZGVmaW5lIF9TVExQX1dFQUsKKyMgICAgZW5kaWYgLyogX1NUTFBfV0VBS19BVFRSSUJVVEUgKi8KKworIyAgICBpZmRlZiBfX1BVVF9TVEFUSUNfREFUQV9NRU1CRVJTX0hFUkUKKyMgICAgICBkZWZpbmUgX19ERUNMQVJFX0lOU1RBTkNFKHR5cGUsaXRlbSxpbml0KSB0eXBlIGl0ZW0gX1NUTFBfV0VBSyBpbml0CisjICAgIGVsc2UKKyMgICAgICBkZWZpbmUgX19ERUNMQVJFX0lOU1RBTkNFKHR5cGUsaXRlbSxpbml0KQorIyAgICBlbmRpZiAvKiBfX1BVVF9TVEFUSUNfREFUQV9NRU1CRVJTX0hFUkUgKi8KKyMgIGVuZGlmIC8qIF9TVExQX1NUQVRJQ19URU1QTEFURV9EQVRBICovCisKKyNlbHNlCisKKy8qIGdjYy0yLjk1LjAgdXNlZCB0byB1c2UgImcrKy0zIiBkaXJlY3Rvcnkgd2hpY2ggaGFzIGJlZW4gY2hhbmdlZCB0byAiZysrIiBpbgorICogc3lzdGVtLWRlcGVuZGVudCAiaW5jbHVkZSIgZm9yIDIuOTUuMiBleGNlcHQgZm9yIEN5Z3dpbiBhbmQgTWluZ3cgcGFja2FnZXMuCisgKiBJIGV4cGVjdCAiZysrLTMiIG5vdCBiZWluZyB1c2VkIGluIGxhdGVyIHJlbGVhc2VzLgorICogSWYgeW91ciBpbnN0YWxsYXRpb24gdXNlICJnKystMyIgaW5jbHVkZSBkaXJlY3RvcnkgZm9yIGFueSByZWFzb24gKHByZS0yLjk1LjIgb3IgV2luIGJpbmFyeSBraXQpLAorICogcGxlYXNlIGNoYW5nZSB0aGUgbWFjcm8gYmVsb3cgdG8gcG9pbnQgdG8geW91ciBkaXJlY3RvcnkuCisgKi8KKworIyAgaWYgIWRlZmluZWQgKF9TVExQX05BVElWRV9JTkNMVURFX1BBVEgpCisjICAgIGlmIGRlZmluZWQoX19ESkdQUCkKKyMgICAgICBkZWZpbmUgX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSCAuLi9sYW5nL2N4eAorIyAgICBlbGlmIChfX0dOVUNfXyA+PSAzKSB8fCAoX19HTlVDX01JTk9SX18gPj0gOTcpCisjICAgICAgZGVmaW5lIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEggLi4vaW5jbHVkZS9nKystdjMKKyMgICAgZWxpZiAoKF9fR05VQ19NSU5PUl9fID49IDk1ICYmIF9fR05VQ19NSU5PUl9fIDwgOTcpICYmIFwKKyAgICAgICAgICAhKCBkZWZpbmVkIChfX0ZyZWVCU0RfXykgfHwgZGVmaW5lZCAoX19OZXRCU0RfXykgfHwgZGVmaW5lZChfX3NnaSkgfHwgZGVmaW5lZCAoX19PUzJfXykgKSApCisjICAgICAgZGVmaW5lIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEggLi4vZysrLTMKKyMgICAgZWxpZiAoX19HTlVDX01JTk9SX18gPiA4KSAmJiAoX19HTlVDX01JTk9SX18gPCA5NSkgJiYgKF9fR05VQ19fIDwgMykgJiYgIWRlZmluZWQoIF9fTHlueF9fICkKKy8qIHRoaXMgcmVhbGx5IHN1Y2tzLCBhcyBHTlVwcm8gZG9lcyBub3QgcmVhbGx5IGlkZW50aWZpZXMgaXRzZWxmLCBzbyB3ZSBoYXZlIHRvIGd1ZXNzCisgKiBkZXBlbmRpbmcgb24gYSBwbGF0Zm9ybQorICovCisjICAgICAgaWZkZWYgX19ocHV4CisjICAgICAgICBkZWZpbmUgX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSCAuLi9nKystMworIyAgICAgIGVsc2UKKyMgICAgICAgIGRlZmluZSBfU1RMUF9OQVRJVkVfSU5DTFVERV9QQVRIIC4uL2crKy0yCisjICAgICAgZW5kaWYKKyMgICAgZWxzZQorIyAgICAgIGRlZmluZSBfU1RMUF9OQVRJVkVfSU5DTFVERV9QQVRIIGcrKworIyAgICBlbmRpZgorIyAgZW5kaWYKKworLyogPGV4Y2VwdGlvbj4gZXQgYWwgKi8KKyMgIGlmZGVmIF9fRnJlZUJTRF9fCisjICAgIGlmIChfX0dOVUNfXyA+IDIpIHx8IChfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fID4gOTUpCisjICAgICAgZGVmaW5lIF9TVExQX05BVElWRV9DUFBfUlVOVElNRV9JTkNMVURFX1BBVEggLi4vaW5jbHVkZQorIyAgICBlbmRpZgorIyAgZWxzZQorLyogYXpvdiAqLworIyAgICBpZm5kZWYgX19MeW54X18KKyMgICAgICBpZiAoX19HTlVDX18gPiAyKSB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA+PSA5NykKKy8qCisjICAgICBkZWZpbmUgX1NUTFBfTkFUSVZFX0NQUF9SVU5USU1FX0lOQ0xVREVfUEFUSCAuLi9nKystdjMKKyovCisjICAgICAgZWxzZQorIyAgICAgICAgZGVmaW5lIF9TVExQX05BVElWRV9DUFBfUlVOVElNRV9JTkNMVURFX1BBVEggLi4vaW5jbHVkZQorIyAgICAgIGVuZGlmCisjICAgIGVuZGlmCisjICBlbmRpZgorCisjZW5kaWYgLyogR05VQ19NSU5PUiA8IDggKi8KKworI2lmICFkZWZpbmVkIChfU1RMUF9OQVRJVkVfQ19JTkNMVURFX1BBVEgpCisjICBkZWZpbmUgX1NUTFBfTkFUSVZFX0NfSU5DTFVERV9QQVRIIC4uL2luY2x1ZGUKKyNlbmRpZgorCisvKiBUdW5lIHNldHRpbmdzIGZvciB0aGUgY2FzZSB3aGVyZSBzdGF0aWMgdGVtcGxhdGUgZGF0YSBtZW1iZXJzIGFyZSBub3QKKyAqIGluc3RhbmlhdGVkIGJ5IGRlZmF1bHQKKyAqLworI2lmIGRlZmluZWQgKCBfU1RMUF9OT19TVEFUSUNfVEVNUExBVEVfREFUQSApCisjICBkZWZpbmUgX1NUTFBfU1RBVElDX1RFTVBMQVRFX0RBVEEgMAorIyAgaWYgIWRlZmluZWQgKCBfU1RMUF9XRUFLX0FUVFJJQlVURSApCisjICAgIGRlZmluZSBfU1RMUF9XRUFLX0FUVFJJQlVURSAwCisjICBlbmRpZgorIyAgaWZkZWYgX19QVVRfU1RBVElDX0RBVEFfTUVNQkVSU19IRVJFCisjICAgIGRlZmluZSBfX0RFQ0xBUkVfSU5TVEFOQ0UodHlwZSxpdGVtLGluaXQpIHR5cGUgaXRlbSBpbml0CisjICBlbHNlCisjICAgIGRlZmluZSBfX0RFQ0xBUkVfSU5TVEFOQ0UodHlwZSxpdGVtLGluaXQpCisjICBlbmRpZgorI2Vsc2UKKyMgIGRlZmluZSBfU1RMUF9TVEFUSUNfVEVNUExBVEVfREFUQSAxCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N0bC9jb25maWcvX2hwYWNjLmggYi9zdGwvY29uZmlnL19ocGFjYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjYzVjYzQKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvY29uZmlnL19ocGFjYy5oCkBAIC0wLDAgKzEsMTk2IEBACisvLyBTVExwb3J0IGNvbmZpZ3VyYXRpb24gZmlsZQorLy8gSXQgaXMgaW50ZXJuYWwgU1RMcG9ydCBoZWFkZXIgLSBETyBOT1QgaW5jbHVkZSBpdCBkaXJlY3RseQorCisjZGVmaW5lIF9TVExQX0NPTVBJTEVSICJBY2MiCisKKy8vIHN5c3RlbSBDLWxpYnJhcnkgZGVwZW5kZW50CisjaWYgZGVmaW5lZChfWE9QRU5fU09VUkNFKSAmJiAoX1hPUEVOX1ZFUlNJT04gLSAwID49IDQpCisjICBkZWZpbmUgX1NUTFBfUkFORDQ4IDEKKyNlbmRpZgorLy8gIyAgZGVmaW5lIF9TVExQX1JBTkQ0OCAxCisjZGVmaW5lIF9TVExQX05PX05BVElWRV9NQlNUQVRFX1QgICAgICAxCisjZGVmaW5lIF9TVExQX0hQQUNDX0JST0tFTl9CVUZFTkQgICAgICAgMQorI2RlZmluZSBfU1RMUF9XQ0hBUl9IUEFDQ19FWENMVURFICAgICAgMQorCisvLyB0aGlzIHdhcyByZXBvcnRlZCB0byBoZWxwLCBqdXN0IGFzIHdpdGggU1VOIENDIDQuMgorI2RlZmluZSBfU1RMUF9JTkxJTkVfU1RSSU5HX0xJVEVSQUxfQlVHCisKKy8vIHNwZWNpZmljIHByb2xvZyBpcyBuZWVkZWQgdG8gc2VsZWN0IGNvcnJlY3QgdGhyZWFkcyBpbXBsCisjZGVmaW5lIF9TVExQX0hBU19TUEVDSUZJQ19QUk9MT0dfRVBJTE9HCisKKy8vIEhQIGFDQyB3aXRoICtub2VoCisjaWZkZWYgX19IUEFDQ19OT0VICisjICBkZWZpbmUgX1NUTFBfSEFTX05PX0VYQ0VQVElPTlMgMQorI2VuZGlmCisKKy8vIEhQIGNvbXBpbGVycworLy8gQXQgdGhhdCBwb2ludCwgd2Ugb25seSBrbm93IHdlIGFyZSBvbiBIUCAoYW5kIF9ub3RfIHVzaW5nIGdjYywKKy8vIGFjY29yZGluZyB0byAic3RsY29tcC5oIgorCisvLyBfX0hQX2FDQyBpbmRpY2F0ZSBIUCBBTlNJIEMrKywgYnV0IG5vdCBhbHdheXMgKDAzLnh4IGRvZXMgbm90CisvLyBkZWZpbmUgaXQgYmVmb3JlIDMuMTMsIGZvciBleGFtcGxlKS4KKy8vCisjaWYgZGVmaW5lZCAoX19IUF9hQ0MpCisKKyMgIGRlZmluZSBfU1RMUF9OT19GT1JDRV9JTlNUQU5USUFURQorIyAgZGVmaW5lIF9TVExQX0xPTkdfTE9ORyBsb25nIGxvbmcKKyMgIGRlZmluZSBfU1RMUF9OT19WRU5ET1JfU1RETElCX0wKKworIyAgaWYgKF9fSFBfYUNDIDw9IDMwMDAwICYmIF9fSFBfYUNDID49IDEyMTAwKQorCisvL1NwZWNpYWwga2x1ZGdlIHRvIHdvcmthcm91bmQgYnVnIGluIGFDQyBBLjAxLjIzLCBDUiBKQUdhYzQwNjM0CisjICAgIGlmZGVmIF9TVExQX0RFQlVHCitzdGF0aWMgdm9pZCBfU1RMUF9kdW1teV9saXRlcmFsKCkgeyBjb25zdCBjaGFyICpwID0gIngiO30KK3N0YXRpYyB2b2lkIF9TVExQX2R1bW15X2xpdGVyYWxfMigpIHsgY29uc3QgY2hhciAqcCA9ICIxMjM0NTY3ODkiOyB9CitzdGF0aWMgdm9pZCBfU1RMUF9kdW1teV9saXRlcmFsXzMoKSB7IGNvbnN0IGNoYXIgKnAgPSAiMTIzNDU2NzAwMDAwMDAwMDAwMDAwMDg5Ijt9CisjICAgIGVuZGlmCisKKyMgICAgZGVmaW5lIF9TVExQX0hQX0FDQyAgICAgICAgICAgICAgICAgICAwMTIzCisjICAgIGRlZmluZSBfU1RMUF9OQVRJVkVfSU5DTFVERV9QQVRIICAgICAgIC4uL2luY2x1ZGUKKyMgICAgZGVmaW5lIF9TVExQX1ZFTkRPUl9HTE9CQUxfU1REICAgICAgICAgMQorIyAgICBkZWZpbmUgX1NUTFBfVkVORE9SX0dMT0JBTF9DU1REICAgICAgICAxCisjICAgIGRlZmluZSBfU1RMUF9ET05UX1RIUk9XX1JBTkdFX0VSUk9SUyAgIDEKKyMgICAgZGVmaW5lIF9TVExQX1NUQVRJQ19DT05TVF9JTklUX0JVRyAxCisjICAgIGlmIChfX0hQX2FDQyAgPCAxMjcwMCkKKy8vbmV3IGZsYWc6IG9uIG1vc3QgSFAgY29tcGlsZXJzIGN3Y2hhciBpcyBtaXNzaW5nCisjICAgICAgZGVmaW5lIF9TVExQX05PX0NXQ0hBUgorIyAgICBlbmRpZgorCisjICAgIGRlZmluZSBfU1RMUF9GT1JDRV9BTExPQ0FUT1JTKHQsYSkgXAorICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY190cmFpdHM8dCxhPjo6X09yaWcgX1NUTFBfZHVtbXlfdHlwZTE7XAorICB0eXBlZGVmIHR5cGVuYW1lIF9TVExQX2R1bW15X3R5cGUxOjogX1NUTFBfVEVNUExBVEUgcmViaW5kPHQ+OjpvdGhlciBfU1RMUF9kdW1teV90eXBlMjsKKworIyAgZW5kaWYgLyogMTIzICovCisKKy8vIGxhdGVzdCB2ZXJzaW9uIGFuZCB1cAorIyAgaWYgKF9fSFBfYUNDID49IDMyNTAwICkKKyMgICAgZGVmaW5lIF9TVExQX0hQX0FDQyAgICAgICAgICAgICAgICAgICAwMzI1CisKKyMgICAgZGVmaW5lIF9TVExQX1VTRV9ORVdfQ19IRUFERVJTCisKKyMgICAgZGVmaW5lIF9TVExQX0ZPUkNFX0FMTE9DQVRPUlModCxhKSBcCisgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jX3RyYWl0czx0LGE+OjpfT3JpZyBfU1RMUF9kdW1teV90eXBlMTtcCisgIHR5cGVkZWYgdHlwZW5hbWUgX1NUTFBfZHVtbXlfdHlwZTE6OiBfU1RMUF9URU1QTEFURSByZWJpbmQ8dD46Om90aGVyIF9TVExQX2R1bW15X3R5cGUyOworCisjICAgIGlmICFkZWZpbmVkICggX0lOQ0xVREVfX1NURENfQTFfU09VUkNFICkgLy8gSFAtVVggMTFpIG9ubHkKKyMgICAgICBkZWZpbmUgX1NUTFBfSEFTX05PX1VOSVg5OF9XQ0hBUl9FWFRFTlNJT05TCisjICAgIGVuZGlmCisKKyMgICAgaWYgZGVmaW5lZCAoX0hQX05BTUVTUEFDRV9TVEQpIC8vIG9wdGlvbiAtQUEKKy8vIGZyb20gbm93LCB3ZSBoYXZlIGEgZnVsbCBzdGFuZGFyZCBsaWIgaW4gbmFtZXNwYWNlIHN0ZAorLy8KKy8vIC1BQSBpbmRpY2F0ZXMgdGhhdCB3ZSBhcmUgY29tcGlsaW5nIGFnYWluc3QgUm9ndWUgV2F2ZSAyLjIuMQorLy8gU1RMIHNoaXBwZWQgd2l0aCB0aGUgSFAgYUNDIGNvbXBpbGVyLiAtQUEgdGVsbHMgdGhlIGNvbXBpbGVyCisvLyB0byB1c2UgdGhlIFNUTCBkZWZpbmVkIGluIHRoZSBpbmNsdWRlX3N0ZCBkaXJlY3RvcnkuCisvLworIyAgICAgIGRlZmluZSBfU1RMUF9OQVRJVkVfSU5DTFVERV9QQVRIIC4uL2luY2x1ZGVfc3RkCisKKy8vICMgICAgICBkZWZpbmUgX1NUTFBfSFBBQ0NfT05MWV9OQVRJVkVfU1RSSU5HIDEgLy8gU1RMUG9ydCBfc3RyaW5nLmMgaW5jbHVkZXMgPGxvY2FsZT4KKyMgICAgICBkZWZpbmUgX1NUTFBfSFBfQUNDX0NPTVBBVCAgICAgICAgICAgIC0xCisjICAgIGVsc2UgLy8gb3B0aW9uIC1BYQorIyAgICAgIGRlZmluZSBfU1RMUF9OQVRJVkVfSU5DTFVERV9QQVRIICAgICAgIC4uL2luY2x1ZGUKKyMgICAgICBkZWZpbmUgX1NUTFBfVkVORE9SX0dMT0JBTF9TVEQgICAgICAgICAxCisjICAgICAgZGVmaW5lIF9TVExQX1ZFTkRPUl9HTE9CQUxfQ1NURCAgICAgICAgMQorIyAgICAgIGRlZmluZSBfU1RMUF9ET05UX1RIUk9XX1JBTkdFX0VSUk9SUyAgIDEKKyMgICAgZW5kaWYgLyogX05BTUVTUEFDRV9TVEQgKi8KKyMgIGVuZGlmCisKKyMgIGlmIChfX0hQX2FDQyA+PSAzMTQwMCAmJiBfX0hQX2FDQyA8IDMyNTAwKQorIyAgICBkZWZpbmUgX1NUTFBfSFBfQUNDIDAzMTQKKworIyAgICBkZWZpbmUgX1NUTFBfRk9SQ0VfQUxMT0NBVE9SUyh0LGEpIFwKK3R5cGVkZWYgdHlwZW5hbWUgX0FsbG9jX3RyYWl0czx0LGE+OjpfT3JpZyBfU1RMUF9kdW1teV90eXBlMTtcCit0eXBlZGVmIHR5cGVuYW1lIF9TVExQX2R1bW15X3R5cGUxOjogX1NUTFBfVEVNUExBVEUgcmViaW5kPHQ+OjpvdGhlciBfU1RMUF9kdW1teV90eXBlMjsKKyMgICAgZGVmaW5lIF9TVExQX05PX0NXQ0hBUgorIyAgICBpZiBkZWZpbmVkIChfTkFNRVNQQUNFX1NURCkgLy8gb3B0aW9uIC1BQQorLy8gZnJvbSBub3csIHdlIGhhdmUgYSBmdWxsIHN0YW5kYXJkIGxpYiBpbiBuYW1lc3BhY2Ugc3RkCisjICAgICAgZGVmaW5lIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEggICAgICAgLi4vaW5jbHVkZV9zdGQKKy8vIyAgICAgIGRlZmluZSBfU1RMUF9IUEFDQ19PTkxZX05BVElWRV9TVFJJTkcgMSAvLyBTVExQb3J0IF9zdHJpbmcuYyBpbmNsdWRlcyA8bG9jYWxlPgorIyAgICAgIGRlZmluZSBfU1RMUF9IUF9BQ0NfQ09NUEFUICAgICAgICAgICAgLTEKKyMgICAgZWxzZSAvLyBraW5kIG9mIGNvbXBhdGliaWxpdHkgbW9kZQorIyAgICAgICBkZWZpbmUgX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSCAgICAgICAuLi9pbmNsdWRlCisjICAgICAgZGVmaW5lIF9TVExQX1ZFTkRPUl9HTE9CQUxfU1REICAgICAgICAgMQorIyAgICAgIGRlZmluZSBfU1RMUF9WRU5ET1JfR0xPQkFMX0NTVEQgICAgICAgIDEKKyMgICAgICBkZWZpbmUgX1NUTFBfRE9OVF9USFJPV19SQU5HRV9FUlJPUlMgICAxCisjICAgICAgZGVmaW5lIF9TVExQX05PX1JPUEUgICAgICAgICAgICAgICAgICAgMQorIyAgICBlbmRpZiAvKiBfTkFNRVNQQUNFX1NURCAqLworIyAgZW5kaWYgLyogMzE0ICovCisKKyMgIGlmICgoX19IUF9hQ0MgPj0gMzAwMDAgJiYgX19IUF9hQ0MgPCAzMTQwMCkgfHwgKF9fSFBfYUNDID09IDEpKSAvLyBBLjAzLjEzOiBfX0hQX2FDQyA9PSAxCisKKyMgICAgaWYgKF9fSFBfYUNDICE9IDEpCisjICAgICAgZGVmaW5lIF9TVExQX0hBU19OT19ORVdfQ19IRUFERVJTIDEKKyMgICAgZW5kaWYKKworIyAgICBkZWZpbmUgX1NUTFBfTk9fUVVBTElGSUVEX0ZSSUVORFMgICAgICAgMQorLy8gYUNDIGJ1ZyA/IG5lZWQgZXhwbGljaXQgYXJncyBvbiBjb25zdHJ1Y3RvcnMgb2YgcGFydGlhbCBzcGVjaWFsaXplZAorLy8gY2xhc3NlcworIyAgICBkZWZpbmUgX1NUTFBfUEFSVElBTF9TUEVDX05FRURTX1RFTVBMQVRFX0FSR1MgMQorLy8gPz8gZmJwIDogbWF5YmUgcHJlc2VudCBpbiBzb21lIHZlcnNpb25zID8KKyMgICAgZGVmaW5lIF9TVExQX05PX01FTUJFUl9URU1QTEFURV9DTEFTU0VTIDEKKyMgICAgZGVmaW5lIF9TVExQX05PX01FTUJFUl9URU1QTEFURV9LRVlXT1JEIDEKKy8vIDxleGNlcHRpb24+IGFuZCBzdHVmZiBpcyBpbiBnbG9iYWwgbmFtZXNwYWNlCisjICAgIGRlZmluZSBfU1RMUF9WRU5ET1JfR0xPQkFMX0VYQ0VQVF9TVEQKKy8vIGZicCA6IG1vdmVkIGhlcmUKKyMgICAgZGVmaW5lIF9TVExQX1ZFTkRPUl9HTE9CQUxfQ1NURCAgICAgICAgMQorLy8gIyAgICAgZGVmaW5lIF9JTkNMVURFX0hQVVhfU09VUkNFCisjICAgIGRlZmluZSBfWFBHNAorIyAgICBkZWZpbmUgX0lOQ0xVREVfWE9QRU5fU09VUkNFCisjICAgIGRlZmluZSBfSU5DTFVERV9BRVNfU09VUkNFCisjICBlbmRpZiAvKiA8IDMxNCAqLworIyAgaWYgX19IUF9hQ0MgPT0gMQorIyAgICBkZWZpbmUgX1NUTFBfQlJPS0VOX1VTSU5HX0lOX0NMQVNTCisjICAgIGRlZmluZSBfU1RMUF9VU0lOR19CQVNFX01FTUJFUgorIyAgICBkZWZpbmUgX1NUTFBfTk9fQ1dDSEFSCisvLyAjICAgICBkZWZpbmUgX1NUTFBfTk9fV0NIQVJfVCAxCisjICBlbmRpZgorI2VuZGlmIC8qIEhQX0FDQyAqLworCisvLworI2lmbmRlZiBfX0hQX2FDQworIyAgZGVmaW5lIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEggLi4vQ0MKKyMgIGRlZmluZSBfU1RMUF9OQVRJVkVfQ19JTkNMVURFX1BBVEggLi4vaW5jbHVkZQorLy8gaXQgaXMgSFAncyBvbGQgY2Zyb250LWJhc2VkIGNvbXBpbGVyLgorIyAgZGVmaW5lIF9TVExQX05PX0JPT0wgMQorLy8gIyAgZGVmaW5lIF9TVExQX0RPTlRfVVNFX0JPT0xfVFlQRURFRiAxCisjICBkZWZpbmUgX1NUTFBfTk9fTkVXX05FV19IRUFERVIgMQorIyAgZGVmaW5lIF9TVExQX0xJTUlURURfREVGQVVMVF9URU1QTEFURVMgMQorIyAgZGVmaW5lIF9TVExQX05PX1NJR05FRF9CVUlMVElOUworIyAgZGVmaW5lIF9TVExQX0hBU19OT19OQU1FU1BBQ0VTIDEKKyMgIGRlZmluZSBfU1RMUF9ORUVEX1RZUEVOQU1FIDEKKyMgIGRlZmluZSBfU1RMUF9ORUVEX0VYUExJQ0lUIDEKKyMgIGRlZmluZSBfU1RMUF9OT19FWENFUFRJT05fU1BFQyAxCisjICBkZWZpbmUgX1NUTFBfTk9OVEVNUExfQkFTRV9NQVRDSF9CVUcgMQorIyAgZGVmaW5lIF9TVExQX05PX0FSUk9XX09QRVJBVE9SIDEKKyMgIGRlZmluZSBfU1RMUF9CQVNFX01BVENIX0JVRworIyAgZGVmaW5lIF9TVExQX0JBU0VfVFlQRURFRl9PVVRTSURFX0JVRyAxCisjICBkZWZpbmUgX1NUTFBfTk9fTkVXX1NUWUxFX0NBU1RTIDEKKy8vICMgIGRlZmluZSBfU1RMUF9OT19XQ0hBUl9UIDEKKy8vICMgIGRlZmluZSBfU1RMUF9MT05HX0xPTkcgbG9uZyBsb25nCisjICBkZWZpbmUgX1NUTFBfTkVFRF9NVVRBQkxFIDEKKyMgIGRlZmluZSBfU1RMUF9OT19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OX1NZTlRBWCAxCisjICBkZWZpbmUgX1NUTFBfTk9fQkFEX0FMTE9DIDEKKyMgIGRlZmluZSBfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVTIDEKKyMgIGRlZmluZSBfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVfQ0xBU1NFUyAxCisjICBkZWZpbmUgX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFX0tFWVdPUkQgMQorIyAgZGVmaW5lIF9TVExQX05PX0ZSSUVORF9URU1QTEFURVMgMQorIyAgZGVmaW5lIF9TVExQX05PX1FVQUxJRklFRF9GUklFTkRTIDEKKyMgIGRlZmluZSBfU1RMUF9OT19DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OIDEKKyMgIGRlZmluZSBfU1RMUF9OT19GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIgMQorIyAgZGVmaW5lIF9TVExQX01FTUJFUl9QT0lOVEVSX1BBUkFNX0JVRyAxCisjICBkZWZpbmUgX1NUTFBfTk9OX1RZUEVfVE1QTF9QQVJBTV9CVUcgMQorIyAgZGVmaW5lIF9TVExQX05PX0RFRkFVTFRfTk9OX1RZUEVfUEFSQU0gMQorLy8gIyAgZGVmaW5lIF9TVExQX05PX01FVEhPRF9TUEVDSUFMSVpBVElPTiAxCisjICBkZWZpbmUgX1NUTFBfTk9fRVhQTElDSVRfRlVOQ1RJT05fVE1QTF9BUkdTIDEKKyMgIGRlZmluZSBfU1RMUF9OT19FWENFUFRJT05fSEVBREVSIDEKKyMgIGRlZmluZSBfU1RMUF9ERUZfQ09OU1RfUExDVF9ORVdfQlVHIDEKKyMgIGRlZmluZSBfU1RMUF9ERUZfQ09OU1RfREVGX1BBUkFNX0JVRyAxCisjICBkZWZpbmUgX1NUTFBfSEFTX05PX05FV19DX0hFQURFUlMgMQorLy8gIyAgZGVmaW5lIF9TVExQX1NUQVRJQ19DT05TVF9JTklUX0JVRyAxCisvLyAjICBkZWZpbmUgX1NUTFBfVEhST1dfUkVUVVJOX0JVRyAxCisvLyAjICBkZWZpbmUgX1NUTFBfTElOS19USU1FX0lOU1RBTlRJQVRJT04gMQorLy8gIyAgZGVmaW5lIF9TVExQX05PX1RFTVBMQVRFX0NPTlZFUlNJT05TIDEKKyMgIGRlZmluZSBfU1RMUF9OT19UWVBFSU5GTyAxCisjICBkZWZpbmUgX1NUTFBfV0NIQVJfVF9JU19VU0hPUlQgMQorCisjZW5kaWYgLyogY2Zyb250ICovCmRpZmYgLS1naXQgYS9zdGwvY29uZmlnL19ocHV4LmggYi9zdGwvY29uZmlnL19ocHV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE2N2MwOAotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9jb25maWcvX2hwdXguaApAQCAtMCwwICsxLDExIEBACisjaWZuZGVmIF9fc3RsX2NvbmZpZ19faHB1eF9oCisjZGVmaW5lIF9fc3RsX2NvbmZpZ19faHB1eF9oCisKKyNkZWZpbmUgX1NUTFBfUExBVEZPUk0gIkhQIFVuaXgiCisKKyNpZmRlZiBfX0dOVUNfXworIyAgZGVmaW5lIF9TVExQX05PX1dDSEFSX1QKKyMgIGRlZmluZSBfU1RMUF9OT19MT05HX0RPVUJMRQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX3N0bF9jb25maWdfX2hwdXhfaCAqLwpkaWZmIC0tZ2l0IGEvc3RsL2NvbmZpZy9faWJtLmggYi9zdGwvY29uZmlnL19pYm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmM1MDRjCi0tLSAvZGV2L251bGwKKysrIGIvc3RsL2NvbmZpZy9faWJtLmgKQEAgLTAsMCArMSwxNDYgQEAKKy8qIFNUTHBvcnQgY29uZmlndXJhdGlvbiBmaWxlCisgKiBJdCBpcyBpbnRlcm5hbCBTVExwb3J0IGhlYWRlciAtIERPIE5PVCBpbmNsdWRlIGl0IGRpcmVjdGx5CisgKi8KKworI2lmIGRlZmluZWQgKF9fSUJNQ1BQX18pIHx8IGRlZmluZWQgKF9fSUJNQ19fKQorIyAgZGVmaW5lIF9TVExQX0NPTVBJTEVSICJWaXN1YWwgQWdlIEMrKyIKKyNlbGlmIGRlZmluZWQgKF9feGxDX18pCisjICBkZWZpbmUgX1NUTFBfQ09NUElMRVIgInhsYyIKKyNlbHNlCisjICBlcnJvciAiVW5rbm93biBjb21waWxlciIKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX19JQk1DUFBfXykgfHwgKF9fSUJNQ1BQX18gPCA1MDApCisjIGRlZmluZSBfU1RMUF9IQVNfTk9fTkVXX0NfSEVBREVSUyAxCisjZW5kaWYKKworLyogc3RyaW5nIGxpdGVyYWwgcHJvYmxlbSwgc2FtZSBhcyB3aXRoIFNVTiBhbmQgYUNDICovCisjIGRlZmluZSBfU1RMUF9JTkxJTkVfU1RSSU5HX0xJVEVSQUxfQlVHIDEKKyMgZGVmaW5lIF9TVExQX0hBU19OQVRJVkVfRkxPQVRfQUJTCisKKyMgZGVmaW5lIF9TVExQX0RFRl9DT05TVF9QTENUX05FV19CVUcgMQorIyBkZWZpbmUgX1NUTFBfREVGX0NPTlNUX0RFRl9QQVJBTV9CVUcgMQorCisKKyMgaWZkZWYgX19JQk1DUFBfXworIyAgZGVmaW5lIF9TVExQX0hBU19TUEVDSUZJQ19QUk9MT0dfRVBJTE9HCisjIGVuZGlmCisKKy8qICMgIGlmICggZGVmaW5lZCAoX19NVUxUSV9fKSAmJiBkZWZpbmVkIChfX1dJTkRPV1NfXykpCisgKiAjICAgZGVmaW5lICBfU1RMUF9XSU4zMlRIUkVBRFMgMSAgICAgICAgICAgT25seSBWaXN1YWwgQWdlIDMuNSBmb3IgV2luZG93cworICogIyAgZW5kaWYKKyAqLworCisjICBpZiAoIGRlZmluZWQgKF9fTVVMVElfXykgJiYgZGVmaW5lZCAoX19PUzJfXykpCisjICAgZGVmaW5lIF9TVExQX09TMlRIUkVBRFMgMQorIyAgZW5kaWYKKworLyogX19URU1QSU5DX18gaXMgc2V0IHdoZW4gL0Z0KyBvcHRpb24gaXMgdXNlZCAqLworIyAgaWZkZWYgX19URU1QSU5DX18KKyMgICAgZGVmaW5lIF9TVExQX0xJTktfVElNRV9JTlNUQU5USUFUSU9OIDEKKyMgIGVuZGlmCisKKyMgaWYgZGVmaW5lZCAoX19NVlNfXykKKy8qIGxvbmcgbG9uZyBzdXBwb3J0IGlzIGJ1Z2d5IC0gcmVwb3J0ZWQgYnkgVGlubnkgTmcKKyAqICMgIGlmIF9fRVhURU5ERURfXyAmJiBfX0NPTVBJTEVSX1ZFUl9fID49IDB4MjIwNjAwMDAKKyAqICMgICBkZWZpbmUgX1NUTFBfTE9OR19MT05HIGxvbmcgbG9uZworICogIyAgZW5kaWYKKyAqLworLyogYm9yaXMgOiBoc3Rhc2ggcmVwb3J0ZWQgaXQgY2FuIGJlIHRyZWF0ZWQgbGlrZSBVTklYICovCisjICBkZWZpbmUgX1NUTFBfVU5JWCAxCisjICBkZWZpbmUgX1NUTFBfTk9fVFlQRUlORk8gMQorIyAgdW5kZWYgX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSAorIyAgZGVmaW5lIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEggL3Vzci9scHAvaW9jbGliL2luY2x1ZGUKKy8qIHNhbWUgZm9yIEMgaGVhZGVycyBsaWtlIDxzdHJpbmcuaD4gKi8KKyMgIHVuZGVmIF9TVExQX05BVElWRV9DX0lOQ0xVREVfUEFUSAorIyAgZGVmaW5lIF9TVExQX05BVElWRV9DX0lOQ0xVREVfUEFUSCAvdXNyL2luY2x1ZGUKKyMgIGRlZmluZSBfU1RMUF9OQVRJVkVfQ1BQX1JVTlRJTUVfSU5DTFVERV9QQVRIIC91c3IvaW5jbHVkZQorCisjIGVsaWYgKGRlZmluZWQgKF9fV0lORE9XU19fKSB8fCBkZWZpbmVkIChfQUlYKSB8fCBkZWZpbmVkIChfX09TMl9fKSApICYmIChfX0lCTUNQUF9fID49IDM1MCkKKworIyAgZGVmaW5lIF9TVExQX0xPTkdfTE9ORyBsb25nIGxvbmcKKworI2VuZGlmCisKKyNpZiAhKCBkZWZpbmVkKCBfX3hsQ19fICkgJiYgX194bENfXyA+PSAweDUwMCApCisKKy8qIEFJWCB4bEMgMy4xICwgMy4wLjEgPT0weDMwMQorICogVmlzdWFsIEFnZSBDKysgMy54CisgKiBPUy0zOTAgQysrCisgKiBmYnAgOiBzaG91bGQgYmUgbW9yZSB2ZXJzaW9uLXNwZWNpZmljIQorICovCisKKyMgIGRlZmluZSBfU1RMUF9OT19CT09MIDEKKyMgIGRlZmluZSBfU1RMUF9ET05UX1VTRV9CT09MX1RZUEVERUYgMQorIyAgZGVmaW5lIF9TVExQX0xJTUlURURfREVGQVVMVF9URU1QTEFURVMgMQorIyAgZGVmaW5lIF9TVExQX0hBU19OT19OQU1FU1BBQ0VTIDEKKyMgIGRlZmluZSBfU1RMUF9ORUVEX1RZUEVOQU1FIDEKKyMgIGRlZmluZSBfU1RMUF9ORUVEX0VYUExJQ0lUIDEKKyMgIGRlZmluZSBfU1RMUF9OT19BUlJPV19PUEVSQVRPUiAxCisjICBkZWZpbmUgX1NUTFBfTk9fTkVXX1NUWUxFX0NBU1RTIDEKKyMgIGRlZmluZSBfU1RMUF9OT19XQ0hBUl9UIDEKKyMgIGRlZmluZSBfU1RMUF9ORUVEX01VVEFCTEUgMQorIyAgZGVmaW5lIF9TVExQX05PX1BBUlRJQUxfU1BFQ0lBTElaQVRJT05fU1lOVEFYIDEKKyMgIGRlZmluZSBfU1RMUF9OT19CQURfQUxMT0MgMQorCisjICBkZWZpbmUgX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFUyAxCisjICBkZWZpbmUgX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFX0NMQVNTRVMgMQorIyAgZGVmaW5lIF9TVExQX05PX01FTUJFUl9URU1QTEFURV9LRVlXT1JEIDEKKyMgIGRlZmluZSBfU1RMUF9OT19GUklFTkRfVEVNUExBVEVTIDEKKyMgIGRlZmluZSBfU1RMUF9OT19RVUFMSUZJRURfRlJJRU5EUyAxCisjICBkZWZpbmUgX1NUTFBfTk9fQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTiAxCisjICBkZWZpbmUgX1NUTFBfTk9fRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSIDEKKworIyAgZGVmaW5lIF9TVExQX05PX0RFRkFVTFRfTk9OX1RZUEVfUEFSQU0gMQorIyAgZGVmaW5lIF9TVExQX05PX01FVEhPRF9TUEVDSUFMSVpBVElPTiAxCisjICBkZWZpbmUgX1NUTFBfTk9fRVhQTElDSVRfRlVOQ1RJT05fVE1QTF9BUkdTIDEKKyMgIGRlZmluZSBfU1RMUF9OT19FWENFUFRJT05fSEVBREVSIDEKKworIyAgZGVmaW5lIF9TVExQX05PX05FV19ORVdfSEVBREVSIDEKKworIyAgaWYgZGVmaW5lZCAoX19PUzJfXykgJiYgKF9fSUJNQ1BQX18gPD0gMzUwKQorIyAgIGRlZmluZSBfU1RMUF9OT19UWVBFSU5GTyAxCisjICBlbmRpZgorIyAgZGVmaW5lIF9TVExQX05PX05FV19ORVdfSEVBREVSIDEKKworIyAgZGVmaW5lIF9TVExQX1NUQVRJQ19DT05TVF9JTklUX0JVRyAxCisvKiAjICBkZWZpbmUgX1NUTFBfVEhST1dfUkVUVVJOX0JVRyAxICovCisKKworIyAgZGVmaW5lIF9TVExQX05PX1RFTVBMQVRFX0NPTlZFUlNJT05TIDEKKyMgIGRlZmluZSBfU1RMUF9CQVNFX1RZUEVERUZfT1VUU0lERV9CVUcgMQorCisvKiBBSVggeGxDLCBWaXN1YWwgQWdlIDMuMCBmb3IgT1MvMiBhbmQgTVMgKi8KKyMgIGRlZmluZSBfU1RMUF9UUklWSUFMX0RFU1RSVUNUT1JfQlVHCisKKyMgIGRlZmluZSBfU1RMUF9OT05fVFlQRV9UTVBMX1BBUkFNX0JVRyAxCisjICBkZWZpbmUgX1NUTFBfTk9OVEVNUExfQkFTRV9NQVRDSF9CVUcgMQorCisjaWYgX19JQk1DUFBfXyA8PSAzNTAKKyMgIGRlZmluZSBfU1RMUF9ORUVEX1VOUkVBQ0hBQkxFX1JFVFVSTiAxCisjZW5kaWYKKworI2lmIF9fSUJNQ1BQX18gPCAzNTAKKyMgIGRlZmluZSBfU1RMUF9OT19MT05HX0RPVUJMRSAxCisjZW5kaWYKKworI2lmIF9fSUJNQ1BQX18gPj0gMzY1CisvKiBkb2VzIG5vdCBoYXZlIG5ldyBDIGhlYWRlcnMsIGJ1dCBoYXMgZGl2KCkgKi8KKyMgIGRlZmluZSBfU1RMUF9MRElWCisjZW5kaWYKKworI2VuZGlmIC8qIHhsQyA1ICovCisKKy8qIGRldGVjdCB4bEM1IGJ5OiAqLworI2lmIGRlZmluZWQoX19JQk1DUFBfXykgJiYgKDUwMCA8PSBfX0lCTUNQUF9fKSAmJiAoX19JQk1DUFBfXyA8IDcwMCkKKyMgIGRlZmluZSBfU1RMUF9VU0VfRVhDRVBUSU9OUyAxCisjICBkZWZpbmUgX1NUTFBfU1RBVElDX0NPTlNUX0lOSVRfQlVHIDEKKy8qICNwcmFnbWEgcmVwb3J0KGRpc2FibGUsQ1BQQzE1MDAwMjkpCisgKiB1bnNpZ25lZCAzMi1iaXQgaW50ZWdlciB0eXBlCisgKi8KKyMgIGRlZmluZSBfU1RMUF9VSU5UMzJfVCB1bnNpZ25lZCBpbnQKKyMgIGlmIGRlZmluZWQoX1hPUEVOX1NPVVJDRSkgJiYgKF9YT1BFTl9WRVJTSU9OIC0gMCA+PSA0KQorIyAgICBkZWZpbmUgX1NUTFBfUkFORDQ4IDEKKyMgIGVuZGlmCisvKiAjICBkZWZpbmUgX1NUTFBfUkFORDQ4IDEgKi8KKyNlbmRpZiAvKiBfX0lCTUNQUF9fID09IDUwMCAqLwpkaWZmIC0tZ2l0IGEvc3RsL2NvbmZpZy9faWNjLmggYi9zdGwvY29uZmlnL19pY2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmMxYmNlCi0tLSAvZGV2L251bGwKKysrIGIvc3RsL2NvbmZpZy9faWNjLmgKQEAgLTAsMCArMSw0NCBAQAorLy8gU1RMcG9ydCBjb25maWd1cmF0aW9uIGZpbGUKKy8vIEl0IGlzIGludGVybmFsIFNUTHBvcnQgaGVhZGVyIC0gRE8gTk9UIGluY2x1ZGUgaXQgZGlyZWN0bHkKKy8vIEEgbGlzdCBvZiBJbnRlbCBjb21waWxlciBmb3IgTGludXggcG9ydGlvbiBvZiBTVExwb3J0IHNldHRpbmdzLgorCisjZGVmaW5lIF9TVExQX0NPTVBJTEVSICJJbnRlbCBJQ0MiCisKKyNkZWZpbmUgX1NUTFBfTE9OR19MT05HIGxvbmcgbG9uZworCisvLyBFZGl0IHJlbGF0aXZlIHBhdGggYmVsb3cgKG9yIHB1dCBmdWxsIHBhdGgpIHRvIGdldCBuYXRpdmUKKy8vIGNvbXBpbGVyIGhlYWRlcnMgaW5jbHVkZWQuIERlZmF1bHQgaXMgIi4uL2luY2x1ZGUiLgorLy8gQyBoZWFkZXJzIG1heSByZXNpZGUgaW4gZGlmZmVyZW50IGRpcmVjdG9yeSwgc28gc2VwYXJhdGUgbWFjcm8gaXMgcHJvdmlkZWQuCisjaWYgKF9fSU5URUxfQ09NUElMRVIgPCA4MDApCisjIGRlZmluZSBfU1RMUF9OQVRJVkVfSU5DTFVERV9QQVRIIC4uL2luY2x1ZGUKKyMgZGVmaW5lIF9TVExQX05BVElWRV9DX0lOQ0xVREVfUEFUSCAuLi9pbmNsdWRlCisjIGRlZmluZSBfU1RMUF9OQVRJVkVfQ1BQX0NfSU5DTFVERV9QQVRIIC4uL2luY2x1ZGUKKyNlbmRpZgorCisjaWYgKF9fSU5URUxfQ09NUElMRVIgPj0gODAwKQorIyBkZWZpbmUgX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSCAuLi9pbmNsdWRlL2MrKworIyBkZWZpbmUgX1NUTFBfTkFUSVZFX0NfSU5DTFVERV9QQVRIIC4uL2luY2x1ZGUKKyMgZGVmaW5lIF9TVExQX05BVElWRV9DUFBfQ19JTkNMVURFX1BBVEggLi4vaW5jbHVkZQorCisjZW5kaWYgLyogX19JTlRFTF9DT01QSUxFUiA+PSA4MDAgKi8KKworI2RlZmluZSBfU1RMUF9IQVNfTk9fTkVXX0NfSEVBREVSUyAxCisjZGVmaW5lIF9TVExQX1ZFTkRPUl9HTE9CQUxfQ1NURCAxCisKKy8qIFN5c3RlbXMgaGF2aW5nIEdMSUJDIGluc3RhbGxlZCBoYXZlIGRpZmZlcmVudCB0cmFpdHMgKi8KKyNpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX0dMSUJDKSAmJiBkZWZpbmVkIChfX2xpbnV4X18pCisjIGRlZmluZSBfU1RMUF9VU0VfR0xJQkMKKyMgZGVmaW5lIF9YT1BFTl9TT1VSQ0UgNjAwCisjZW5kaWYKKworI3VuZGVmIF9TVExQX05PX1VOQ0FVR0hUX0VYQ0VQVF9TVVBQT1JUCisKKworI2lmbmRlZiBfX0dOVUNfXworIyBkZWZpbmUgX19HTlVDX18gMworI2VuZGlmCisKKy8vI2RlZmluZSBfU1RMUF9OT19OQVRJVkVfV0lERV9GVU5DVElPTlMgMQorCisjZGVmaW5lIF9TVExQX05PX0ZPUkNFX0lOU1RBTlRJQVRFCisvLyNkZWZpbmUgX1JFRU5UUkFOVApkaWZmIC0tZ2l0IGEvc3RsL2NvbmZpZy9faW50ZWwuaCBiL3N0bC9jb25maWcvX2ludGVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY4MDIyZgotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9jb25maWcvX2ludGVsLmgKQEAgLTAsMCArMSw3MyBAQAorLy8gU1RMcG9ydCBjb25maWd1cmF0aW9uIGZpbGUKKy8vIEl0IGlzIGludGVybmFsIFNUTHBvcnQgaGVhZGVyIC0gRE8gTk9UIGluY2x1ZGUgaXQgZGlyZWN0bHkKKworI2RlZmluZSBfU1RMUF9DT01QSUxFUiAiSW50ZWwgSUNMIgorCisjZGVmaW5lIF9TVExQX0lNUE9SVF9URU1QTEFURV9LRVlXT1JEIGV4dGVybgorCisvKiBZb3UgbmVlZCB0byB1bmRlZiBmb2xsb3dpbmcgbWFjcm8gaWYgeW91ciBpY2wgaW5zdGFsbCBpcyBiaW5kZWQgdG8gTVNWQyA2CisgKiBuYXRpdmUgbGliIGFuZCB5b3UgYXJlIGJ1aWxkaW5nIHdpdGggL1F2Yzcgb3IgL1F2YzcuMSBvciAvUXZjOCBvcHRpb24uCisgKi8KKy8qICNkZWZpbmUgX1NUTFBfTVNWQ19MSUIgMTIwMCAqLworLyogWW91IG5lZWQgdG8gdW5kZWYgZm9sbG93aW5nIG1hY3JvIGlmIHlvdXIgaWNsIGluc3RhbGwgaXMgYmluZGVkIHRvIE1TVkMgLk5ldCAyMDAyCisgKiBuYXRpdmUgbGliIGFuZCB5b3UgYXJlIGJ1aWxkaW5nIHdpdGhvdXQgYW55IC9RdmMqIG9wdGlvbiBvciB3aXRoIC9RdmM2IG9yIC9RdmM3LjEKKyAqIG9yIC9RdmM4IG9wdGlvbi4KKyAqLworLyogI2RlZmluZSBfU1RMUF9NU1ZDX0xJQiAxMzAwICovCisvKiBZb3UgbmVlZCB0byB1bmRlZiBmb2xsb3dpbmcgbWFjcm8gaWYgeW91ciBpY2wgaW5zdGFsbCBpcyBiaW5kZWQgdG8gTVNWQyAuTmV0IDIwMDIKKyAqIG5hdGl2ZSBsaWIgYW5kIHlvdSBhcmUgYnVpbGRpbmcgd2l0aG91dCBhbnkgL1F2Yyogb3B0aW9uIG9yIHdpdGggL1F2YzYgb3IgL1F2YzcKKyAqIG9yIC9RdmM4IG9wdGlvbi4KKyAqLworLyogI2RlZmluZSBfU1RMUF9NU1ZDX0xJQiAxMzEwICovCisvKiBZb3UgbmVlZCB0byB1bmRlZiBmb2xsb3dpbmcgbWFjcm8gaWYgeW91ciBpY2wgaW5zdGFsbCBpcyBiaW5kZWQgdG8gTVNWQyAuTmV0IDIwMDIKKyAqIG5hdGl2ZSBsaWIgYW5kIHlvdSBhcmUgYnVpbGRpbmcgd2l0aG91dCBhbnkgL1F2Yyogb3B0aW9uIG9yIHdpdGggL1F2YzYgb3IgL1F2YzcKKyAqIG9yIC9RdmM3LjEgb3B0aW9uLgorICovCisvKiAjZGVmaW5lIF9TVExQX01TVkNfTElCIDE0MDAgKi8KKworI2luY2x1ZGUgPHN0bC9jb25maWcvX21zdmMuaD4KKworI2lmIGRlZmluZWQgKF9TVExQX0RPTlRfUkVUVVJOX1ZPSUQpCisjICB1bmRlZiBfU1RMUF9ET05UX1JFVFVSTl9WT0lECisjZW5kaWYKKworI2lmIChfX0lDTCA+PSA5MDApCisvKiAjICB1bmRlZiBfU1RMUF9OT19VTkVYUEVDVEVEX0VYQ0VQVF9TVVBQT1JUICovCisjICBpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9VU0VfRVhDRVBUSU9OUykKKyMgICAgZGVmaW5lIF9TVExQX05PVEhST1cgdGhyb3coKQorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgKF9fSUNMIDw9IDgxMCkKKy8qIElmIG1ldGhvZCBzcGVjaWFsaXphdGlvbiBpcyBhY3RpdmF0ZWQsIGNvbXBpbGVyIGRvIG5vdCBleHBvcnQgc29tZQorICogc3ltYm9scyBhbnltb3JlLgorICovCisjICBkZWZpbmUgX1NUTFBfTk9fTUVUSE9EX1NQRUNJQUxJWkFUSU9OIDEKKyNlbmRpZgorCisjaWYgKF9fSUNMID49IDgwMCkKKyMgIGRlZmluZSBfU1RMUF9TVEFUSUNfQ09OU1RfSU5JVF9CVUcgMQorI2VuZGlmCisKKyNpZiAoX19JQ0wgPj0gNDUwKQorIyAgZGVmaW5lIF9TVExQX0RMTEVYUE9SVF9ORUVEU19QUkVERUNMQVJBVElPTiAxCisjZW5kaWYKKworI2lmIChfX0lDTCA8IDQ1MCkKKy8qICAgIG9ubHkgc3RhdGljIFNUTHBvcnQgbGliIHdvcmtzIGZvciBJQ0wgKi8KKyMgIHVuZGVmICBfU1RMUF9VU0VfU1RBVElDX0xJQgorIyAgdW5kZWYgIF9TVExQX1VTRV9EWU5BTUlDX0xJQgorIyAgZGVmaW5lIF9TVExQX1VTRV9TVEFUSUNfTElCCisvKiAgICBkaXNhYmxlIGhvb2sgd2hpY2ggbWFrZXMgdGVtcGxhdGUgc3ltYm9scyB0byBiZSBzZWFyY2hlZCBmb3IgaW4gdGhlIGxpYnJhcnkgKi8KKyMgIHVuZGVmIF9TVExQX05PX0NVU1RPTV9JTworI2VuZGlmCisKKyN1bmRlZiAgX1NUTFBfTE9OR19MT05HCisjZGVmaW5lIF9TVExQX0xPTkdfTE9ORyBsb25nIGxvbmcKKworI2lmIGRlZmluZWQgKF9fY3BsdXNwbHVzKSAmJiAoX19JQ0wgPj0gOTAwKSAmJiAoX1NUTFBfTVNWQ19MSUIgPCAxMzAwKQorbmFtZXNwYWNlIHN0ZAoreworICB2b2lkIF9TVExQX0NBTEwgdW5leHBlY3RlZCgpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9zdGwvY29uZmlnL19rYWkuaCBiL3N0bC9jb25maWcvX2thaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMmJlZGIKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvY29uZmlnL19rYWkuaApAQCAtMCwwICsxLDQ4IEBACisvLyBTVExwb3J0IGNvbmZpZyBmaWxlIGZvciBLQUkgQysrIGNvbXBpbGVyCisKKyNpZiBkZWZpbmVkKF9YT1BFTl9TT1VSQ0UpICYmIChfWE9QRU5fVkVSU0lPTiAtIDAgPj0gNCkKKyMgZGVmaW5lIF9TVExQX1JBTkQ0OCAxCisjZW5kaWYKKworIyAgaWZuZGVmIF9fS0FJX1NUUklDVCAvKiBfTk9fTE9OR0xPTkcgKi8KKyMgICBkZWZpbmUgX1NUTFBfTE9OR19MT05HIGxvbmcgbG9uZworIyAgZW5kaWYKKworIyAgaWYgIWRlZmluZWQgKF9fRVhDRVBUSU9OUykgJiYgISBkZWZpbmVkIChfRVhDRVBUSU9OUykKKyMgICAgZGVmaW5lIF9TVExQX0hBU19OT19FWENFUFRJT05TCisjICBlbmRpZgorCisjIGlmbmRlZiBfX0JVSUxESU5HX1NUTFBPUlQKKyMgIGRlZmluZSBfU1RMUF9MSU5LX1RJTUVfSU5TVEFOVElBVElPTiAxCisjIGVuZGlmCisKKy8vIHR3byBsZXZlbHMgb2YgbWFjcm9zIGRvIG5vdCB3b3JrIGdvb2Qgd2l0aCBrY2MuCisjICAgZGVmaW5lIF9TVExQX05BVElWRV9IRUFERVIoaGVhZGVyKSAgICA8Li4vaW5jbHVkZS8jI2hlYWRlcj4KKyMgICBkZWZpbmUgX1NUTFBfTkFUSVZFX0NfSEVBREVSKGhlYWRlcikgICAgPC4uL2luY2x1ZGUvIyNoZWFkZXI+CisjICAgZGVmaW5lIF9TVExQX05BVElWRV9DUFBfQ19IRUFERVIoaGVhZGVyKSAgICA8Li4vaW5jbHVkZS8jI2hlYWRlcj4KKyMgICBkZWZpbmUgX1NUTFBfTkFUSVZFX0NQUF9SVU5USU1FX0hFQURFUihoZWFkZXIpIDwuLi9pbmNsdWRlLyMjaGVhZGVyPgorCisjIGlmZGVmIF9XSU4zMgorIyAgZGVmaW5lIF9TVExQX01JTklNVU1fSU1QT1JUX1NURAorIyBlbmRpZgorCisvLyBLQUkgQysrIHVzZXMgRURHIGZyb250LWVuZCwgYnV0IGFwcGFyZW50bHkgZGlmZmVyZW50IHN3aXRjaGVzCisvLyAjICBkZWZpbmUgX19FREdfU1dJVENIRVMgMQorCisKKyMgIGRlZmluZSBfU1RMUF9WRU5ET1JfR0xPQkFMX0NTVEQgMQorIyAgZGVmaW5lIF9TVExQX1ZFTkRPUl9NQl9OQU1FU1BBQ0Ugc3RkCisKKy8vIGJvcmlzIDogc29tZSBvZiB0aG9zZSBtYXkgYWxzbyBhcHBseSB0byBLQ0MgMy40CisjIGlmIF9fS0NDX1ZFUlNJT04gPCA0MDAwCisjICBkZWZpbmUgX1NUTFBfVkVORE9SX0dMT0JBTF9FWENFUFRfU1REIDEKKworIyBlbmRpZgorCisjIGlmIGRlZmluZWQgKF9fc2dpKQorLy8gdGhpcyByZXF1aXJlcyBzb21lIGRpc2NyaW1pbmF0aW9uIG9uIHdoZXRoZXIgd2UgYXJlIGFjdHVhbGx5IG9uCisvLyBhIHN5c3RlbSBvZmZpY2lhbGx5IHN1cHBvcnRlZCBieSBLQUkuCisjICBkZWZpbmUgX1NUTFBfSEFTX05PX05FV19DX0hFQURFUlMgMQorIyAgaW5jbHVkZSA8c3RhbmRhcmRzLmg+CisjIGVuZGlmCisKZGlmZiAtLWdpdCBhL3N0bC9jb25maWcvX2xpbnV4LmggYi9zdGwvY29uZmlnL19saW51eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MmNkOGIKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvY29uZmlnL19saW51eC5oCkBAIC0wLDAgKzEsOTMgQEAKKyNpZm5kZWYgX19zdGxfY29uZmlnX19saW51eF9oCisjZGVmaW5lIF9fc3RsX2NvbmZpZ19fbGludXhfaAorCisjZGVmaW5lIF9TVExQX1BMQVRGT1JNICJMaW51eCIKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKy8qIFRoaXMgaXMgZGVmaW5lZCB3ZXRoZXIgbGlicmFyeSBpbiB1c2UgaXMgZ2xpYmMgb3Igbm90LgorICAgVGhpcyBtYXkgYmUgdHJlYXRlZCBhcyBwcmVzZW5jZSBvZiBHTlUgbGliYyBjb21wYXRpYmxlCisgICBoZWFkZXIgZmlsZXMgKHRoZXNlIGRlZmluZSBpcyBub3QgcmVhbGx5IGludGVuZGVkIHRvIGNoZWNrCisgICBmb3IgdGhlIHByZXNlbmNlIG9mIGEgcGFydGljdWxhciBsaWJyYXJ5LCBidXQgcmF0aGVyIGlzIHVzZWQKKyAgIHRvIGRlZmluZSBhbiBJTlRFUkZBQ0UuKSAqLworI2lmbmRlZiBfU1RMUF9VU0VfR0xJQkMKKyMgIGRlZmluZSBfU1RMUF9VU0VfR0xJQkMgMQorI2VuZGlmCisKKyNkZWZpbmUgX1NUTFBfVU5JWCAxCisKKyNpZiBkZWZpbmVkKF9SRUVOVFJBTlQpICYmICFkZWZpbmVkKF9QVEhSRUFEUykKKyMgZGVmaW5lIF9QVEhSRUFEUworI2VuZGlmCisKKyNpZmRlZiBfX1VDTElCQ19fIC8qIHVDbGliYyAwLjkuMjcgKi8KKyMgIGRlZmluZSBfU1RMUF9VU0VfVUNMSUJDIDEKKyMgIGlmICFkZWZpbmVkKF9fVUNMSUJDX0hBU19XQ0hBUl9fKQorIyAgICBpZm5kZWYgX1NUTFBfTk9fV0NIQVJfVAorIyAgICAgIGRlZmluZSBfU1RMUF9OT19XQ0hBUl9UCisjICAgIGVuZGlmCisjICAgIGlmbmRlZiBfU1RMUF9OT19NQlNUQVRFX1QKKyMgICAgICBkZWZpbmUgX1NUTFBfTk9fTUJTVEFURV9UCisjICAgIGVuZGlmCisjICAgIGlmbmRlZiBfU1RMUF9OT19OQVRJVkVfV0lERV9TVFJFQU1TCisjICAgICAgZGVmaW5lIF9TVExQX05PX05BVElWRV9XSURFX1NUUkVBTVMKKyMgICAgZW5kaWYKKyMgIGVuZGlmIC8qIF9fVUNMSUJDX0hBU19XQ0hBUl9fICovCisgICAvKiBIbW0sIGJvZ3VzIF9HTElCQ1BQX1VTRV9OQU1FU1BBQ0VTIHNlZW1zIHVuZGVmaW5lZC4uLiAqLworIyAgZGVmaW5lIF9TVExQX1ZFTkRPUl9HTE9CQUxfQ1NURCAxCisjICBpZiBkZWZpbmVkKF9TVExQX1JFQUxfTE9DQUxFX0lNUExFTUVOVEVEKQorICAgICAvKiBsb2NhbGUgaW4gdUNsaWJjIGlzIHZlcnkgcmVzdHJpY3RlZCAqLworICAgICAvKiByZWNoZWNrIGlmIF9fVUNMSUJDX0hBU19MT0NBTEVfXyBkZWZpbmVkLi4uKi8KKyMgICAgdW5kZWYgX1NUTFBfUkVBTF9MT0NBTEVfSU1QTEVNRU5URUQKKyMgIGVuZGlmCisjZW5kaWYKKworCisjaWYgZGVmaW5lZChfUFRIUkVBRFMpCisjICBkZWZpbmUgX1NUTFBfVEhSRUFEUworIyAgZGVmaW5lIF9TVExQX1BUSFJFQURTCisvKgorIyAgaWZuZGVmIF9fVVNFX1VOSVg5OAorIyAgICBkZWZpbmUgX19VU0VfVU5JWDk4CisjICBlbmRpZgorKi8KKy8qIFRoaXMgZmVhdHVyZSBleGlzdCBhdCBsZWFzdCBzaW5jZSBnbGliYyAyLjIuNCAqLworLyogIyAgZGVmaW5lIF9fRklUX1hTSV9USFIgKi8gLyogVW5peCA5OCBvciBYL09wZW4gU3lzdGVtIEludGVyZmFjZXMgRXh0ZW50aW9uICovCisjICBpZmRlZiBfX1VTRV9YT1BFTjJLCisvKiBUaGUgSUVFRSBTdGQuIDEwMDMuMWotMjAwMCBpbnRyb2R1Y2VzIGZ1bmN0aW9ucyB0byBpbXBsZW1lbnQgc3BpbmxvY2tzLiAqLworIyAgIGlmbmRlZiBfX1VDTElCQ19fIC8qIFRoZXJlIGFyZSBubyBzcGlubG9ja3MgaW4gdUNsaWJjIDAuOS4yNyAqLworIyAgICAgZGVmaW5lIF9TVExQX1VTRV9QVEhSRUFEX1NQSU5MT0NLCisjICAgZWxzZQorIyAgICAgaWZuZGVmIF9TVExQX0RPTlRfVVNFX1BUSFJFQURfU1BJTkxPQ0sKKyAgICAgICAgLyogaW4gdUNsaWJjICgwLjkuMjYpIHB0aHJlYWRfc3BpbmxvY2sqIGRlY2xhcmVkIGluIGhlYWRlcnMKKyAgICAgICAgICogYnV0IGFic2VudCBpbiBsaWJyYXJ5ICovCisjICAgICAgIGRlZmluZSBfU1RMUF9ET05UX1VTRV9QVEhSRUFEX1NQSU5MT0NLCisjICAgICBlbmRpZgorIyAgIGVuZGlmCisvKiAjICAgZGVmaW5lIF9fRklUX1BTSEFSRURfTVVURVggKi8KKyMgIGVuZGlmCisjZW5kaWYKKworLyogRW5kaWFubmVzICovCisjaW5jbHVkZSA8ZW5kaWFuLmg+CisjaWYgIWRlZmluZWQoX19CWVRFX09SREVSKSB8fCAhZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pIHx8ICFkZWZpbmVkKF9fQklHX0VORElBTikKKyMgIGVycm9yICJPbmUgb2YgX19CWVRFX09SREVSLCBfX0xJVFRMRV9FTkRJQU4gYW5kIF9fQklHX0VORElBTiB1bmRlZmluZWQ7IEZpeCBtZSEiCisjZW5kaWYKKworI2lmICggX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTiApCisjICBkZWZpbmUgX1NUTFBfTElUVExFX0VORElBTiAxCisjZWxpZiAoIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4gKQorIyAgZGVmaW5lIF9TVExQX0JJR19FTkRJQU4gMQorI2Vsc2UKKyMgIGVycm9yICJfX0JZVEVfT1JERVIgbmVpdGhlciBfX0JJR19FTkRJQU4gbm9yIF9fTElUVExFX0VORElBTjsgRml4IG1lISIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKF9fR05VQ19fIDwgMykKKyMgIGRlZmluZSBfU1RMUF9OT19OQVRJVkVfV0lERV9GVU5DVElPTlMgMQorLyoKKyMgICAgZGVmaW5lIF9TVExQX05PX05BVElWRV9XSURFX1NUUkVBTVMgICAxCisqLworI2VuZGlmCisKKworI2VuZGlmIC8qIF9fc3RsX2NvbmZpZ19fbGludXhfaCAqLwpkaWZmIC0tZ2l0IGEvc3RsL2NvbmZpZy9fbWFjLmggYi9zdGwvY29uZmlnL19tYWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODBjYzcxCi0tLSAvZGV2L251bGwKKysrIGIvc3RsL2NvbmZpZy9fbWFjLmgKQEAgLTAsMCArMSBAQAorI2RlZmluZSBfU1RMUF9QTEFURk9STSAiTWFjIgpkaWZmIC0tZ2l0IGEvc3RsL2NvbmZpZy9fbWFjb3N4LmggYi9zdGwvY29uZmlnL19tYWNvc3guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDM0NTJiCi0tLSAvZGV2L251bGwKKysrIGIvc3RsL2NvbmZpZy9fbWFjb3N4LmgKQEAgLTAsMCArMSw3IEBACisjZGVmaW5lIF9TVExQX1BMQVRGT1JNICJNYWMgT1MgWCIKKworI2lmIGRlZmluZWQgKF9fQklHX0VORElBTl9fKQorIyAgZGVmaW5lIF9TVExQX0JJR19FTkRJQU4gMQorI2VsaWYgZGVmaW5lZCAoX19MSVRUTEVfRU5ESUFOX18pCisjICBkZWZpbmUgX1NUTFBfTElUVExFX0VORElBTiAxCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N0bC9jb25maWcvX21sYy5oIGIvc3RsL2NvbmZpZy9fbWxjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY4N2QwYgotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9jb25maWcvX21sYy5oCkBAIC0wLDAgKzEsNyBAQAorLy8gU1RMcG9ydCBjb25maWd1cmF0aW9uIGZpbGUKKy8vIEl0IGlzIGludGVybmFsIFNUTHBvcnQgaGVhZGVyIC0gRE8gTk9UIGluY2x1ZGUgaXQgZGlyZWN0bHkKKworI2RlZmluZSBfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVTICAgICAgICAgICAgIC8vIENvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgbWVtYmVyIHRlbXBsYXRlcworI2RlZmluZSBfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVfQ0xBU1NFUyAgICAgIC8vIENvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgbWVtYmVyIHRlbXBsYXRlIGNsYXNzZXMKKworI2RlZmluZSBfU1RMUF9IQVNfTkVXX05FV19IRUFERVIKZGlmZiAtLWdpdCBhL3N0bC9jb25maWcvX21zdmMuaCBiL3N0bC9jb25maWcvX21zdmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzUwMzZmCi0tLSAvZGV2L251bGwKKysrIGIvc3RsL2NvbmZpZy9fbXN2Yy5oCkBAIC0wLDAgKzEsMzUzIEBACisvKiBTVExwb3J0IGNvbmZpZ3VyYXRpb24gZmlsZQorICogSXQgaXMgaW50ZXJuYWwgU1RMcG9ydCBoZWFkZXIgLSBETyBOT1QgaW5jbHVkZSBpdCBkaXJlY3RseQorICogTWljcm9zb2Z0IFZpc3VhbCBDKysgNi4wLCA3LjAsIDcuMSwgOC4wLCBJQ0wKKyAqLworCisjaWYgIWRlZmluZWQgKF9TVExQX0NPTVBJTEVSKQorIyAgZGVmaW5lIF9TVExQX0NPTVBJTEVSICJNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBDKysiCisjZW5kaWYKKworI2lmICFkZWZpbmVkIChfX0lDTCkgJiYgIWRlZmluZWQgKF9TVExQX01TVkMpCisjICBkZWZpbmUgX1NUTFBfTVNWQyBfTVNDX1ZFUgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTVNWQ19MSUIpCisjICBkZWZpbmUgX1NUTFBfTVNWQ19MSUIgX01TQ19WRVIKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19CVUlMRElOR19TVExQT1JUKSAmJiBkZWZpbmVkIChfTUFOQUdFRCkKKy8qIEJ1aWxkaW5nIGEgbWFuYWdlZCB2ZXJzaW9uIG9mIFNUTHBvcnQgaXMgbm90IHN1cHBvcnRlZCBiZWNhdXNlIHdlIGhhdmVuJ3QKKyAqIGZvdW5kIGEgZ29vZCByZWFzb24gdG8gc3VwcG9ydCBpdC4gSG93ZXZlciwgYnVpbGRpbmcgYSBtYW5hZ2VkIHRyYW5zbGF0aW9uCisgKiB1bml0IHVzaW5nIFNUTHBvcnQgX2lzXyBzdXBwb3J0ZWQuCisgKi8KKyMgIGVycm9yIFNvcnJ5IGJ1dCBidWlsZGluZyBhIG1hbmFnZWQgdmVyc2lvbiBvZiBTVExwb3J0IGlzIG5vdCBzdXBwb3J0ZWQuCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX1VTSU5HX1BMQVRGT1JNX1NES19DT01QSUxFUikKKy8qIFRoaXMgaXMgYSBzcGVjaWZpYyBzZWN0aW9uIGZvciBjb21waWxlcnMgY29taW5nIHdpdGggcGxhdGZvcm0gU0RLcy4gTmF0aXZlCisgKiBsaWJyYXJ5IGNvbWluZyB3aXRoIGl0IGlzIGRpZmZlcmVudCBmcm9tIHRoZSBvbmUgY29taW5nIHdpdGggY29tbWVyY2lhbAorICogTVNWQyBjb21waWxlcnMgc28gdGhlcmUgaXMgc29tZSBzcGVjaWZpYyBzZXR0aW5ncy4KKyAqLworIyAgZGVmaW5lIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEggLi4vY3J0CisjICBkZWZpbmUgX1NUTFBfVkVORE9SX0dMT0JBTF9DU1RECisjICBkZWZpbmUgX1NUTFBfVkVORE9SX1RFUk1JTkFURV9TVEQKKyMgIGRlZmluZSBfU1RMUF9HTE9CQUxfTkVXX0hBTkRMRVIKKyMgIGlmIChfU1RMUF9NU1ZDX0xJQiA8PSAxNDAwKQorLyogV2UgaG9wZSB0aGlzIGJ1ZyB3aWxsIGJlIGZpeGVkIGluIGZ1dHVyZSB2ZXJzaW9ucy4gKi8KKyMgICAgZGVmaW5lIF9TVExQX05FV19ET05UX1RIUk9XX0JBRF9BTExPQyAxCisjICBlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgX1NUTFBfQ0FMTCBfX2NkZWNsCisKKyNpZm5kZWYgX1NUTFBfTE9OR19MT05HCisjICBkZWZpbmUgX1NUTFBfTE9OR19MT05HIF9faW50NjQKKyNlbmRpZgorCisjZGVmaW5lIF9TVExQX1BSQUdNQV9PTkNFCisKKy8qIFRoZXNlIHN3aXRjaGVzIGRlcGVuZCBvbiBjb21waWxlciBmbGFncy4gV2UgYXJlIGhvcGluZyBoZXJlIHRoYXQgY29tcGlsZXJzCisgKiBzaW11bGF0aW5nIE1TVkMgYmVoYXZpb3IgdXNlIGlkZW50aWNhbCBtYWNyb3MgdG8gcmVwb3J0IGNvbXBpbGF0aW9uIGNvbnRleHQuCisgKiBPdGhlcndpc2UgdGhvc2UgbWFjcm9zIHdpbGwgaGF2ZSB0byBiZSB1bmRlZiBpbiBzcGVjaWZpYyBjb21waWxlciBjb25maWd1cmF0aW9uCisgKiBmaWxlcy4KKyAqLworI2lmbmRlZiBfQ1BQVU5XSU5ECisjICBkZWZpbmUgX1NUTFBfRE9OVF9VU0VfRVhDRVBUSU9OUyAxCisjZW5kaWYKKworI2lmbmRlZiBfQ1BQUlRUSQorIyAgZGVmaW5lIF9TVExQX05PX1JUVEkgMQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfTVQpICYmICFkZWZpbmVkIChfU1RMUF9OT19USFJFQURTKSAmJiAhZGVmaW5lZCAoX1JFRU5UUkFOVCkKKyMgIGRlZmluZSBfUkVFTlRSQU5UIDEKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKF9OQVRJVkVfV0NIQVJfVF9ERUZJTkVEKQorIyAgZGVmaW5lIF9TVExQX1dDSEFSX1RfSVNfVVNIT1JUIDEKKyNlbmRpZgorCisjZGVmaW5lIF9TVExQX01JTklNVU1fSU1QT1JUX1NURAorI2RlZmluZSBfU1RMUF9OT19WRU5ET1JfU1RETElCX0wgMQorCisjaWYgZGVmaW5lZCAoX1NUTFBfTVNWQykKKworI2RlZmluZSBfU1RMUF9OT1JFVFVSTl9GVU5DVElPTiBfX2RlY2xzcGVjKG5vcmV0dXJuKQorCisvKiBGdWxsIGNvbXBpbGVyIHZlcnNpb24gY29tZXMgZnJvbSBib29zdCBsaWJyYXJ5IGludHJpbnNpY3MuaHBwIGhlYWRlci4gKi8KKyMgIGlmIGRlZmluZWQgKF9NU0NfRlVMTF9WRVIpICYmIChfTVNDX0ZVTExfVkVSID49IDE0MDA1MDIxNSkKKyMgICAgZGVmaW5lIF9TVExQX0hBU19UUklWSUFMX0NPTlNUUlVDVE9SKFQpIF9faGFzX3RyaXZpYWxfY29uc3RydWN0b3IoVCkKKyMgICAgZGVmaW5lIF9TVExQX0hBU19UUklWSUFMX0NPUFkoVCkgX19oYXNfdHJpdmlhbF9jb3B5KFQpCisjICAgIGRlZmluZSBfU1RMUF9IQVNfVFJJVklBTF9BU1NJR04oVCkgX19oYXNfdHJpdmlhbF9hc3NpZ24oVCkKKyMgICAgZGVmaW5lIF9TVExQX0hBU19UUklWSUFMX0RFU1RSVUNUT1IoVCkgX19oYXNfdHJpdmlhbF9kZXN0cnVjdG9yKFQpCisjICAgIGRlZmluZSBfU1RMUF9JU19QT0QoVCkgX19pc19wb2QoVCkKKyMgICAgZGVmaW5lIF9TVExQX0hBU19UWVBFX1RSQUlUU19JTlRSSU5TSUNTCisjICBlbmRpZgorCisjICBpZm5kZWYgX1NUTFBfTVNWQzUwX0NPTVBBVElCSUxJVFkKKyMgICAgZGVmaW5lIF9TVExQX01TVkM1MF9DT01QQVRJQklMSVRZICAgMQorIyAgZW5kaWYKKworIyAgZGVmaW5lIF9TVExQX0RMTEVYUE9SVF9ORUVEU19QUkVERUNMQVJBVElPTiAxCisjICBkZWZpbmUgX1NUTFBfSEFTX1NQRUNJRklDX1BST0xPR19FUElMT0cgMQorCisvKiAjIGlmbmRlZiBfX0JVSUxESU5HX1NUTFBPUlQKKyAqICMgIGRlZmluZSBfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUIDEKKyAqICMgZW5kaWYKKyAqLworIyAgaWYgKF9TVExQX01TVkMgPD0gMTQwMSkKKyMgICAgZGVmaW5lIF9TVExQX1NUQVRJQ19DT05TVF9JTklUX0JVRyAgIDEKKyMgIGVuZGlmCisKKy8qKiBOb3RlOiB0aGUgbWFjcm8gX1NUTFBfTk9fVU5DQVVHSFRfRVhDRVBUX1NVUFBPUlQgaXMgZGVmaW5lZAordW5jb25kaXRpb25hbGx5IGFuZCB1bmRlZidlZCBoZXJlIHdoZW4gYXBwbGljYWJsZS4gKi8KKyMgIGlmIGRlZmluZWQoVU5ERVJfQ0UpCisvKiBlVkN4OgordW5jYXVnaHRfZXhjZXB0aW9uIGlzIGRlY2xhcmVkIGluIHRoZSBTREtzIGRlbGl2ZXJlZCB3aXRoIGVWQzQgKGVWQzMgaXMKK3Vua25vd24pIGFuZCB0aGV5IGFsbCByZXNpZGUgaW4gbmFtZXNwYWNlICdzdGQnIHRoZXJlLiBIb3dldmVyLCB0aGV5IGFyZSBub3QKK3BhcnQgb2YgYW55IGxpYiBzbyBsaW5raW5nIGZhaWxzLiBXaGVuIHVzaW5nIFZDOCB0byBjcm9zc2NvbXBpbGUgZm9yIENFIDUgb24KK2FuIEFSTVY0SSwgdGhlIHVuY2F1Z2h0X2V4Y2VwdGlvbiB0ZXN0IGZhaWxzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgd3JvbmcKK3ZhbHVlLiAqLworIyAgZWxzZQorLyogVkN4OgorVGhlc2UgYXJlIHByZXNlbnQgYXQgbGVhc3Qgc2luY2UgVkM2LCBidXQgdGhlIHVuY2F1Z2h0X2V4Y2VwdGlvbigpIG9mIFZDNiBpcworYnJva2VuLCBpdCByZXR1cm5zIHRoZSB3cm9uZyB2YWx1ZSBpbiB0aGUgdW5pdHRlc3RzLiA3LjEgYW5kIGxhdGVyIHNlZW0gdG8KK3dvcmssIDcuMCBpcyBzdGlsbCB1bmtub3duICh3ZSBhc3N1bWUgaXQgd29ya3MgdW50aWwgbmVnYXRpdmUgcmVwb3J0KS4gKi8KKyMgICAgaWYgKF9TVExQX01TVkMgPj0gMTMwMCkvLyBWQzcgYW5kIGxhdGVyCisjICAgICAgdW5kZWYgX1NUTFBfTk9fVU5DQVVHSFRfRVhDRVBUX1NVUFBPUlQKKyMgICAgICBpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9VU0VfRVhDRVBUSU9OUykKKyMgICAgICAgIGRlZmluZSBfU1RMUF9OT1RIUk9XIHRocm93KCkKKyMgICAgICBlbmRpZgorIyAgICBlbmRpZgorIyAgZW5kaWYKKworIyAgaWYgKF9TVExQX01TVkMgPD0gMTMwMCkKKyMgICAgZGVmaW5lIF9TVExQX05PX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04gMQorIyAgICBkZWZpbmUgX1NUTFBfTk9fRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSIDEKKy8qIFRoZXJlIGlzIG5vIHBhcnRpYWwgc3BlYywgYW5kIE1TVkMgYnJlYWtzIG9uIHNpbXVsYXRpbmcgaXQgZm9yIGl0ZXJhdG9yX3RyYWl0cyBxdWVyaWVzICovCisjICAgIGRlZmluZSBfU1RMUF9VU0VfT0xEX0hQX0lURVJBVE9SX1FVRVJJRVMKKyMgICAgZGVmaW5lIF9TVExQX05PX1RZUEVOQU1FX0lOX1RFTVBMQVRFX0hFQURFUgorIyAgICBkZWZpbmUgX1NUTFBfTk9fTUVUSE9EX1NQRUNJQUxJWkFUSU9OIDEKKyMgICAgZGVmaW5lIF9TVExQX0RFRl9DT05TVF9QTENUX05FV19CVUcgMQorIyAgICBkZWZpbmUgX1NUTFBfTk9fVFlQRU5BTUVfT05fUkVUVVJOX1RZUEUgMQorLyogVkMrKyBjYW5ub3QgaGFuZGxlIGRlZmF1bHQgYWxsb2NhdG9yIGFyZ3VtZW50IGluIHRlbXBsYXRlIGNvbnN0cnVjdG9ycyAqLworIyAgICBkZWZpbmUgX1NUTFBfTkVFRFNfRVhUUkFfVEVNUExBVEVfQ09OU1RSVUNUT1JTCisjICAgIGRlZmluZSBfU1RMUF9OT19RVUFMSUZJRURfRlJJRU5EUyAgICAxCisjICAgIGRlZmluZSBfU1RMUF9OT19GUklFTkRfVEVNUExBVEVTCisvKiBGYWlscyB0byBwcm9wZXJseSByZXNvbHZlIGNhbGwgdG8gc2luKCkgZnJvbSB3aXRoaW4gc2luKCkgKi8KKyMgIGVuZGlmCisKKyMgIGlmIChfU1RMUF9NU1ZDIDwgMTMwMCkKKyMgICAgZGVmaW5lIF9TVExQX05PX0lFQzU1OV9TVVBQT1JUIDEKKyMgIGVuZGlmCisKKyMgIGlmIChfU1RMUF9NU1ZDIDwgMTMwMCkgLyogaW5jbHVkaW5nIE1TVkMgNi4wICovCisjICAgIGRlZmluZSBfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVfS0VZV09SRCAxCisjICAgIGRlZmluZSBfU1RMUF9ET05UX1NVUFBPUlRfUkVCSU5EX01FTUJFUl9URU1QTEFURSAxCisjICBlbmRpZgorCisjICBpZiAoX1NUTFBfTVNWQyA+PSAxMjAwKQorIyAgICBkZWZpbmUgX1NUTFBfSEFTX05BVElWRV9GTE9BVF9BQlMgMQorIyAgZW5kaWYKKworLy8gVE9ETzogc29tZSBlVkM0IGNvbXBpbGVycyByZXBvcnQgX01TQ19WRVIgMTIwMSBvciAxMjAyLCB3aGljaCBjYXRlZ29yeSBkbyB0aGV5IGJlbG9uZyB0bz8KKyMgIGlmIChfU1RMUF9NU1ZDID4gMTIwMCkgJiYgKF9TVExQX01TVkMgPCAxMzEwKQorIyAgICBkZWZpbmUgX1NUTFBfTk9fTU9WRV9TRU1BTlRJQworIyAgZW5kaWYKKworIyAgaWYgKF9TVExQX01TVkMgPCAxMzAwKQorLyogVE9ETzogcmVtb3ZlIHRoaXMgaWYgaXQgaXMgaGFuZGxlZCBhbmQgZG9jdW1lbnRlZCBlbHNld2hlcmUKKyAqIGR1bXM6IFZDNiBkbyBub3QgaGFuZGxlIGNvcnJlY3RseSBtZW1iZXIgdGVtcGxhdGVzIG9mIGNsYXNzIHRoYXQgYXJlIGV4cGxpY2l0ZWx5CisgKiBpbnN0YW5jaWF0ZWQgdG8gYmUgZXhwb3J0ZWQuIFRoZXJlIGlzIGEgd29ya2Fyb3VuZCwgc2VwZXJhdGUgdGhlIG5vbiB0ZW1wbGF0ZSBtZXRob2RzCisgKiBmcm9tIHRoZSB0ZW1wbGF0ZSBvbmVzIHdpdGhpbiAyIGRpZmZlcmVudCBjbGFzc2VzIGFuZCBvbmx5IGV4cG9ydCB0aGUgbm9uIHRlbXBsYXRlIG9uZS4KKyAqIEl0IGlzIGltcGxlbWVudGVkIGZvciBiYXNpY19zdHJpbmcgYW5kIGxvY2FsZSBhdCB0aGUgd3JpdGluZyBvZiB0aGlzIG5vdGUuCisgKiBIb3dldmVyIHRoaXMgcHJvYmxlbSBob3Mgbm90ICBiZWVuIGNvbnNpZGVyZWQgYXMgaW1wb3J0YW50IGVub3VnaCB0byByZW1vdmUgdGVtcGxhdGUgbWVtYmVyCisgKiBtZXRob2RzIGZvciBvdGhlciBjbGFzc2VzLiBNb3Jlb3ZlciBCb29zdCAod3d3LmJvb3N0Lm9yZykgcmVxdWlyZWQgaXQgdG8gYmUgZ3JhbnRlZC4KKyAqIFRoZSB3b3JrYXJvdW5kIGlzIGFjdGl2YXRlZCB0aGFua3MgdG8gdGhlIF9TVExQX1VTRV9NU1ZDNl9NRU1fVF9CVUdfV09SS0FST1VORCBtYWNybyBkZWZpbmVkCisgKiBsYXRlciBpbiB0aGlzIGNvbmZpZyBmaWxlLgorICovCisvKgorIyAgICBpZiBkZWZpbmVkIChfRExMKQorIyAgICAgIGRlZmluZSBfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVTIDEKKyMgICAgZW5kaWYKKyovCisKKy8qIEJvcmlzIDogbm90IGRlZmluaW5nIHRoaXMgbWFjcm8gZm9yIFNQNSBjYXVzZXMgb3RoZXIgcHJvYmxlbXMgKi8KKy8qIyAgICBpZiAhZGVmaW5lZCAoX01TQ19GVUxMX1ZFUikgfHwgKF9NU0NfRlVMTF9WRVIgPCAxMjAwODgwNCApICovCisjICAgIGRlZmluZSBfU1RMUF9OT19VU0lOR19GT1JfR0xPQkFMX0ZVTkNUSU9OUyAxCisvKiMgICAgZW5kaWYgKi8KKyMgICAgZGVmaW5lIF9TVExQX0RPTlRfVVNFX0JPT0xfVFlQRURFRiAxCisjICAgIGRlZmluZSBfU1RMUF9ET05UX1JFVFVSTl9WT0lEIDEKKyMgIGVuZGlmCisKKy8qCisgKiBNU1ZDNiBpcyBrbm93biB0byBoYXZlIG1hbnkgdHJvdWJsZSB3aXRoIG5hbWVzcGFjZSBtYW5hZ2VtZW50IGJ1dAorICogTVNWQyAuTmV0IDIwMDMgYW5kIDIwMDUgYWxzbyBoYXZlIGEgYnVnIGRpZmZpY3VsdCB0byByZXByb2R1Y2Ugd2l0aG91dAorICogU1RMcG9ydDoKKyAqIG5hbWVzcGFjZSBzdGxwX3N0ZCB7CisgKiAgIHR5cGVkZWYgaW50IGZvb19pbnQ7CisgKiB9CisgKiAjaW5jbHVkZSA8bWFwPgorICogY29uc3QgZm9vX2ludCBiYXIgPSAwOworICoKKyAqIEFzIHlvdSBjYW4gc2VlIGZvbyBpcyBhdmFpbGFibGUgd2l0aG91dCBuYW1lc3BhY2Ugc3BlY2lmaWNhdGlvbiBhcyBpZgorICogYSB1c2luZyBuYW1lc3BhY2Ugc3RscF9zdGQgaGFzIGJlZW4gcGVyZm9ybWVkLiBEZWZpbmluZyBfU1RMUF9VU0lOR19OQU1FU1BBQ0VfQlVHCisgKiByZXN0b3JlIHRoZSBleHBlY3RlZCBjb21waWxhdGlvbiBlcnJvci4KKyAqLworIyAgZGVmaW5lIF9TVExQX1VTSU5HX05BTUVTUEFDRV9CVUcgMQorCisjICBpZiAoX1NUTFBfTVNWQyA8IDEzMDApIC8qIE1TVkMgNi4wIGFuZCBlYXJsaWVyICovCisjICAgIGRlZmluZSBfU1RMUF9OT19FWFBMSUNJVF9GVU5DVElPTl9UTVBMX0FSR1MgMQorLyogZGVmaW5lZCBmb3IgREVCVUcgYW5kIE5ERUJVRyB0b28sIHRvIGFsbG93IHVzZXIgbWl4IG93biBkZWJ1ZyBidWlsZCB3aXRoIFNUTFAgcmVsZWFzZSBsaWJyYXJ5ICovCisjICAgIGRlZmluZSBfU1RMUF9VU0VfQUJCUkVWUworIyAgZW5kaWYKKworLy8gVE9ETzogd2hhdCBpcyB0aGUgZWFybGllc3QgdmVyc2lvbiBmb3IgdGhpcz8gSWYgaXQgaXMgMTIwMCwgdXNlIF9TVExQX01TVkM+PTEyMDAuCisjICBpZiAoX1NUTFBfTVNWQyA+IDExMDApICYmIChfU1RMUF9NU1ZDIDwgMTMwMCkKK3R5cGVkZWYgY2hhciBfX3N0bF9jaGFyOworIyAgICBkZWZpbmUgX1NUTFBfREVGQVVMVENIQVIgX19zdGxfY2hhcgorIyAgZW5kaWYKKworIyAgaWYgKF9TVExQX01TVkMgPCAxMjAwKSAvKiBiZWZvcmUgVkMrKyA2LjAgKi8KKy8qICMgIGRlZmluZSBfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVTIDEgKi8KKyMgICAgZGVmaW5lIF9TVExQX0RPTlRfU0lNVUxBVEVfUEFSVElBTF9TUEVDX0ZPUl9UWVBFX1RSQUlUUyAxCisjICAgIGRlZmluZSBfU1RMUF9ET05UX1VTRV9QQVJUSUFMX1NQRUNfV1JLRCAxCisjICAgIGRlZmluZSBfU1RMUF9RVUFMSUZJRURfU1BFQ0lBTElaQVRJT05fQlVHIDEKKyMgICAgZGVmaW5lIF9TVExQX05PTl9UWVBFX1RNUExfUEFSQU1fQlVHIDEKKyMgICAgZGVmaW5lIF9TVExQX1RIUk9XX1JFVFVSTl9CVUcgMQorIyAgICBkZWZpbmUgX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFX0NMQVNTRVMgMQorIyAgICBkZWZpbmUgX1NUTFBfREVGX0NPTlNUX0RFRl9QQVJBTV9CVUcgMQorIyAgZW5kaWYKKworIyAgaWYgKF9TVExQX01TVkMgPCAxMTAwICkKKyMgICAgaWZuZGVmIF9TVExQX1VTRV9OT19JT1NUUkVBTVMKKyMgICAgICBkZWZpbmUgX1NUTFBfVVNFX05PX0lPU1RSRUFNUworIyAgICBlbmRpZgorLyogIyAgZGVmaW5lIF9TVExQX05FU1RFRF9UWVBFX1BBUkFNX0JVRyAxICovCisvKiBEZWJ1ZyBtb2RlIGRvZXMgbm90IHdvcmsgZm9yIDQuMiAqLworIyAgICBpZiBkZWZpbmVkIChfU1RMUF9ERUJVRykKKyMgICAgICBwcmFnbWEgbWVzc2FnZSAoIlNUTHBvcnQgZGVidWcgbW9kZSBkb2VzIG5vdCB3b3JrIGZvciBWQysrIDQuMiwgdHVybmluZyBfU1RMUF9ERUJVRyBvZmYgLi4uIikKKyMgICAgICB1bmRlZiBfU1RMUF9ERUJVRworIyAgICBlbmRpZgorIyAgICBkZWZpbmUgX1NUTFBfTk9fQk9PTCAgICAgICAgICAgIDEKKyMgICAgZGVmaW5lIF9TVExQX05FRURfVFlQRU5BTUUgICAgICAxCisjICAgIGRlZmluZSBfU1RMUF9ORUVEX0VYUExJQ0lUICAgICAgMQorIyAgICBkZWZpbmUgX1NUTFBfTkVFRF9NVVRBQkxFICAgICAgIDEKKyMgICAgZGVmaW5lIF9TVExQX05PX1BBUlRJQUxfU1BFQ0lBTElaQVRJT05fU1lOVEFYCisjICAgIGRlZmluZSBfU1RMUF9MSU1JVEVEX0RFRkFVTFRfVEVNUExBVEVTIDEKKyMgICAgZGVmaW5lIF9TVExQX05PTlRFTVBMX0JBU0VfTUFUQ0hfQlVHIDEKKyMgICAgZGVmaW5lIF9TVExQX0JST0tFTl9VU0lOR19ESVJFQ1RJVkUgIDEKKyMgICAgZGVmaW5lIF9TVExQX05PX0FSUk9XX09QRVJBVE9SIDEKKyMgICAgZGVmaW5lIF9TVExQX05PX1NJR05FRF9CVUlMVElOUyAxCisjICAgIGRlZmluZSBfU1RMUF9OT19FWENFUFRJT05fU1BFQyAxCisjICAgIGRlZmluZSBfU1RMUF9IQVNfTk9fTkFNRVNQQUNFUyAxCisjICAgIGRlZmluZSBfU1RMUF9OT19BVF9NRU1CRVJfRlVOQ1RJT04gMQorIyAgICBkZWZpbmUgX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFUyAxCisjICBlbmRpZiAvKiAxMTAwICovCisKKyNlbmRpZiAvKiBfU1RMUF9NU1ZDICovCisKKy8qKiBUaGUgZGVza3RvcCB2YXJpYW50cyBzdGFydGluZyB3aXRoIFZDOCBoYXZlIGEgc2V0IG9mIG1vcmUgc2VjdXJlIHJlcGxhY2VtZW50cworZm9yIHRoZSBlcnJvci1wcm9uZSBzdHJpbmcgaGFuZGxpbmcgZnVuY3Rpb25zIG9mIHRoZSBDIHN0YW5kYXJkIGxpYi4gKi8KKyNpZiAoX1NUTFBfTVNWQ19MSUIgPj0gMTQwMCkgJiYgIWRlZmluZWQgKF9TVExQX1VTSU5HX1BMQVRGT1JNX1NES19DT01QSUxFUikgJiYgIWRlZmluZWQoVU5ERVJfQ0UpCisjICBkZWZpbmUgX1NUTFBfVVNFX1NBRkVfU1RSSU5HX0ZVTkNUSU9OUyAxCisjZW5kaWYKKworI2lmIChfU1RMUF9NU1ZDX0xJQiA8PSAxMzEwKQorIyAgZGVmaW5lIF9TVExQX1ZFTkRPUl9HTE9CQUxfQ1NURAorI2VuZGlmCisKKyNpZiAoX1NUTFBfTVNWQ19MSUIgPj0gMTMwMCkgJiYgIWRlZmluZWQoVU5ERVJfQ0UpCisvKiBTdGFydGluZyB3aXRoIE1TVkMgNy4wIGFuZCBjb21waWxlcnMgc2ltdWxhdGluZyBpdCwKKyAqIHdlIGFzc3VtZSB0aGF0IHRoZSBuZXcgU0RLIGlzIGdyYW50ZWQ6CisgKi8KKyMgIGRlZmluZSBfU1RMUF9ORVdfUExBVEZPUk1fU0RLIDEKKyNlbmRpZgorCisjaWYgKF9TVExQX01TVkNfTElCIDwgMTMwMCkgLyogaW5jbHVkaW5nIE1TVkMgNi4wICovCisjICBkZWZpbmUgX1NUTFBfR0xPQkFMX05FV19IQU5ETEVSIDEKKyMgIGRlZmluZSBfU1RMUF9WRU5ET1JfVU5FWFBFQ1RFRF9TVEQKKyMgIGRlZmluZSBfU1RMUF9ORVdfRE9OVF9USFJPV19CQURfQUxMT0MgMQorI2VuZGlmCisKKyNpZiAoX1NUTFBfTVNWQ19MSUIgPCAxMTAwKQorLyogdXAgdG8gNC4yLCBsaWJyYXJ5IGlzIGluIGdsb2JhbCBuYW1lc3BhY2UgKi8KKyMgIGRlZmluZSBfU1RMUF9WRU5ET1JfR0xPQkFMX1NURAorI2VuZGlmCisKKyNpZiAoX1NUTFBfTVNWQ19MSUIgPD0gMTAxMCkKKy8qICJib29sIiBpcyByZXNlcnZlZCBpbiBNU1ZDIDQuMSB3aGlsZSA8eXZhbHMuaD4gYWJzZW50LCBzbyA6ICovCisjICBkZWZpbmUgX1NUTFBfTk9fQkFEX0FMTE9DCisjICBkZWZpbmUgX1NUTFBfSEFTX05PX05FV19DX0hFQURFUlMgMQorIyAgZGVmaW5lIF9TVExQX05PX05FV19ORVdfSEVBREVSIDEKKyNlbGlmIChfU1RMUF9NU1ZDX0xJQiA8IDExMDApCisvKiBWQysrIDQuMiBhbmQgaGlnaGVyICovCisjICBkZWZpbmUgX1NUTFBfWVZBTFNfSCAxCisjICBkZWZpbmUgX1NUTFBfVVNFX05PX0lPU1RSRUFNUyAxCisjZW5kaWYKKworI2RlZmluZSBfU1RMUF9FWFBPUlRfREVDTFNQRUMgX19kZWNsc3BlYyhkbGxleHBvcnQpCisjZGVmaW5lIF9TVExQX0lNUE9SVF9ERUNMU1BFQyBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKworI2lmICFkZWZpbmVkIChfU1RMUF9NU1ZDKSB8fCAoX1NUTFBfTVNWQyA+PSAxMTAwKQorIyAgZGVmaW5lIF9TVExQX0NMQVNTX0VYUE9SVF9ERUNMU1BFQyBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyMgIGRlZmluZSBfU1RMUF9DTEFTU19JTVBPUlRfREVDTFNQRUMgX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fRExMKSB8fCBkZWZpbmVkIChfRExMKSB8fCBkZWZpbmVkIChfUlRMRExMKSB8fCBkZWZpbmVkIChfQUZYRExMKQorIyAgZGVmaW5lIF9TVExQX1JVTlRJTUVfRExMCisjZW5kaWYKKyNpZiBkZWZpbmVkIChfX0JVSUxESU5HX1NUTFBPUlQpICYmIFwKKyAgIChkZWZpbmVkIChfU1RMUF9VU0VfRFlOQU1JQ19MSUIpIHx8IFwKKyAgICBkZWZpbmVkIChfU1RMUF9SVU5USU1FX0RMTCkgJiYgIWRlZmluZWQgKF9TVExQX1VTRV9TVEFUSUNfTElCKSkKKyMgIGRlZmluZSBfU1RMUF9ETEwKKyNlbmRpZgorI2luY2x1ZGUgPHN0bC9jb25maWcvX2RldGVjdF9kbGxfb3JfbGliLmg+CisjdW5kZWYgX1NUTFBfUlVOVElNRV9ETEwKKyN1bmRlZiBfU1RMUF9ETEwKKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9EWU5BTUlDX0xJQikKKyMgIHVuZGVmICBfU1RMUF9VU0VfREVDTFNQRUMKKyMgIGRlZmluZSBfU1RMUF9VU0VfREVDTFNQRUMgMQorIyAgaWYgKF9TVExQX01TVkMgPj0gMTIwMCkgJiYgKF9TVExQX01TVkMgPCAxMzAwKQorIyAgICBkZWZpbmUgX1NUTFBfVVNFX01TVkM2X01FTV9UX0JVR19XT1JLQVJPVU5EIDEKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmICFkZWZpbmVkIChfU1RMUF9JTVBPUlRfVEVNUExBVEVfS0VZV09SRCkKKyMgIGlmICFkZWZpbmVkIChfTVNDX0VYVEVOU0lPTlMpIHx8IGRlZmluZWQoX1NUTFBfTVNWQykgJiYgX1NUTFBfTVNWQyA+PSAxMzAwCisjICAgIGRlZmluZSBfU1RMUF9JTVBPUlRfVEVNUExBVEVfS0VZV09SRAorIyAgZWxzZQorIyAgICBkZWZpbmUgX1NUTFBfSU1QT1JUX1RFTVBMQVRFX0tFWVdPUkQgZXh0ZXJuCisjICBlbmRpZgorI2VuZGlmCisjZGVmaW5lIF9TVExQX0VYUE9SVF9URU1QTEFURV9LRVlXT1JECisKKyNpZiBkZWZpbmVkIChfU1RMUF9NU1ZDKSAmJiAoX1NUTFBfTVNWQyA8IDEyMDApCisvKiAgICBvbmx5IHN0YXRpYyBTVExwb3J0IGxpYiBub3cgd29ya3MgZm9yIFZDIDUuMCAqLworIyAgdW5kZWYgIF9TVExQX1VTRV9TVEFUSUNfTElCCisjICB1bmRlZiAgX1NUTFBfVVNFX0RZTkFNSUNfTElCCisjICBkZWZpbmUgX1NUTFBfVVNFX1NUQVRJQ19MSUIKKy8qICAgIGRpc2FibGUgaG9vayB3aGljaCBtYWtlcyB0ZW1wbGF0ZSBzeW1ib2xzIHRvIGJlIHNlYXJjaGVkIGZvciBpbiB0aGUgbGlicmFyeSAqLworIyAgdW5kZWYgX1NUTFBfTk9fQ1VTVE9NX0lPCisjZW5kaWYKKworI2luY2x1ZGUgPHN0bC9jb25maWcvX2F1dG9fbGluay5oPgorCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNJTkdfUExBVEZPUk1fU0RLX0NPTVBJTEVSKQorLyogVGhlIFdpbmRvd3MgNjQgYml0cyBTREsgcmVxdWlyZWQgZm9yIHRoZSBtb21lbnQgbGluayB0byBidWZmZXJvdmVyZmxvd1UubGliIGZvcgorICogYWRkaXRpb25hbCBidWZmZXIgb3ZlcnJ1biBjaGVja3MuIFJhdGhlciB0aGFuIHJlcXVpcmUgdGhlIFNUTHBvcnQgYnVpbGQgc3lzdGVtIGFuZAorICogdXNlcnMgdG8gZXhwbGljaXRlbHkgbGluayB3aXRoIGl0IHdlIHVzZSB0aGUgTVNWQyBhdXRvIGxpbmsgZmVhdHVyZS4KKyAqLworIyAgaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfVVNFX0FVVE9fTElOSykgfHwgZGVmaW5lZCAoX19CVUlMRElOR19TVExQT1JUKQorIyAgICBwcmFnbWEgY29tbWVudCAobGliLCAiYnVmZmVyb3ZlcmZsb3dVLmxpYiIpCisjICAgIGlmIGRlZmluZWQgKF9TVExQX1ZFUkJPU0VfQVVUT19MSU5LKQorIyAgICAgIHByYWdtYSBtZXNzYWdlICgiU1RMcG9ydDogQXV0byBsaW5raW5nIHRvIGJ1ZmZlcm92ZXJmbG93VS5saWIiKQorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCisvKiBMb2NhbCBWYXJpYWJsZXM6CisgKiBtb2RlOkMrKworICogRW5kOgorICovCmRpZmYgLS1naXQgYS9zdGwvY29uZmlnL19td2NjbmxtLmggYi9zdGwvY29uZmlnL19td2NjbmxtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVhZjliNQotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9jb25maWcvX213Y2NubG0uaApAQCAtMCwwICsxLDg4IEBACisvLyBTVExwb3J0IGNvbmZpZ3VyYXRpb24gZmlsZQorLy8gSXQgaXMgaW50ZXJuYWwgU1RMcG9ydCBoZWFkZXIgLSBETyBOT1QgaW5jbHVkZSBpdCBkaXJlY3RseQorCisjZGVmaW5lIF9TVExQX0NPTVBJTEVSICJNZXRyb3dlcmtzIENvZGVXYXJyaW9yIgorCisvLyBCcmluZyBpbiBkZWZpbml0aW9uIG9mIF9fTVNMX18gYW5kIHJlbGF0ZWQgaXRlbXMKKyNpbmNsdWRlIDxtc2xHbG9iYWxzLmg+CisjaW5jbHVkZSA8YW5zaV9wYXJtcy5oPgorCisvLyAqKiogQ29kZVdhcnJpb3IgQ29tcGlsZXIgQ29tbW9uIEZlYXR1cmVzICoqKgorI2lmIF9fb3B0aW9uKGxvbmdsb25nKQorIyAgZGVmaW5lIF9TVExQX0xPTkdfTE9ORyAgbG9uZyBsb25nCisjZW5kaWYKKworI2RlZmluZSBfU1RMUF9VU0VfVU5JWF9FTVVMQVRJT05fSU8gIDEKKworI2RlZmluZSBfU1RMUF9VU0VfQVVUT19QVFJfQ09OVkVSU0lPTlMgIDEKKworI2lmZGVmIF9fSU5URUxfXworIyAgZGVmaW5lIF9TVExQX0xJVFRMRV9FTkRJQU4KKyNlbHNlCisjICBkZWZpbmUgX1NUTFBfQklHX0VORElBTgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9NU0xfTk9fTE9DQUxFKQorIyAgZGVmaW5lIF9TVExQX05PX0lNUE9SVF9MT0NBTEUKKyNlbmRpZgorCisjaWYgIV9fb3B0aW9uKCB3Y2hhcl90eXBlICkKKyMgIGRlZmluZSBfU1RMUF9XQ0hBUl9UX0lTX1VTSE9SVAorI2VuZGlmCisKKyNpZiBfX01XRVJLU19fIDwgMHgzMDAwCisvLyAqKiogQ29kZVdhcnJpb3IgQ29tcGlsZXIgQ29tbW9uIEJ1Z3MgKioqCisjICBkZWZpbmUgX19NU0xfRklYX0lURVJBVE9SU19fKG15VHlwZSkgICAgLy8gU29tZSBNU0wgaGVhZGVycyByZWx5IG9uIHRoaXMKKyMgIGRlZmluZSBfU1RMUF9OT19GUklFTkRfVEVNUExBVEVTIDEgIC8vIEJ1ZyBteXN0ZXJpb3VzbHkgcmVpbnRyb2R1Y2VkIGluIHRoaXMgdmVyc2lvbi4KKyMgIGRlZmluZSBfU1RMUF9USFJPV19SRVRVUk5fQlVHICAxCisjZW5kaWYKKworI2lmIF9fTVdFUktTX18gPj0gMHgyNDA1CisjICBkZWZpbmUgX1NUTFBfSEFTX05BVElWRV9GTE9BVF9BQlMKKyNlbmRpZgorCisjaWYgX19NV0VSS1NfXyA8IDB4MjQwNQorIyAgZGVmaW5lIF9TVExQX1NUQVRJQ19DT05TVF9JTklUX0JVRworI2VuZGlmCisKKyNpZiBfX01XRVJLU19fIDw9IDB4MjMwMworIyAgZGVmaW5lIF9TVExQX05PX1RFTVBMQVRFX0NPTlZFUlNJT05TICAxCisjICBkZWZpbmUgX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFX0tFWVdPUkQgIDEKKyNlbmRpZgorCisjaWYgX19NV0VSS1NfXyA8IDB4MjMwMQorIyAgZGVmaW5lIF9TVExQX01FTUJFUl9TUEVDSUFMSVpBVElPTl9CVUcgIDEKKyNlbmRpZgorCisjaWYgX19NV0VSS1NfXyA8IDB4MjMwMCAgICAvLyBDVyBQcm81IGZlYXR1cmVzCisjICBkZWZpbmUgX1NUTFBfSU5MSU5FX01FTUJFUl9URU1QTEFURVMgMQorIyAgZGVmaW5lIF9TVExQX1JFTE9QU19JTl9TVERfQlVHICAgMQorIyAgZGVmaW5lIF9TVExQX0RFRl9DT05TVF9QTENUX05FV19CVUcgMQorIyAgZGVmaW5lIF9TVExQX0RFRl9DT05TVF9ERUZfUEFSQU1fQlVHIDEKKyMgIGRlZmluZSBfU1RMUF9OT19UWVBFTkFNRV9PTl9SRVRVUk5fVFlQRQorI2VuZGlmCisKKy8vIGZpeGVzIHRvIG5hdGl2ZSBpbmNsdXNpb24gd3JhcHBlcnMuCisjaWYgX19NV0VSS1NfXyA+PSAweDIzMDAgIC8vIENXUHJvNSBjaGFuZ2VzIHBhdGhzIC0gZHdhIDIvMjgvOTkKKyMgIGRlZmluZSBfU1RMUF9OQVRJVkVfSU5DTFVERV9QQVRIICAuLi9ud3Nkay9pbmNsdWRlL25sbQorIyAgZGVmaW5lIF9TVExQX05BVElWRV9DX0lOQ0xVREVfUEFUSCAgLi4vbndzZGsvaW5jbHVkZS9ubG0KKyMgIGRlZmluZSBfU1RMUF9OQVRJVkVfSEVBREVSKGhlYWRlcikgICAgIDwuLi9ud3Nkay9pbmNsdWRlL25sbS8jI2hlYWRlcj4KKyMgIGRlZmluZSBfU1RMUF9OQVRJVkVfQ1BQX0NfSEVBREVSKGhlYWRlcikgICAgIDwuLi9MaWJyYXJpZXMvTVNMIEMrKy9JbmNsdWRlLyMjaGVhZGVyPgorIyAgZGVmaW5lIF9TVExQX05BVElWRV9DX0hFQURFUihoZWFkZXIpICAgICA8Li4vbndzZGsvaW5jbHVkZS9ubG0vIyNoZWFkZXI+CisjICBkZWZpbmUgX1NUTFBfTkFUSVZFX0NQUF9SVU5USU1FX0hFQURFUihoZWFkZXIpIDwuLi9MaWJyYXJpZXMvTVNMIEMrKy9JbmNsdWRlLyMjaGVhZGVyPgorCisjICBkZWZpbmUgX1NUTFBfVkVORE9SX0dMT0JBTF9DU1REICAxCisjICBkZWZpbmUgX1NUTFBfTk9fVkVORE9SX1NURExJQl9MICAxCisjICBkZWZpbmUgX1NUTFBfTk9fVkVORE9SX01BVEhfRiAgICAxCisjICBkZWZpbmUgX1NUTFBfTk9fVkVORE9SX01BVEhfTCAgICAxCisgICAgIC8vIyAgIGRlZmluZSBfTVNMX05PX1RIUk9XX1NQRUNTCisgICAgIC8vIyAgIGRlZmluZSBfU1RECisgICAgIC8vIyAgIGRlZmluZSBfQ1NURAorI2VuZGlmCisKKy8vIGZicAorI2lmICFkZWZpbmVkKCBfX01TTF9DUFBfXyApIHx8IF9fTVNMX0NQUF9fIDw9IDB4NDEwNQorIyAgZGVmaW5lIF9TVExQX05PX05BVElWRV9XSURFX1NUUkVBTVMgMQorIyBlbmRpZgorCisjZGVmaW5lIF9TVExQX0RMTEVYUE9SVF9ORUVEU19QUkVERUNMQVJBVElPTiAxCmRpZmYgLS1naXQgYS9zdGwvY29uZmlnL19td2Vya3MuaCBiL3N0bC9jb25maWcvX213ZXJrcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZGEzMmIKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvY29uZmlnL19td2Vya3MuaApAQCAtMCwwICsxLDE2MSBAQAorLy8gU1RMcG9ydCBjb25maWd1cmF0aW9uIGZpbGUKKy8vIEl0IGlzIGludGVybmFsIFNUTHBvcnQgaGVhZGVyIC0gRE8gTk9UIGluY2x1ZGUgaXQgZGlyZWN0bHkKKworI2RlZmluZSBfU1RMUF9DT01QSUxFUiAiTWV0cm93ZXJrIENvZGV3YXJyaW9yIgorCisvLyBCcmluZyBpbiBkZWZpbml0aW9uIG9mIF9fTVNMX18gYW5kIHJlbGF0ZWQgaXRlbXMKKyNpbmNsdWRlIDxtc2xHbG9iYWxzLmg+CisjaW5jbHVkZSA8YW5zaV9wYXJtcy5oPgorCisvLworLy8gIENvbXBpbGVyIGZlYXR1cmVzCisvLworCisKKy8vICoqKiBDb2RlV2FycmlvciBDb21waWxlciBDb21tb24gRmVhdHVyZXMgKioqCisjICBpZiBfX29wdGlvbihsb25nbG9uZykKKyMgICBkZWZpbmUgX1NUTFBfTE9OR19MT05HICBsb25nIGxvbmcKKyMgIGVuZGlmCisKKyMgIGRlZmluZSBfU1RMUF9VU0VfVU5JWF9FTVVMQVRJT05fSU8gIDEKKworIyAgZGVmaW5lIF9TVExQX1VTRV9BVVRPX1BUUl9DT05WRVJTSU9OUyAgMQorCisjIGlmZGVmIF9fSU5URUxfXworIyAgZGVmaW5lIF9TVExQX0xJVFRMRV9FTkRJQU4KKyMgZWxzZQorIyAgZGVmaW5lIF9TVExQX0JJR19FTkRJQU4KKyMgZW5kaWYKKworI2lmIGRlZmluZWQoX01TTF9OT19MT0NBTEUpCisjZGVmaW5lIF9TVExQX05PX0lNUE9SVF9MT0NBTEUKKyNlbmRpZgorI2lmICFfX29wdGlvbiggd2NoYXJfdHlwZSApCisjIGRlZmluZSBfU1RMUF9XQ0hBUl9UX0lTX1VTSE9SVAorI2VuZGlmCisKKyMgIGlmIF9fTVdFUktTX18gPCAweDMwMDAKKy8vICoqKiBDb2RlV2FycmlvciBDb21waWxlciBDb21tb24gQnVncyAqKioKKyMgICBkZWZpbmUgX19NU0xfRklYX0lURVJBVE9SU19fKG15VHlwZSkgICAgLy8gU29tZSBNU0wgaGVhZGVycyByZWx5IG9uIHRoaXMKKyMgICBkZWZpbmUgX1NUTFBfTk9fRlJJRU5EX1RFTVBMQVRFUyAxICAvLyBCdWcgbXlzdGVyaW91c2x5IHJlaW50cm9kdWNlZCBpbiB0aGlzIHZlcnNpb24uCisjICAgZGVmaW5lIF9TVExQX1RIUk9XX1JFVFVSTl9CVUcgIDEKKyMgIGVuZGlmCisKKy8vICAqKiogVmVyc2lvbi1zcGVjaWZpYyBzZXR0aW5ncyAqKioKKworIyAgaWYgX19NV0VSS1NfXyA+PSAweDI0MDUKKyMgICBkZWZpbmUgX1NUTFBfSEFTX05BVElWRV9GTE9BVF9BQlMKKyMgIGVuZGlmCisKKyMgIGlmIF9fTVdFUktTX18gPCAweDI0MDUKKyMgICBkZWZpbmUgX1NUTFBfU1RBVElDX0NPTlNUX0lOSVRfQlVHCisjICBlbmRpZgorCisjICBpZiBfX01XRVJLU19fIDw9IDB4MjMwMworIyAgIGRlZmluZSBfU1RMUF9OT19URU1QTEFURV9DT05WRVJTSU9OUyAgMQorIyAgIGRlZmluZSBfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVfS0VZV09SRCAgMQorIyAgZW5kaWYKKworIyAgaWYgX19NV0VSS1NfXyA8IDB4MjMwMQorIyAgIGRlZmluZSBfU1RMUF9NRU1CRVJfU1BFQ0lBTElaQVRJT05fQlVHICAxCisjICBlbmRpZgorCisjICBpZiBfX01XRVJLU19fIDwgMHgyMzAwICAgIC8vIENXIFBybzUgZmVhdHVyZXMKKyMgICBkZWZpbmUgX1NUTFBfSU5MSU5FX01FTUJFUl9URU1QTEFURVMgMQorIyAgIGRlZmluZSBfU1RMUF9SRUxPUFNfSU5fU1REX0JVRyAgIDEKKyMgICBkZWZpbmUgX1NUTFBfREVGX0NPTlNUX1BMQ1RfTkVXX0JVRyAxCisjICAgZGVmaW5lIF9TVExQX0RFRl9DT05TVF9ERUZfUEFSQU1fQlVHIDEKKyMgICBkZWZpbmUgX1NUTFBfTk9fVFlQRU5BTUVfT05fUkVUVVJOX1RZUEUKKyMgIGVuZGlmCisKKyMgIGlmIF9fTVdFUktTX18gPCAweDIyMDAgICAgLy8gQ1cgUHJvNCBmZWF0dXJlcworIyAgIGRlZmluZSBfU1RMUF9CUk9LRU5fVVNJTkdfRElSRUNUSVZFICAxCisjICAgZGVmaW5lIF9TVExQX05PX01FTUJFUl9URU1QTEFURVMgMQorIyAgIGRlZmluZSBfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVfQ0xBU1NFUyAxCisjICAgZGVmaW5lIF9TVExQX05PX01FTUJFUl9URU1QTEFURV9LRVlXT1JEIDEKKyMgICBkZWZpbmUgX1NUTFBfTk9fRlJJRU5EX1RFTVBMQVRFUyAxCisjICAgZGVmaW5lIF9TVExQX05PX1FVQUxJRklFRF9GUklFTkRTIDEKKyMgICBkZWZpbmUgX1NUTFBfTk9fRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSIDEKKyMgIGVuZGlmCisKKyMgIGlmIF9fTVdFUktTX18gPCAweDIxMDAgICAgICAvLyBDVyBQcm8zIGZlYXR1cmVzCisjICAgZGVmaW5lIF9TVExQX05PX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04gMQorIyAgIGRlZmluZSBfU1RMUF9IQVNfTk9fTkFNRVNQQUNFUyAxCisjICAgZGVmaW5lIF9TVExQX05PX0VYUExJQ0lUX0ZVTkNUSU9OX1RNUExfQVJHUyAxCisKKyMgICBkZWZpbmUgX1NUTFBfTkVFRF9UWVBFTkFNRSAgICAgICAgMQorIyAgIGRlZmluZSBfU1RMUF9OT19BUlJPV19PUEVSQVRPUiAxCisjICAgZGVmaW5lIF9TVExQX1RFTVBMQVRFX1BBUkFNX1NVQlRZUEVfQlVHICAxCisjICAgZGVmaW5lIF9TVExQX0ZPUkNFRF9JTkxJTkVfSU5TVEFOVElBVElPTl9CVUcgIDEKKyMgICBkZWZpbmUgX1NUTFBfTVVMVElfQ09OU1RfVEVNUExBVEVfQVJHX0JVRyAgMQorIyAgIGRlZmluZSBfU1RMUF9JTkxJTkVfTkFNRV9SRVNPTFVUSU9OX0JVRyAgMQorLy8gKioqIE1ldHJvd2Vya3MgU3RhbmRhcmQgTGlicmFyeSBCdWcgKioqCisjICAgZGVmaW5lIF9TVExQX01TVkM1MF9DT01QQVRJQklMSVRZIDEKKyMgIGVuZGlmCisKKyMgIGlmIF9fTVdFUktTX18gPCAweDIwMDAgICAgICAvLyB2LiAyLjAgZmVhdHVyZXMKKyMgICBkZWZpbmUgX1NUTFBfTk9fV0NIQVJfVCAxCisjICAgZGVmaW5lIF9TVExQX05PX0RFRkFVTFRfTk9OX1RZUEVfUEFSQU0gMQorIyAgIGRlZmluZSBfU1RMUF9OT05fVFlQRV9UTVBMX1BBUkFNX0JVRyAgMSAgLy8gZHdhIDgvMjEvOTcgLSB0aGlzIGJ1ZyBmaXhlZCBmb3IgQ1dQcm8yCisjICBlbmRpZgorCisjICBpZiBfX01XRVJLU19fIDwgMHgxOTAwICAgICAgICAgICAgICAgICAvLyBkd2EgOC8xOS85NyAtIDEuOSBDb21waWxlciBmZWF0dXJlIGRlZmluZXMKKyMgICBkZWZpbmUgX1NUTFBfTElNSVRFRF9ERUZBVUxUX1RFTVBMQVRFUyAxCisjICAgZGVmaW5lIF9TVExQX0JBU0VfVFlQRURFRl9CVUcgICAgICAgIDEKKyMgICBkZWZpbmUgX1NUTFBfQkFTRV9NQVRDSF9CVUcgICAxCisjICAgZGVmaW5lIF9TVExQX05PTlRFTVBMX0JBU0VfTUFUQ0hfQlVHIDEKKyMgICBkZWZpbmUgX1NUTFBfREVGQVVMVF9UWVBFX1BBUkFNICAxICAgICAgLy8gTW9yZSBsaW1pdGVkIHRlbXBsYXRlIHBhcmFtZXRlcnMKKworIyAgIGlmIF9fTVdFUktTX18gPCAweDE4MDAKKyAgICBfX0dJVkVfVVBfV0lUSF9TVEwoQ1dfMTgpCisjICAgZW5kaWYKKworIyAgZW5kaWYKKworCisvLyBmaXhlcyB0byBuYXRpdmUgaW5jbHVzaW9uIHdyYXBwZXJzLgorIyBpZiBfX01XRVJLU19fID49IDB4MjMwMCAgLy8gQ1dQcm81IGNoYW5nZXMgcGF0aHMgLSBkd2EgMi8yOC85OQorIyAgZGVmaW5lIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEggIC4uL2luY2x1ZGUKKyMgIGRlZmluZSBfU1RMUF9OQVRJVkVfQ19JTkNMVURFX1BBVEggIC4uL2luY2x1ZGUKKyMgIGRlZmluZSBfU1RMUF9OQVRJVkVfSEVBREVSKGhlYWRlcikgICAgIDwuLi9pbmNsdWRlLyMjaGVhZGVyPgorIyAgZGVmaW5lIF9TVExQX05BVElWRV9DUFBfQ19IRUFERVIoaGVhZGVyKSAgICAgPC4uL2luY2x1ZGUvIyNoZWFkZXI+CisjICBkZWZpbmUgX1NUTFBfTkFUSVZFX0NfSEVBREVSKGhlYWRlcikgICAgIDwuLi9pbmNsdWRlLyMjaGVhZGVyPgorIyAgZGVmaW5lIF9TVExQX05BVElWRV9DUFBfUlVOVElNRV9IRUFERVIoaGVhZGVyKSA8Li4vaW5jbHVkZS8jI2hlYWRlcj4KKyMgZWxzZQorCisjICBkZWZpbmUgX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSCAgTWFjaW50b3NoIEhEOkNvZGV3YXJyaW9yIFBybyA0Ok1ldHJvd2Vya3MgQ29kZVdhcnJpb3I6TWV0cm93ZXJrcyBTdGFuZGFyZCBMaWJyYXJ5Ok1TTCBDKys6SW5jbHVkZQorIyAgZGVmaW5lIF9TVExQX05BVElWRV9DX0lOQ0xVREVfUEFUSCAgTWFjaW50b3NoIEhEOkNvZGV3YXJyaW9yIFBybyA0Ok1ldHJvd2Vya3MgQ29kZVdhcnJpb3I6TWV0cm93ZXJrcyBTdGFuZGFyZCBMaWJyYXJ5Ok1TTCBDOk1TTCBDb21tb246UHVibGljIEluY2x1ZGVzCisjICBkZWZpbmUgX1NUTFBfTkFUSVZFX0hFQURFUihoZWFkZXIpICAgICA8TWFjaW50b3NoIEhEOkNvZGV3YXJyaW9yIFBybyA0Ok1ldHJvd2Vya3MgQ29kZVdhcnJpb3I6TWV0cm93ZXJrcyBTdGFuZGFyZCBMaWJyYXJ5Ok1TTCBDKys6SW5jbHVkZTojI2hlYWRlcj4KKyMgIGRlZmluZSBfU1RMUF9OQVRJVkVfQ1BQX0NfSEVBREVSKGhlYWRlcikgICAgIDxNYWNpbnRvc2ggSEQ6Q29kZXdhcnJpb3IgUHJvIDQ6TWV0cm93ZXJrcyBDb2RlV2FycmlvcjpNZXRyb3dlcmtzIFN0YW5kYXJkIExpYnJhcnk6TVNMIEMrKzpJbmNsdWRlOiMjaGVhZGVyPgorIyAgZGVmaW5lIF9TVExQX05BVElWRV9DX0hFQURFUihoZWFkZXIpICAgICA8TWFjaW50b3NoIEhEOkNvZGV3YXJyaW9yIFBybyA0Ok1ldHJvd2Vya3MgQ29kZVdhcnJpb3I6TWV0cm93ZXJrcyBTdGFuZGFyZCBMaWJyYXJ5Ok1TTCBDOk1TTCBDb21tb246UHVibGljIEluY2x1ZGVzOiMjaGVhZGVyPgorIyAgZGVmaW5lIF9TVExQX05BVElWRV9DUFBfUlVOVElNRV9IRUFERVIoaGVhZGVyKSA8TWFjaW50b3NoIEhEOkNvZGV3YXJyaW9yIFBybyA0Ok1ldHJvd2Vya3MgQ29kZVdhcnJpb3I6TWV0cm93ZXJrcyBTdGFuZGFyZCBMaWJyYXJ5Ok1TTCBDOk1TTCBDb21tb246UHVibGljIEluY2x1ZGVzOiMjaGVhZGVyPgorCisjIGVuZGlmCisKKy8vRm9sbG93aW5nIGJsb2NrIGNvbWUgZnJvbSBib29zdCBpbnRyaW5zaWNzLmhwcCBmaWxlOgorI2lmIGRlZmluZWQgKF9fTVNMX0NQUF9fKSAmJiAoX19NU0xfQ1BQX18gPj0gMHg4MDAwKQorICAgIC8vIE1ldHJvd2Vya3MgY29tcGlsZXIgaXMgYWNxdWlyaW5nIGludHJpbnNpYyB0eXBlIHRyYWl0cyBzdXBwb3J0CisgICAgLy8gcG9zdCB2ZXJzaW9uIDguICBXZSBob29rIGludG8gdGhlIHB1Ymxpc2hlZCBpbnRlcmZhY2UgdG8gcGljayB1cAorICAgIC8vIHVzZXIgZGVmaW5lZCBzcGVjaWFsaXphdGlvbnMgYXMgd2VsbCBhcyBjb21waWxlciBpbnRyaW5zaWNzIGFzCisgICAgLy8gYW5kIHdoZW4gdGhleSBiZWNvbWUgYXZhaWxhYmxlOgorIyAgIGluY2x1ZGUgPG1zbF91dGlsaXR5PgorIyAgIGRlZmluZSBfU1RMUF9IQVNfVFJJVklBTF9DT05TVFJVQ1RPUihUKSBNZXRyb3dlcmtzOjpoYXNfdHJpdmlhbF9kZWZhdWx0X2N0b3I8VD46OnZhbHVlCisjICAgZGVmaW5lIF9TVExQX0hBU19UUklWSUFMX0NPUFkoVCkgTWV0cm93ZXJrczo6aGFzX3RyaXZpYWxfY29weV9jdG9yPFQ+Ojp2YWx1ZQorIyAgIGRlZmluZSBfU1RMUF9IQVNfVFJJVklBTF9BU1NJR04oVCkgTWV0cm93ZXJrczo6aGFzX3RyaXZpYWxfYXNzaWdubWVudDxUPjo6dmFsdWUKKyMgICBkZWZpbmUgX1NUTFBfSEFTX1RSSVZJQUxfREVTVFJVQ1RPUihUKSBNZXRyb3dlcmtzOjpoYXNfdHJpdmlhbF9kdG9yPFQ+Ojp2YWx1ZQorIyAgIGRlZmluZSBfU1RMUF9JU19QT0QoVCkgTWV0cm93ZXJrczo6aXNfUE9EPFQ+Ojp2YWx1ZQorIyAgIGRlZmluZSBfU1RMUF9IQVNfVFlQRV9UUkFJVFNfSU5UUklOU0lDUworI2VuZGlmCisKKy8vIGZicAorIyBpZiAhZGVmaW5lZCggX19NU0xfQ1BQX18gKSB8fCBfX01TTF9DUFBfXyA8PSAweDQxMDUKKyMgICBkZWZpbmUgX1NUTFBfTk9fTkFUSVZFX1dJREVfU1RSRUFNUyAxCisjICBlbmRpZgorCisjIGlmIGRlZmluZWQoX19NQUNIX18pCisjICBkZWZpbmUgX1NUTFBfTUFDCisjICBkZWZpbmUgT19CSU5BUlkgMAorIyBlbGlmIGRlZmluZWQobWFjaW50b3NoKQorIyAgZGVmaW5lIF9OT1RIUkVBRFMKKyMgZW5kaWYKKyMgZGVmaW5lIF9TVExQX0RMTEVYUE9SVF9ORUVEU19QUkVERUNMQVJBVElPTiAxCmRpZmYgLS1naXQgYS9zdGwvY29uZmlnL19uYXRpdmVfaGVhZGVycy5oIGIvc3RsL2NvbmZpZy9fbmF0aXZlX2hlYWRlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWY0YmM5Ci0tLSAvZGV2L251bGwKKysrIGIvc3RsL2NvbmZpZy9fbmF0aXZlX2hlYWRlcnMuaApAQCAtMCwwICsxLDUwIEBACisgLyoKKyAgKgorICAqIENvcHlyaWdodCAoYykgMjAwNgorICAqIEZyYW5jb2lzIER1bW9udAorICAqCisgICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICAqCisgICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICAqCisgICovCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTUFLRV9IRUFERVIpCisjICBkZWZpbmUgX1NUTFBfTUFLRV9IRUFERVIocGF0aCwgaGVhZGVyKSA8cGF0aC9oZWFkZXI+CisjZW5kaWYKKworI2lmICFkZWZpbmVkIChfU1RMUF9OQVRJVkVfSEVBREVSKQorIyAgaWYgIWRlZmluZWQgKF9TVExQX05BVElWRV9JTkNMVURFX1BBVEgpCisjICAgIGRlZmluZSBfU1RMUF9OQVRJVkVfSU5DTFVERV9QQVRIIC4uL2luY2x1ZGUKKyMgIGVuZGlmCisjICBkZWZpbmUgX1NUTFBfTkFUSVZFX0hFQURFUihoZWFkZXIpIF9TVExQX01BS0VfSEVBREVSKF9TVExQX05BVElWRV9JTkNMVURFX1BBVEgsaGVhZGVyKQorI2VuZGlmCisKKy8qIEZvciBzb21lIGNvbXBpbGVycywgQyBoZWFkZXJzIGxpa2UgPHN0ZGlvLmg+IGFyZSBsb2NhdGVkIGluIHNlcGFyYXRlIGRpcmVjdG9yeSAqLworI2lmICFkZWZpbmVkIChfU1RMUF9OQVRJVkVfQ19IRUFERVIpCisjICBpZiAhZGVmaW5lZCAoX1NUTFBfTkFUSVZFX0NfSU5DTFVERV9QQVRIKQorIyAgICBkZWZpbmUgX1NUTFBfTkFUSVZFX0NfSU5DTFVERV9QQVRIIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEgKKyMgIGVuZGlmCisjICBkZWZpbmUgX1NUTFBfTkFUSVZFX0NfSEVBREVSKGhlYWRlcikgIF9TVExQX01BS0VfSEVBREVSKF9TVExQX05BVElWRV9DX0lOQ0xVREVfUEFUSCxoZWFkZXIpCisjZW5kaWYKKworLyogRm9yIHNvbWUgY29tcGlsZXJzLCBDLWxpYnJhcnkgaGVhZGVycyBsaWtlIDxjc3RkaW8+IGFyZSBsb2NhdGVkIGluIHNlcGFyYXRlIGRpcmVjdG9yeSAqLworI2lmICFkZWZpbmVkIChfU1RMUF9OQVRJVkVfQ1BQX0NfSEVBREVSKQorIyAgaWYgIWRlZmluZWQgKF9TVExQX05BVElWRV9DUFBfQ19JTkNMVURFX1BBVEgpCisjICAgIGRlZmluZSBfU1RMUF9OQVRJVkVfQ1BQX0NfSU5DTFVERV9QQVRIIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEgKKyMgIGVuZGlmCisjICBkZWZpbmUgX1NUTFBfTkFUSVZFX0NQUF9DX0hFQURFUihoZWFkZXIpICBfU1RMUF9NQUtFX0hFQURFUihfU1RMUF9OQVRJVkVfQ1BQX0NfSU5DTFVERV9QQVRILGhlYWRlcikKKyNlbmRpZgorCisvKiBTb21lIGNvbXBpbGVycyBsb2NhdGUgYmFzaWMgQysrIHJ1bnRpbWUgc3VwcG9ydCBoZWFkZXJzICg8bmV3PiwgPHR5cGVpbmZvPiwgPGV4Y2VwdGlvbj4pIGluIHNlcGFyYXRlIGRpcmVjdG9yeSAqLworI2lmICFkZWZpbmVkICggX1NUTFBfTkFUSVZFX0NQUF9SVU5USU1FX0hFQURFUiApCisjICBpZiAhZGVmaW5lZCAoX1NUTFBfTkFUSVZFX0NQUF9SVU5USU1FX0lOQ0xVREVfUEFUSCkKKyMgICAgZGVmaW5lIF9TVExQX05BVElWRV9DUFBfUlVOVElNRV9JTkNMVURFX1BBVEggX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSAorIyAgZW5kaWYKKyMgIGRlZmluZSBfU1RMUF9OQVRJVkVfQ1BQX1JVTlRJTUVfSEVBREVSKGhlYWRlcikgIF9TVExQX01BS0VfSEVBREVSKF9TVExQX05BVElWRV9DUFBfUlVOVElNRV9JTkNMVURFX1BBVEgsaGVhZGVyKQorI2VuZGlmCmRpZmYgLS1naXQgYS9zdGwvY29uZmlnL19uZXR3YXJlLmggYi9zdGwvY29uZmlnL19uZXR3YXJlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRkZWJkMgotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9jb25maWcvX25ldHdhcmUuaApAQCAtMCwwICsxIEBACisjZGVmaW5lIF9TVExQX1BMQVRGT1JNICJOb3ZlbGwgTmV0d2FyZSIKZGlmZiAtLWdpdCBhL3N0bC9jb25maWcvX29wZW5ic2QuaCBiL3N0bC9jb25maWcvX29wZW5ic2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjY5ODI1Ci0tLSAvZGV2L251bGwKKysrIGIvc3RsL2NvbmZpZy9fb3BlbmJzZC5oCkBAIC0wLDAgKzEgQEAKKyNkZWZpbmUgX1NUTFBfUExBVEZPUk0gIk9wZW4gQlNEIgpkaWZmIC0tZ2l0IGEvc3RsL2NvbmZpZy9fcHJvbG9nLmggYi9zdGwvY29uZmlnL19wcm9sb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWQ5NDNmCi0tLSAvZGV2L251bGwKKysrIGIvc3RsL2NvbmZpZy9fcHJvbG9nLmgKQEAgLTAsMCArMSw1MiBAQAorCisjaWYgZGVmaW5lZCAoX1NUTFBfTVNWQykgfHwgZGVmaW5lZCAoX19JQ0wpCisKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9NU1ZDKSB8fCAoX1NUTFBfTVNWQyA+PSAxMjAwKQorIyAgICBwcmFnbWEgd2FybmluZyhwdXNoKQorIyAgZW5kaWYKKyMgIGluY2x1ZGUgPHN0bC9jb25maWcvX3dhcm5pbmdzX29mZi5oPgorLyogV2UgYXJlIGZvcmNpbmcgdGhlIGFsaWdubWVudCB0byBndWFyYW50eSB0aGF0IGxpYnJhcmllcyBhcmUgdXNlCisgKiB3aXRoIHRoZSBzYW1lIGFsaWdubWVudCBhcyB0aGUgb25lIHVzZSB0byBidWlsZCB0aGVtLgorICovCisjICBpZiAhZGVmaW5lZCAoX1dJTjY0KQorIyAgICBwcmFnbWEgcGFjayhwdXNoLCA4KQorIyAgZWxzZQorIyAgICBwcmFnbWEgcGFjayhwdXNoLCAxNikKKyMgIGVuZGlmCisKKyNlbGlmIGRlZmluZWQgKF9fQk9STEFORENfXykKKworIyAgcHJhZ21hIG9wdGlvbiBwdXNoCisjICBwcmFnbWEgb3B0aW9uIC1WeC0gLVZlLSAtYTggLWIgLXBjCisjICBpbmNsdWRlIDxzdGwvY29uZmlnL193YXJuaW5nc19vZmYuaD4KKworI2VsaWYgZGVmaW5lZCAoX19zZ2kpICYmICFkZWZpbmVkIChfX0dOVUNfXykgJiYgKF9NSVBTX1NJTSAhPSBfTUlQU19TSU1fQUJJMzIpCisKKyMgIHByYWdtYSBzZXQgd29mZiAxMjA5CisjICBwcmFnbWEgc2V0IHdvZmYgMTE3NAorIyAgcHJhZ21hIHNldCB3b2ZmIDEzNzUKKy8qIGZyb20gaXRlcmF0b3JfYmFzZS5oICovCisjICBwcmFnbWEgc2V0IHdvZmYgMTE4MworCisjZWxpZiBkZWZpbmVkIChfX0RFQ0NYWCkKKworIyAgaWZkZWYgX19QUkFHTUFfRU5WSVJPTk1FTlQKKyMgICAgcHJhZ21hIF9fZW52aXJvbm1lbnQgX19zYXZlCisjICAgIHByYWdtYSBfX2Vudmlyb25tZW50IF9faGVhZGVyX2RlZmF1bHRzCisjICBlbmRpZgorCisjZWxpZiBkZWZpbmVkIChfX0lCTUNQUF9fKQorLyogc3VwcmVzcyBFREMzMTMwOiBBIGNvbnN0YW50IGlzIGJlaW5nIHVzZWQgYXMgYSBjb25kaXRpb25hbCBleHByZXNzaW9uICovCisjICBwcmFnbWEgaW5mbyhub2NuZCkKKworI2VsaWYgZGVmaW5lZCAoX19IUF9hQ0MpCisvKiBfUkVFTlRSQU5UIHNlbGVjdHMgUG9zaXggMWMgdGhyZWFkcyB1bmxlc3MgZHJhZnQ0IHNlbGVjdGVkLgorICogICogVGhpcyB1c2FnZSBpcyBvYnNvbGVzY2VudCwgIi1EX1BPU0lYX0NfU09VUkNFPTE5OTUwNiIgaXMgcHJlZmVycmVkICovCisjICBpZiAwIC8qIGRlZmluZWQgKF9SRUVOVFJBTlQpICYmICEgZGVmaW5lZCAoX1BPU0lYX0NfU09VUkNFKSAqLworIyAgICBkZWZpbmUgX1BPU0lYX0NfU09VUkNFIDE5OTUwNgorIyAgZW5kaWYKKyNlbGlmIGRlZmluZWQgKF9fV0FUQ09NQ1BMVVNQTFVTX18pCisjICBwcmFnbWEgd2FybmluZyA2MDQgMTAgLyogbXVzdCBsb29rYWhlYWQgdG8gZGV0ZXJtaW5lLi4uICovCisjICBwcmFnbWEgd2FybmluZyA1OTQgMTAgLyogcmVzb2x2ZWQgYXMgZGVjbGFyYXRpb24vdHlwZSAqLworIyAgcHJhZ21hIHdhcm5pbmcgNTk1IDEwIC8qIHJlc29sdmVkIGFzIGFuIGV4cHJlc3Npb24gKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3RsL2NvbmZpZy9fc2dpLmggYi9zdGwvY29uZmlnL19zZ2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjc1MThmCi0tLSAvZGV2L251bGwKKysrIGIvc3RsL2NvbmZpZy9fc2dpLmgKQEAgLTAsMCArMSw5MiBAQAorLy8gU1RMcG9ydCBjb25maWd1cmF0aW9uIGZpbGUKKy8vIEl0IGlzIGludGVybmFsIFNUTHBvcnQgaGVhZGVyIC0gRE8gTk9UIGluY2x1ZGUgaXQgZGlyZWN0bHkKKworI2RlZmluZSBfU1RMUF9DT01QSUxFUiAiQ0MiCisKKyNkZWZpbmUgX1NUTFBfSEFTX1NQRUNJRklDX1BST0xPR19FUElMT0cKKworLy8gZGVmaW5lIG5hdGl2ZSBpbmNsdWRlIHBhdGggYmVmb3JlIHRyeWluZyB0byBpbmNsdWRlIGFueXRoaW5nCisKKyNkZWZpbmUgX1NUTFBfTkFUSVZFX0hFQURFUihfX3gpIDwvdXNyL2luY2x1ZGUvQ0MvIyNfX3g+CisjZGVmaW5lIF9TVExQX05BVElWRV9DX0hFQURFUihfX3gpIDwvdXNyL2luY2x1ZGUvIyNfX3g+CisjZGVmaW5lIF9TVExQX05BVElWRV9PTERfU1RSRUFNU19IRUFERVIoX194KSA8L3Vzci9pbmNsdWRlL0NDLyMjX194PgorI2RlZmluZSBfU1RMUF9OQVRJVkVfQ1BQX0NfSEVBREVSKF9feCkgPC91c3IvaW5jbHVkZS9DQy8jI19feD4KKyNkZWZpbmUgX1NUTFBfTkFUSVZFX0NQUF9SVU5USU1FX0hFQURFUihfX3gpIDwvdXNyL2luY2x1ZGUvQ0MvIyNfX3g+CisKKyNkZWZpbmUgX1NUTFBfTk9fTkFUSVZFX01CU1RBVEVfVAorCisjZGVmaW5lIF9TVExQX05PX1VTSU5HX0ZPUl9HTE9CQUxfRlVOQ1RJT05TCisjZGVmaW5lIF9TVExQX05PX05BVElWRV9XSURFX0ZVTkNUSU9OUworI2RlZmluZSBfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVfQ0xBU1NFUworCisvLyAjZGVmaW5lIF9TVExQX05PX0JBRF9BTExPQworCisjZGVmaW5lIF9TVExfSEFTX05BTUVTUEFDRVMKKworI2lmICEgZGVmaW5lZCAoX19FWENFUFRJT05TKSAmJiAhIGRlZmluZWQgKF9TVExQX05PX0VYQ0VQVElPTlMpCisjICBkZWZpbmUgX1NUTFBfTk9fRVhDRVBUSU9OUworI2VuZGlmCisKKy8vICNkZWZpbmUgX1NUTFBfTk9USFJPVyB0aHJvdygpCisKKyNkZWZpbmUgX19FREdfU1dJVENIRVMKKworI2RlZmluZSBfU1RMUF9VU0VfU0dJX1NUUklORyAgICAgICAgIDEKKworI2RlZmluZSBfU1RMUF9IQVNfTk9fTkVXX0NfSEVBREVSUyAxCisvLyAjICBkZWZpbmUgX1NUTFBfVkVORE9SX0dMT0JBTF9FWENFUFRfU1RECisKKyNkZWZpbmUgX1NUTFBfTk9fUE9TVF9DT01QQVRJQkxFX1NFQ1RJT04KKworI2luY2x1ZGUgPHN0YW5kYXJkcy5oPgorCisjaWYgIShfQ09NUElMRVJfVkVSU0lPTiA+PSA3MzApCisjICBkZWZpbmUgX1NUTFBfTk9fTkVXX05FV19IRUFERVIgMQorI2VuZGlmCisKKyNpZiAoX0NPTVBJTEVSX1ZFUlNJT04gPj0gNzMwICYmIGRlZmluZWQoX1NUQU5EQVJEX0NfUExVU19QTFVTKSkKKyMgIGRlZmluZSBfU1RMUF9FWFRFUk5fUkFOR0VfRVJST1JTCisjZW5kaWYKKworI2lmICFkZWZpbmVkKF9CT09MKQorIyAgZGVmaW5lIF9TVExQX05PX0JPT0wKKyNlbmRpZgorI2lmIGRlZmluZWQoX01JUFNfU0lNKSAmJiBfTUlQU19TSU0gPT0gX0FCSU8zMgorIyAgZGVmaW5lIF9TVExQX1NUQVRJQ19DT05TVF9JTklUX0JVRworI2VuZGlmCisKKyNpZiAoX0NPTVBJTEVSX1ZFUlNJT04gPCA3MjApIHx8IChkZWZpbmVkKF9NSVBTX1NJTSkgJiYgX01JUFNfU0lNID09IF9BQklPMzIpCisjICBkZWZpbmUgX1NUTFBfREVGX0NPTlNUX1BMQ1RfTkVXX0JVRworIyAgZGVmaW5lIF9TVExQX0RFRl9DT05TVF9ERUZfUEFSQU1fQlVHCisjZW5kaWYKKyNpZiAhKChfQ09NUElMRVJfVkVSU0lPTiA+PSA3MzApICYmIGRlZmluZWQoX01JUFNfU0lNKSAmJiBfTUlQU19TSU0gIT0gX0FCSU8zMikKKyMgIGRlZmluZSBfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVfS0VZV09SRAorI2VuZGlmCisjaWYgIWRlZmluZWQoX1NUQU5EQVJEX0NfUExVU19QTFVTKQorIyAgZGVmaW5lIF9TVExQX05PX0VYUExJQ0lUX0ZVTkNUSU9OX1RNUExfQVJHUworI2VuZGlmCisjaWYgISgoX0NPTVBJTEVSX1ZFUlNJT04gPj0gNzIxKSAmJiBkZWZpbmVkKF9OQU1FU1BBQ0VTKSkKKyMgIGRlZmluZSBfU1RMUF9IQVNfTk9fTkFNRVNQQUNFUworI2VuZGlmCisjaWYgKF9DT01QSUxFUl9WRVJTSU9OIDwgNzIxKSB8fCAhZGVmaW5lZChfU1RMX0hBU19OQU1FU1BBQ0VTKSB8fCBkZWZpbmVkKF9TVExQX05PX05BTUVTUEFDRVMpCisjICBkZWZpbmUgX1NUTFBfTk9fRVhDRVBUSU9OX0hFQURFUgorI2VuZGlmCisjaWYgX0NPTVBJTEVSX1ZFUlNJT04gPCA3MzAgfHwgIWRlZmluZWQoX1NUQU5EQVJEX0NfUExVU19QTFVTKSB8fCAhZGVmaW5lZChfTkFNRVNQQUNFUykKKyMgIGRlZmluZSBfU1RMUF9OT19CQURfQUxMT0MKKyNlbmRpZgorI2lmIGRlZmluZWQoX0xPTkdMT05HKSAmJiBkZWZpbmVkKF9TR0lBUEkpICYmIF9TR0lBUEkKKyMgIGRlZmluZSBfU1RMUF9MT05HX0xPTkcgbG9uZyBsb25nCisjZW5kaWYKKyNpZiAhKF9DT01QSUxFUl9WRVJTSU9OID49IDczMCAmJiBkZWZpbmVkKF9TVEFOREFSRF9DX1BMVVNfUExVUykpCisjICBkZWZpbmUgX1NUTFBfVVNFX05PX0lPU1RSRUFNUworI2VuZGlmCisjaWYgIShfQ09NUElMRVJfVkVSU0lPTiA+PSA3MzAgJiYgZGVmaW5lZChfU1RBTkRBUkRfQ19QTFVTX1BMVVMpKQorIyAgZGVmaW5lIF9TVExQX05PX0FUX01FTUJFUl9GVU5DVElPTgorI2VuZGlmCisvLyAjICAgaWYgIShfQ09NUElMRVJfVkVSU0lPTiA+PSA3MzAgJiYgZGVmaW5lZChfU1RBTkRBUkRfQ19QTFVTX1BMVVMpKQorI2lmICEoX0NPTVBJTEVSX1ZFUlNJT04gPj0gNzIxICYmIGRlZmluZWQoX1NUQU5EQVJEX0NfUExVU19QTFVTKSkKKyMgIGRlZmluZSBfU1RMUF9OT19URU1QTEFURV9DT05WRVJTSU9OUworI2VuZGlmCisjaWYgISgoX0NPTVBJTEVSX1ZFUlNJT04gPj0gNzMwKSAmJiBkZWZpbmVkKF9NSVBTX1NJTSkgJiYgX01JUFNfU0lNICE9IF9BQklPMzIpCisjICBkZWZpbmUgX1NUTFBfTk9fRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N0bC9jb25maWcvX3NvbGFyaXMuaCBiL3N0bC9jb25maWcvX3NvbGFyaXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTAwZDljCi0tLSAvZGV2L251bGwKKysrIGIvc3RsL2NvbmZpZy9fc29sYXJpcy5oCkBAIC0wLDAgKzEsODUgQEAKKyNpZm5kZWYgX19zdGxfY29uZmlnX19zb2xhcmlzX2gKKyNkZWZpbmUgX19zdGxfY29uZmlnX19zb2xhcmlzX2gKKworI2RlZmluZSBfU1RMUF9QTEFURk9STSAiU3VuIFNvbGFyaXMiCisKKy8qIGluY2x1ZGUgc3lzdGVtIGZlYXR1cmVzIGZpbGUgKi8KKyNpbmNsdWRlIDxzeXMvZmVhdHVyZV90ZXN0cy5oPgorCisvKiBzeXN0ZW0tZGVwZW5kZW50IGRlZmluZXMgKi8KKworLyoKKyAqIFNob3VsZCBiZSBmaXhlZDoKKyAqIDEuIF9fU3VuT1NfNV94IG5vdCBkZWZpbmVkLCBhbmQgbm8gd2F5IHRvIGRlcml2ZSB0aGlzIGZyb20gaGVhZGVycyBvbmx5OworICogICAgZGVmaW5lIGl0IHdpdGggLUQgb24gY29tcGlsZXIgY29tbWFuZCBsaW5lIGlzIGEgYmFkIGlkZWEgdG9vLgorICoKKyAqIDIuIFNvbGFyaXMgbWF5IGhhcywgYnV0IG1heSBoYXNuJ3QgTUFUSF9GIGFuZCBNQVRIX0wgZnVuY3Rpb25zIChldmVuIHdpdGggdHdvCisgKiAgICB1bmRlcnNjb3JlcyktLS10aGlzIGRlcGVuZHMgdXBvbiBzeXN0ZW0gdXBkYXRlIGxldmVsIGFuZCBzZWVtcyBsZWdhbGx5IHByZXNlbnQKKyAqICAgIG9ubHkgaW4gU29sYXJpcyAxMCAoaS5lLiBJIHNhdyBTb2xhcmlzIDkgd2l0aCBhbmQgd2l0aG91dCBfX2Fjb3NmIGluIGxpYm0uc28uMSkKKyAqCisgKiAgICAgICAgICAgICAgLSBwdHIKKyAqLworCisjaWYgZGVmaW5lZCAoX19TdW5PU181XzgpICYmICEgZGVmaW5lZCAoX1NUTFBfSEFTX05PX05FV19DX0hFQURFUlMpICYmICggX19jcGx1c3BsdXMgPj0gMTk5NzExTCkKKyMgIGRlZmluZSBfU1RMUF9IQVNfTkFUSVZFX0ZMT0FUX0FCUworI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9YT1BFTl9TT1VSQ0UpICYmIChfWE9QRU5fVkVSU0lPTiAtIDAgPj0gNCkKKyMgZGVmaW5lIF9TVExQX1JBTkQ0OCAxCisjZW5kaWYKKworI2lmIChkZWZpbmVkKF9YT1BFTl9TT1VSQ0UpICYmIChfWE9QRU5fVkVSU0lPTiAtIDAgPT0gNCkpIHx8IGRlZmluZWQgKF9fU3VuT1NfNV82KQorIyBkZWZpbmUgX1NUTFBfV0NIQVJfU1VOUFJPX0VYQ0xVREUgMQorIyBkZWZpbmUgX1NUTFBfTk9fTkFUSVZFX1dJREVfRlVOQ1RJT05TIDEKKyNlbmRpZgorCisvKiBib3JpcyA6IHRoaXMgc2hvdWxkIGFsd2F5cyBiZSBkZWZpbmVkIGZvciBTb2xhcmlzIDUgJiA2LiBBbnkgaWRlYXMgaG93IHRvIGRvIGl0PyAqLworI2lmICEoZGVmaW5lZCAoIF9fS0NDICkgJiYgX19LQ0NfVkVSU0lPTiA+IDM0MDAgKSAmJiBcCisgICgoZGVmaW5lZChfX1N1bk9TXzVfNV8xKSB8fCBkZWZpbmVkKF9fU3VuT1NfNV82KSApKQorIyAgaWZuZGVmIF9TVExQX05PX05BVElWRV9NQlNUQVRFX1QKKyMgICAgZGVmaW5lIF9TVExQX05PX05BVElWRV9NQlNUQVRFX1QgMQorIyAgZW5kaWYKKyNlbmRpZiAvKiBLQ0MgKi8KKworLyogRm9yIFNQQVJDIHdlIHVzZSBsaWdodHdlaWdodCBzeW5jaHJvbml6YXRpb24gKi8KKyNpZiBkZWZpbmVkIChfX3NwYXJjKSAvKiAmJiAoZGVmaW5lZCAoX1JFRU5UUkFOVCkgfHwgZGVmaW5lZCAoX1BUSFJFQURTKSkgKi8KKyMgIGlmICggKGRlZmluZWQgKF9fR05VQ19fKSAmJiBkZWZpbmVkIChfX3NwYXJjX3Y5X18pKSB8fCBcCisgICAgICAgIGRlZmluZWQgKF9fc3BhcmN2OSkgKSBcCisgICAgICAgJiYgIWRlZmluZWQoX05PVEhSRUFEUykgJiYgIWRlZmluZWQgKF9TVExQX05PX1NQQVJDX1NPTEFSSVNfVEhSRUFEUykKKyMgICAgZGVmaW5lIF9TVExQX1NQQVJDX1NPTEFSSVNfVEhSRUFEUworIyAgICBkZWZpbmUgX1NUTFBfVEhSRUFEU19ERUZJTkVECisjICBlbmRpZgorI2VuZGlmCisKKy8qIGdjYyBkb2VzIG5vdCBzdXBwb3J0IEVMRjY0IHlldCA7IGhvd2V2ZXI7IGl0IHN1cHBvcnRzIHVsdHJhc3BhcmMgKyB2OHBsdXMuCisgKiBsaW1pdHMuaCBjb250YWlucyBpbnZhbGlkIHZhbHVlcyBmb3IgdGhpcyBjb21iaW5hdGlvbgorICovCisjaWZkZWYgX19HTlVDX18KKyMgIGlmIChkZWZpbmVkICAoX19zcGFyY192OV9fKSB8fCBkZWZpbmVkIChfX3NwYXJjdjkpKSAmJiAhZGVmaW5lZCAoIF9fV09SRDY0ICkgJiYgIWRlZmluZWQoX19hcmNoNjRfXykKKyMgICAgZGVmaW5lIF9fTE9OR19NQVhfXyAyMTQ3NDgzNjQ3TAorIyAgZW5kaWYKKyNlbmRpZgorCisvKgorICogSG1tLCBJIGRvbid0IGZvdW5kIGluIFNvbGFyaXMgOSBzeXN0ZW0gaGVhZGVycyBkZWZpbml0aW9uIGxpa2UgX19TdW5PU181XzkKKyAqIChkZWZpbmVkIGluIFN1blBybz8pOyBJIGFsc28gY2FuJ3QgZmluZCBmdW5jdGlvbnMgbGlrZSBmbW9kZiAoYWdhaW4sCisgKiBJIGZvdW5kIG1vZGZmIGluIGxpYmMsIGJ1dCBubyBhY29zZiBldGMuKS4gU3RyYW5nZSwgSSBzYXcgX19jb3NmIGZ1bmN0aW9ucworICogKGJ1aWx0LWluPykgYXQgbGVhc3Qgd2l0aCBnY2Mgc29tZSB0aW1lIGFnbywgYnV0IGRvbid0IHNlZSBvbmVzIHdpdGgKKyAqIGdjYyAzLjMuMiBvbiBTdW5PUyBzcGFyYy1zb2xhcmlzMSA1LjkgR2VuZXJpY18xMTIyMzMtMDMgc3VuNHUgc3BhcmMgU1VOVyxVbHRyYS02MAorICogZnJvbSBTb3JjZWZvcmdlJ3MgQ0YuCisgKiAgICAyMDA1LTEyLTE1LCAtIHB0cgorICoKKyAqIFAuUy4gVGhhdCdzIHdoeSBJIGFkZCB0d28gZGVmaW5lczoKKyAqLworCisvKiAjaWZkZWYgX19HTlVDX18gKi8KKyNkZWZpbmUgX1NUTFBfTk9fVkVORE9SX01BVEhfRgorI2RlZmluZSBfU1RMUF9OT19WRU5ET1JfTUFUSF9MCisvKiAjZW5kaWYgKi8KKworI2lmZGVmIF9fR05VQ19fCisjICBkZWZpbmUgX1NUTFBfV0NIQVJfQk9STEFORF9FWENMVURFCisjICBkZWZpbmUgX1NUTFBfTk9fTkFUSVZFX1dJREVfRlVOQ1RJT05TIDEKKyNlbmRpZgorCisjZW5kaWYgLyogX19zdGxfY29uZmlnX19zb2xhcmlzX2ggKi8KZGlmZiAtLWdpdCBhL3N0bC9jb25maWcvX3N1bnByb2NjLmggYi9zdGwvY29uZmlnL19zdW5wcm9jYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NGUxMjEKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvY29uZmlnL19zdW5wcm9jYy5oCkBAIC0wLDAgKzEsMTYxIEBACisvLyBTVExwb3J0IGNvbmZpZ3VyYXRpb24gZmlsZQorLy8gSXQgaXMgaW50ZXJuYWwgU1RMcG9ydCBoZWFkZXIgLSBETyBOT1QgaW5jbHVkZSBpdCBkaXJlY3RseQorCisjZGVmaW5lIF9TVExQX0NPTVBJTEVSICJTdW5wcm8gQ0MiCisKKyNkZWZpbmUgX1NUTFBfTE9OR19MT05HICBsb25nIGxvbmcKKworLy8gR0FCOiAxMS8wOS8wNQorLy8gU3RhcnRpbmcgd2l0aCA1LjAgdGhlIFNUTHBvcnQgY29kZSBleHBlY3RzIHRvIGJlCisvLyBpbnN0YW50aWF0ZWQgZHVyaW5nIGNvbXBpbGUgdGltZS4gVGhpcyBpcyBkdWUgdG8gdW5kZWZpbmcKKy8vIGEgbnVtYmVyIG9mIGRlZmluZXMgdGhhdCBhcmUgYWxzbyB1c2VkIGluIHRoZSBjIHZlcnNpb25zCisvLyBvZiB0aGUgZmlsZS4gV2hlbiB0aGV5IGFyZSB1bmRlZmVkIHRoZSBjIHZlcnNpb24gZmFpbHMgdG8KKy8vIGNvbXBpbGUuCisvLyAjICBkZWZpbmUgX1NUTFBfTElOS19USU1FX0lOU1RBTlRJQVRJT04gMQorCisjaWYgISBkZWZpbmVkKF9CT09MKQorIyAgZGVmaW5lIF9TVExQX05PX0JPT0wgMQorI2VuZGlmCisKKy8vIGNvbXBhdGliaWxpdHkgbW9kZSBzdHVmZgorI2lmIChfX1NVTlBST19DQyA+PSAweDUxMCkgJiYgKCFkZWZpbmVkIChfX1NVTlBST19DQ19DT01QQVQpIHx8IChfX1NVTlBST19DQ19DT01QQVQgPT0gNSApKQorIyAgZGVmaW5lIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEggLi4vQ0MvQ3N0ZAorIyAgZGVmaW5lIF9TVExQX05BVElWRV9DUFBfUlVOVElNRV9JTkNMVURFX1BBVEggLi4vQ0MKKyNlbGlmIChfX1NVTlBST19DQyA+PSAweDUwMCkgJiYgKCFkZWZpbmVkIChfX1NVTlBST19DQ19DT01QQVQpIHx8IChfX1NVTlBST19DQ19DT01QQVQgPT0gNSApKQorIyAgZGVmaW5lIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEggLi4vQ0MKKyNlbGlmIChkZWZpbmVkIChfX1NVTlBST19DQ19DT01QQVQpICYmIF9fU1VOUFJPX0NDX0NPTVBBVCA9PSA0KQorIyAgZGVmaW5lIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEggLi4vQ0M0CisjZWxzZQorIyAgZGVmaW5lIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEggLi4vQ0MKKyNlbmRpZgorCisjZGVmaW5lIF9TVExQX1NUQVRJQ19DT05TVF9JTklUX0JVRyAxCisKKyNpZiAoX19TVU5QUk9fQ0MgPCAweDUzMCkKKy8vIHRob3NlIGFyZSB0ZXN0ZWQgYW5kIHByb3ZlZCBub3QgdG8gd29yay4uLgorIyAgZGVmaW5lIF9TVExQX05PX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04gMQorIyAgZGVmaW5lIF9TVExQX05PX01FTUJFUl9URU1QTEFURV9DTEFTU0VTIDEKKyMgIGRlZmluZSBfU1RMUF9VU0VfT0xEX0hQX0lURVJBVE9SX1FVRVJJRVMKKyNlbmRpZgorCisjaWZkZWYgX1NUTFBfVVNFX05PX0lPU1RSRUFNUworIyAgZGVmaW5lIF9TVExQX0hBU19OT19ORVdfQ19IRUFERVJTIDEKKyNlbmRpZgorCisvLyB0aG9zZSBkbyBub3QgZGVwZW5kIG9uIGNvbXBhdGliaWxpdHkKKyNpZiAoX19TVU5QUk9fQ0MgPCAweDUxMCkKKyMgIGRlZmluZSBfU1RMUF9OT19UWVBFTkFNRV9PTl9SRVRVUk5fVFlQRSAxCisjICBkZWZpbmUgX1NUTFBfTk9OVEVNUExfQkFTRV9NQVRDSF9CVUcgMQorI2VuZGlmCisKKyNpZiAoX19TVU5QUk9fQ0MgPCAweDUxMCkgfHwgKGRlZmluZWQgKF9fU1VOUFJPX0NDX0NPTVBBVCkgJiYgKF9fU1VOUFJPX0NDX0NPTVBBVCA8IDUpKQorCisjICBkZWZpbmUgX1NUTFBfTk9fUVVBTElGSUVEX0ZSSUVORFMgMQorCisvLyBubyBwYXJ0aWFsICwganVzdCBmb3IgZXhwbGljaXQgb25lCisjICBkZWZpbmUgX1NUTFBfUEFSVElBTF9TUEVDX05FRURTX1RFTVBMQVRFX0FSR1MKKyMgIGRlZmluZSBfU1RMUF9OT05fVFlQRV9UTVBMX1BBUkFNX0JVRyAxCisKKyMgIGRlZmluZSBfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVTIDEKKyMgIGRlZmluZSBfU1RMUF9OT19GUklFTkRfVEVNUExBVEVTIDEKKworIyAgZGVmaW5lIF9TVExQX05PX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUiAxCisjICBkZWZpbmUgX1NUTFBfTk9fRVhQTElDSVRfRlVOQ1RJT05fVE1QTF9BUkdTCisjICBkZWZpbmUgX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFX0tFWVdPUkQgMQorI2VuZGlmCisKKy8vIEZlYXR1cmVzIHRoYXQgZGVwZW5kIG9uIGNvbXBhdGliaWxpdHkgc3dpdGNoCisjaWYgKCBfX1NVTlBST19DQyA8IDB4NTAwICkgfHwgKGRlZmluZWQgKF9fU1VOUFJPX0NDX0NPTVBBVCkgJiYgKF9fU1VOUFJPX0NDX0NPTVBBVCA8IDUpKQorCisjICBpZm5kZWYgX1NUTFBfVVNFX05PX0lPU1RSRUFNUworIyAgICBkZWZpbmUgX1NUTFBfVVNFX05PX0lPU1RSRUFNUyAxCisjICBlbmRpZgorIyAgZGVmaW5lIF9TVExQX05PX05FV19ORVdfSEVBREVSIDEKKy8vICMgIGRlZmluZSBfU1RMUF9OT19SRUxPUFNfTkFNRVNQQUNFCisjICBkZWZpbmUgX1NUTFBfSEFTX05PX05BTUVTUEFDRVMgMQorIyAgZGVmaW5lIF9TVExQX05FRURfTVVUQUJMRSAgMQorIyAgZGVmaW5lIF9TVExQX05PX0JBRF9BTExPQyAxCisjICBkZWZpbmUgX1NUTFBfTk9fRVhDRVBUSU9OX0hFQURFUiAxCisjICBkZWZpbmUgX1NUTFBfTkFUSVZFX0NfSU5DTFVERV9QQVRIIC4uL2luY2x1ZGUKKyNlbGlmIChfX1NVTlBST19DQyA8IDB4NTEwKQorLy8gIyAgZGVmaW5lIF9TVExQX05BVElWRV9DX0hFQURFUihoZWFkZXIpIDwuLi9DQy8jI2hlYWRlciMjLlNVTldDQ2g+CisjICBkZWZpbmUgX1NUTFBfTkFUSVZFX0NQUF9DX0hFQURFUihoZWFkZXIpIDwuLi9DQy8jI2hlYWRlciMjLlNVTldDQ2g+CisjICBkZWZpbmUgX1NUTFBfTkFUSVZFX0NfSU5DTFVERV9QQVRIIC91c3IvaW5jbHVkZQorI2VsaWYgZGVmaW5lZCggX19TdW5PU181XzVfMSApIHx8IGRlZmluZWQoIF9fU3VuT1NfNV82ICkgfHwgZGVmaW5lZCggX19TdW5PU181XzcgKQorIyAgZGVmaW5lIF9TVExQX05BVElWRV9DX0lOQ0xVREVfUEFUSCAuLi9DQy9zdGQKKyMgIGRlZmluZSBfU1RMUF9OQVRJVkVfQ1BQX0NfSU5DTFVERV9QQVRIIC4uL0NDL3N0ZAorI2Vsc2UKKyMgIGRlZmluZSBfU1RMUF9OQVRJVkVfQ19JTkNMVURFX1BBVEggL3Vzci9pbmNsdWRlCisjICBkZWZpbmUgX1NUTFBfTkFUSVZFX0NQUF9DX0lOQ0xVREVfUEFUSCAuLi9DQy9zdGQKKyNlbmRpZgorCisjaWYgKCBfX1NVTlBST19DQyA8IDB4NTAwICkKKworIyAgdW5kZWYgX1NUTFBfTkFUSVZFX0NfSEVBREVSCisjICB1bmRlZiBfU1RMUF9OQVRJVkVfQ1BQX0NfSEVBREVSCisKKyMgIGRlZmluZSB3aW50X3QgX193aW50X3QKKy8vIGZhbW91cyBDQyA0LjIgYnVnCisjICBkZWZpbmUgX1NUTFBfSU5MSU5FX1NUUklOR19MSVRFUkFMX0JVRyAxCisvLyAvdXNyL2luY2x1ZGUKKyMgIGRlZmluZSBfU1RMUF9OQVRJVkVfQ19JTkNMVURFX1BBVEggLi4vaW5jbHVkZQorCisvLyA0LjIgY2Fubm90IGhhbmRsZSBpdGVyYXRvcl90cmFpdHM8X1RwPjo6aXRlcmF0b3JfY2F0ZWdvcnkgYXMgYSByZXR1cm4gdHlwZSA7KAorIyAgZGVmaW5lIF9TVExQX1VTRV9PTERfSFBfSVRFUkFUT1JfUVVFUklFUworCisvLyA0LjIgZG9lcyBub3QgbGlrZSBpdAorIyAgdW5kZWYgIF9TVExQX1BBUlRJQUxfU1BFQ19ORUVEU19URU1QTEFURV9BUkdTCisKKyMgIGRlZmluZSBfU1RMUF9MSU1JVEVEX0RFRkFVTFRfVEVNUExBVEVTIDEKKworIyAgZGVmaW5lIF9TVExQX05FRURfVFlQRU5BTUUgMQorIyAgZGVmaW5lIF9TVExQX05FRURfRVhQTElDSVQgMQorIyAgZGVmaW5lIF9TVExQX05PX0JBRF9BTExPQyAxCisjICBkZWZpbmUgX1NUTFBfTk9fQVJST1dfT1BFUkFUT1IgMQorCisjICBkZWZpbmUgX1NUTFBfREVGX0NPTlNUX1BMQ1RfTkVXX0JVRyAxCisjICBkZWZpbmUgX1NUTFBfREVGX0NPTlNUX0RFRl9QQVJBTV9CVUcgMQorIyAgZGVmaW5lIF9TVExQX0dMT0JBTF9ORVNURURfUkVUVVJOX1RZUEVfUEFSQU1fQlVHIDEKKyMgIHVuZGVmICBfU1RMUF9IQVNfTk9fTkVXX0NfSEVBREVSUworIyAgZGVmaW5lIF9TVExQX0hBU19OT19ORVdfQ19IRUFERVJTIDEKKy8vICMgIGRlZmluZSBfU1RMUF9ET05UX1NJTVVMQVRFX1BBUlRJQUxfU1BFQ19GT1JfVFlQRV9UUkFJVFMKKworIyAgaWYgKCBfX1NVTlBST19DQyA8IDB4NDIwICkKKyMgICAgZGVmaW5lIF9TVExQX05PX1BBUlRJQUxfU1BFQ0lBTElaQVRJT05fU1lOVEFYIDEKKyMgICAgZGVmaW5lIF9TVExQX05PX05FV19TVFlMRV9DQVNUUyAxCisjICAgIGRlZmluZSBfU1RMUF9OT19NRVRIT0RfU1BFQ0lBTElaQVRJT04gMQorIyAgICBpZiAoIF9fU1VOUFJPX0NDID4gMHg0MDEgKQorIyAgICAgIGlmIChfX1NVTlBST19DQz09MHg0MTApCisjICAgICAgICBkZWZpbmUgX1NUTFBfQkFTRV9UWVBFREVGX09VVFNJREVfQlVHICAxCisjICAgICAgZW5kaWYKKyMgICAgZWxzZQorICAgLy8gU1VOUHJvIEMrKyA0LjAuMQorIyAgICAgIGRlZmluZSBfU1RMUF9CQVNFX01BVENIX0JVRyAgICAgICAgICAxCisjICAgICAgZGVmaW5lIF9TVExQX0JBU0VfVFlQRURFRl9CVUcgICAgICAgIDEKKyMgICAgICBpZiAoKCBfX1NVTlBST19DQyA8IDB4NDAxICkgJiYgIWRlZmluZWQoX19TVU5QUk9fQykpCisgICAgICAgICBfX0dJVkVfVVBfV0lUSF9TVEwoU1VOUFJPXzQwMSkKKyMgICAgICBlbmRpZgorIyAgICBlbmRpZiAvKiA0LjAuMSAqLworIyAgZW5kaWYgLyogNC4yICovCisjZW5kaWYgLyogPCAgNS4wICovCisKKyNpZm5kZWYgX01CU1RBVEVUX0gKKyMgIGRlZmluZSBfTUJTVEFURVRfSAorIyAgdW5kZWYgX01CU1RBVEVfVAorIyAgZGVmaW5lIF9NQlNUQVRFX1QKK3R5cGVkZWYgc3RydWN0IF9fbWJzdGF0ZV90IHsKKyMgIGlmIGRlZmluZWQoX0xQNjQpCisgIGxvbmcgICAgX19maWxsZXJbNF07CisjICBlbHNlCisgIGludCAgICAgX19maWxsZXJbNl07CisjICBlbmRpZgorfSBfX21ic3RhdGVfdDsKKyMgIGlmbmRlZiBfU1RMUF9IQVNfTk9fTkFNRVNQQUNFUworbmFtZXNwYWNlIHN0ZCB7CisgIHR5cGVkZWYgX19tYnN0YXRlX3QgbWJzdGF0ZV90OworfQordXNpbmcgc3RkOjptYnN0YXRlX3Q7CisjICBlbHNlCit0eXBlZGVmIF9fbWJzdGF0ZV90IG1ic3RhdGVfdDsKKyMgIGVuZGlmCisjZW5kaWYgIC8qIF9fTUJTVEFURVRfSCAqLwpkaWZmIC0tZ2l0IGEvc3RsL2NvbmZpZy9fc3ltYW50ZWMuaCBiL3N0bC9jb25maWcvX3N5bWFudGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkyNmJmNQotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9jb25maWcvX3N5bWFudGVjLmgKQEAgLTAsMCArMSw0OCBAQAorLyogU1RMcG9ydCBjb25maWd1cmF0aW9uIGZpbGUKKyAqIEl0IGlzIGludGVybmFsIFNUTHBvcnQgaGVhZGVyIC0gRE8gTk9UIGluY2x1ZGUgaXQgZGlyZWN0bHkKKyAqLworCisjZGVmaW5lIF9TVExQX0NPTVBJTEVSICJTeW1hbnRlYyIKKworLyogaWYgbm90IHVzaW5nIG1heGltdW0gQU5TSSBjb21wYXRpYmlsaXR5ICggLUEgLUFiIC1BdyksCisgKiB1bmNvbW1lbnQgdGhlIGZvbGxvd2luZyB0d28gbGluZXM6CisgKi8KKy8qIyAgZGVmaW5lIF9TVExQX05PX0JPT0wgMSAqLworLyojICBkZWZpbmUgX1NUTFBfTk9fV0NIQVJfVCAxICovCisKKy8qIFRPRE86IENoZWNrIHRoYXQgdGhpcyBjb25maWcgaXMgbmVjZXNzYXJ5IGZvciBhbGwgY29tcGlsZXIgdmVyc2lvbnMuCisgKiBJdCBpcyBoZXJlIGZvciBoaXN0b3JpY2FsIHJlYXNvbnMgZm9yIHRoZSBtb21lbnQuCisgKi8KKyNkZWZpbmUgX1NUTFBfTk9fQ09OVEFJTkVSU19FWFRFTlNJT04KKworIyAgZGVmaW5lIF9TVExQX0hBU19OT19OQU1FU1BBQ0VTIDEKKworIyAgZGVmaW5lIF9TVExQX05FRURfVFlQRU5BTUUgMQorIyAgZGVmaW5lIF9TVExQX05FRURfRVhQTElDSVQgMQorIyAgZGVmaW5lIF9TVExQX05PX05FV19TVFlMRV9DQVNUUyAxCisjICBkZWZpbmUgX1NUTFBfTkVFRF9NVVRBQkxFIDEKKyMgIGRlZmluZSBfU1RMUF9OT19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OX1NZTlRBWCAxCisvKiAjICBkZWZpbmUgX1NUTFBfTk9fQkFEX0FMTE9DIDEgKi8KKworIyAgZGVmaW5lIF9TVExQX05PX01FTUJFUl9URU1QTEFURVMgMQorIyAgZGVmaW5lIF9TVExQX05PX01FTUJFUl9URU1QTEFURV9DTEFTU0VTIDEKKyMgIGRlZmluZSBfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVfS0VZV09SRCAxCisjICBkZWZpbmUgX1NUTFBfTk9fRlJJRU5EX1RFTVBMQVRFUyAxCisjICBkZWZpbmUgX1NUTFBfTk9fUVVBTElGSUVEX0ZSSUVORFMgMQorIyAgZGVmaW5lIF9TVExQX05PX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04gMQorIyAgZGVmaW5lIF9TVExQX05PX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUiAxCisKKy8qICMgIGRlZmluZSBfU1RMUF9OT19ERUZBVUxUX05PTl9UWVBFX1BBUkFNIDEgKi8KKyMgIGRlZmluZSBfU1RMUF9OT19NRVRIT0RfU1BFQ0lBTElaQVRJT04gMQorIyAgZGVmaW5lIF9TVExQX05PX0VYUExJQ0lUX0ZVTkNUSU9OX1RNUExfQVJHUyAxCisvKiAjICBkZWZpbmUgX1NUTFBfTk9fRVhDRVBUSU9OX0hFQURFUiAxICovCisKKyMgIGRlZmluZSBfU1RMUF9IQVNfTk9fTkVXX0NfSEVBREVSUyAxCisKKyMgIGRlZmluZSBfU1RMUF9TVEFUSUNfQ09OU1RfSU5JVF9CVUcgMQorIyAgZGVmaW5lIF9TVExQX1RIUk9XX1JFVFVSTl9CVUcgMQorLyogIyAgZGVmaW5lIF9TVExQX0xJTktfVElNRV9JTlNUQU5USUFUSU9OIDEgKi8KKyMgIGRlZmluZSBfU1RMUF9OT19URU1QTEFURV9DT05WRVJTSU9OUyAxCisKKyMgIGRlZmluZSBfU1RMUF9OT05fVFlQRV9UTVBMX1BBUkFNX0JVRyAxCisKZGlmZiAtLWdpdCBhL3N0bC9jb25maWcvX3N5c3RlbS5oIGIvc3RsL2NvbmZpZy9fc3lzdGVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UyMjA0NAotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9jb25maWcvX3N5c3RlbS5oCkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBNb3Njb3cgQ2VudGVyIGZvciBTUEFSQyBUZWNobm9sb2d5CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworLyoKKyAqIFB1cnBvc2Ugb2YgdGhpcyBmaWxlIDoKKyAqCisgKiBUbyBob2xkIENPTVBJTEVSLVNQRUNJRklDIHBvcnRpb24gb2YgU1RMcG9ydCBzZXR0aW5ncy4KKyAqIEluIGdlbmVyYWwsIHVzZXIgc2hvdWxkIG5vdCBlZGl0IHRoaXMgZmlsZSB1bmxlc3MKKyAqIHVzaW5nIHRoZSBjb21waWxlciBub3QgcmVjb2duaXplZCBiZWxvdy4KKyAqCisgKiBJZiB5b3VyIGNvbXBpbGVyIGlzIG5vdCBiZWluZyByZWNvZ25pemVkIHlldCwKKyAqIHBsZWFzZSBsb29rIGZvciBkZWZpbml0aW9ucyBvZiBtYWNyb3MgaW4gc3RsX215Y29tcC5oLAorICogY29weSBzdGxfbXljb21wLmggdG8gc3RsX1lPVVJfQ09NUElMRVJfTkFNRSwKKyAqIGFkanVzdCBmbGFncyBmb3IgeW91ciBjb21waWxlciwgYW5kIGFkZCAgPGluY2x1ZGUgY29uZmlnL3N0bF9ZT1VSX0NPTVBJTEVSX05BTUU+CisgKiB0byB0aGUgc2VjdG9uIGNvbnRyb2xsZWQgYnkgdW5pcXVlIG1hY3JvIGRlZmluZWQgaW50ZXJuYWx5IGJ5IHlvdXIgY29tcGlsZXIuCisgKgorICogVG8gY2hhbmdlIHVzZXItZGVmaW5hYmxlIHNldHRpbmdzLCBwbGVhc2UgZWRpdCA8dXNlcl9jb25maWcuaD4KKyAqCisgKi8KKworI2lmbmRlZiBfX3N0bF9jb25maWdfX3N5c3RlbV9oCisjZGVmaW5lIF9fc3RsX2NvbmZpZ19fc3lzdGVtX2gKKworI2lmIGRlZmluZWQoX19TWU1CSUFOMzJfXykKKyMgIGlmIGRlZmluZWQoX19HQ0NFX18pIHx8IGRlZmluZWQoX19BUk1DQ19fKQorIyAgICBpbmNsdWRlIDxzdGwvY29uZmlnL3N0bF9nY2NlLmg+CisjICBlbGlmIGRlZmluZWQoX19XSU5TQ1dfXykKKyMgICAgaW5jbHVkZSA8c3RsL2NvbmZpZy9zdGxfd2luc2N3Lmg+CisjICBlbmRpZgorIyAgaW5jbHVkZSA8c3RsL2NvbmZpZy9zdGxfc3ltYmlhbi5oPgorI2VsaWYgZGVmaW5lZCAoX19zdW4pCisjICBpbmNsdWRlIDxzdGwvY29uZmlnL19zb2xhcmlzLmg+CisjICBpZiBkZWZpbmVkIChfX0dOVUNfXykKKyMgICAgaW5jbHVkZSA8c3RsL2NvbmZpZy9fZ2NjLmg+CisjICBlbGlmIGRlZmluZWQgKF9fU1VOUFJPX0NDKQorIyAgICBpbmNsdWRlIDxzdGwvY29uZmlnL19zdW5wcm9jYy5oPgorLyoKKyMgIGlmZGVmIF9fS0NDCisjICAgIGluY2x1ZGUgPHN0bC9jb25maWcvX2thaS5oPgorIyAgZW5kaWYKKyovCisjICBlbGlmIGRlZmluZWQgKF9fQVBPR0VFX18pICAvKiBBcG9nZWUgNC54ICovCisjICAgIGluY2x1ZGUgPHN0bC9jb25maWcvX2FwY2MuaD4KKyMgIGVsaWYgZGVmaW5lZCAoX19GQ0NfVkVSU0lPTikgLyogRnVqaXRzdSBDb21waWxlciwgdjQuMCBhc3N1bWVkICovCisjICAgIGluY2x1ZGUgPHN0bC9jb25maWcvX2Z1aml0c3UuaD4KKyMgIGVuZGlmCisjZWxpZiBkZWZpbmVkIChfX2hwdXgpCisjICBpbmNsdWRlIDxzdGwvY29uZmlnL19ocHV4Lmg+CisjICBpZiBkZWZpbmVkIChfX0dOVUNfXykKKyMgICAgaW5jbHVkZSA8c3RsL2NvbmZpZy9fZ2NjLmg+CisjICBlbGlmIGRlZmluZWQgKF9fSFBfYUNDKQorIyAgICBpbmNsdWRlIDxzdGwvY29uZmlnL19ocGFjYy5oPgorIyAgZW5kaWYKKyNlbGlmIGRlZmluZWQgKEFORFJPSUQpCisgICAvKiBBbmRyb2lkIG1vYmlsZSBwaG9uZSBwbGF0Zm9ybS4gU29tZXdoYXQgYnV0IG5vdCBlbnRpcmVseSBHTlUvTGludXgtbGlrZSAqLworIyAgaW5jbHVkZSA8c3RsL2NvbmZpZy9fYW5kcm9pZC5oPgorIyAgaW5jbHVkZSA8c3RsL2NvbmZpZy9fZ2NjLmg+CisjZWxpZiBkZWZpbmVkIChsaW51eCkgfHwgZGVmaW5lZCAoX19saW51eF9fKQorIyAgaW5jbHVkZSA8c3RsL2NvbmZpZy9fbGludXguaD4KKy8qIEludGVsJ3MgaWNjIGRlZmluZSBfX0dOVUNfXyEgKi8KKyMgIGlmIGRlZmluZWQgKF9fSU5URUxfQ09NUElMRVIpCisjICAgIGluY2x1ZGUgPHN0bC9jb25maWcvX2ljYy5oPgorIyAgZWxpZiBkZWZpbmVkIChfX0dOVUNfXykKKyMgICAgaW5jbHVkZSA8c3RsL2NvbmZpZy9fZ2NjLmg+CisjICBlbmRpZgorLyoKKyMgIGlmZGVmIF9fS0NDCisjICAgIGluY2x1ZGUgPHN0bC9jb25maWcvX2thaS5oPgorIyAgZW5kaWYKKyovCisjZWxpZiBkZWZpbmVkIChfX0ZyZWVCU0RfXykKKyMgIGluY2x1ZGUgPHN0bC9jb25maWcvX2ZyZWVic2QuaD4KKyMgIGlmIGRlZmluZWQgKF9fR05VQ19fKQorIyAgICBpbmNsdWRlIDxzdGwvY29uZmlnL19nY2MuaD4KKyMgIGVuZGlmCisjZWxpZiBkZWZpbmVkIChfX09wZW5CU0RfXykKKyMgIGluY2x1ZGUgPHN0bC9jb25maWcvX29wZW5ic2QuaD4KKyMgIGlmIGRlZmluZWQgKF9fR05VQ19fKQorIyAgICBpbmNsdWRlIDxzdGwvY29uZmlnL19nY2MuaD4KKyMgIGVuZGlmCisjZWxpZiBkZWZpbmVkIChOX1BMQVRfTkxNKSAvKiBOb3ZlbGwgTmV0V2FyZSAqLworIyAgaW5jbHVkZSA8c3RsL2NvbmZpZy9fbmV0d2FyZS5oPgorIyAgaWZkZWYgX19NV0VSS1NfXyAvKiBNZXRyb3dlcmtzIENvZGVXYXJyaW9yICovCisjICAgIGluY2x1ZGUgPHN0bC9jb25maWcvX213Y2NubG0uaD4KKyMgIGVuZGlmCisjZWxpZiBkZWZpbmVkIChfX3NnaSkgLyogSVJJWD8gKi8KKyMgIGRlZmluZSBfU1RMUF9QTEFURk9STSAiU0dJIElyaXgiCisjICBpZiBkZWZpbmVkIChfX0dOVUNfXykKKyMgICAgaW5jbHVkZSA8c3RsL2NvbmZpZy9fZ2NjLmg+CisjICBlbHNlCisjICAgIGluY2x1ZGUgPHN0bC9jb25maWcvX3NnaS5oPgorIyAgZW5kaWYKKyNlbGlmIGRlZmluZWQgKF9fT1M0MDBfXykgLyogQVMvNDAwIEMrKyAqLworIyAgZGVmaW5lIF9TVExQX1BMQVRGT1JNICJPUyA0MDAiCisjICBpZiBkZWZpbmVkIChfX0dOVUNfXykKKyMgICAgaW5jbHVkZSA8c3RsL2NvbmZpZy9fZ2NjLmg+CisjICBlbHNlCisjICAgIGluY2x1ZGUgPHN0bC9jb25maWcvX2FzNDAwLmg+CisjICBlbmRpZgorI2VsaWYgZGVmaW5lZCAoX0FJWCkKKyMgIGluY2x1ZGUgPHN0bC9jb25maWcvX2FpeC5oPgorIyAgaWYgZGVmaW5lZCAoX194bENfXykgfHwgZGVmaW5lZCAoX19JQk1DX18pIHx8IGRlZmluZWQgKCBfX0lCTUNQUF9fICkKKyAgICAgLyogQUlYIHhsQywgVmlzdWFsIEFnZSBDKysgLCBPUy0zOTAgQysrICovCisjICAgIGluY2x1ZGUgPHN0bC9jb25maWcvX2libS5oPgorIyAgZW5kaWYKKyNlbGlmIGRlZmluZWQgKF9DUkFZKSAvKiBDcmF5IEMrKyAzLjQgb3IgMy41ICovCisjICBkZWZpbmUgX1NUTFBfUExBVEZPUk0gIkNyYXkiCisjICBpbmNsdWRlIDxjb25maWcvX2NyYXkuaD4KKyNlbGlmIGRlZmluZWQgKF9fREVDQ1hYKSB8fCBkZWZpbmVkIChfX0RFQ0MpCisjICBkZWZpbmUgX1NUTFBfUExBVEZPUk0gIkRFQ0MiCisjICBpZmRlZiBfX3ZtcworIyAgICBpbmNsdWRlIDxzdGwvY29uZmlnL19kZWNfdm1zLmg+CisjICBlbHNlCisjICAgIGluY2x1ZGUgPHN0bC9jb25maWcvX2RlYy5oPgorIyAgZW5kaWYKKyNlbGlmIGRlZmluZWQgKG1hY2ludG9zaCkgfHwgZGVmaW5lZCAoX01BQykKKyMgIGluY2x1ZGUgPHN0bC9jb25maWcvX21hYy5oPgorIyAgaWYgZGVmaW5lZCAoX19NV0VSS1NfXykKKyMgICAgaW5jbHVkZSA8c3RsL2NvbmZpZy9fbXdlcmtzLmg+CisjICBlbGlmIGRlZmluZWQgKF9fTVJDX18pIHx8IChkZWZpbmVkIChfX1NDX18pICYmIChfX1NDX18gPj0gMHg4ODIpKQorICAgICAvKiBBcHBsZSBNUFcgU0NwcCA4LjguMiwgQXBwbGUgTVBXIE1yQ3BwIDQuMS4wICovCisjICAgIGluY2x1ZGUgPHN0bC9jb25maWcvX2FwcGxlLmg+CisjICBlbmRpZgorI2VsaWYgZGVmaW5lZCAoX19BUFBMRV9fKQorIyAgaW5jbHVkZSA8c3RsL2NvbmZpZy9fbWFjb3N4Lmg+CisjICBpZmRlZiBfX0dOVUNfXworIyAgICBpbmNsdWRlIDxzdGwvY29uZmlnL19nY2MuaD4KKyMgIGVuZGlmCisjZWxpZiBkZWZpbmVkIChfX0NZR1dJTl9fKQorIyAgaW5jbHVkZSA8c3RsL2NvbmZpZy9fY3lnd2luLmg+CisjICBpZiBkZWZpbmVkIChfX0dOVUNfXykKKyMgICAgaW5jbHVkZSA8c3RsL2NvbmZpZy9fZ2NjLmg+CisjICBlbmRpZgorI2VsaWYgZGVmaW5lZCAoX19NSU5HVzMyX18pCisjICBkZWZpbmUgX1NUTFBfUExBVEZPUk0gIk1pbkdXIgorIyAgaWYgZGVmaW5lZCAoX19HTlVDX18pCisjICAgIGluY2x1ZGUgPHN0bC9jb25maWcvX2djYy5oPgorIyAgZW5kaWYKKyMgIGluY2x1ZGUgPHN0bC9jb25maWcvX3dpbmRvd3MuaD4KKyNlbGlmIGRlZmluZWQgKF9XSU4zMikgfHwgZGVmaW5lZCAoX19XSU4zMikgfHwgZGVmaW5lZCAoV0lOMzIpIHx8IGRlZmluZWQgKF9fV0lOMzJfXykgfHwgXAorICAgICAgZGVmaW5lZCAoX19XSU4xNikgfHwgZGVmaW5lZCAoV0lOMTYpIHx8IGRlZmluZWQgKF9XSU4xNikKKyMgIGlmIGRlZmluZWQgKCBfX0JPUkxBTkRDX18gKSAgLyogQm9ybGFuZCBDKysgKCA0LnggLSA1LnggKSAqLworIyAgICBpbmNsdWRlIDxzdGwvY29uZmlnL19iYy5oPgorIyAgZWxpZiBkZWZpbmVkIChfX1dBVENPTV9DUExVU1BMVVNfXykgfHwgZGVmaW5lZCAoX19XQVRDT01DX18pICAvKiBXYXRjb20gQysrICovCisjICAgIGluY2x1ZGUgPHN0bC9jb25maWcvX3dhdGNvbS5oPgorIyAgZWxpZiBkZWZpbmVkIChfX0NPTU9fXykgfHwgZGVmaW5lZCAoX19DT01PX1ZFUlNJT05fKQorIyAgICBpbmNsdWRlIDxzdGwvY29uZmlnL19jb21vLmg+CisjICBlbGlmIGRlZmluZWQgKF9fRE1DX18pICAgLyogRGlnaXRhbCBNYXJzIEMrKyAqLworIyAgICBpbmNsdWRlIDxzdGwvY29uZmlnL19kbS5oPgorIyAgZWxpZiBkZWZpbmVkIChfX1NDX18pICYmIChfX1NDX18gPCAweDgwMCkgLyogU3ltYW50ZWMgNy41ICovCisjICAgIGluY2x1ZGUgPHN0bC9jb25maWcvX3N5bWFudGVjLmg+CisjICBlbGlmIGRlZmluZWQgKF9fSUNMKSAvKiBJbnRlbCByZWZlcmVuY2UgY29tcGlsZXIgZm9yIFdpbiAqLworIyAgICBpbmNsdWRlIDxzdGwvY29uZmlnL19pbnRlbC5oPgorIyAgZWxpZiBkZWZpbmVkIChfX01XRVJLU19fKQorIyAgICBpbmNsdWRlIDxzdGwvY29uZmlnL19td2Vya3MuaD4KKyMgIGVsaWYgZGVmaW5lZCAoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKSAmJiBkZWZpbmVkIChVTkRFUl9DRSkKKyAgICAgLyogTWljcm9zb2Z0IGVNYmVkZGVkIFZpc3VhbCBDKysgMy4wLCA0LjAgKC5ORVQpICovCisjICAgIGluY2x1ZGUgPHN0bC9jb25maWcvX2V2Yy5oPgorIyAgZWxpZiBkZWZpbmVkIChfTVNDX1ZFUikKKyAgICAvKiBNaWNyb3NvZnQgVmlzdWFsIEMrKyA2LjAsIDcuMCwgNy4xLCA4LjAgKi8KKyMgICAgaW5jbHVkZSA8c3RsL2NvbmZpZy9fbXN2Yy5oPgorIyAgZW5kaWYKKworIyAgaW5jbHVkZSA8c3RsL2NvbmZpZy9fd2luZG93cy5oPgorI2Vsc2UKKyMgIGVycm9yIFVua25vd24gcGxhdGZvcm0gISEKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKF9TVExQX0NPTVBJTEVSKQorLyogVW5hYmxlIHRvIGlkZW50aWZ5IHRoZSBjb21waWxlciwgaXNzdWUgZXJyb3IgZGlhZ25vc3RpYy4KKyAqIEVkaXQgPGNvbmZpZy9zdGxfbXljb21wLmg+IHRvIHNldCBTVExwb3J0IHVwIGZvciB5b3VyIGNvbXBpbGVyLiAqLworIyAgaW5jbHVkZSA8c3RsL2NvbmZpZy9zdGxfbXljb21wLmg+CisjZW5kaWYKKworI2VuZGlmIC8qIF9fc3RsX2NvbmZpZ19fc3lzdGVtX2ggKi8KZGlmZiAtLWdpdCBhL3N0bC9jb25maWcvX3dhcm5pbmdzX29mZi5oIGIvc3RsL2NvbmZpZy9fd2FybmluZ3Nfb2ZmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYxOGU2ZQotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9jb25maWcvX3dhcm5pbmdzX29mZi5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qIFRoaXMgaGVhZGVyIHR1cm5zIG9mZiB3YXJuaW5ncyB0aGF0IFNUTHBvcnQgaGVhZGVycyBnZW5lcmF0ZSBmb3IgY29tcGlsZWQKKyAqIHVzZXIgY29kZS4KKyAqLworCisjaWYgZGVmaW5lZCAoX1NUTFBfTVNWQykKKyMgIGlmIChfU1RMUF9NU1ZDID4gMTAwMCkKKyMgICAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX01TVkM2X01FTV9UX0JVR19XT1JLQVJPVU5EKQorLyoKKyAqIDMxLzA3LzIwMDQ6IGR1bXMgLSBub3cgdGhhdCB3ZSBkbyBub3QgZXhwb3J0IHRoZSBiYXNpY19zdHJpbmcgY2xhc3MgYW55bW9yZSBidXQgb25seSBhIGJhc2UgY2xhc3MKKyAqIHdlIGhhdmUgdG8gZGlzYWJsZSB0aGlzIHdhcm5pbmcgYXMgdGhlIHN0cmluZyBhcmUgdXNlZCBhcyBkYXRhIG1lbWJlcnMgdHlwZSBvZiBtYW55IGlvc3RyZWFtIGNsYXNzZXMuCisgKi8KKyMgICAgICBwcmFnbWEgd2FybmluZyAoIGRpc2FibGUgOiA0MjUxICkgIC8vIGlnbm9yZSB0ZW1wbGF0ZSBjbGFzc2VzIGJlaW5nIGV4cG9ydGVkIGluIC5kbGwncworIyAgICBlbmRpZgorCisjICAgIGlmIChfU1RMUF9NU1ZDIDwgMTIwMCkgLy8gVkM1IGFuZCBlYXJsaWVyCisjICAgICAgcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0Mzg5ICkgLy8gJz09JyA6IHNpZ25lZC91bnNpZ25lZCBtaXNtYXRjaAorLy8gbXVsdGlwbGUgY29weSBjb25zdHJ1Y3RvcnMvYXNzaWdubWVudCBvcGVyYXRvcnMgc3BlY2lmaWVkLAorLy8gd2l0aCBtZW1iZXIgdGVtcGxhdGVzIGFyZSBib2d1cy4uLgorIyAgICAgIHByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDUyMSApCisjICAgICAgcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0NTIyICkKKyMgICAgZW5kaWYKKworIyAgICBpZiAoX1NUTFBfTVNWQyA8IDEzMDApIC8vIFZDNiwgZVZDMywgZVZDNAorIyAgICAgIHByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDA5NyApIC8vIHR5cGVkZWYtbmFtZSB1c2VkIGFzIGJhc2VkIGNsYXNzIG9mICguLi4pCisjICAgICAgcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0MjMxICkgLy8gbm9uIHN0YW5kYXJkIGV4dGVuc2lvbiA6ICdleHRlcm4nIGJlZm9yZSB0ZW1wbGF0ZSBpbnN0YW5jaWF0aW9uCisjICAgICAgcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0MjQ0ICkgLy8gaW1wbGljaXQgY29udmVyc2lvbjogcG9zc2libGUgbG9zcyBvZiBkYXRhCisjICAgICAgcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0Mjg0ICkgLy8gZm9yIC0+IG9wZXJhdG9yCisvL1RoaXMgd2FybmluZyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBvZiB0aGUgbmF0aXZlIHBsYXRmb3JtIGhlYWRlcnM6CisjICAgICAgcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0MjkwICkgLy8gYysrIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uIGlnbm9yZWQKKyMgICAgICBwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQ1MTQgKSAvLyB1bnJlZmVyZW5jZWQgaW5saW5lIGZ1bmN0aW9uIGhhcyBiZWVuIHJlbW92ZWQKKyMgICAgICBwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQ2NjAgKSAvLyB0ZW1wbGF0ZS1jbGFzcyBzcGVjaWFsaXphdGlvbiAnLi4uJyBpcyBhbHJlYWR5IGluc3RhbnRpYXRlZAorIyAgICAgIHByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDcwMSApIC8vIGxvY2FsIHZhcmlhYmxlICcuLi4nIG1heSBiZSB1c2VkIHdpdGhvdXQgaGF2aW5nIGJlZW4gaW5pdGlhbGl6ZWQKKyMgICAgICBwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQ3MTAgKSAvLyBmdW5jdGlvbiAoLi4uKSBub3QgaW5saW5lZAorIyAgICAgIHByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDc4NiApIC8vIGlkZW50aWZpZXIgdHJ1bmNhdGVkIHRvIDI1NSBjaGFyYWN0ZXJzCisjICAgIGVuZGlmCisKKyMgICAgaWYgKF9TVExQX01TVkMgPCAxNDAwKQorIyAgICAgIHByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDUxMSApIC8vIGNvcHkgY29uc3RydWN0b3IgY2Fubm90IGJlIGdlbmVyYXRlZAorIyAgICBlbmRpZgorCisvL1Bvb2wgb2YgY29tbW9uIHdhcm5pbmdzIGZvciBhbGwgTVNWQyBzdXBwb3J0ZWQgdmVyc2lvbnM6CisvL01hbnkgYXJlIG9ubHkgdXNlZnVsIGlmIHdhcm5pbmcgbGV2ZWwgaXMgc2V0IHRvIDQuCisjICAgIHByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDEwMCApIC8vIHVucmVmZXJlbmNlZCBmb3JtYWwgcGFyYW1ldGVyCisjICAgIHByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDEyNyApIC8vIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gaXMgY29uc3RhbnQKKyMgICAgcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0MTQ2ICkgLy8gdW5hcnkgbWludXMgb3BlcmF0b3IgYXBwbGllZCB0byB1bnNpZ25lZCB0eXBlLCByZXN1bHQgc3RpbGwgdW5zaWduZWQKKyMgICAgcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0MjQ1ICkgLy8gY29udmVyc2lvbiBmcm9tICdlbnVtICcgdG8gJ3Vuc2lnbmVkIGludCcsIHNpZ25lZC91bnNpZ25lZCBtaXNtYXRjaAorIyAgICBwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQzNTUgKSAvLyB0aGlzIHVzZWQgaW4gYmFzZSBtZW1iZXIgaW5pdGlhbGl6ZXIgbGlzdCAodXNlZCBpbiByb3BlIGltcGxlbWVudGF0aW9uKQorIyAgICBwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQ1MTAgKSAvLyBkZWZhdWx0IGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBnZW5lcmF0ZWQKKyMgICAgcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0NTEyICkgLy8gYXNzaWdubWVudCBvcGVyYXRvciBjb3VsZCBub3QgYmUgZ2VuZXJhdGVkCisjICAgIHByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDU3MSApIC8vIGNhdGNoKC4uLikgYmxvY2tzIGNvbXBpbGVkIHdpdGggL0VIcyBkbyBub3QgY2F0Y2ggb3IgcmUtdGhyb3cgU3RydWN0dXJlZCBFeGNlcHRpb25zCisjICAgIHByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDYxMCApIC8vIHN0cnVjdCAnLi4uJyBjYW4gbmV2ZXIgYmUgaW5zdGFudGlhdGVkIC0gdXNlciBkZWZpbmVkIGNvbnN0cnV0b3IgcmVxdWlyZWQKKyMgIGVuZGlmCisjZWxpZiBkZWZpbmVkIChfX0JPUkxBTkRDX18pCisjICBwcmFnbWEgb3B0aW9uIC13LWNjYyAvLyAtdy04MDA4IENvbmRpdGlvbiBpcyBhbHdheXMgdHJ1ZSBPUiBDb25kaXRpb24gaXMgYWx3YXlzIGZhbHNlCisjICBwcmFnbWEgb3B0aW9uIC13LWlubCAvLyAtdy04MDI3IEZ1bmN0aW9ucyBjb250YWluaW5nIHJlc2VydmVkIHdvcmRzIGFyZSBub3QgZXhwYW5kZWQgaW5saW5lCisjICBwcmFnbWEgb3B0aW9uIC13LW5ndSAvLyAtdy04MDQxIE5lZ2F0aW5nIHVuc2lnbmVkIHZhbHVlCisjICBwcmFnbWEgb3B0aW9uIC13LXBvdyAvLyAtdy04MDYyIFByZXZpb3VzIG9wdGlvbnMgYW5kIHdhcm5pbmdzIG5vdCByZXN0b3JlZAorIyAgcHJhZ21hIG9wdGlvbiAtdy1yY2ggLy8gLXctODA2NiBVbnJlYWNoYWJsZSBjb2RlCisjICBwcmFnbWEgb3B0aW9uIC13LXBhciAvLyAtdy04MDU3IFBhcmFtZXRlciAncGFyYW1ldGVyJyBpcyBuZXZlciB1c2VkCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N0bC9jb25maWcvX3dhdGNvbS5oIGIvc3RsL2NvbmZpZy9fd2F0Y29tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk2MDQyNAotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9jb25maWcvX3dhdGNvbS5oCkBAIC0wLDAgKzEsMTU0IEBACisvLyBTVExwb3J0IGNvbmZpZ3VyYXRpb24gZmlsZQorLy8gSXQgaXMgaW50ZXJuYWwgU1RMcG9ydCBoZWFkZXIgLSBETyBOT1QgaW5jbHVkZSBpdCBkaXJlY3RseQorCisjZGVmaW5lIF9TVExQX0NPTVBJTEVSICJXYXRjb20iCisKKyMgaWZuZGVmIF9TVExQX1VTRV9OT19JT1NUUkVBTVMKKyMgIGRlZmluZSBfU1RMUF9VU0VfTk9fSU9TVFJFQU1TCisjIGVuZGlmCisKKyMgZGVmaW5lIF9TVExQX05PX1JFTE9QU19OQU1FU1BBQ0UKKyMgZGVmaW5lIF9TVExQX05PX1BBUlRJQUxfU1BFQ0lBTElaQVRJT05fU1lOVEFYCisKKyMgIGRlZmluZSBfU1RMUF9IQVNfU1BFQ0lGSUNfUFJPTE9HX0VQSUxPRworIyAgZGVmaW5lIF9TVExQX0RPTlRfU0lNVUxBVEVfUEFSVElBTF9TUEVDX0ZPUl9UWVBFX1RSQUlUUworIyAgZGVmaW5lIF9TVExQX1VTRV9PTERfSFBfSVRFUkFUT1JfUVVFUklFUworCisvLyBPbiBRTlgsIGhlYWRlcnMgYXJlIHN1cHBvc2VkIHRvIGJlIGZvdW5kIGluIC91c3IvaW5jbHVkZSwKKy8vIHNvIGRlZmF1bHQgIi4uL2luY2x1ZGUiIHNob3VsZCB3b3JrLgorIyBpZm5kZWYgX19RTlhfXworIyAgZGVmaW5lIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEggLi4vaAorIyBlbmRpZgorCisvLyBJbmxpbmUgcmVwbGFjZW1lbnRzIGZvciBsb2NraW5nIGNhbGxzIHVuZGVyIFdhdGNvbQorLy8gRGVmaW5lIF9TVExQX05PX1dBVENPTV9JTkxJTkVfSU5URVJMT0NLIHRvIGtlZXAgdXNpbmcKKy8vIHN0YW5kYXJkIFdJTjMyIGNhbGxzCisvLyBEZWZpbmUgX1NUTF9NVUxUSVBST0NFU1NPUiB0byBlbmFibGUgbG9jaworI2lmICFkZWZpbmVkKF9TVExQX05PX1dBVENPTV9JTkxJTkVfSU5URVJMT0NLKQorCitsb25nICAgIF9fc3RsX0ludGVybG9ja2VkSW5jcmVtZW50KCBsb25nICp2YXIgKTsKK2xvbmcgICAgX19zdGxfSW50ZXJsb2NrZWREZWNyZW1lbnQoIGxvbmcgKnZhciApOworCisjaWZkZWYgX1NUTF9NVUxUSVBST0NFU1NPUgorLy8gTXVsdGlwbGUgUHJvY2Vzc29ycywgYWRkIGxvY2sgcHJlZml4CisjcHJhZ21hIGF1eCBfX3N0bF9JbnRlcmxvY2tlZEluY3JlbWVudCBwYXJtIFsgZWN4IF0gPSBcCisgICAgICAgICIuNTg2IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIm1vdiBlYXgsIDEiICAgICAgICAgICAgXAorICAgICAgICAibG9jayB4YWRkIFtlY3hdLCBlYXgiICAgICAgIFwKKyAgICAgICAgImluYyBlYXgiICAgICAgICAgICAgICAgXAorICAgICAgICB2YWx1ZSBbZWF4XTsKKworCisjcHJhZ21hIGF1eCBfX3N0bF9JbnRlcmxvY2tlZERlY3JlbWVudCBwYXJtIFsgZWN4IF0gPSBcCisgICAgICAgICIuNTg2IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIm1vdiBlYXgsIDBGRkZGRkZGRmgiICAgXAorICAgICAgICAibG9jayB4YWRkIFtlY3hdLCBlYXgiICAgICAgIFwKKyAgICAgICAgImRlYyBlYXgiICAgICAgICAgICAgICAgXAorICAgICAgICB2YWx1ZSBbZWF4XTsKKyNlbHNlCisvLyBTaW5nbGUgUHJvY2Vzc29yLCBsb2NrIHByZWZpeCBub3QgbmVlZGVkCisjcHJhZ21hIGF1eCBfX3N0bF9JbnRlcmxvY2tlZEluY3JlbWVudCBwYXJtIFsgZWN4IF0gPSBcCisgICAgICAgICIuNTg2IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIm1vdiBlYXgsIDEiICAgICAgICAgICAgXAorICAgICAgICAieGFkZCBbZWN4XSwgZWF4IiAgICAgICBcCisgICAgICAgICJpbmMgZWF4IiAgICAgICAgICAgICAgIFwKKyAgICAgICAgdmFsdWUgW2VheF07CisKKyNwcmFnbWEgYXV4IF9fc3RsX0ludGVybG9ja2VkRGVjcmVtZW50IHBhcm0gWyBlY3ggXSA9IFwKKyAgICAgICAgIi41ODYiICAgICAgICAgICAgICAgICAgXAorICAgICAgICAibW92IGVheCwgMEZGRkZGRkZGaCIgICBcCisgICAgICAgICJ4YWRkIFtlY3hdLCBlYXgiICAgICAgIFwKKyAgICAgICAgImRlYyBlYXgiICAgICAgICAgICAgICAgXAorICAgICAgICB2YWx1ZSBbZWF4XTsKKyNlbmRpZiAvLyBfU1RMX01VTFRJUFJPQ0VTU09SCisKK2xvbmcgICAgX19zdGxfSW50ZXJsb2NrZWRFeGNoYW5nZSggbG9uZyAqRGVzdGluYXRpb24sIGxvbmcgVmFsdWUgKTsKKworLy8geGNoZyBoYXMgYXV0by1sb2NrCisjcHJhZ21hIGF1eCBfX3N0bF9JbnRlcmxvY2tlZEV4Y2hhbmdlIHBhcm0gW2VjeF0gW2VheF0gPSBcCisgICAgICAgICIuNTg2IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInhjaGcgZWF4LCBbZWN4XSIgICAgICAgXAorICAgICAgICB2YWx1ZSBbZWF4XTsKKyNlbHNlCisKKyNkZWZpbmUgX19zdGxfSW50ZXJsb2NrZWRJbmNyZW1lbnQgICAgICBJbnRlcmxvY2tlZEluY3JlbWVudAorI2RlZmluZSBfX3N0bF9JbnRlcmxvY2tlZERlY3JlbWVudCAgICAgIEludGVybG9ja2VkRGVjcmVtZW50CisjZGVmaW5lIF9fc3RsX0ludGVybG9ja2VkRXhjaGFuZ2UgICAgICAgSW50ZXJsb2NrZWRFeGNoYW5nZQorI2VuZGlmIC8qIElOTElORSBJTlRFUkxPQ0sgKi8KKworI2RlZmluZSBfU1RMUF9BVE9NSUNfSU5DUkVNRU5UKF9feCkgX19zdGxfSW50ZXJsb2NrZWRJbmNyZW1lbnQoKGxvbmcqKV9feCkKKyNkZWZpbmUgX1NUTFBfQVRPTUlDX0RFQ1JFTUVOVChfX3gpIF9fc3RsX0ludGVybG9ja2VkRGVjcmVtZW50KChsb25nKilfX3gpCisjZGVmaW5lIF9TVExQX0FUT01JQ19FWENIQU5HRShfX3gsIF9feSkgX19zdGxfSW50ZXJsb2NrZWRFeGNoYW5nZSgobG9uZyopX194LCAobG9uZylfX3kpCisKKy8vIGJvcmlzIDogaXMgdGhpcyB0cnVlIG9yIGp1c3QgdGhlIGhlYWRlciBpcyBub3QgaW4gL3Vzci9pbmNsdWRlID8KKyMgaWZkZWYgX19RTlhfXworIyAgZGVmaW5lIF9TVExQX05PX1RZUEVJTkZPIDEKKyMgZW5kaWYKKworIyAgZGVmaW5lIF9TVExQX05PX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUiAxCisjICBkZWZpbmUgX1NUTFBfTk9fQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTiAxCisjICBkZWZpbmUgX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFX0tFWVdPUkQgMQorIyAgZGVmaW5lIF9TVExQX05PX01FTUJFUl9URU1QTEFURVMgMQorIyAgZGVmaW5lIF9TVExQX05PX0ZSSUVORF9URU1QTEFURVMgMQorIyAgZGVmaW5lIF9TVExQX05PX01FTUJFUl9URU1QTEFURV9DTEFTU0VTIDEKKworCisjICBkZWZpbmUgX1NUTFBfTElNSVRFRF9ERUZBVUxUX1RFTVBMQVRFUyAxCisjICBkZWZpbmUgX1NUTFBfSEFTX05PX05BTUVTUEFDRVMgMQorIyAgZGVmaW5lIF9TVExQX05FRURfVFlQRU5BTUUgMQorCisjICBpZiBfX1dBVENPTUNfXyA8IDExMDAKKyMgIGRlZmluZSBfU1RMUF9OT19XQ0hBUl9UIDEKKyMgIGRlZmluZSBfU1RMUF9OT19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OX1NZTlRBWCAxCisjICBlbmRpZgorCisjICBkZWZpbmUgX1NUTFBfTk9fRVhQTElDSVRfRlVOQ1RJT05fVE1QTF9BUkdTIDEKKworIyAgZGVmaW5lIF9TVExQX1NUQVRJQ19DT05TVF9JTklUX0JVRyAxCisvLyAjICBkZWZpbmUgX1NUTFBfVEhST1dfUkVUVVJOX0JVRyAxCisjICBkZWZpbmUgX1NUTFBfTk9fVEVNUExBVEVfQ09OVkVSU0lPTlMgMQorCisjICBkZWZpbmUgX1NUTFBfQkFTRV9UWVBFREVGX09VVFNJREVfQlVHIDEKKworIyAgZGVmaW5lIF9TVExQX0hBU19OT19ORVdfSU9TVFJFQU1TIDEKKyMgIGRlZmluZSBfU1RMUF9IQVNfTk9fTkVXX0NfSEVBREVSUyAxCisjICBkZWZpbmUgX1NUTFBfTk9fTkVXX05FV19IRUFERVIgMQorIyAgZGVmaW5lIF9TVExQX1ZFTkRPUl9HTE9CQUxfU1RECisKKyMgIGRlZmluZSBfU1RMUF9OT19ERUZBVUxUX05PTl9UWVBFX1BBUkFNIDEKKyMgIGRlZmluZSBfU1RMUF9OT05fVFlQRV9UTVBMX1BBUkFNX0JVRyAxCisjICBkZWZpbmUgX1NUTFBfTk9OVEVNUExfQkFTRV9NQVRDSF9CVUcKKyMgIGRlZmluZSBfU1RMUF9OT19FWENFUFRJT05fSEVBREVSIDEKKyMgIGRlZmluZSBfU1RMUF9OT19CQURfQUxMT0MgMQorCisjICBkZWZpbmUgX1NUTFBfTkVTVEVEX1RZUEVfUEFSQU1fQlVHIDEKKworIyAgZGVmaW5lIF9TVExQX05PX1VTSU5HX0ZPUl9HTE9CQUxfRlVOQ1RJT05TIDEKKworIyAgaWYgKF9fV0FUQ09NX0NQTFVTUExVU19fIDwgMTEwMCApCisjICAgZGVmaW5lIF9TVExQX05PX0JPT0wgMQorIyAgIGRlZmluZSBfU1RMUF9ORUVEX0VYUExJQ0lUIDEKKyMgICBkZWZpbmUgX1NUTFBfTkVFRF9NVVRBQkxFIDEKKyMgICBkZWZpbmUgX1NUTFBfTk9fQVJST1dfT1BFUkFUT1IgMQorIyAgZW5kaWYKKy8vIFRoaXMgb25lIGlzIHByZXNlbnQgaW4gMTEsIGJ1dCBhcHBhcmVudGx5IGhhcyBidWdzICh3aXRoIGF1dG9fcHRyKS4KKyMgICBkZWZpbmUgX1NUTFBfTk9fTkVXX1NUWUxFX0NBU1RTIDEKKworLy8gR2V0IHJpZCBvZiBXYXRjb20ncyBtaW4gYW5kIG1heCBtYWNyb3MKKyN1bmRlZiBtaW4KKyN1bmRlZiBtYXgKKworLy8gZm9yIHN3aXRjaGVzICgteHMsICAteHNzLCAgLXhzdCkKKy8vCisjaWYgIShkZWZpbmVkIChfX1NXX1hTKSB8fCBkZWZpbmVkIChfX1NXX1hTUykgfHwgZGVmaW5lZChfX1NXX1hTVCkpCisjICAgIGRlZmluZSBfU1RMUF9IQVNfTk9fRVhDRVBUSU9OUyAxCisjIGVuZGlmCisKKyMgaWYgZGVmaW5lZCAoIF9NVCApICYmICFkZWZpbmVkIChfTk9USFJFQURTKSAmJiAhZGVmaW5lZCAoX1JFRU5UUkFOVCkKKyMgZGVmaW5lIF9SRUVOVFJBTlQgMQorIyBlbmRpZgorCisKKworCisKZGlmZiAtLWdpdCBhL3N0bC9jb25maWcvX3dpbmRvd3MuaCBiL3N0bC9jb25maWcvX3dpbmRvd3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTA2OGJjCi0tLSAvZGV2L251bGwKKysrIGIvc3RsL2NvbmZpZy9fd2luZG93cy5oCkBAIC0wLDAgKzEsMjIzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk3LTE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzCisgKiBGcmFuY29pcyBEdW1vbnQKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfV0lORE9XU19ICisjZGVmaW5lIF9TVExQX0lOVEVSTkFMX1dJTkRPV1NfSAorCisjaWYgIWRlZmluZWQgKF9TVExQX1BMQVRGT1JNKQorIyAgZGVmaW5lIF9TVExQX1BMQVRGT1JNICJXaW5kb3dzIgorI2VuZGlmCisKKy8qIF9TVExQX1dJTjMyX1ZFUlNJT04gaXMgdXNlZCB0byBkZXRlY3QgdGFyZ2V0dGVkIFdpbmRvd3MgcGxhdGZvcm1zIGFzCisgKiBvbGQgb25lcyBhcmUgbm90IHN1cHBvcnRpbmcgc29tZSBXaW4zMiBmdW5jdGlvbnMgdGhhdCBTVExwb3J0IHVzZS4KKyAqIExpbWl0ZWQgT1NzIGFyZSBnb2luZyB1cCB0byBhbmQgaW5jbHVkaW5nIFdpbmRvd3MgOTggc28gdGhleSBjYW4gYmUKKyAqIGRldGVjdGVkIHVzaW5nIFdJTlZFUiBvciBfV0lOMzJfV0lORE9XUyBtYWNyb3MsIHdlIGRvIG5vdCBoYXZlIHRvIHVzZQorICogX1dJTk5UX1dJTkRPV1MgbWFjcm8gZm9yIHRoZSBtb21lbnQuCisgKi8KKyNpZiAhZGVmaW5lZCAoX1NUTFBfV0lOMzJfVkVSU0lPTikKKyMgIGlmIGRlZmluZWQgKFdJTlZFUikKKyMgICAgZGVmaW5lIF9TVExQX1dJTjMyX1ZFUlNJT04gV0lOVkVSCisjICBlbGlmIGRlZmluZWQgKF9XSU4zMl9XSU5ET1dTKQorIyAgICBkZWZpbmUgX1NUTFBfV0lOMzJfVkVSU0lPTiBfV0lOMzJfV0lORE9XUworIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKF9TVExQX0JJR19FTkRJQU4pICYmICFkZWZpbmVkIChfU1RMUF9MSVRUTEVfRU5ESUFOKQorIyAgaWYgZGVmaW5lZCAoX01JUFNFQikKKyMgICAgZGVmaW5lIF9TVExQX0JJR19FTkRJQU4gMQorIyAgZW5kaWYKKyMgIGlmIGRlZmluZWQgKF9faTM4NikgfHwgZGVmaW5lZCAoX01fSVg4NikgfHwgZGVmaW5lZCAoX01fQVJNKSB8fCBcCisgICAgICBkZWZpbmVkIChfX2FtZDY0X18pIHx8IGRlZmluZWQgKF9NX0FNRDY0KSB8fCBkZWZpbmVkIChfX3g4Nl82NF9fKSB8fCBcCisgICAgICBkZWZpbmVkIChfX2FscGhhX18pCisjICAgIGRlZmluZSBfU1RMUF9MSVRUTEVfRU5ESUFOIDEKKyMgIGVuZGlmCisjICBpZiBkZWZpbmVkIChfX2lhNjRfXykKKyAgICAvKiBpdGFuaXVtIGFsbG93cyBib3RoIHNldHRpbmdzIChmb3IgaW5zdGFuY2UgdmlhIGdjYyAtbWJpZy1lbmRpYW4pIC0gaGVuY2UgYSBzZXBlcmF0ZSBjaGVjayBpcyByZXF1aXJlZCAqLworIyAgICBpZiBkZWZpbmVkIChfX0JJR19FTkRJQU5fXykKKyMgICAgICBkZWZpbmUgX1NUTFBfQklHX0VORElBTiAxCisjICAgIGVsc2UKKyMgICAgICBkZWZpbmUgX1NUTFBfTElUVExFX0VORElBTiAxCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmIC8qIF9TVExQX0JJR19FTkRJQU4gKi8KKworI2lmICFkZWZpbmVkIChfU1RMUF9XSU5ET1dTX0hfSU5DTFVERUQpCisjICBkZWZpbmUgX1NUTFBfV0lORE9XU19IX0lOQ0xVREVECisjICBpZiAhKGRlZmluZWQgKCBfU1RMUF9NU1ZDICkgfHwgZGVmaW5lZCAoX19CT1JMQU5EQ19fKSB8fCBkZWZpbmVkIChfX0lDTCkgfHwgZGVmaW5lZCAoX19XQVRDT01DX18pIHx8IFwKKyAgICAgICAgZGVmaW5lZCAoX19NSU5HVzMyX18pIHx8IGRlZmluZWQgKF9fRE1DX18pKQorIyAgICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfTUZDKQorIyAgICAgIGluY2x1ZGUgPGFmeC5oPgorIyAgICBlbHNlCisjICAgICAgaW5jbHVkZSA8d2luZG93cy5oPgorIyAgICBlbmRpZgorIyAgZWxzZQorLyogVGhpcyBzZWN0aW9uIHNlcnZlcyBhcyBhIHJlcGxhY2VtZW50IGZvciB3aW5kb3dzLmggaGVhZGVyIGZvciBWaXN1YWwgQysrICovCisjICAgIGlmIGRlZmluZWQgKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjICAgIGVuZGlmCisjICAgIGlmIChkZWZpbmVkIChfTV9BTUQ2NCkgfHwgZGVmaW5lZCAoX01fSUE2NCkgfHwgKCFkZWZpbmVkIChfU1RMUF9XQ0UpICYmIGRlZmluZWQgKF9NX01SWDAwMCkpIHx8IGRlZmluZWQgKF9NX0FMUEhBKSB8fCBcCisgICAgICAgIChkZWZpbmVkIChfTV9QUEMpICYmIChfU1RMUF9NU1ZDX0xJQiA+PSAxMDAwKSkpICYmICFkZWZpbmVkIChSQ19JTlZPS0VEKQorIyAgICAgIGRlZmluZSBJbnRlcmxvY2tlZEluY3JlbWVudCAgICAgICBfSW50ZXJsb2NrZWRJbmNyZW1lbnQKKyMgICAgICBkZWZpbmUgSW50ZXJsb2NrZWREZWNyZW1lbnQgICAgICAgX0ludGVybG9ja2VkRGVjcmVtZW50CisjICAgICAgZGVmaW5lIEludGVybG9ja2VkRXhjaGFuZ2UgICAgICAgIF9JbnRlcmxvY2tlZEV4Y2hhbmdlCisvKiBIZXJlIHdlIHVzZSBhIGRpZmZlcmVudCBtYWNybyBuYW1lIHRoYW4gdGhlIEludGVybG9ja2VkRXhjaGFuZ2VQb2ludGVyIFNESyBmdW5jdGlvbgorICogdG8gYXZvaWQgbWFjcm8gZGVmaW5pdGlvbiBjb25mbGljdCBhcyB0aGUgU0RLIG1pZ2h0IGFscmVhZHkgZGVmaW5lIEludGVybG9ja2VkRXhjaGFuZ2VQb2ludGVyCisgKiBhcyBhIG1hY3JvLgorICovCisjICAgICAgZGVmaW5lIFNUTFBJbnRlcmxvY2tlZEV4Y2hhbmdlUG9pbnRlciBfSW50ZXJsb2NrZWRFeGNoYW5nZVBvaW50ZXIKKyMgICAgICBkZWZpbmUgX1NUTFBfU1REQ0FMTAorIyAgICBlbHNlCisjICAgICAgaWYgZGVmaW5lZCAoX01BQykKKyMgICAgICAgIGRlZmluZSBfU1RMUF9TVERDQUxMIF9jZGVjbAorIyAgICAgIGVsc2UKKyMgICAgICAgIGRlZmluZSBfU1RMUF9TVERDQUxMIF9fc3RkY2FsbAorIyAgICAgIGVuZGlmCisjICAgIGVuZGlmCisKKyMgICAgaWYgZGVmaW5lZCAoX1NUTFBfTkVXX1BMQVRGT1JNX1NESykKK19TVExQX0lNUE9SVF9ERUNMU1BFQyBsb25nIF9TVExQX1NURENBTEwgSW50ZXJsb2NrZWRJbmNyZW1lbnQobG9uZyB2b2xhdGlsZSAqKTsKK19TVExQX0lNUE9SVF9ERUNMU1BFQyBsb25nIF9TVExQX1NURENBTEwgSW50ZXJsb2NrZWREZWNyZW1lbnQobG9uZyB2b2xhdGlsZSAqKTsKK19TVExQX0lNUE9SVF9ERUNMU1BFQyBsb25nIF9TVExQX1NURENBTEwgSW50ZXJsb2NrZWRFeGNoYW5nZShsb25nIHZvbGF0aWxlICosIGxvbmcpOworIyAgICAgIGlmIGRlZmluZWQgKFNUTFBJbnRlcmxvY2tlZEV4Y2hhbmdlUG9pbnRlcikKK19TVExQX0lNUE9SVF9ERUNMU1BFQyB2b2lkKiBfU1RMUF9TVERDQUxMIFNUTFBJbnRlcmxvY2tlZEV4Y2hhbmdlUG9pbnRlcih2b2lkKiB2b2xhdGlsZSAqLCB2b2lkKik7CisjICAgICAgZW5kaWYKK19TVExQX0lNUE9SVF9ERUNMU1BFQyBsb25nIF9TVExQX1NURENBTEwgSW50ZXJsb2NrZWRFeGNoYW5nZUFkZChsb25nIHZvbGF0aWxlICosIGxvbmcpOworIyAgICBlbGlmIGRlZmluZWQgKF9TVExQX1dDRSkKKworLyogc3RhcnQgb2YgZU1iZWRkZWQgVmlzdWFsIEMrKyBzcGVjaWZpYyBzZWN0aW9uICovCisjICAgICAgaW5jbHVkZSA8d2luZGVmLmg+IC8qIG5lZWRlZCBmb3IgYmFzaWMgd2luZG93cyB0eXBlcyAqLworCisgICAgICAgLyoqIGluIFNES3MgZ2VuZXJhdGVkIHdpdGggUEI1LCB3aW5kZWYuaCBzb21laG93IGluY2x1ZGVzIGhlYWRlcnMgd2hpY2ggdGhlbgorICAgICAgIGRlZmluZSBzZXRqbXAuICovCisjICAgICAgaWYgKF9XSU4zMl9XQ0UgPj0gMHg1MDApCisjICAgICAgICBkZWZpbmUgX1NUTFBfTkFUSVZFX1NFVEpNUF9IX0lOQ0xVREVECisjICAgICAgZW5kaWYKKworIyAgICAgIGlmbmRlZiBfV0lOQkFTRV8gLyogd2luYmFzZS5oIGFscmVhZHkgaW5jbHVkZWQ/ICovCitsb25nIFdJTkFQSSBJbnRlcmxvY2tlZEluY3JlbWVudChsb25nKik7Citsb25nIFdJTkFQSSBJbnRlcmxvY2tlZERlY3JlbWVudChsb25nKik7Citsb25nIFdJTkFQSSBJbnRlcmxvY2tlZEV4Y2hhbmdlKGxvbmcqLCBsb25nKTsKKyMgICAgICBlbmRpZgorCisjICAgICAgaWZuZGVmIF9fV0lORE9XU19fIC8qIHdpbmRvd3MuaCBhbHJlYWR5IGluY2x1ZGVkPyAqLworCisjICAgICAgICBpZiBkZWZpbmVkICh4ODYpCisjICAgICAgICAgIGluY2x1ZGUgPHdpbmJhc2UuaD4gLyogbmVlZGVkIGZvciBpbmxpbmUgdmVyc2lvbnMgb2YgSW50ZXJsb2NrZWQqIGZ1bmN0aW9ucyAqLworIyAgICAgICAgZW5kaWYKKworIyAgICAgICAgaWZuZGVmIF9NRkNfVkVSCisKKyMgICAgICAgICAgZGVmaW5lIE1lc3NhZ2VCb3ggTWVzc2FnZUJveFcKK2ludCBXSU5BUEkgTWVzc2FnZUJveFcoSFdORCBoV25kLCBMUENXU1RSIGxwVGV4dCwgTFBDV1NUUiBscENhcHRpb24sIFVJTlQgdVR5cGUpOworCisjICAgICAgICAgIGRlZmluZSB3dnNwcmludGYgd3ZzcHJpbnRmVworaW50IFdJTkFQSSB3dnNwcmludGZXKExQV1NUUiwgTFBDV1NUUiwgdmFfbGlzdCBBcmdMaXN0KTsKKwordm9pZCBXSU5BUEkgRXhpdFRocmVhZChEV09SRCBkd0V4aXRDb2RlKTsKKworIyAgICAgICAgICBpZiAhZGVmaW5lZCAoQ09SRURMTCkKKyMgICAgICAgICAgICBkZWZpbmUgX1NUTFBfV0NFX1dJTkJBU0VBUEkgREVDTFNQRUNfSU1QT1JUCisjICAgICAgICAgIGVsc2UKKyMgICAgICAgICAgICBkZWZpbmUgX1NUTFBfV0NFX1dJTkJBU0VBUEkKKyMgICAgICAgICAgZW5kaWYKKworX1NUTFBfV0NFX1dJTkJBU0VBUEkgaW50IFdJTkFQSQorTXVsdGlCeXRlVG9XaWRlQ2hhcihVSU5UIENvZGVQYWdlLCBEV09SRCBkd0ZsYWdzLCBMUENTVFIgbHBNdWx0aUJ5dGVTdHIsCisgICAgICAgICAgICAgICAgICAgIGludCBjYk11bHRpQnl0ZSwgTFBXU1RSIGxwV2lkZUNoYXJTdHIsIGludCBjY2hXaWRlQ2hhcik7CisKK19TVExQX1dDRV9XSU5CQVNFQVBJIFVJTlQgV0lOQVBJIEdldEFDUCgpOworCitfU1RMUF9XQ0VfV0lOQkFTRUFQSSBCT09MIFdJTkFQSSBUZXJtaW5hdGVQcm9jZXNzKEhBTkRMRSBoUHJvY2VzcywgRFdPUkQgdUV4aXRDb2RlKTsKKworIyAgICAgICAgICBkZWZpbmUgT3V0cHV0RGVidWdTdHJpbmcgT3V0cHV0RGVidWdTdHJpbmdXCit2b2lkIFdJTkFQSSBPdXRwdXREZWJ1Z1N0cmluZ1coTFBDV1NUUik7CisKK19TVExQX1dDRV9XSU5CQVNFQVBJIHZvaWQgV0lOQVBJIFNsZWVwKERXT1JEKTsKKworIyAgICAgICAgICB1bmRlZiBfU1RMUF9XQ0VfV0lOQkFTRUFQSQorCisjICAgICAgICBlbmRpZiAvKiAhX01GQ19WRVIgKi8KKworIyAgICAgIGVuZGlmIC8qICFfX1dJTkRPV1NfXyAqLworCisvKiBlbmQgb2YgZU1iZWRkZWQgVmlzdWFsIEMrKyBzcGVjaWZpYyBzZWN0aW9uICovCisKKyMgICAgZWxzZQorLyogYm9yaXMgOiBmb3IgdGhlIGxhdGVzdCBTREssIHlvdSBtYXkgYWN0dWFsbHkgbmVlZCB0aGUgb3RoZXIgdmVyc2lvbiBvZiB0aGUgZGVjbGFyYXRpb24gKGFib3ZlKQorICogZXZlbiBmb3IgZWFybGllciBWQysrIHZlcnNpb25zLiBUaGVyZSBpcyBubyB3YXkgdG8gdGVsbCBTREsgdmVyc2lvbnMgYXBhcnQsIHNvcnJ5IC4uLgorICovCitfU1RMUF9JTVBPUlRfREVDTFNQRUMgbG9uZyBfU1RMUF9TVERDQUxMIEludGVybG9ja2VkSW5jcmVtZW50KGxvbmcqKTsKK19TVExQX0lNUE9SVF9ERUNMU1BFQyBsb25nIF9TVExQX1NURENBTEwgSW50ZXJsb2NrZWREZWNyZW1lbnQobG9uZyopOworX1NUTFBfSU1QT1JUX0RFQ0xTUEVDIGxvbmcgX1NUTFBfU1REQ0FMTCBJbnRlcmxvY2tlZEV4Y2hhbmdlKGxvbmcqLCBsb25nKTsKKyMgICAgZW5kaWYKKworIyAgICBpZiAhZGVmaW5lZCAoU1RMUEludGVybG9ja2VkRXhjaGFuZ2VQb2ludGVyKQorLyogVGhpcyBBUEkgZnVuY3Rpb24gZG8gbm90IGV4aXN0IGluIHRoZSBvbGQgcGxhdGZvcm0gU0RLIGFuZCBpcyBlcXVpdmFsZW50IHRvCisgKiBJbnRlcmxvY2tlZEV4Y2hhbmdlIG9uIDMyIGJpdHMgcGxhdGZvcm06CisgKi8KKyMgICAgICBpZiBkZWZpbmVkIChfX2NwbHVzcGx1cykKKy8qIFdlIGRvIG5vdCBkZWZpbmUgdGhpcyBmdW5jdGlvbiBpZiB3ZSBhcmUgbm90IGluIGEgQysrIHRyYW5zbGF0aW9uIHVuaXQganVzdAorICogYmVjYXVzZSBvZiB0aGUgaW5saW5lIHBvcnRhYmlsaXR5IGlzc3VlIGl0IHdvdWxkIGludHJvZHVjZS4gV2Ugd2lsbCBoYXZlIHRvCisgKiBmaXggaXQgdGhlIGRheSB3ZSBuZWVkIHRoaXMgZnVuY3Rpb24gZm9yIGEgQyB0cmFuc2xhdGlvbiB1bml0LgorICovCitpbmxpbmUKK3ZvaWQqIF9TVExQX0NBTEwgU1RMUEludGVybG9ja2VkRXhjaGFuZ2VQb2ludGVyKHZvaWQqIHZvbGF0aWxlKiBfX2EsIHZvaWQqIF9fYikgeworIyAgICAgICAgaWYgZGVmaW5lZCAoX1NUTFBfTVNWQykKKy8qIEhlcmUgTVNWQyBwcm9kdWNlcyB3YXJuaW5nIGlmIDY0IGJpdHMgcG9ydGFiaWxpdHkgaXNzdWUgaXMgYWN0aXZhdGVkLgorICogTVNWQyBkbyBub3Qgc2VlIHRoYXQgX1NUTFBfQVRPTUlDX0VYQ0hBTkdFX1BUUiBpcyBhIG1hY3JvIHdoaWNoIGNvbnRlbnQKKyAqIGlzIGJhc2VkIG9uIHRoZSBwbGF0Zm9ybSwgV2luMzIgb3IgV2luNjQKKyAqLworIyAgICAgICAgICBwcmFnbWEgd2FybmluZyAocHVzaCkKKyMgICAgICAgICAgcHJhZ21hIHdhcm5pbmcgKGRpc2FibGUgOiA0MzExKSAvLyBwb2ludGVyIHRydW5jYXRpb24gZnJvbSB2b2lkKiB0byBsb25nCisjICAgICAgICAgIHByYWdtYSB3YXJuaW5nIChkaXNhYmxlIDogNDMxMikgLy8gY29udmVyc2lvbiBmcm9tIGxvbmcgdG8gdm9pZCogb2YgZ3JlYXRlciBzaXplCisjICAgICAgICBlbmRpZgorIyAgICAgICAgaWYgIWRlZmluZWQgKF9TVExQX05PX05FV19TVFlMRV9DQVNUUykKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KEludGVybG9ja2VkRXhjaGFuZ2UocmVpbnRlcnByZXRfY2FzdDxsb25nKj4oY29uc3RfY2FzdDx2b2lkKio+KF9fYSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGxvbmc+KF9fYikpKTsKKyMgICAgICAgIGVsc2UKKyAgcmV0dXJuICh2b2lkKilJbnRlcmxvY2tlZEV4Y2hhbmdlKChsb25nKilfX2EsIChsb25nKV9fYik7CisjICAgICAgICBlbmRpZgorIyAgICAgICAgaWYgZGVmaW5lZCAoX1NUTFBfTVNWQykKKyMgICAgICAgICAgcHJhZ21hIHdhcm5pbmcgKHBvcCkKKyMgICAgICAgIGVuZGlmCit9CisjICAgICAgZW5kaWYKKyMgICAgZW5kaWYKKworIyAgICBpZiAhZGVmaW5lZCAoX1NUTFBfV0NFKQorX1NUTFBfSU1QT1JUX0RFQ0xTUEVDIHZvaWQgX1NUTFBfU1REQ0FMTCBTbGVlcCh1bnNpZ25lZCBsb25nKTsKK19TVExQX0lNUE9SVF9ERUNMU1BFQyB2b2lkIF9TVExQX1NURENBTEwgT3V0cHV0RGVidWdTdHJpbmdBKGNvbnN0IGNoYXIqIGxwT3V0cHV0U3RyaW5nKTsKKyMgICAgZW5kaWYKKworIyAgICBpZiBkZWZpbmVkIChJbnRlcmxvY2tlZEluY3JlbWVudCkKKyMgICAgICBwcmFnbWEgaW50cmluc2ljKF9JbnRlcmxvY2tlZEluY3JlbWVudCkKKyMgICAgICBwcmFnbWEgaW50cmluc2ljKF9JbnRlcmxvY2tlZERlY3JlbWVudCkKKyMgICAgICBwcmFnbWEgaW50cmluc2ljKF9JbnRlcmxvY2tlZEV4Y2hhbmdlKQorIyAgICAgIHByYWdtYSBpbnRyaW5zaWMoX0ludGVybG9ja2VkRXhjaGFuZ2VQb2ludGVyKQorIyAgICBlbmRpZgorIyAgICBpZiBkZWZpbmVkIChfX2NwbHVzcGx1cykKK30gLyogZXh0ZXJuICJDIiAqLworIyAgICBlbmRpZgorCisjICBlbmRpZiAvKiBTVExfTVNWQyBfX0JPUkxBTkRDX18gX19JQ0wgX19XQVRDT01DX18gX19NSU5HVzMyX18gX19ETUNfXyovCisKKyNlbmRpZiAvKiBfU1RMUF9XSU5ET1dTX0hfSU5DTFVERUQgKi8KKworI2VuZGlmIC8qIF9TVExQX0lOVEVSTkFMX1dJTkRPV1NfSCAqLwpkaWZmIC0tZ2l0IGEvc3RsL2NvbmZpZy9jb21wYXQuaCBiL3N0bC9jb25maWcvY29tcGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAzZDg3NAotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9jb25maWcvY29tcGF0LmgKQEAgLTAsMCArMSw4NCBAQAorCisvKgorICogQ29tcGF0aWJpbGl0eSBzZWN0aW9uCisgKiBUaGlzIHNlY3Rpb24gc2V0cyBuZXctc3R5bGUgbWFjcm9zIGJhc2VkIG9uIG9sZC1zdHlsZSBvbmVzLCBmb3IgY29tcGF0aWJpbGl0eQorICovCisKKyNpZiBkZWZpbmVkIChfX1NUTF9ERUJVRykgJiYgIWRlZmluZWQgKF9TVExQX0RFQlVHKQorIyAgZGVmaW5lIF9TVExQX0RFQlVHIF9fU1RMX0RFQlVHCisjZW5kaWYKKyNpZiBkZWZpbmVkIChfX1NUTF9OT19BTkFDSFJPTklTTVMpICYmICFkZWZpbmVkIChfU1RMUF9OT19BTkFDSFJPTklTTVMpCisjICBkZWZpbmUgX1NUTFBfTk9fQU5BQ0hST05JU01TIF9fU1RMX05PX0FOQUNIUk9OSVNNUworI2VuZGlmCisjaWYgZGVmaW5lZCAoX19TVExfTk9fRVhURU5TSU9OUykgJiYgIWRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpCisjICBkZWZpbmUgX1NUTFBfTk9fRVhURU5TSU9OUyBfX1NUTF9OT19FWFRFTlNJT05TCisjZW5kaWYKKyNpZiBkZWZpbmVkIChfX1NUTF9OT19FWENFUFRJT05TKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhDRVBUSU9OUykKKyMgIGRlZmluZSBfU1RMUF9OT19FWENFUFRJT05TIF9fU1RMX05PX0VYQ0VQVElPTlMKKyNlbmRpZgorI2lmIGRlZmluZWQgKF9fU1RMX05PX05BTUVTUEFDRVMpICYmICFkZWZpbmVkIChfU1RMUF9OT19OQU1FU1BBQ0VTKQorIyAgZGVmaW5lIF9TVExQX05PX05BTUVTUEFDRVMgX19TVExfTk9fTkFNRVNQQUNFUworI2VuZGlmCisjaWYgZGVmaW5lZCAoX19TVExfTUlOSU1VTV9ERUZBVUxUX1RFTVBMQVRFX1BBUkFNUykgJiYgIWRlZmluZWQgKF9TVExQX01JTklNVU1fREVGQVVMVF9URU1QTEFURV9QQVJBTVMpCisjICBkZWZpbmUgX1NUTFBfTUlOSU1VTV9ERUZBVUxUX1RFTVBMQVRFX1BBUkFNUyBfX1NUTF9NSU5JTVVNX0RFRkFVTFRfVEVNUExBVEVfUEFSQU1TCisjZW5kaWYKKyNpZiBkZWZpbmVkIChfX1NUTF9OT19PV05fTkFNRVNQQUNFKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fT1dOX05BTUVTUEFDRSkKKyMgIGRlZmluZSBfU1RMUF9OT19PV05fTkFNRVNQQUNFIF9fU1RMX05PX09XTl9OQU1FU1BBQ0UKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19TVExfTk9fUkVMT1BTX05BTUVTUEFDRSkgJiYgIWRlZmluZWQgKF9TVExQX05PX1JFTE9QU19OQU1FU1BBQ0UpCisjICBkZWZpbmUgX1NUTFBfTk9fUkVMT1BTX05BTUVTUEFDRSBfX1NUTF9OT19SRUxPUFNfTkFNRVNQQUNFCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fU1RMX0RFQlVHX1VOSU5JVElBTElaRUQpICYmICFkZWZpbmVkIChfU1RMUF9ERUJVR19VTklOSVRJQUxJWkVEKQorIyAgZGVmaW5lIF9TVExQX0RFQlVHX1VOSU5JVElBTElaRUQgX19TVExfREVCVUdfVU5JTklUSUFMSVpFRAorI2VuZGlmCisjaWYgZGVmaW5lZCAoX19TVExfU0hSRURfQllURSkgJiYgIWRlZmluZWQgKF9TVExQX1NIUkVEX0JZVEUpCisjICBkZWZpbmUgX1NUTFBfU0hSRURfQllURSBfX1NUTF9TSFJFRF9CWVRFCisjZW5kaWYKKyNpZiBkZWZpbmVkIChfX1NUTF9VU0VfTUZDKSAmJiAhZGVmaW5lZCAoX1NUTFBfVVNFX01GQykKKyMgIGRlZmluZSBfU1RMUF9VU0VfTUZDIF9fU1RMX1VTRV9NRkMKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19TVExfVVNFX05FV0FMTE9DKSAmJiAhZGVmaW5lZCAoX1NUTFBfVVNFX05FV0FMTE9DKQorIyAgZGVmaW5lIF9TVExQX1VTRV9ORVdBTExPQyBfX1NUTF9VU0VfTkVXQUxMT0MKKyNlbmRpZgorI2lmIGRlZmluZWQgKF9fU1RMX1VTRV9NQUxMT0MpICYmICFkZWZpbmVkIChfU1RMUF9VU0VfTUFMTE9DKQorIyAgZGVmaW5lIF9TVExQX1VTRV9NQUxMT0MgX19TVExfVVNFX01BTExPQworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX1NUTF9ERUJVR19BTExPQykgJiYgIWRlZmluZWQgKF9TVExQX0RFQlVHX0FMTE9DKQorIyAgZGVmaW5lIF9TVExQX0RFQlVHX0FMTE9DIF9fU1RMX0RFQlVHX0FMTE9DCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fU1RMX0RFQlVHX01FU1NBR0UpICYmICFkZWZpbmVkIChfU1RMUF9ERUJVR19NRVNTQUdFKQorIyAgZGVmaW5lIF9TVExQX0RFQlVHX01FU1NBR0UgX19TVExfREVCVUdfTUVTU0FHRQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX1NUTF9ERUJVR19URVJNSU5BVEUpICYmICFkZWZpbmVkIChfU1RMUF9ERUJVR19URVJNSU5BVEUpCisjICBkZWZpbmUgX1NUTFBfREVCVUdfVEVSTUlOQVRFIF9fU1RMX0RFQlVHX1RFUk1JTkFURQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX1NUTF9VU0VfQUJCUkVWUykgJiYgIWRlZmluZWQgKF9TVExQX1VTRV9BQkJSRVZTKQorIyAgZGVmaW5lIF9TVExQX1VTRV9BQkJSRVZTIF9fU1RMX1VTRV9BQkJSRVZTCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fU1RMX05PX01TVkM1MF9DT01QQVRJQklMSVRZKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fTVNWQzUwX0NPTVBBVElCSUxJVFkpCisjICBkZWZpbmUgX1NUTFBfTk9fTVNWQzUwX0NPTVBBVElCSUxJVFkgX19TVExfTk9fTVNWQzUwX0NPTVBBVElCSUxJVFkKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19TVExfVVNFX1JBV19TR0lfQUxMT0NBVE9SUykgJiYgIWRlZmluZWQgKF9TVExQX1VTRV9SQVdfU0dJX0FMTE9DQVRPUlMpCisjICBkZWZpbmUgX1NUTFBfVVNFX1JBV19TR0lfQUxMT0NBVE9SUyBfX1NUTF9VU0VfUkFXX1NHSV9BTExPQ0FUT1JTCisjZW5kaWYKKworLyogU1RMcG9ydCBkbyBub3Qgc3VwcG9ydCBhbnltb3JlIHRoZSBpb3N0cmVhbSB3cmFwcGVyIG1vZGUgc28gdGhpcyBtYWNybyBzaG91bGQKKyAqIGFsd2F5cyBiZWVuIGRlZmluZSBmb3Igb3RoZXIgbGlicmFyaWVzIHRoYXQgd2FzIHVzaW5nIGl0OgorICovCisjaWYgIWRlZmluZWQgKF9TVExQX09XTl9JT1NUUkVBTVMpCisjICBkZWZpbmUgX1NUTFBfT1dOX0lPU1RSRUFNUworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9OT19PV05fSU9TVFJFQU1TKQorIyAgZXJyb3IgU1RMcG9ydCBkbyBub3Qgc3VwcG9ydCBhbnltb3JlIHRoZSB3cmFwcGVyIG1vZGUuIElmIHlvdSB3YW50IHRvIHVzZSBTVExwb3J0IFwKK3VzZSBpdHMgaW9zdHJlYW1zIGltcGxlbWVudGF0aW9uIG9yIG5vIGlvc3RyZWFtcyBhdCBhbGwuCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N0bC9jb25maWcvZmVhdHVyZXMuaCBiL3N0bC9jb25maWcvZmVhdHVyZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjI4NWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc3RsL2NvbmZpZy9mZWF0dXJlcy5oCkBAIC0wLDAgKzEsMTE5NiBAQAorIC8qCisgICoKKyAgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICAqCisgICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAgKgorICAqIENvcHlyaWdodCAoYykgMTk5NworICAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKKyAgKgorICAqIENvcHlyaWdodCAoYykgMTk5OQorICAqIEJvcmlzIEZvbWl0Y2hldgorICAqCisgICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICAqCisgICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICAqCisgICovCisKKyNpZm5kZWYgX1NUTFBfRkVBVFVSRVNfSAorI2RlZmluZSBfU1RMUF9GRUFUVVJFU19ICisKKy8qCisgKiBQdXJwb3NlIG9mIHRoaXMgZmlsZToKKyAqCisgKiBEZWZpbmVzIGFsbCBTVExwb3J0IHNldHRpbmdzLgorICogVGhpcyBmaWxlIGlzIGFjdHVhbGx5IGEgd3JhcHBlciA6IGl0IGluY2x1ZGVzIGNvbXBpbGVyLXNwZWNpZmljCisgKiBzZXR0aW5ncyBmcm9tIDxjb25maWcvc3RsY29tcC5oPgorICogYW5kIHVzZXItZGVmaW5lZCBzZXR0aW5ncyBmcm9tIDxjb25maWcvdXNlcl9jb25maWcuaD4uCisgKiBTZWUgPGNvbmZpZy9zdGxfbXljb21wLmg+IGFuZCA8Y29uZmlnL3VzZXJfY29uZmlnLmg+IGZvciB0aGUgZGVzY3JpcHRpb24KKyAqIG9mIHRob3NlIG1hY3JvcworICoKKyAqLworCisvKiBEZWZpbml0aW9uIG9mIHRoZSBTVExwb3J0IHZlcnNpb24gaW5mb3JtYXRpb25zICovCisjaW5jbHVkZSA8c3RsL19zdGxwb3J0X3ZlcnNpb24uaD4KKworLyogT3RoZXIgbWFjcm9zIGRlZmluZWQgYnkgdGhpcyBmaWxlOgorCisgKiBib29sLCB0cnVlLCBhbmQgZmFsc2UsIGlmIF9TVExQX05PX0JPT0wgaXMgZGVmaW5lZC4KKyAqIHR5cGVuYW1lLCBhcyBhIG51bGwgbWFjcm8gaWYgaXQncyBub3QgYWxyZWFkeSBhIGtleXdvcmQuCisgKiBleHBsaWNpdCwgYXMgYSBudWxsIG1hY3JvIGlmIGl0J3Mgbm90IGFscmVhZHkgYSBrZXl3b3JkLgorICogbmFtZXNwYWNlLXJlbGF0ZWQgbWFjcm9zIChfU1RMUF9TVEQsIF9TVExQX0JFR0lOX05BTUVTUEFDRSwgZXRjLikKKyAqIGV4Y2VwdGlvbi1yZWxhdGVkIG1hY3JvcyAoX1NUTFBfVFJZLCBfU1RMUF9VTldJTkQsIGV0Yy4pCisgKiBfU1RMUF9BU1NFUlQsIGVpdGhlciBhcyBhIHRlc3Qgb3IgYXMgYSBudWxsIG1hY3JvLCBkZXBlbmRpbmcgb24KKyAgIHdoZXRoZXIgb3Igbm90IF9TVExQX0FTU0VSVElPTlMgaXMgZGVmaW5lZC4KKyovCisKKy8qIERlZmluaXRpb24gb2YgdGhlIDIgU1RMcG9ydCBkZWJ1ZyBsZXZlbHMgKi8KKyNkZWZpbmUgX1NUTFBfU1RMUE9SVF9EQkdfTEVWRUwgMQorI2RlZmluZSBfU1RMUF9TVEFOREFSRF9EQkdfTEVWRUwgMgorCisvKiBQbGFjZWhvbGRlciBmb3IgdXNlciB0byBvdmVycmlkZSBzZXR0aW5ncy4KKyAqIEl0IGNvdWxkIGJlIGFsc28gdXNlZCB0byBtYXNrIHNldHRpbmdzIGZyb20KKyAqIGRpZmZlcmVudCBkaXJlY3Rvcmllcy4KKyAqLworI2luY2x1ZGUgPHN0bC9jb25maWcvdXNlcl9jb25maWcuaD4KKworI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHKSAmJiAhZGVmaW5lZCAoX1NUTFBfREVCVUdfTEVWRUwpCisjICBkZWZpbmUgX1NUTFBfREVCVUdfTEVWRUwgX1NUTFBfU1RMUE9SVF9EQkdfTEVWRUwKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19CVUlMRElOR19TVExQT1JUKQorLyogRm9yIHRoZSBTVExwb3J0IGltcGxlbWVudGF0aW9uIHdlIGNhbiB1c2UgZXZlcnl0aGluZzoKKyAqLworIyAgaWYgZGVmaW5lZCAoX1NUTFBfTk9fQU5BQ0hST05JU01TKQorIyAgICB1bmRlZiBfU1RMUF9OT19BTkFDSFJPTklTTVMKKyMgIGVuZGlmCisjICBpZiBkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKQorIyAgICB1bmRlZiBfU1RMUF9OT19FWFRFTlNJT05TCisjICBlbmRpZgorLyogTW9yZW92ZXIgdGhlcmUgYXJlIHRoaW5ncyB0aGF0IGhhcyBubyBzZW5zOgorICovCisjICBpZiBkZWZpbmVkIChfU1RMUF9OT19JT1NUUkVBTVMpCisjICAgIGVycm9yIElmIHlvdSBkbyBub3QgdXNlIGlvc3RyZWFtcyB5b3UgZG8gbm90IG5lZWQgdG8gYnVpbGQgdGhlIFNUTHBvcnQgbGlicmFyeS4KKyMgIGVuZGlmCisjZW5kaWYKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiBUaGlzIGZpbGUgaXMgdXNlZCBmb3IgY29tcGF0aWJpbGl0eTsgaXQgYWNjZXB0cyBvbGQtc3R5bGUgY29uZmlnCisgICBzd2l0Y2hlcyAqLworI2luY2x1ZGUgPHN0bC9jb25maWcvY29tcGF0Lmg+CisKKy8qIENvbW1vbiBjb25maWd1cmF0aW9uIGZpbGUgZm9yIHRoaXMgcGFydGljdWxhciBpbnN0YWxsYXRpb24uICovCisjaW5jbHVkZSA8c3RsL2NvbmZpZy9ob3N0Lmg+CisKKy8qIE9wZXJhdGlvbmFsIEVudmlyb25tZW50IHNwZWNpZmljICovCisjaW5jbHVkZSA8c3RsL2NvbmZpZy9fc3lzdGVtLmg+CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKiBzb21lIGZpeGVzIHRvIGNvbmZpZ3VyYXRpb24uIFRoaXMgYWxzbyBpbmNsdWRlcyBtb2RpZmljYXRpb25zCisgKiBvZiBTVExwb3J0IHN3aXRjaGVzIGRlcGVuZGluZyBvbiBjb21waWxlciBmbGFncywKKyAqIG9yIHNldHRpbmdzIGFwcGxpY2FibGUgdG8gYSBncm91cCBvZiBjb21waWxlcnMsIHN1Y2ggYXMKKyAqIHRvIGFsbCB3aG8gdXNlIEVERyBmcm9udC1lbmQuCisgKi8KKyNpbmNsdWRlIDxzdGwvY29uZmlnL3N0bF9jb25maXguaD4KKworI2lmZGVmIF9TVExQX1VTRV9CT09TVF9TVVBQT1JUCisvKiBXZSBhcmUgZ29pbmcgdG8gdXNlIHRoZSBib29zdCBsaWJyYXJ5IHN1cHBvcnQuIFRvIGxpbWl0IHRoZSBwcm9ibGVtCisgKiBvZiBzZWxmIHJlZmVyZW5jaW5nIGhlYWRlcnMgd2UgaGF2ZSB0byBzcGVjaWZ5IGNsZWFybHkgdG8gdGhlIGJvb3N0CisgKiBsaWJyYXJ5IHRoYXQgdGhlIFN0YW5kYXJkIGxpYiBpcyBTVExwb3J0OgorICovCisjICBpZm5kZWYgQk9PU1RfU1RETElCX0NPTkZJRworIyAgICBkZWZpbmUgQk9PU1RfU1RETElCX0NPTkZJRyA8Ym9vc3QvY29uZmlnL3N0ZGxpYi9zdGxwb3J0LmhwcD4KKyMgIGVuZGlmCisjZW5kaWYKKworCisvKgorICogUGVyZm9ybXMgaW50ZWdyaXR5IGNoZWNrIG9uIHVzZXItc3BlY2lmaWVkIHBhcmFtZXRlcnMKKyAqIGFuZCBzaXRlLXNwZWNpZmljIHNldHRpbmdzLgorICovCisvKgorIyBpbmNsdWRlIDxzdGwvX2NoZWNrX2NvbmZpZy5oPgorKi8KKworLyogU0dJIHRlcm1zICovCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFUykgJiYgIWRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisjICBkZWZpbmUgX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAxCisjZW5kaWYKKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19GUklFTkRfVEVNUExBVEVTKSAmJiAhZGVmaW5lZCAoX1NUTFBfRlJJRU5EX1RFTVBMQVRFUykKKyMgIGRlZmluZSBfU1RMUF9GUklFTkRfVEVNUExBVEVTIDEKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKF9TVExQX05PX01FTUJFUl9URU1QTEFURV9DTEFTU0VTKSAmJiAhZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFX0NMQVNTRVMpCisjICBkZWZpbmUgX1NUTFBfTUVNQkVSX1RFTVBMQVRFX0NMQVNTRVMgMQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVfQ0xBU1NFUykgJiYgIWRlZmluZWQgKF9TVExQX0RPTlRfU1VQUE9SVF9SRUJJTkRfTUVNQkVSX1RFTVBMQVRFKQorIyAgZGVmaW5lIF9TVExQX0RPTlRfU1VQUE9SVF9SRUJJTkRfTUVNQkVSX1RFTVBMQVRFIDEKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKF9TVExQX05PX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pICYmICFkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQorIyAgZGVmaW5lIF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04gMQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSKQorIyAgZGVmaW5lIF9TVExQX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUiAxCisjZW5kaWYKKworI2lmICFkZWZpbmVkIChfU1RMUF9ET05UX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0pICYmICFkZWZpbmVkIChfU1RMUF9VU0VfU0hPUlRfU1RSSU5HX09QVElNKQorIyAgZGVmaW5lIF9TVExQX1VTRV9TSE9SVF9TVFJJTkdfT1BUSU0gMQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykgJiYgXAorICAgIWRlZmluZWQgKF9TVExQX05PX0NPTlRBSU5FUlNfRVhURU5TSU9OKSAmJiAhZGVmaW5lZCAoX1NUTFBfVVNFX0NPTlRBSU5FUlNfRVhURU5TSU9OKQorIyAgZGVmaW5lIF9TVExQX1VTRV9DT05UQUlORVJTX0VYVEVOU0lPTgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfQ09OVEFJTkVSU19FWFRFTlNJT04pCisjICBkZWZpbmUgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUIHRlbXBsYXRlIDxjbGFzcyBfS1Q+CisjZWxzZQorIyAgZGVmaW5lIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUFRSX1NQRUNJQUxJWkFUSU9OUykgJiYgXAorICAgIChkZWZpbmVkIChfU1RMUF9OT19DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKSAmJiBkZWZpbmVkIChfU1RMUF9ET05UX1NJTVVMQVRFX1BBUlRJQUxfU1BFQ19GT1JfVFlQRV9UUkFJVFMpKQorIyAgZXJyb3IgIlNvcnJ5IGJ1dCBhY2NvcmRpbmcgdGhlIFNUTHBvcnQgc2V0dGluZ3MgeW91ciBjb21waWxlciBjYW4gbm90IHN1cHBvcnQgdGhlIHBvaW50ZXIgc3BlY2lhbGl6YXRpb24gZmVhdHVyZS4iCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX05PX0lPU1RSRUFNUykgJiYgXAorICAgIWRlZmluZWQgKF9TVExQX1VTRV9ORVdBTExPQykgJiYgIWRlZmluZWQgKF9TVExQX1VTRV9NQUxMT0MpCisjICBkZWZpbmUgX1NUTFBfVVNFX05FV0FMTE9DCisjZW5kaWYKKworI2lmICFkZWZpbmVkIChfU1RMUF9CSUdfRU5ESUFOKSAmJiAhZGVmaW5lZCAoX1NUTFBfTElUVExFX0VORElBTikKKyMgIGlmIGRlZmluZWQgKF9NSVBTRUIpIHx8IGRlZmluZWQgKF9fc3BhcmMpIHx8IGRlZmluZWQgKF9BSVgpIHx8IFwKKyAgICAgIGRlZmluZWQgKF9faHB1eCkgfHwgZGVmaW5lZCAobWFjaW50b3NoKSB8fCBkZWZpbmVkIChfTUFDKQorIyAgICBkZWZpbmUgX1NUTFBfQklHX0VORElBTiAxCisjICBlbGlmIGRlZmluZWQgKF9faTM4NikgfHwgZGVmaW5lZCAoX01fSVg4NikgfHwgZGVmaW5lZCAoX01fQVJNKSB8fCBcCisgICAgICAgIGRlZmluZWQgKF9fYW1kNjRfXykgfHwgZGVmaW5lZCAoX01fQU1ENjQpIHx8IGRlZmluZWQgKF9feDg2XzY0X18pIHx8IFwKKyAgICAgICAgZGVmaW5lZCAoX19hbHBoYV9fKQorIyAgICBkZWZpbmUgX1NUTFBfTElUVExFX0VORElBTiAxCisjICBlbGlmIGRlZmluZWQgKF9faWE2NF9fKQorICAgIC8qIGl0YW5pdW0gYWxsb3dzIGJvdGggc2V0dGluZ3MgKGZvciBpbnN0YW5jZSB2aWEgZ2NjIC1tYmlnLWVuZGlhbikgLSBoZW5jZSBhIHNlcGVyYXRlIGNoZWNrIGlzIHJlcXVpcmVkICovCisjICAgIGlmIGRlZmluZWQgKF9fQklHX0VORElBTl9fKQorIyAgICAgIGRlZmluZSBfU1RMUF9CSUdfRU5ESUFOIDEKKyMgICAgZWxzZQorIyAgICAgIGRlZmluZSBfU1RMUF9MSVRUTEVfRU5ESUFOIDEKKyMgICAgZW5kaWYKKyMgIGVsc2UKKyMgICAgZXJyb3IgImNhbid0IGRldGVybWluZSBlbmRpYW5lc3MiCisjICBlbmRpZgorI2VuZGlmIC8qIF9TVExQX0JJR19FTkRJQU4gKi8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogZmluYWwgd29ya2Fyb3VuZCB0dW5pbmcgYmFzZWQgb24gZ2l2ZW4gZmxhZ3MKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworI2lmbmRlZiBfU1RMUF9VSU5UMzJfVAorIyAgZGVmaW5lIF9TVExQX1VJTlQzMl9UIHVuc2lnbmVkIGxvbmcKKyNlbmRpZgorI2lmbmRlZiBfU1RMUF9BQk9SVAorIyAgZGVmaW5lIF9TVExQX0FCT1JUKCkgYWJvcnQoKQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfSEFTX05PX05BTUVTUEFDRVMpCisjICBpZiBkZWZpbmVkIF9TVExQX05PX05BTUVTUEFDRVMKKyMgICAgdW5kZWYgX1NUTFBfVVNFX05BTUVTUEFDRVMKKyMgIGVsc2UKKy8qIGFzc3VtZSBpdCBhcyB0aGUgZGVmYXVsdCwgdHVybiBpdCBvZmYgbGF0ZXIgaWYgTk9fTkFNRVNQQUNFUyBzZWxlY3RlZCAqLworIyAgICB1bmRlZiBfU1RMUF9VU0VfTkFNRVNQQUNFUworIyAgICBkZWZpbmUgX1NUTFBfVVNFX05BTUVTUEFDRVMgMQorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfTk9fSU9TVFJFQU1TKQorIyAgZGVmaW5lIF9TVExQX1VTRV9OT19JT1NUUkVBTVMKKyNlbmRpZgorCisvKiBPcGVyYXRpbmcgc3lzdGVtIHJlY29nbml0aW9uIChiYXNpYykgKi8KKyNpZiBkZWZpbmVkIChfX3VuaXgpIHx8IGRlZmluZWQgKF9fbGludXhfXykgfHwgZGVmaW5lZCAoX19RTlhfXykgfHwgZGVmaW5lZCAoX0FJWCkgIHx8IGRlZmluZWQgKF9fTmV0QlNEX18pIHx8IGRlZmluZWQoX19PcGVuQlNEX18pIHx8IGRlZmluZWQgKF9fTHlueF9fKQorIyAgZGVmaW5lIF9TVExQX1VOSVggMQorI2VsaWYgZGVmaW5lZChtYWNpbnRvc2gpIHx8IGRlZmluZWQgKF9NQUMpCisjICBkZWZpbmUgX1NUTFBfTUFDICAxCisjZWxpZiBkZWZpbmVkIChfV0lOMzIpIHx8IGRlZmluZWQgKF9fV0lOMzIpIHx8IGRlZmluZWQgKFdJTjMyKSB8fCBkZWZpbmVkIChfX1dJTjMyX18pCisjICBpZm5kZWYgX19TWU1CSUFOMzJfXworIyAgICBkZWZpbmUgX1NUTFBfV0lOMzIgMQorIyAgZW5kaWYKKyNlbGlmIGRlZmluZWQgKF9fV0lOMTYpIHx8IGRlZmluZWQgKFdJTjE2KSB8fCBkZWZpbmVkIChfV0lOMTYpCisjICBkZWZpbmUgX1NUTFBfV0lOMTYKKyNlbmRpZiAvKiBfX3VuaXggKi8KKworI2lmIGRlZmluZWQgKF9TVExQX1dJTjE2KQorIyAgZGVmaW5lIF9TVExQX0xET1VCTEVfODAKKyNlbGlmIGRlZmluZWQoX1NUTFBfV0lOMzIpCisjICBpZiBkZWZpbmVkIChfU1RMUF9NU1ZDKSB8fCBkZWZpbmVkIChfX0lDTCkgfHwgZGVmaW5lZCAoX19CT1JMQU5EQ19fKSB8fCBkZWZpbmVkIChfX0NZR1dJTl9fKQorIyAgICBkZWZpbmUgX1NUTFBfTERPVUJMRV82NAorIyAgZWxzZQorIyAgICBkZWZpbmUgX1NUTFBfTERPVUJMRV85NgorIyAgZW5kaWYKKyNlbGlmIGRlZmluZWQgKF9TVExQX1VOSVgpCisjICBpZiBkZWZpbmVkIChfX0NZR1dJTl9fKQorIyAgICBkZWZpbmUgX1NUTFBfTERPVUJMRV85NgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKF9TVExQX0xET1VCTEVfNjQpICYmICFkZWZpbmVkIChfU1RMUF9MRE9VQkxFXzgwKSAmJiAhZGVmaW5lZCAoX1NUTFBfTERPVUJMRV85NikgJiYgIWRlZmluZWQgKF9TVExQX0xET1VCTEVfMTI4KQorIyAgZGVmaW5lIF9TVExQX0xET1VCTEVfMTI4CisjZW5kaWYKKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19MT05HX0RPVUJMRSkKKyMgIGRlZmluZSBfU1RMUF9MT05HRVNUX0ZMT0FUX1RZUEUgbG9uZyBkb3VibGUKKyNlbHNlCisjICBkZWZpbmUgX1NUTFBfTE9OR0VTVF9GTE9BVF9UWVBFIGRvdWJsZQorI2VuZGlmCisKKy8qIE5hdGl2ZSBoZWFkZXJzIGFjY2VzcyBtYWNyb3MgKi8KKyNpbmNsdWRlIDxzdGwvY29uZmlnL19uYXRpdmVfaGVhZGVycy5oPgorCisvKiAgc2hhcmVkIGxpYnJhcnkgdHVuZS11cCAqLworCisjaWYgZGVmaW5lZCAoX19CVUlMRElOR19TVExQT1JUKQorLyogIGlmIHdlIGFyZSByZWJ1aWxkaW5nIHJpZ2h0IG5vdywgcGxhY2UgZXZlcnl0aGluZyBoZXJlICovCisjICB1bmRlZiAgX1NUTFBfREVTSUdOQVRFRF9ETEwKKyMgIGRlZmluZSBfU1RMUF9ERVNJR05BVEVEX0RMTCAxCisjZW5kaWYKKworLyogVXNlIG93biBuYW1lc3BhY2UgYWx3YXlzIGlmIHBvc3NpYmxlIGFuZCBub3QgZXhwbGljaXRseSBpbnN0cnVjdGVkIG90aGVyd2lzZSAqLworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9OQU1FU1BBQ0VTKSAmJiAhZGVmaW5lZCAoX1NUTFBfQlJPS0VOX1VTSU5HX0RJUkVDVElWRSkgJiYgXAorICAgIWRlZmluZWQgKF9TVExQX05PX09XTl9OQU1FU1BBQ0UpCisjICB1bmRlZiAgX1NUTFBfVVNFX09XTl9OQU1FU1BBQ0UKKyMgIGRlZmluZSBfU1RMUF9VU0VfT1dOX05BTUVTUEFDRSAgMQorI2Vsc2UKKyMgIHVuZGVmIF9TVExQX1dIT0xFX05BVElWRV9TVEQKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKF9OT1RIUkVBRFMpICYmICFkZWZpbmVkIChfU1RMUF9USFJFQURTX0RFRklORUQpCisKKyMgIGlmIGRlZmluZWQgKF9QVEhSRUFEUykKKyMgICAgZGVmaW5lIF9TVExQX1BUSFJFQURTCisjICAgIGRlZmluZSBfU1RMUF9USFJFQURTCisjICBlbmRpZgorIyAgaWYgZGVmaW5lZCAoX1VJVEhSRUFEUykKKyMgICAgZGVmaW5lIF9TVExQX1VJVEhSRUFEUworIyAgICBkZWZpbmUgX1NUTFBfVEhSRUFEUworIyAgZW5kaWYKKworIyAgaWYgZGVmaW5lZCAoX19zZ2kpICYmICFkZWZpbmVkIChfX0tDQykgJiYgIWRlZmluZWQgKF9fR05VQ19fKQorIyAgICBkZWZpbmUgX1NUTFBfU0dJX1RIUkVBRFMKKyMgIGVsaWYgZGVmaW5lZCAoX19ERUNDKSB8fCBkZWZpbmVkIChfX0RFQ0NYWCkKKyMgICAgZGVmaW5lIF9TVExQX0RFQ19USFJFQURTCisjICBlbGlmIGRlZmluZWQgKF9TVExQX1dJTjMyKSAmJiAhZGVmaW5lZCAoX1NUTFBfUFRIUkVBRFMpCisjICAgIGRlZmluZSBfU1RMUF9XSU4zMlRIUkVBRFMgMQorIyAgZWxpZiAoKGRlZmluZWQgKF9fc3VuKSAmJiAhZGVmaW5lZCAoX19saW51eF9fKSkgfHwgZGVmaW5lZCAoX1VJVEhSRUFEUykgKSAmJiBcCisgICAgICAgICFkZWZpbmVkKF9TVExQX1BUSFJFQURTKQorIyAgICBkZWZpbmUgX1NUTFBfVUlUSFJFQURTCisjICBlbGlmIGRlZmluZWQgKF9fT1MyX18pCisjICAgIGRlZmluZSBfU1RMUF9PUzJUSFJFQURTCisjICBlbGlmIGRlZmluZWQgKF9fQkVPU19fKQorIyAgICBkZWZpbmUgX1NUTFBfQkVUSFJFQURTCisjICBlbGlmIGRlZmluZWQgKF9fTVdFUktTX18pICYmIGRlZmluZWQgKE5fUExBVF9OTE0pIC8qIChfX2Rlc3Rfb3MgPT0gX19uZXR3YXJlX29zKSAqLworIyAgICBkZWZpbmUgX1NUTFBfTldUSFJFQURTCisjICBlbHNlCisjICAgIGRlZmluZSBfU1RMUF9QVEhSRUFEUworIyAgZW5kaWYgLyogX19zZ2kgKi8KKyMgIGRlZmluZSBfU1RMUF9USFJFQURTX0RFRklORUQKKyNlbmRpZgorCisjaWYgKGRlZmluZWQgKF9SRUVOVFJBTlQpIHx8IGRlZmluZWQgKF9USFJFQURfU0FGRSkgfHwgXAorICAgIChkZWZpbmVkIChfUE9TSVhfVEhSRUFEUykgJiYgZGVmaW5lZCAoX19PcGVuQlNEX18pKSkgJiYgXAorICAgICFkZWZpbmVkIChfU1RMUF9USFJFQURTKQorIyAgZGVmaW5lIF9TVExQX1RIUkVBRFMKKyNlbmRpZiAvKiBfUkVFTlRSQU5UICovCisKKyNpZiBkZWZpbmVkIChfX2xpbnV4X18pICYmIGRlZmluZWQgKF9TVExQX1BUSFJFQURTKQorLyogIyAgaW5jbHVkZSA8ZmVhdHVyZXMuaD4gKi8KKworIyAgaWYgZGVmaW5lZCAoX19VU0VfWE9QRU4ySykgJiYgIWRlZmluZWQgKF9TVExQX0RPTlRfVVNFX1BUSFJFQURfU1BJTkxPQ0spCisjICAgIGRlZmluZSBfU1RMUF9VU0VfUFRIUkVBRF9TUElOTE9DSworIyAgICBkZWZpbmUgX1NUTFBfU1RBVElDX01VVEVYIF9TVExQX211dGV4CisjICBlbmRpZiAvKiBfX1VTRV9YT1BFTjJLICovCisjZW5kaWYgLyogX19saW51eF9fICYmIF9TVExQX1BUSFJFQURTICovCisKKyNpZiBkZWZpbmVkIChfX09wZW5CU0RfXykgJiYgZGVmaW5lZCAoX1BPU0lYX1RIUkVBRFMpICYmICFkZWZpbmVkIChfU1RMUF9ET05UX1VTRV9QVEhSRUFEX1NQSU5MT0NLKQorIyAgZGVmaW5lIF9TVExQX1VTRV9QVEhSRUFEX1NQSU5MT0NLCisjICBkZWZpbmUgX1NUTFBfU1RBVElDX01VVEVYIF9TVExQX211dGV4CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9TVEFUSUNfTVVURVgKKyMgIGRlZmluZSBfU1RMUF9TVEFUSUNfTVVURVggX1NUTFBfbXV0ZXhfYmFzZQorI2VuZGlmCisKKyNpZiAoZGVmaW5lZCAoX01GQ19WRVIpIHx8IGRlZmluZWQgKF9BRlhETEwpKSAmJiAhZGVmaW5lZCAoX1NUTFBfVVNFX01GQykKKyMgIGRlZmluZSBfU1RMUF9VU0VfTUZDIDEKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfVEhSRUFEUykKKyMgIGRlZmluZSBfU1RMUF9WT0xBVElMRSB2b2xhdGlsZQorLyogd2luZG93cy5oIF9NVVNUIGJlIGluY2x1ZGVkIGJlZm9yZSBib29sIGRlZmluaXRpb24gOyggKi8KKyMgIGlmIGRlZmluZWQgKF9TVExQX1dJTjMyVEhSRUFEUykgJiYgZGVmaW5lZCAoX1NUTFBfTk9fQk9PTCkKKyMgICAgdW5kZWYgIE5PTUlOTUFYCisjICAgIGRlZmluZSBOT01JTk1BWAorIyAgICBpZmRlZiBfU1RMUF9VU0VfTUZDCisjICAgICAgaW5jbHVkZSA8YWZ4Lmg+CisjICAgIGVsc2UKKyMgICAgICBpbmNsdWRlIDx3aW5kb3dzLmg+CisjICAgIGVuZGlmCisjICAgIGRlZmluZSBfU1RMUF9XSU5ET1dTX0hfSU5DTFVERUQKKyMgIGVuZGlmCisjZWxzZQorIyAgZGVmaW5lIF9TVExQX1ZPTEFUSUxFCisjZW5kaWYKKworI2lmICFkZWZpbmVkIChfU1RMUF9VU0VfTkVXX0NfSEVBREVSUykgJiYgIWRlZmluZWQgKF9TVExQX0hBU19OT19ORVdfQ19IRUFERVJTKQorIyAgZGVmaW5lIF9TVExQX1VTRV9ORVdfQ19IRUFERVJTCisjZW5kaWYKKy8qIGRpc2FibGUgbmV3LXN0eWxlIGhlYWRlcnMgaWYgcmVxdWVzdGVkICovCisjaWYgZGVmaW5lZCAoX1NUTFBfTk9fTkVXX0NfSEVBREVSUykKKyMgIHVuZGVmIF9TVExQX1VTRV9ORVdfQ19IRUFERVJTCisjZW5kaWYKKworI2lmICFkZWZpbmVkIChfU1RMUF9TVEFUSUNfVEVNUExBVEVfREFUQSkKKyMgIGRlZmluZSBfU1RMUF9TVEFUSUNfVEVNUExBVEVfREFUQSAxCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX0JBU0VfVFlQRURFRl9CVUcpCisjICB1bmRlZiAgX1NUTFBfQkFTRV9UWVBFREVGX09VVFNJREVfQlVHCisjICBkZWZpbmUgX1NUTFBfQkFTRV9UWVBFREVGX09VVFNJREVfQlVHIDEKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfTkVTVEVEX1RZUEVfUEFSQU1fQlVHKSB8fCAoZGVmaW5lZCAoX1NUTFBfTVNWQykgJiYgKF9TVExQX01TVkMgPCAxMTAwKSkKKyMgIGRlZmluZSBfU1RMUF9HTE9CQUxfTkVTVEVEX1JFVFVSTl9UWVBFX1BBUkFNX0JVRworI2VuZGlmCisKKy8qIFNVTnBybyA0LjIgaW5saW5lIHN0cmluZyBsaXRlcmFsIGJ1ZyAqLworI2lmZGVmIF9TVExQX0lOTElORV9TVFJJTkdfTElURVJBTF9CVUcKKyMgIGRlZmluZSBfU1RMUF9GSVhfTElURVJBTF9CVUcoX194KSBfX3ggPSBfX3g7CisjZWxzZQorIyAgZGVmaW5lIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3gpCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX05PTl9UWVBFX1RNUExfUEFSQU1fQlVHKQorIyAgdW5kZWYgIF9TVExQX05PX0RFRkFVTFRfTk9OX1RZUEVfUEFSQU0KKyMgIGRlZmluZSBfU1RMUF9OT19ERUZBVUxUX05PTl9UWVBFX1BBUkFNIDEKKyNlbmRpZgorCisjZGVmaW5lIF9TVExQX05FVyBuZXcKKyNkZWZpbmUgX1NUTFBfUExBQ0VNRU5UX05FVyBuZXcKKworI2lmZGVmIF9TVExQX0RFQlVHCisjICBkZWZpbmUgX1NUTFBfQVNTRVJUSU9OUyAxCisjZW5kaWYKKworI2lmICFkZWZpbmVkIChfU1RMUF9TVEFUSUNfQVNTRVJUKQorLyogU29tZSBjb21waWxlciBzdXBwb3J0IDAgc2l6ZSBhcnJheSBzbyB3ZSB1c2UgbmVnYXRpdmUgc2l6ZSBhcnJheSB0byBnZW5lcmF0ZQorICogYSBjb21waWxhdGlvbiB0aW1lIGVycm9yLgorICovCisjICBkZWZpbmUgX1NUTFBfU1RBVElDX0FTU0VSVChleHByKSB0eXBlZGVmIGNoYXIgX19zdGF0aWNfYXNzZXJ0W2V4cHIgPyAxIDogLTFdOworI2VuZGlmCisKKy8qIGFwcGxlIG1wdyBleGNlcHRpb24gaGFuZGxpbmcgYnVnICovCisjaWZuZGVmIF9TVExQX01QV0ZJWF9UUlkKKyMgIGRlZmluZSBfU1RMUF9NUFdGSVhfVFJZCisjZW5kaWYKKyNpZm5kZWYgX1NUTFBfTVBXRklYX0NBVENICisjICBkZWZpbmUgX1NUTFBfTVBXRklYX0NBVENICisjZW5kaWYKKyNpZm5kZWYgX1NUTFBfTVBXRklYX0NBVENIX0FDVElPTgorIyAgZGVmaW5lIF9TVExQX01QV0ZJWF9DQVRDSF9BQ1RJT04oYWN0aW9uKQorI2VuZGlmCisKKy8qIGlmIF9TVExQX0RFQlVHIG9yIF9TVExQX0FTU0VSVElPTlMgYXJlIHNldCwgc3RsL2RlYnVnL19kZWJ1Zy5oIGRlZmluZXMgdGhvc2UgKi8KKworI2lmICFkZWZpbmVkIChfU1RMUF9BU1NFUlRJT05TKSAmJiAhZGVmaW5lZCAoX1NUTFBfREVCVUcpICYmICFkZWZpbmVkIChfU1RMUF9ERUJVR19BTExPQykKKyMgIGRlZmluZSBfU1RMUF9BU1NFUlQoZXhwcikKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKF9TVExQX0RFQlVHKQorIyAgZGVmaW5lIF9TVExQX1ZFUkJPU0VfQVNTRVJUKGV4cHIsZGlhZ25vc3RpYykKKyMgIGRlZmluZSBfU1RMUF9ERUJVR19DSEVDSyhleHByKQorIyAgZGVmaW5lIF9TVExQX0RFQlVHX0RPKGV4cHIpCisjZW5kaWYKKworI2lmICFkZWZpbmVkIChfU1RMUF9XRUFLKQorIyAgZGVmaW5lIF9TVExQX1dFQUsKKyNlbmRpZgorCisvKiBkZWZhdWx0IHBhcmFtZXRlcnMgYXMgdGVtcGxhdGUgdHlwZXMgZGVyaXZlZCBmcm9tIGFyZ3VtZW50cyAoIG5vdCBhbHdheXMgc3VwcG9ydGVkICkgKi8KKyNpZiBkZWZpbmVkIChfU1RMUF9MSU1JVEVEX0RFRkFVTFRfVEVNUExBVEVTKQorIyAgZGVmaW5lIF9TVExQX0RGTF9UTVBMX1BBUkFNKCBjbGFzc25hbWUsIGRlZnZhbCApIGNsYXNzIGNsYXNzbmFtZQorI2Vsc2UKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9ERUZBVUxUX1RZUEVfUEFSQU0pCisjICAgIGRlZmluZSBfU1RMUF9ERUZBVUxUX1RZUEVfUEFSQU0gMQorIyAgZW5kaWYKKyMgIGRlZmluZSBfU1RMUF9ERkxfVE1QTF9QQVJBTSggY2xhc3NuYW1lLCBkZWZ2YWwgKSBjbGFzcyBjbGFzc25hbWUgPSBkZWZ2YWwKKyNlbmRpZgorCisvKiBkZWZhdWx0IHBhcmFtZXRlcnMgYXMgY29tcGxldGUgdHlwZXMgKi8KKyNpZiBkZWZpbmVkIChfU1RMUF9ERUZBVUxUX1RZUEVfUEFSQU0pCisjICBkZWZpbmUgX1NUTFBfREZMX1RZUEVfUEFSQU0oIGNsYXNzbmFtZSwgZGVmdmFsICkgY2xhc3MgY2xhc3NuYW1lID0gZGVmdmFsCisjICBkZWZpbmUgX1NUTFBfREZMX05PTl9UWVBFX1BBUkFNKHR5cGUsbmFtZSx2YWwpIHR5cGUgbmFtZSA9IHZhbAorI2Vsc2UKKyMgIGRlZmluZSBfU1RMUF9ERkxfVFlQRV9QQVJBTSggY2xhc3NuYW1lLCBkZWZ2YWwgKSBjbGFzcyBjbGFzc25hbWUKKyMgIGRlZmluZSBfU1RMUF9ERkxfTk9OX1RZUEVfUEFSQU0odHlwZSxuYW1lLHZhbCkgdHlwZSBuYW1lCisjZW5kaWYKKworLyogU0dJIGNvbXBhdGliaWxpdHkgKi8KKworI2lmZGVmIF9TVExQX05PX1dDSEFSX1QKKyMgIGlmbmRlZiBfU1RMUF9OT19OQVRJVkVfV0lERV9TVFJFQU1TCisjICAgIGRlZmluZSAgX1NUTFBfTk9fTkFUSVZFX1dJREVfU1RSRUFNUyAxCisjICBlbmRpZgorI2Vsc2UKKyMgIGRlZmluZSBfU1RMUF9IQVNfV0NIQVJfVCAxCisjZW5kaWYKKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19BVF9NRU1CRVJfRlVOQ1RJT04pCisjICBkZWZpbmUgX1NUTFBfQ0FOX1RIUk9XX1JBTkdFX0VSUk9SUyAxCisjZW5kaWYKKworI2lmICFkZWZpbmVkIChfU1RMUF9VU0VfUkFXX1NHSV9BTExPQ0FUT1JTKQorIyAgZGVmaW5lIF9TVExQX0RFRkFVTFRfQUxMT0NBVE9SKF9UcCkgYWxsb2NhdG9yPCBfVHAgPgorIyAgZGVmaW5lIF9TVExQX0RFRkFVTFRfQUxMT0NBVE9SX1NFTEVDVCggX1RwICkgX1NUTFBfREZMX1RNUExfUEFSQU0oX0FsbG9jLCBhbGxvY2F0b3I8IF9UcCA+KQorIyAgZGVmaW5lIF9TVExQX0RFRkFVTFRfUEFJUl9BTExPQ0FUT1IoX0tleSwgX1RwKSBhbGxvY2F0b3I8IHBhaXIgPCBfS2V5LCBfVHAgPiA+CisjICBpZiBkZWZpbmVkIChfU1RMUF9MSU1JVEVEX0RFRkFVTFRfVEVNUExBVEVTKQorIyAgICBkZWZpbmUgX1NUTFBfREVGQVVMVF9QQUlSX0FMTE9DQVRPUl9TRUxFQ1QoX0tleSwgX1RwICkgY2xhc3MgX0FsbG9jCisjICAgIGRlZmluZSBfU1RMUF9VU0VfV1JBUFBFUl9GT1JfQUxMT0NfUEFSQU0gMQorIyAgZWxzZQorIyAgICBkZWZpbmUgX1NUTFBfREVGQVVMVF9QQUlSX0FMTE9DQVRPUl9TRUxFQ1QoX0tleSwgX1RwICkgXAorICAgICAgICAgICAgY2xhc3MgX0FsbG9jID0gYWxsb2NhdG9yPCBwYWlyIDwgX0tleSwgX1RwID4gPgorIyAgZW5kaWYKKyNlbHNlCisjICBkZWZpbmUgX1NUTFBfREVGQVVMVF9BTExPQ0FUT1IoIF9UcCApIF9fc2dpX2FsbG9jCisjICBkZWZpbmUgX1NUTFBfREVGQVVMVF9BTExPQ0FUT1JfU0VMRUNUKCBfVHAgKSBfU1RMUF9ERkxfVFlQRV9QQVJBTShfQWxsb2MsX19zZ2lfYWxsb2MpCisjICBkZWZpbmUgX1NUTFBfREVGQVVMVF9QQUlSX0FMTE9DQVRPUiggX0tleSwgX1RwICkgX19zZ2lfYWxsb2MKKyMgIGRlZmluZSBfU1RMUF9ERUZBVUxUX1BBSVJfQUxMT0NBVE9SX1NFTEVDVChfS2V5LCBfVHAgKSBfU1RMUF9ERkxfVFlQRV9QQVJBTShfQWxsb2MsX19zZ2lfYWxsb2MpCisjICBpZiBkZWZpbmVkIChfU1RMUF9MSU1JVEVEX0RFRkFVTFRfVEVNUExBVEVTKSAmJiAhZGVmaW5lZCAoX1NUTFBfREVGQVVMVF9UWVBFX1BBUkFNKQorIyAgICBkZWZpbmUgX1NUTFBfVVNFX1dSQVBQRVJfRk9SX0FMTE9DX1BBUkFNIDEKKyMgIGVuZGlmCisjZW5kaWYKKworLyogZGVidWcgbW9kZSB0b29sICovCisjaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpCisjICBkZWZpbmUgX1NUTFBfTk9OX0RCR19OQU1FKFgpIF9Ob25EYmdfIyNYCisjZW5kaWYKKworLyogcG9pbnRlciBzcGVjaWFsaXphdGlvbiB0b29sICovCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BUUl9TUEVDSUFMSVpBVElPTlMpCisjICBkZWZpbmUgX1NUTFBfUFRSX0lNUExfTkFNRShYKSBfSW1wbF8jI1gKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX01TVkM2X01FTV9UX0JVR19XT1JLQVJPVU5EKQorIyAgZGVmaW5lIF9TVExQX05PX01FTV9UX05BTUUoWCkgX05vTWVtVF8jI1gKKyMgIGlmIGRlZmluZWQgKF9TVExQX0RFQlVHKQorIyAgICBkZWZpbmUgX1NUTFBfTk9OX0RCR19OT19NRU1fVF9OQU1FKFgpIF9Ob25EYmdfTm9NZW1UXyMjWAorIyAgZW5kaWYKKyNlbmRpZgorCisvKiB0aGlzIGFsd2F5cyBtZWFuIHRoZSBDIGxpYnJhcnkgaXMgaW4gZ2xvYmFsIG5hbWVzcGFjZSAqLworI2lmIGRlZmluZWQgKF9TVExQX0hBU19OT19ORVdfQ19IRUFERVJTKSAmJiAhZGVmaW5lZCAoX1NUTFBfVkVORE9SX0dMT0JBTF9DU1REKQorIyAgZGVmaW5lIF9TVExQX1ZFTkRPUl9HTE9CQUxfQ1NURCAxCisjZW5kaWYKKworLyogRGVwZW5kaW5nIG9mIHdoZXRoZXIgY29tcGlsZXIgc3VwcG9ydHMgbmFtZXNwYWNlcywKKyAqIHR1bmUgdGhlIHBhcmFtZXRlcnMgZm9yIHZlbmRvci1zdXBwbGllZCBsaWJyYXJpZXMuCisgKiBUaGlzIHNlY3Rpb24gaXMgZ3VhcmRlZCBieSBfU1RMUF9IQVNfTk9fTkFNRVNQQUNFUywgbm90IGJ5IF9TVExQX1VTRV9OQU1FU1BBQ0VTLAorICogc2luY2UgaXQgZGVwZW5kcyBvbmx5IG9uIHRoZSBuYXRpdmUgZmVhdHVyZXMsIG5vdCBvbiB1c2VyJ3MgcHJlZmVyZW5jZSB3aGV0aGVyCisgKiB0byB1c2UgbmFtZXNwYWNlIGZvciBTVExwb3J0IG9yIG5vdC4KKyAqLworI2lmICFkZWZpbmVkIChfU1RMUF9IQVNfTk9fTkFNRVNQQUNFUykKKy8qIEltcG9ydCBzb21lIHZlbmRvcidzIGhlYWRlcnMgaW50byBjb3JyZXNwb25kaW5nIFNUTHBvcnQgb25lcyBpZiB0aGV5IG1pZ2h0IGJlIG5lZWRlZAorICogKGlmIHdlIHdyYXAgbmF0aXZlIGlvc3RyZWFtcyBhbmQgdXNlIG5hbWVwYWNlIG90aGVyIHRoYW4gc3RkOjopICovCisjICBpZiBkZWZpbmVkIChfU1RMUF9XSE9MRV9OQVRJVkVfU1REKQorIyAgICBkZWZpbmUgIF9TVExQX0lNUE9SVF9WRU5ET1JfU1REIDEKKyMgICAgdW5kZWYgICBfU1RMUF9NSU5JTVVNX0lNUE9SVF9TVEQKKyMgIGVuZGlmCisKKy8qIGlmIHVzaW5nIHN0bHBvcnQ6OiBuYW1lc3BhY2Ugb3IgaWYgQyBsaWJyYXJ5IHN0dWZmIGlzIG5vdCBpbiB2ZW5kb3IncyBzdGQ6OiwKKyAqIHRyeSBpbXBvcnRpbmcgJ2VtLgorICogTVNWQyBoYXMgYW1iaWd1aXR5IHByb2JsZW0gd2hlbiB3ZSB0cnkgdG8gaW1wb3J0IEMtc3R5bGUgc3RkOjogc3R1ZmYgYmFjayBpbnRvIGdsb2JhbCBuYW1lc3BhY2UgKi8KKyMgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9OQU1FU1BBQ0VTKSAmJiAoZGVmaW5lZChfU1RMUF9VU0VfT1dOX05BTUVTUEFDRSkgfHwgZGVmaW5lZCAoX1NUTFBfVkVORE9SX0dMT0JBTF9DU1REKSkKKyMgICAgZGVmaW5lICBfU1RMUF9JTVBPUlRfVkVORE9SX0NTVEQgMQorIyAgZW5kaWYKKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfTk9fVVNJTkdfRk9SX0dMT0JBTF9GVU5DVElPTlMpICYmICFkZWZpbmVkIChfU1RMUF9ET19JTVBPUlRfQ1NURF9GVU5DVElPTlMpCisjICAgIGRlZmluZSBfU1RMUF9OT19DU1REX0ZVTkNUSU9OX0lNUE9SVFMKKyMgIGVuZGlmCisKKyMgIGRlZmluZSBfU1RMUF9VU0lOR19OQU1FU1BBQ0UoeCkgdXNpbmcgbmFtZXNwYWNlIHggOworCituYW1lc3BhY2Ugc3RkIHsgfQorbmFtZXNwYWNlIF9fc3RkX2FsaWFzID0gc3RkOworCisvKiBhc3N1bWUgc3RkOjogbmFtZXNwYWNlIGZvciBDKysgc3RkIGxpYnJhcnkgaWYgbm90IGJlaW5nIHRvbGQgb3RoZXJ3aXNlICovCisjICBpZiBkZWZpbmVkIChfU1RMUF9WRU5ET1JfR0xPQkFMX1NURCkKKyMgICAgZGVmaW5lIF9TVExQX1ZFTkRPUl9TVEQKKyMgIGVsc2UKKyMgICAgZGVmaW5lIF9TVExQX1ZFTkRPUl9TVEQgX19zdGRfYWxpYXMKKyMgIGVuZGlmCisKKy8qIHR1bmUgdGhpbmdzIHRoYXQgY29tZSBmcm9tIEMgbGlicmFyeSAqLworIyAgaWYgIGRlZmluZWQgKF9TVExQX1ZFTkRPUl9HTE9CQUxfQ1NURCkgfHwgIWRlZmluZWQoX1NUTFBfVVNFX05FV19DX0hFQURFUlMpCisvKiAgaW4gb2xkLXN0eWxlIGhlYWRlcnMsIEMgZnVuY3Rpb25zIGdvIHRvIGdsb2JhbCBzY29wZS4gKi8KKyMgICAgZGVmaW5lIF9TVExQX1ZFTkRPUl9DU1RECisjICAgIGRlZmluZSBfU1RMUF9VU0lOR19WRU5ET1JfQ1NURAorIyAgZWxzZQorIyAgICBkZWZpbmUgX1NUTFBfVkVORE9SX0NTVEQgIF9TVExQX1ZFTkRPUl9TVEQKKyMgICAgZGVmaW5lIF9TVExQX1VTSU5HX1ZFTkRPUl9DU1REIF9TVExQX1VTSU5HX05BTUVTUEFDRShfU1RMUF9WRU5ET1JfQ1NURCkKKyMgIGVuZGlmIC8qIF9TVExQX1ZFTkRPUl9DU1REICovCisvKiBleGNlcHRpb24sIHR5cGVpbmZvLCBuZXcgLSBhbHdheXMgY29tZSBmcm9tIHRoZSB2ZW5kb3IgKi8KKyMgIGlmICFkZWZpbmVkIChfU1RMUF9WRU5ET1JfRVhDRVBUX1NURCkKKyMgICAgaWYgZGVmaW5lZCAoX1NUTFBfVkVORE9SX0dMT0JBTF9FWENFUFRfU1REKQorIyAgICAgIGRlZmluZSBfU1RMUF9WRU5ET1JfRVhDRVBUX1NURAorIyAgICBlbHNlCisjICAgICAgZGVmaW5lIF9TVExQX1ZFTkRPUl9FWENFUFRfU1REIF9TVExQX1ZFTkRPUl9TVEQKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjICBkZWZpbmUgX1NUTFBfT0xEX0lPX05BTUVTUEFDRQorIyAgaWYgIWRlZmluZWQgKF9TVExQX1ZFTkRPUl9NQl9OQU1FU1BBQ0UpCisjICAgIGRlZmluZSBfU1RMUF9WRU5ET1JfTUJfTkFNRVNQQUNFIF9TVExQX1ZFTkRPUl9DU1RECisjICBlbmRpZgorI2Vsc2UKKy8qIGNvbXBpbGVyIGhhcyBubyBuYW1lc3BhY2Ugc3VwcG9ydCAqLworIyAgZGVmaW5lIF9TVExQX1ZFTkRPUl9TVEQKKyMgIGRlZmluZSBfU1RMUF9WRU5ET1JfQ1NURAorIyAgZGVmaW5lIF9TVExQX1VTSU5HX05BTUVTUEFDRSh4KQorIyAgZGVmaW5lIF9TVExQX1VTSU5HX1ZFTkRPUl9DU1RECisjICBkZWZpbmUgX1NUTFBfVkVORE9SX0VYQ0VQVF9TVEQKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX05BTUVTUEFDRVMpCisKKyMgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9PV05fTkFNRVNQQUNFKQorIyAgICBpZiAhZGVmaW5lZCAoX1NUTFBfU1REX05BTUUpCisjICAgICAgaWYgIWRlZmluZWQgKF9TVExQX0RFQlVHKQorIyAgICAgICAgaWYgIWRlZmluZWQgKF9TVExQX1VTSU5HX0NST1NTX05BVElWRV9SVU5USU1FX0xJQikKKyMgICAgICAgICAgaWZuZGVmIF9TVExQX1RIUkVBRFMKKyMgICAgICAgICAgICBkZWZpbmUgX1NUTFBfU1REX05BTUUgIHN0bHBtdHhfc3RkCisjICAgICAgICAgIGVsc2UKKyMgICAgICAgICAgICBkZWZpbmUgX1NUTFBfU1REX05BTUUgIHN0bHBfc3RkCisjICAgICAgICAgIGVuZGlmCisjICAgICAgICBlbHNlCisjICAgICAgICAgIGlmbmRlZiBfU1RMUF9USFJFQURTCisjICAgICAgICAgICAgZGVmaW5lIF9TVExQX1NURF9OQU1FICBzdGxweG10eF9zdGQKKyMgICAgICAgICAgZWxzZQorIyAgICAgICAgICAgIGRlZmluZSBfU1RMUF9TVERfTkFNRSAgc3RscHhfc3RkCisjICAgICAgICAgIGVuZGlmCisjICAgICAgICBlbmRpZgorIyAgICAgIGVsc2UKKy8qCisgKiBUaGUgU1RMcG9ydCBkZWJ1ZyBtb2RlIGlzIGJpbmFyeSBpbmNvbXBhdGlibGUgd2l0aCB0aGUgb3RoZXIgbW9kZXMsCisgKiBsZXRzIG1ha2UgaXQgY2xlYXIgb24gdGhlIFNUTHBvcnQgbmFtZXNwYWNlIHRvIGdlbmVyYXRlIGxpbmsgZXJyb3JzIHJhdGhlcgorICogdGhhbiBydW50aW1lLgorICovCisjICAgICAgICBpZiAhZGVmaW5lZCAoX1NUTFBfVVNJTkdfQ1JPU1NfTkFUSVZFX1JVTlRJTUVfTElCKQorIyAgICAgICAgICBpZm5kZWYgX1NUTFBfVEhSRUFEUworIyAgICAgICAgICAgIGRlZmluZSBfU1RMUF9TVERfTkFNRSAgc3RscGRtdHhfc3RkCisjICAgICAgICAgIGVsc2UKKyMgICAgICAgICAgICBkZWZpbmUgX1NUTFBfU1REX05BTUUgIHN0bHBkX3N0ZAorIyAgICAgICAgICBlbmRpZgorIyAgICAgICAgZWxzZQorIyAgICAgICAgICBpZm5kZWYgX1NUTFBfVEhSRUFEUworIyAgICAgICAgICAgIGRlZmluZSBfU1RMUF9TVERfTkFNRSAgc3RscGR4bXR4X3N0ZAorIyAgICAgICAgICBlbHNlCisjICAgICAgICAgICAgZGVmaW5lIF9TVExQX1NURF9OQU1FICBzdGxwZHhfc3RkCisjICAgICAgICAgIGVuZGlmCisjICAgICAgICBlbmRpZgorIyAgICAgIGVuZGlmCisjICAgIGVuZGlmCituYW1lc3BhY2UgX1NUTFBfU1REX05BTUUgeyB9CisjICBlbHNlCisjICAgIGlmIGRlZmluZWQgKF9TVExQX0RFQlVHKQorbmFtZXNwYWNlIHN0ZEQgPSBzdGQ7CisjICAgIGVuZGlmCisjICAgIGRlZmluZSBfU1RMUF9TVERfTkFNRSBzdGQKKyMgIGVuZGlmIC8qIF9TVExQX1VTRV9PV05fTkFNRVNQQUNFICovCisKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9VU0lOR19OQU1FU1BBQ0VfQlVHKQorIyAgICBkZWZpbmUgX1NUTFBfUFJJVl9OQU1FIHN0bHBfcHJpdgorbmFtZXNwYWNlIF9TVExQX1BSSVZfTkFNRSB7CisgIHVzaW5nIG5hbWVzcGFjZSBfU1RMUF9TVERfTkFNRTsKK30KKyMgIGVsc2UKKyMgICAgZGVmaW5lIF9TVExQX1BSSVZfTkFNRSBwcml2CisjICBlbmRpZgorCisjICBkZWZpbmUgX1NUTFBfQkVHSU5fTkFNRVNQQUNFIG5hbWVzcGFjZSBfU1RMUF9TVERfTkFNRSB7CisjICBkZWZpbmUgX1NUTFBfRU5EX05BTUVTUEFDRSB9CisKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9ET05UX1VTRV9QUklWX05BTUVTUEFDRSkKKyMgICAgaWYgIWRlZmluZWQgKF9TVExQX1VTSU5HX05BTUVTUEFDRV9CVUcpCisvKiBXZSBwcmVmZXIgdG8gbWFrZSBwcml2YXRlIG5hbWVzcGFjZSBhIHRvdGFseSBzZXBlcmF0ZWQgbmFtZXNwYWNlLi4uCisgKi8KKyMgICAgICBkZWZpbmUgX1NUTFBfUFJJViA6Ol9TVExQX1BSSVZfTkFNRTo6CisjICAgICAgZGVmaW5lIF9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UgfSBuYW1lc3BhY2UgX1NUTFBfUFJJVl9OQU1FIHsKKyMgICAgICBkZWZpbmUgX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFIH0gbmFtZXNwYWNlIF9TVExQX1NURF9OQU1FIHsKKyMgICAgZWxzZQorLyogYnV0IHNvbWV0aW1lcyB3ZSBjYW4ndDoKKyAqLworIyAgICAgIGRlZmluZSBfU1RMUF9QUklWIF9TVExQX1BSSVZfTkFNRTo6CisjICAgICAgZGVmaW5lIF9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UgbmFtZXNwYWNlIF9TVExQX1BSSVZfTkFNRSB7CisjICAgICAgZGVmaW5lIF9TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRSB9CisjICAgIGVuZGlmCisjICBlbHNlCisjICAgIGRlZmluZSBfU1RMUF9QUklWCisjICAgIGRlZmluZSBfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisjICAgIGRlZmluZSBfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKyMgIGVuZGlmCisKKy8qIGRlY2lkZSB3aGV0aGVyIG9yIG5vdCB3ZSB1c2Ugc2VwYXJhdGUgbmFtZXNwYWNlIGZvciByZWwgb3BzICovCisjICBpZiBkZWZpbmVkIChfU1RMUF9OT19SRUxPUFNfTkFNRVNQQUNFKQorIyAgICBkZWZpbmUgX1NUTFBfQkVHSU5fUkVMT1BTX05BTUVTUEFDRSBfU1RMUF9CRUdJTl9OQU1FU1BBQ0UgbmFtZXNwYWNlIHJlbF9vcHMge30KKyMgICAgZGVmaW5lIF9TVExQX0VORF9SRUxPUFNfTkFNRVNQQUNFIH0KKyMgIGVsc2UKKy8qIFVzZSBzdGQ6OnJlbF9vcHMgbmFtZXNwYWNlICovCisjICAgIGRlZmluZSBfU1RMUF9CRUdJTl9SRUxPUFNfTkFNRVNQQUNFIF9TVExQX0JFR0lOX05BTUVTUEFDRSBuYW1lc3BhY2UgcmVsX29wcyB7CisjICAgIGRlZmluZSBfU1RMUF9FTkRfUkVMT1BTX05BTUVTUEFDRSB9IH0KKyMgICAgZGVmaW5lIF9TVExQX1VTRV9TRVBBUkFURV9SRUxPUFNfTkFNRVNQQUNFCisjICBlbmRpZiAvKiBVc2Ugc3RkOjpyZWxfb3BzIG5hbWVzcGFjZSAqLworCisjICBkZWZpbmUgX1NUTFBfU1REIDo6X1NUTFBfU1REX05BTUUKKworLyogT2ZmaWNpYWwgU1RMcG9ydCBuYW1lc3BhY2Ugd2hlbiBzdGQgaXMgbm90IHJlZGVmaW5lZC4KKyAqIEhlcmUgd2UgZG9uJ3QgdXNlIGEgbWFjcm8gYXMgc3RscG9ydCBpcyB1c2VkIGFzIGZpbGUgbmFtZSBieSBib29zdAorICogYW5kIGZvbGRlciBuYW1lIHVuZGVyIGJlb3M6CisgKi8KK25hbWVzcGFjZSBzdGxwb3J0ID0gX1NUTFBfU1REX05BTUU7CisKKy8qIEJhY2t3YXJkIGNvbXBhdGliaWxpdHk6CisgKi8KK25hbWVzcGFjZSBfU1RMID0gX1NUTFBfU1REX05BTUU7CisjdW5kZWYgX19TVExQT1JUX05BTUVTUEFDRQorI2RlZmluZSBfX1NUTFBPUlRfTkFNRVNQQUNFIF9TVExQX1NURF9OQU1FCisKKyNlbHNlIC8qIF9TVExQX1VTRV9OQU1FU1BBQ0VTICovCisvKiBTVExwb3J0IGlzIGJlaW5nIHB1dCBpbnRvIGdsb2JhbCBuYW1lc3BhY2UgKi8KKyMgIGRlZmluZSBfU1RMUF9TVEQKKyMgIGRlZmluZSBfU1RMUF9QUklWCisjICBkZWZpbmUgX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisjICBkZWZpbmUgX1NUTFBfRU5EX05BTUVTUEFDRQorIyAgZGVmaW5lIF9TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKyMgIGRlZmluZSBfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKworLyogYm9yaXMgOiBpdCB3YXMgZm91bmQgb3V0IHRoYXQgX1NUTFBfVVNFX1NFUEFSQVRFX1JFTE9QU19OQU1FU1BBQ0UKKyAgIGNhdXNlcyBsZXNzIHByb2JsZW1zIHRoYW4gaGF2aW5nIHJlbGF0aW9uYWwgb3BlcmF0b3IgdGVtcGxhdGVzIGluIGdsb2JhbCBuYW1lc3BhY2UKKyAgIFBsZWFzZSBkZWZpbmUgX1NUTFBfTk9fUkVMT1BTX05BTUVTUEFDRSBpbiBjb25maWcvdXNlcl9jb25maWcuaCBpZiB5b3VyIGNvZGUgcmVseSBvbiB0aGVtLiAqLworIyAgaWYgIWRlZmluZWQgKF9TVExQX05PX1JFTE9QU19OQU1FU1BBQ0UpCisjICAgIGRlZmluZSBfU1RMUF9VU0VfU0VQQVJBVEVfUkVMT1BTX05BTUVTUEFDRQorIyAgZW5kaWYKKyMgIGRlZmluZSBfU1RMUF9CRUdJTl9SRUxPUFNfTkFNRVNQQUNFCisjICBkZWZpbmUgX1NUTFBfRU5EX1JFTE9QU19OQU1FU1BBQ0UKKyMgIHVuZGVmICBfU1RMUF9VU0VfT1dOX05BTUVTUEFDRQorI2VuZGlmICAvKiBfU1RMUF9VU0VfTkFNRVNQQUNFUyAqLworCisjZGVmaW5lIFNUTFBPUlRfQ1NURCBfU1RMUF9WRU5ET1JfQ1NURAorI2RlZmluZSBTVExQT1JUICAgICAgX1NUTFBfU1REX05BTUUKKworI2lmIGRlZmluZWQoX1NUTFBfQk9HVVNfVEVNUExBVEVfVFlQRV9NQVRDSElOR19CVUcpCisjICBkZWZpbmUgX1NUTFBfU0lNUExFX1RZUEUoVCkgX3N0bF90cml2aWFsX3Byb3h5PFQ+CisjZWxzZQorIyAgZGVmaW5lIF9TVExQX1NJTVBMRV9UWVBFKFQpIFQKKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX1JBTkQ0OAorIyAgZGVmaW5lIF9TVExQX05PX0RSQU5ENDgKKyNlbmRpZgorCisvKiBhZHZhbmNlZCBrZXl3b3JkcyB1c2FnZSAqLworI2RlZmluZSBfX0NfQ0FTVChfX3gsIF9feSkgKChfX3gpKF9feSkpCisjaWZuZGVmICBfU1RMUF9OT19ORVdfU1RZTEVfQ0FTVFMKKyMgIGRlZmluZSBfX0NPTlNUX0NBU1QoX194LF9feSkgY29uc3RfY2FzdDxfX3g+KF9feSkKKyMgIGRlZmluZSBfX1NUQVRJQ19DQVNUKF9feCxfX3kpIHN0YXRpY19jYXN0PF9feD4oX195KQorIyAgZGVmaW5lIF9fUkVJTlRFUlBSRVRfQ0FTVChfX3gsX195KSByZWludGVycHJldF9jYXN0PF9feD4oX195KQorIyAgZGVmaW5lIF9fRFlOQU1JQ19DQVNUKF9feCxfX3kpIGR5bmFtaWNfY2FzdDxfX3g+KF9feSkKKyNlbHNlCisjICBkZWZpbmUgX19TVEFUSUNfQ0FTVChfX3gsX195KSBfX0NfQ0FTVChfX3gsIF9feSkKKyMgIGRlZmluZSBfX0NPTlNUX0NBU1QoX194LF9feSkgX19DX0NBU1QoX194LCBfX3kpCisjICBkZWZpbmUgX19SRUlOVEVSUFJFVF9DQVNUKF9feCxfX3kpIF9fQ19DQVNUKF9feCwgX195KQorIyAgZGVmaW5lIF9fRFlOQU1JQ19DQVNUKF9feCxfX3kpIF9fQ19DQVNUKF9feCwgX195KQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9ORUVEX1RZUEVOQU1FKSAmJiAhIGRlZmluZWQgKHR5cGVuYW1lKQorIyAgZGVmaW5lIHR5cGVuYW1lCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX05FRURfVFlQRU5BTUUpIHx8IGRlZmluZWQgKF9TVExQX05PX1RZUEVOQU1FX09OX1JFVFVSTl9UWVBFICkKKyMgIGRlZmluZSBfU1RMUF9UWVBFTkFNRV9PTl9SRVRVUk5fVFlQRQorI2Vsc2UKKyMgIGRlZmluZSBfU1RMUF9UWVBFTkFNRV9PTl9SRVRVUk5fVFlQRSB0eXBlbmFtZQorI2VuZGlmCisKKyNpZmRlZiBfU1RMUF9OT19UWVBFTkFNRV9JTl9URU1QTEFURV9IRUFERVIKKyMgIGRlZmluZSBfU1RMUF9IRUFERVJfVFlQRU5BTUUKKyNlbHNlCisjICBkZWZpbmUgX1NUTFBfSEVBREVSX1RZUEVOQU1FIHR5cGVuYW1lCisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVfS0VZV09SRAorIyAgZGVmaW5lIF9TVExQX1RFTVBMQVRFIHRlbXBsYXRlCisjZWxzZQorIyAgZGVmaW5lIF9TVExQX1RFTVBMQVRFCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9DT05UQUlORVJTX0VYVEVOU0lPTikKKyMgIGRlZmluZSBfU1RMUF9LRVlfVFlQRV9GT1JfQ09OVF9FWFQodHlwZSkKKyMgIGRlZmluZSBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQgdGVtcGxhdGUgPGNsYXNzIF9LVD4KKyNlbHNlCisjICBkZWZpbmUgX1NUTFBfS0VZX1RZUEVfRk9SX0NPTlRfRVhUKHR5cGUpIHR5cGVkZWYgdHlwZSBfS1Q7CisjICBkZWZpbmUgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX05FRURfRVhQTElDSVQpICYmICFkZWZpbmVkIChleHBsaWNpdCkKKyMgIGRlZmluZSBleHBsaWNpdAorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTkVFRF9NVVRBQkxFKQorIyAgZGVmaW5lIF9TVExQX0FTU0lHTl9NVVRBQkxFKHR5cGUseCx5KSB4ID0geQorI2Vsc2UKKyMgIGRlZmluZSBfU1RMUF9BU1NJR05fTVVUQUJMRSh0eXBlLHgseSkgX19DT05TVF9DQVNUKHR5cGUseCk9eQorIyAgZGVmaW5lIG11dGFibGUKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfTk9fU0lHTkVEX0JVSUxUSU5TKQorLyogb2xkIEhQLVVYIGRvZXNuJ3QgdW5kZXJzdGFuZCAic2lnbmVkIiBrZXl3b3JkICovCisjICBkZWZpbmUgc2lnbmVkCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX0xPT1BfSU5MSU5FX1BST0JMRU1TKQorIyAgZGVmaW5lIF9TVExQX0lOTElORV9MT09QCisjZWxzZQorIyAgZGVmaW5lIF9TVExQX0lOTElORV9MT09QIGlubGluZQorI2VuZGlmCisKKyNkZWZpbmUgX1NUTFBfUFJJVkFURSBwdWJsaWMKKworI2lmbmRlZiBfU1RMUF9OT19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OX1NZTlRBWAorIyAgZGVmaW5lIF9TVExQX1RFTVBMQVRFX05VTEwgdGVtcGxhdGU8PgorI2Vsc2UKKyMgIGRlZmluZSBfU1RMUF9URU1QTEFURV9OVUxMCisjZW5kaWYKKworI2lmZGVmIF9TVExQX0ZVTkNUSU9OX1RNUExfUEFSVElBTF9PUkRFUgorIyAgZGVmaW5lIF9TVExQX09QRVJBVE9SX1RFTVBMQVRFCisjZWxzZQorIyAgZGVmaW5lIF9TVExQX09QRVJBVE9SX1RFTVBMQVRFIF9TVExQX1RFTVBMQVRFX05VTEwKKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04KKy8qIHVubGVzcyB3ZSBoYXZlIG90aGVyIGNvbXBpbGVyIHByb2JsZW0sIHRyeSBzaW11bGF0aW5nIHBhcnRpYWwgc3BlYyBoZXJlICovCisjICBpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9TSU1VTEFURV9QQVJUSUFMX1NQRUNfRk9SX1RZUEVfVFJBSVRTKQorIyAgICBkZWZpbmUgX1NUTFBfU0lNVUxBVEVfUEFSVElBTF9TUEVDX0ZPUl9UWVBFX1RSQUlUUworIyAgZW5kaWYKKy8qIEZvciB5b3VyIG93biBpdGVyYXRvcnMsIHBsZWFzZSB1c2UgaW5oZXJpdGFuY2UgZnJvbSBpdGVyYXRvcjw+IGluc3RlYWQgb2YgdGhlc2Ugb2Jzb2xldGUgcXVlcmllcy4gKi8KKyMgIGlmICAoZGVmaW5lZCAoX1NUTFBfTkVTVEVEX1RZUEVfUEFSQU1fQlVHKSB8fCAhZGVmaW5lZCAoX1NUTFBfU0lNVUxBVEVfUEFSVElBTF9TUEVDX0ZPUl9UWVBFX1RSQUlUUykpCisjICAgIGlmICEgZGVmaW5lZCAoIF9TVExQX1VTRV9PTERfSFBfSVRFUkFUT1JfUVVFUklFUyApCisjICAgICAgZGVmaW5lIF9TVExQX1VTRV9PTERfSFBfSVRFUkFUT1JfUVVFUklFUworIyAgICBlbmRpZgorIyAgZWxpZiBkZWZpbmVkICggX1NUTFBfTk9fQU5BQ0hST05JU01TICkKKyMgICAgdW5kZWYgX1NUTFBfVVNFX09MRF9IUF9JVEVSQVRPUl9RVUVSSUVTCisjICBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfTk9fRVhQTElDSVRfRlVOQ1RJT05fVE1QTF9BUkdTCisjICBkZWZpbmUgX1NUTFBfTlVMTF9UTVBMX0FSR1MgPD4KKyMgZWxzZQorIyAgZGVmaW5lIF9TVExQX05VTExfVE1QTF9BUkdTCisjZW5kaWYKKworI2lmICFkZWZpbmVkIChfU1RMUF9BTExPQ0FUT1JfVFlQRV9ERkwpCisjICBpZiBkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQorIyAgICBkZWZpbmUgX1NUTFBfTkVFRFNfRVhUUkFfVEVNUExBVEVfQ09OU1RSVUNUT1JTCisjICBlbmRpZgorIyAgaWYgZGVmaW5lZCAoX1NUTFBfTkVFRFNfRVhUUkFfVEVNUExBVEVfQ09OU1RSVUNUT1JTKQorIyAgICBkZWZpbmUgX1NUTFBfQUxMT0NBVE9SX1RZUEVfREZMCisjICBlbHNlCisjICAgIGRlZmluZSBfU1RMUF9BTExPQ0FUT1JfVFlQRV9ERkwgPSBhbGxvY2F0b3JfdHlwZSgpCisjICBlbmRpZgorI2VuZGlmCisKKy8qIFdoZW4gdGhlIGNvbXBpbGVyIGRvIG5vdCBjb3JyZWN0bHkgaW5pdGlhbGl6ZWQgdGhlIGJhc2ljIHR5cGVzIHZhbHVlIGluIGRlZmF1bHQgcGFyYW1ldGVycyB3ZSBwcmVmZXIKKyAqIHRvIGF2b2lkIHRoZW0gdG8gYmUgYWJsZSB0byBjb3JyZWN0IHRoaXMgYnVnLgorICovCisjaWYgZGVmaW5lZCAoX1NUTFBfREVGX0NPTlNUX0RFRl9QQVJBTV9CVUcpCisjICBkZWZpbmUgX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSAxCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fU0dJX1NUTF9OT19BUlJPV19PUEVSQVRPUikgJiYgISBkZWZpbmVkIChfU1RMUF9OT19BUlJPV19PUEVSQVRPUikKKyMgIGRlZmluZSBfU1RMUF9OT19BUlJPV19PUEVSQVRPUgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikKKyMgIGlmICEoZGVmaW5lZCAoX1NUTFBfTk9fQVJST1dfT1BFUkFUT1IpKSAmJiBcCisgICAgICAgIWRlZmluZWQgKF9TVExQX05PX01TVkM1MF9DT01QQVRJQklMSVRZKSAmJiAhZGVmaW5lZCAoX1NUTFBfTVNWQzUwX0NPTVBBVElCSUxJVFkpCisvKiB0aGlzIG9uZSBpcyBuZWVkZWQgZm9yIHByb3BlciByZXZlcnNlX2l0ZXJhdG9yPD4gb3BlcmF0b3IgLT4oKSBoYW5kbGluZyAqLworIyAgICBkZWZpbmUgX1NUTFBfTVNWQzUwX0NPTVBBVElCSUxJVFkgMQorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoIF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04gKQorIyAgaWYgKGRlZmluZWQoX19JQk1DUFBfXykgJiYgKDUwMCA8PSBfX0lCTUNQUF9fKSAmJiAoX19JQk1DUFBfXyA8IDYwMCkgKQorIyAgICBkZWZpbmUgX1NUTFBfREVDTEFSRV9SRVZFUlNFX0lURVJBVE9SUyhfX3JldmVyc2VfaXRlcmF0b3IpIFwKKyAgIHR5cGVkZWYgdHlwZW5hbWUgX1NUTFBfU1REIDo6IHJldmVyc2VfaXRlcmF0b3I8Y29uc3RfaXRlcmF0b3I+IGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7IFwKKyAgIHR5cGVkZWYgdHlwZW5hbWUgX1NUTFBfU1REIDo6IHJldmVyc2VfaXRlcmF0b3I8aXRlcmF0b3I+IHJldmVyc2VfaXRlcmF0b3IKKyMgIGVsaWYgKGRlZmluZWQgKF9fc2dpKSAmJiAhIGRlZmluZWQgKF9fR05VQ19fKSkgfHwgZGVmaW5lZCAoX19TVU5QUk9fQ0MpIHx8IGRlZmluZWQgKF9feGxDX18pCisjICAgIGRlZmluZSBfU1RMUF9ERUNMQVJFX1JFVkVSU0VfSVRFUkFUT1JTKF9fcmV2ZXJzZV9pdGVyYXRvcikgXAorICAgdHlwZWRlZiBfU1RMUF9TVEQ6OiBfU1RMUF9URU1QTEFURSByZXZlcnNlX2l0ZXJhdG9yPGNvbnN0X2l0ZXJhdG9yPiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOyBcCisgICB0eXBlZGVmIF9TVExQX1NURDo6IF9TVExQX1RFTVBMQVRFIHJldmVyc2VfaXRlcmF0b3I8aXRlcmF0b3I+IHJldmVyc2VfaXRlcmF0b3IKKyMgIGVsc2UKKyMgICAgZGVmaW5lIF9TVExQX0RFQ0xBUkVfUkVWRVJTRV9JVEVSQVRPUlMoX19yZXZlcnNlX2l0ZXJhdG9yKSBcCisgICB0eXBlZGVmIF9TVExQX1NURDo6cmV2ZXJzZV9pdGVyYXRvcjxjb25zdF9pdGVyYXRvcj4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsgXAorICAgdHlwZWRlZiBfU1RMUF9TVEQ6OnJldmVyc2VfaXRlcmF0b3I8aXRlcmF0b3I+IHJldmVyc2VfaXRlcmF0b3IKKyMgIGVuZGlmCisjZWxzZSAvKiBfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OICovCisjICBpZiBkZWZpbmVkIChfU1RMUF9NU1ZDNTBfQ09NUEFUSUJJTElUWSkKKyMgICAgZGVmaW5lIF9TVExQX0RFQ0xBUkVfUkVWRVJTRV9JVEVSQVRPUlMoX19yZXZlcnNlX2l0ZXJhdG9yKSBcCisgIHR5cGVkZWYgX1NUTFBfU1REOjpfX3JldmVyc2VfaXRlcmF0b3I8Y29uc3RfaXRlcmF0b3IsIHZhbHVlX3R5cGUsIGNvbnN0X3JlZmVyZW5jZSwgXAorICAgIGNvbnN0X3BvaW50ZXIsIGRpZmZlcmVuY2VfdHlwZT4gIGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7IFwKKyAgdHlwZWRlZiBfU1RMUF9TVEQ6Ol9fcmV2ZXJzZV9pdGVyYXRvcjxpdGVyYXRvciwgdmFsdWVfdHlwZSwgcmVmZXJlbmNlLCBwb2ludGVyLCBkaWZmZXJlbmNlX3R5cGU+IFwKKyAgICByZXZlcnNlX2l0ZXJhdG9yCisjICBlbHNlCisjICAgIGRlZmluZSBfU1RMUF9ERUNMQVJFX1JFVkVSU0VfSVRFUkFUT1JTKF9fcmV2ZXJzZV9pdGVyYXRvcikgXAorICB0eXBlZGVmIF9TVExQX1NURDo6X19yZXZlcnNlX2l0ZXJhdG9yPGNvbnN0X2l0ZXJhdG9yLCB2YWx1ZV90eXBlLCBjb25zdF9yZWZlcmVuY2UsIFwKKyAgICBkaWZmZXJlbmNlX3R5cGU+ICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOyBcCisgIHR5cGVkZWYgX1NUTFBfU1REOjpfX3JldmVyc2VfaXRlcmF0b3I8aXRlcmF0b3IsIHZhbHVlX3R5cGUsIFwKKyAgICByZWZlcmVuY2UsIGRpZmZlcmVuY2VfdHlwZT4gXAorICAgIHJldmVyc2VfaXRlcmF0b3IKKyMgIGVuZGlmCisjZW5kaWYgLyogX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTiAqLworCisjZGVmaW5lIF9TVExQX0RFQ0xBUkVfQklESVJFQ1RJT05BTF9SRVZFUlNFX0lURVJBVE9SUyBcCisgICAgICAgIF9TVExQX0RFQ0xBUkVfUkVWRVJTRV9JVEVSQVRPUlMocmV2ZXJzZV9iaWRpcmVjdGlvbmFsX2l0ZXJhdG9yKQorI2RlZmluZSBfU1RMUF9ERUNMQVJFX1JBTkRPTV9BQ0NFU1NfUkVWRVJTRV9JVEVSQVRPUlMgXAorICAgICAgICBfU1RMUF9ERUNMQVJFX1JFVkVSU0VfSVRFUkFUT1JTKHJldmVyc2VfaXRlcmF0b3IpCisKKyNkZWZpbmUgX19JTVBPUlRfQ09OVEFJTkVSX1RZUEVERUZTKF9TdXBlcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdHlwZWRlZiB0eXBlbmFtZSBfU3VwZXI6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHR5cGVkZWYgdHlwZW5hbWUgX1N1cGVyOjpzaXplX3R5cGUgc2l6ZV90eXBlOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9TdXBlcjo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsgICAgICAgICAgICBcCisgICAgdHlwZWRlZiB0eXBlbmFtZSBfU3VwZXI6OnJlZmVyZW5jZSByZWZlcmVuY2U7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHR5cGVkZWYgdHlwZW5hbWUgX1N1cGVyOjpjb25zdF9yZWZlcmVuY2UgY29uc3RfcmVmZXJlbmNlOyAgICAgICAgICAgIFwKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9TdXBlcjo6cG9pbnRlciBwb2ludGVyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdHlwZWRlZiB0eXBlbmFtZSBfU3VwZXI6OmNvbnN0X3BvaW50ZXIgY29uc3RfcG9pbnRlcjsgICAgICAgICAgICAgICAgXAorICAgIHR5cGVkZWYgdHlwZW5hbWUgX1N1cGVyOjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKKworCisjZGVmaW5lIF9fSU1QT1JUX0lURVJBVE9SUyhfU3VwZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHR5cGVkZWYgdHlwZW5hbWUgX1N1cGVyOjppdGVyYXRvciBpdGVyYXRvcjsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9TdXBlcjo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7CisKKyNkZWZpbmUgX19JTVBPUlRfUkVWRVJTRV9JVEVSQVRPUlMoX1N1cGVyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHR5cGVkZWYgdHlwZW5hbWUgX1N1cGVyOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOyBcCisgICAgdHlwZWRlZiB0eXBlbmFtZSBfU3VwZXI6OnJldmVyc2VfaXRlcmF0b3IgcmV2ZXJzZV9pdGVyYXRvcjsKKworI2RlZmluZSAgX19JTVBPUlRfU1VQRVJfQ09QWV9BU1NJR05NRU5UKF9fZGVyaXZlZF9uYW1lLCBfU2VsZiwgX1NVUEVSKSAgICAgICBcCisgICAgX19kZXJpdmVkX25hbWUoY29uc3QgX1N1cGVyJiBfX3gpIDogX1NVUEVSKF9feCkge30gICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfU2VsZiYgb3BlcmF0b3I9KGNvbnN0IF9TdXBlciYgX194KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAqKF9TdXBlciopdGhpcyA9IF9feDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiAqdGhpczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fZGVyaXZlZF9uYW1lKGNvbnN0IF9TZWxmJiBfX3gpIDogX1NVUEVSKF9feCkge30gICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX1NlbGYmIG9wZXJhdG9yPShjb25zdCBfU2VsZiYgX194KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKihfU3VwZXIqKXRoaXMgPSBfX3g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gKnRoaXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisjZGVmaW5lIF9fSU1QT1JUX1dJVEhfSVRFUkFUT1JTKF9TdXBlcikgXAorICBfX0lNUE9SVF9DT05UQUlORVJfVFlQRURFRlMoX1N1cGVyKSBfX0lNUE9SVF9JVEVSQVRPUlMoX1N1cGVyKQorCisjZGVmaW5lIF9fSU1QT1JUX1dJVEhfUkVWRVJTRV9JVEVSQVRPUlMoX1N1cGVyKSBcCisgIF9fSU1QT1JUX1dJVEhfSVRFUkFUT1JTKF9TdXBlcikgX19JTVBPUlRfUkVWRVJTRV9JVEVSQVRPUlMoX1N1cGVyKQorCisjaWYgZGVmaW5lZCAoX1NUTFBfVFJJVklBTF9DT05TVFJVQ1RPUl9CVUcpCisjICBkZWZpbmUgX19UUklWSUFMX0NPTlNUUlVDVE9SKF9fdHlwZSkgX190eXBlKCkge30KKyNlbHNlCisjICBkZWZpbmUgX19UUklWSUFMX0NPTlNUUlVDVE9SKF9fdHlwZSkKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfVFJJVklBTF9ERVNUUlVDVE9SX0JVRykKKyMgIGRlZmluZSBfX1RSSVZJQUxfREVTVFJVQ1RPUihfX3R5cGUpIH5fX3R5cGUoKSB7fQorI2Vsc2UKKyMgIGRlZmluZSBfX1RSSVZJQUxfREVTVFJVQ1RPUihfX3R5cGUpCisjZW5kaWYKKworI2RlZmluZSBfX1RSSVZJQUxfU1RVRkYoX190eXBlKSAgXAorICBfX1RSSVZJQUxfQ09OU1RSVUNUT1IoX190eXBlKSBfX1RSSVZJQUxfREVTVFJVQ1RPUihfX3R5cGUpCisKKyNpZiBkZWZpbmVkIChfU1RMUF9IQVNfTk9fRVhDRVBUSU9OUykKKyMgIGRlZmluZSBfU1RMUF9OT19FWENFUFRJT05TCisjZW5kaWYKKworI2lmICFkZWZpbmVkIChfU1RMUF9ET05UX1VTRV9FWENFUFRJT05TKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhDRVBUSU9OUykgJiYgIWRlZmluZWQgKF9TVExQX1VTRV9FWENFUFRJT05TKQorIyAgZGVmaW5lIF9TVExQX1VTRV9FWENFUFRJT05TCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9FWENFUFRJT05TKQorIyAgZGVmaW5lIF9TVExQX1RSWSB0cnkKKyMgIGRlZmluZSBfU1RMUF9DQVRDSF9BTEwgY2F0Y2goLi4uKQorIyAgaWZuZGVmIF9TVExQX1RIUk9XCisjICAgIGRlZmluZSBfU1RMUF9USFJPVyh4KSB0aHJvdyB4CisjICBlbmRpZgorIyAgZGVmaW5lIF9TVExQX1JFVEhST1cgdGhyb3cKKworIyAgZGVmaW5lIF9TVExQX1VOV0lORChhY3Rpb24pIGNhdGNoKC4uLikgeyBhY3Rpb247IHRocm93OyB9CisKKyMgIGlmZGVmIF9TVExQX1RIUk9XX1JFVFVSTl9CVUcKKyMgICAgZGVmaW5lIF9TVExQX1JFVF9BRlRFUl9USFJPVyhkYXRhKSByZXR1cm4gZGF0YTsKKyMgIGVsc2UKKyMgICAgZGVmaW5lIF9TVExQX1JFVF9BRlRFUl9USFJPVyhkYXRhKQorIyAgZW5kaWYKKworLyogV2UgZG8gbm90IHVzZSBleGNlcHRpb24gdGhyb3cgc3BlY2lmaWNhdGlvbnMgdW5sZXNzIHdlIGFyZSBmb3JjZWQgdG8gKi8KKyMgIGlmICFkZWZpbmVkIChfU1RMUF9USFJPV1MpCisjICAgIGRlZmluZSBfU1RMUF9USFJPV1MoeCkKKyMgIGVuZGlmCisjICBpZiAhZGVmaW5lZCAoX1NUTFBfTk9USFJPVykKKyMgICAgZGVmaW5lIF9TVExQX05PVEhST1cKKyMgIGVuZGlmCisjZWxzZQorIyAgZGVmaW5lIF9TVExQX1RSWQorIyAgZGVmaW5lIF9TVExQX0NBVENIX0FMTCBpZiAoZmFsc2UpCisjICBpZm5kZWYgX1NUTFBfVEhST1cKKyMgICAgZGVmaW5lIF9TVExQX1RIUk9XKHgpCisjICBlbmRpZgorIyAgZGVmaW5lIF9TVExQX1JFVEhST1cge30KKyMgIGRlZmluZSBfU1RMUF9VTldJTkQoYWN0aW9uKQorIyAgZGVmaW5lIF9TVExQX1RIUk9XUyh4KQorIyAgZGVmaW5lIF9TVExQX05PVEhST1cKKyMgIGRlZmluZSBfU1RMUF9SRVRfQUZURVJfVEhST1coZGF0YSkKKyNlbmRpZgorCisvKgorICogSGVyZSB3ZSBjaGVjayBfU1RMUF9OT19FWENFUFRJT05TIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGNvbXBpbGVyIGhhcyBubworICogZXhjZXB0aW9uIHN1cHBvcnQgYnV0IG5vdCB0aGUgX1NUTFBfVVNFX0VYQ0VQVElPTlMgd2hpY2ggc2ltcGx5IG1lYW5zCisgKiB0aGF0IHRoZSB1c2VyIGRvIG5vdCB3YW50IHRvIHVzZSB0aGVtLgorICovCisjaWYgIWRlZmluZWQgKF9TVExQX05PX0VYQ0VQVElPTlMpICYmICFkZWZpbmVkIChfU1RMUF9OT19FWENFUFRJT05fU1BFQykKKyMgIGRlZmluZSBfU1RMUF9USFJPV1NfSU5IRVJFTlRMWSh4KSB0aHJvdyB4CisjICBkZWZpbmUgX1NUTFBfTk9USFJPV19JTkhFUkVOVExZIHRocm93KCkKKyNlbHNlCisjICBkZWZpbmUgX1NUTFBfVEhST1dTX0lOSEVSRU5UTFkoeCkKKyMgIGRlZmluZSBfU1RMUF9OT1RIUk9XX0lOSEVSRU5UTFkKKyNlbmRpZgorCisvKiBTVExwb3J0IGZ1bmN0aW9uIG5vdCByZXR1cm5pbmcgYXJlIGZ1bmN0aW9ucyB0aGF0IHRocm93IHNvIHdlIHRyYW5zbGF0ZQorICogdGhlIG5vcmV0dXJuIGZ1bmN0aW9ucyBpbiB0aHJvd2luZyBmdW5jdGlvbnMgdGFraW5nIGFsc28gaW50byBhY2NvdW50CisgKiBleGNlcHRpb24gc3VwcG9ydCBhY3RpdmF0aW9uLgorICovCisjaWYgZGVmaW5lZCAoX1NUTFBfTk9SRVRVUk5fRlVOQ1RJT04pICYmICFkZWZpbmVkIChfU1RMUF9OT19FWENFUFRJT05TKSAmJiBcCisgICAhZGVmaW5lZCAoX1NUTFBfRlVOQ1RJT05fVEhST1dTKQorIyAgZGVmaW5lIF9TVExQX0ZVTkNUSU9OX1RIUk9XUyBfU1RMUF9OT1JFVFVSTl9GVU5DVElPTgorI2Vsc2UKKyMgIGRlZmluZSBfU1RMUF9GVU5DVElPTl9USFJPV1MKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfU1RMUF9OT19CT09MKQorIyAgaWYgKGRlZmluZWQgKF9fSUJNQ1BQX18pICYmIChfX0lCTUNQUF9fIDwgNDAwKSkgJiYgISBkZWZpbmVkIChfQUlYKQorIyAgICBpbmNsdWRlIDxpc3lub255bS5ocHA+CisjICAgIGlmIGRlZmluZWQgKF9fT1M0MDBfXykKK3R5cGVkZWYgaW50IGJvb2w7CisjICAgIGVsaWYgISggZGVmaW5lZCAoX194bENfXykgfHwgZGVmaW5lZCAoX0FJWCkpCit0eXBlZGVmIEJvb2xlYW4gYm9vbDsKKyMgICAgZW5kaWYKKyMgIGVsc2UKKyMgICAgaWYgZGVmaW5lZChfU1RMUF9ZVkFMU19IKQorIyAgICAgIGluY2x1ZGUgPHl2YWxzLmg+CisjICAgIGVsc2UKKyMgICAgICBpZiBkZWZpbmVkIChfU1RMUF9ET05UX1VTRV9CT09MX1RZUEVERUYpCisjICAgICAgICBkZWZpbmUgYm9vbCBpbnQKKyMgICAgICBlbHNlCit0eXBlZGVmIGludCBib29sOworIyAgICAgIGVuZGlmCisjICAgICAgZGVmaW5lIHRydWUgMQorIyAgICAgIGRlZmluZSBmYWxzZSAwCisjICAgIGVuZGlmCisjICBlbmRpZiAvKiBfX0lCTUNQUF9fICovCisjZWxzZQorIyAgZGVmaW5lIF9TVExQX0JPT0xfS0VZV09SRCAxCisjZW5kaWYgLyogX1NUTFBfTk9fQk9PTCAqLworCisjaWZuZGVmIF9TVExQX01QV19FWFRSQV9DT05TVAorIyAgZGVmaW5lIF9TVExQX01QV19FWFRSQV9DT05TVAorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfREVGQVVMVENIQVIKKyMgIGRlZmluZSBfU1RMUF9ERUZBVUxUQ0hBUiBjaGFyCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHX0FMTE9DKSAmJiAhZGVmaW5lZCAoX1NUTFBfQVNTRVJUSU9OUykKKyMgIGRlZmluZSBfU1RMUF9BU1NFUlRJT05TIDEKKyNlbmRpZgorCisvKiB1bmluaXRpYWxpemVkIHZhbHVlIGZpbGxlciAqLworI2lmbmRlZiBfU1RMUF9TSFJFRF9CWVRFCisvKiBUaGlzIHZhbHVlIGlzIGRlc2lnbmVkIHRvIGNhdXNlIHByb2JsZW1zIGlmIGFuIGVycm9yIG9jY3VycyAqLworIyAgZGVmaW5lIF9TVExQX1NIUkVEX0JZVEUgMHhBMworI2VuZGlmIC8qIF9TVExQX1NIUkVEX0JZVEUgKi8KKworLyogc2hhcmVkIGxpYnJhcnkgdHVuZS11cCAqLworI2lmbmRlZiBfU1RMUF9JTVBPUlRfREVDTFNQRUMKKyMgIGRlZmluZSBfU1RMUF9JTVBPUlRfREVDTFNQRUMKKyNlbmRpZgorCisvKiBhIGtleXdvcmQgdXNlZCB0byBpbnN0YW50aWF0ZSBleHBvcnQgdGVtcGxhdGUgKi8KKyNpZm5kZWYgX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0tFWVdPUkQKKyMgIGRlZmluZSBfU1RMUF9FWFBPUlRfVEVNUExBVEVfS0VZV09SRAorI2VuZGlmCisjaWZuZGVmIF9TVExQX0lNUE9SVF9URU1QTEFURV9LRVlXT1JECisjICBkZWZpbmUgX1NUTFBfSU1QT1JUX1RFTVBMQVRFX0tFWVdPUkQKKyNlbmRpZgorCisjaWZkZWYgX1NUTFBfVVNFX05PX0lPU1RSRUFNUworLyoKKyAqIElmIHdlIGRvIG5vdCB1c2UgaW9zdHJlYW1zIHdlIGRvIG5vdCB1c2UgdGhlIGV4cG9ydC9pbXBvcnQKKyAqIHRlY2huaXF1ZXMgdG8gYXZvaWQgYnVpbGQgb2YgdGhlIFNUTHBvcnQgbGlicmFyeS4KKyAqLworIyAgdW5kZWYgX1NUTFBfVVNFX0RFQ0xTUEVDCisvKiBXZSBhbHNvIHVuZGVmIFVTRV9EWU5BTUlDX0xJQiBtYWNybyBhcyB0aGlzIG1hY3JvIGFkZCBzb21lIGNvZGUKKyAqIHRvIHVzZSB0aGUgZHluYW1pYyAoc2hhcmVkKSBTVExwb3J0IGxpYnJhcnkgZm9yIHNvbWUgcGxhdGZvcm0vY29tcGlsZXIKKyAqIGNvbmZpZ3VyYXRpb24gbGVhZGluZyB0byBwcm9ibGVtIHdoZW4gZG8gbm90IGxpbmsgdG8gdGhlIFNUTHBvcnQgbGliLgorICovCisjICB1bmRlZiBfU1RMUF9VU0VfRFlOQU1JQ19MSUIKKyNlbmRpZgorCisjaWYgIGRlZmluZWQgKF9TVExQX0RMTEVYUE9SVF9ORUVEU19QUkVERUNMQVJBVElPTikgJiYgZGVmaW5lZCAoX1NUTFBfVVNFX0RFQ0xTUEVDKQorIyAgaWYgISBkZWZpbmVkIChfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUKQorLyogdGhpcyBzZXR0aW5nIHR1cm5zIG9uICJleHRlcm4gdGVtcGxhdGUiIGV4dGVuc2lvbiB1c2UgKi8KKyMgICAgZGVmaW5lIF9TVExQX1VTRV9URU1QTEFURV9FWFBPUlQKKyMgIGVuZGlmCisjICBpZiBkZWZpbmVkIChfU1RMUF9ERVNJR05BVEVEX0RMTCkgJiYgISBkZWZpbmVkIChfU1RMUF9OT19GT1JDRV9JTlNUQU5USUFURSkKKyMgICAgZGVmaW5lIF9TVExQX05PX0ZPUkNFX0lOU1RBTlRJQVRFCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9ERVNJR05BVEVEX0RMTCkgLyogVGhpcyBpcyBhIGxpYiB3aGljaCB3aWxsIGNvbnRhaW4gU1RMcG9ydCBleHBvcnRzICovCisjICBkZWZpbmUgIF9TVExQX0VYUE9SVCBfU1RMUF9FWFBPUlRfVEVNUExBVEVfS0VZV09SRAorI2Vsc2UKKyMgIGRlZmluZSAgX1NUTFBfRVhQT1JUIF9TVExQX0lNUE9SVF9URU1QTEFURV9LRVlXT1JECisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9FWFBPUlRfVEVNUExBVEUKKyMgIGRlZmluZSAgX1NUTFBfRVhQT1JUX1RFTVBMQVRFIF9TVExQX0VYUE9SVCB0ZW1wbGF0ZQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfREVDTFNQRUMpIC8qIHVzaW5nIGV4cG9ydC9pbXBvcnQgdGVjaG5pcXVlICovCisKKyMgIGlmbmRlZiBfU1RMUF9FWFBPUlRfREVDTFNQRUMKKyMgICAgZGVmaW5lIF9TVExQX0VYUE9SVF9ERUNMU1BFQworIyAgZW5kaWYKKyMgIGlmbmRlZiBfU1RMUF9JTVBPUlRfREVDTFNQRUMKKyMgICAgZGVmaW5lIF9TVExQX0lNUE9SVF9ERUNMU1BFQworIyAgZW5kaWYKKyMgIGlmbmRlZiBfU1RMUF9DTEFTU19FWFBPUlRfREVDTFNQRUMKKyMgICAgZGVmaW5lIF9TVExQX0NMQVNTX0VYUE9SVF9ERUNMU1BFQworIyAgZW5kaWYKKyMgIGlmbmRlZiBfU1RMUF9DTEFTU19JTVBPUlRfREVDTFNQRUMKKyMgICAgZGVmaW5lIF9TVExQX0NMQVNTX0lNUE9SVF9ERUNMU1BFQworIyAgZW5kaWYKKyMgIGlmIGRlZmluZWQgKF9TVExQX0RFU0lHTkFURURfRExMKSAvKiBUaGlzIGlzIGEgbGliIHdoaWNoIHdpbGwgY29udGFpbiBTVExwb3J0IGV4cG9ydHMgKi8KKyMgICAgZGVmaW5lICBfU1RMUF9ERUNMU1BFQyAgICAgICAgX1NUTFBfRVhQT1JUX0RFQ0xTUEVDCisjICAgIGRlZmluZSAgX1NUTFBfQ0xBU1NfREVDTFNQRUMgIF9TVExQX0NMQVNTX0VYUE9SVF9ERUNMU1BFQworIyAgZWxzZQorIyAgICBkZWZpbmUgIF9TVExQX0RFQ0xTUEVDICAgICAgICBfU1RMUF9JTVBPUlRfREVDTFNQRUMgICAvKiBPdGhlciBtb2R1bGVzLCBpbXBvcnRpbmcgU1RMcG9ydCBleHBvcnRzICovCisjICAgIGRlZmluZSAgX1NUTFBfQ0xBU1NfREVDTFNQRUMgIF9TVExQX0NMQVNTX0lNUE9SVF9ERUNMU1BFQworIyAgZW5kaWYKKworI2Vsc2UgLyogTm90IHVzaW5nIERMTCBleHBvcnQvaW1wb3J0IHNwZWNpZmljYXRpb25zICovCisKKyMgIGRlZmluZSBfU1RMUF9ERUNMU1BFQworIyAgZGVmaW5lIF9TVExQX0NMQVNTX0RFQ0xTUEVDCisKKyNlbmRpZgorCisjZGVmaW5lIF9TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBfU1RMUF9FWFBPUlQgdGVtcGxhdGUgY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMKKworI2lmIGRlZmluZWQgKF9TVExQX01TVkMpIHx8IGRlZmluZWQgKF9fSUNMKQorIyAgZGVmaW5lIF9TVExQX1NUQVRJQ19NRU1CRVJfREVDTFNQRUMKKyNlbHNlCisjICBkZWZpbmUgX1NUTFBfU1RBVElDX01FTUJFUl9ERUNMU1BFQyBfU1RMUF9ERUNMU1BFQworI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfQ0FMTCkKKyMgIGRlZmluZSBfU1RMUF9DQUxMCisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9VU0VfTk9fSU9TVFJFQU1TCisKKyMgIGlmIGRlZmluZWQgKF9fREVDQ1hYKSAmJiAhIGRlZmluZWQgKF9fVVNFX1NURF9JT1NUUkVBTSkKKyMgICAgZGVmaW5lIF9fVVNFX1NURF9JT1NUUkVBTQorIyAgZW5kaWYKKworLyogV2Ugb25seSBuZWVkIHRvIGV4cG9zZSBkZXRhaWxzIG9mIHN0cmVhbXMgaW1wbGVtZW50YXRpb24KKyAgIGlmIHdlIHVzZSBub24tc3RhbmRhcmQgaS9vIG9yIGFyZSBidWlsZGluZyBTVExwb3J0Ki8KKyMgIGlmIGRlZmluZWQgKF9fQlVJTERJTkdfU1RMUE9SVCkgfHwgZGVmaW5lZCAoX1NUTFBfTk9fRk9SQ0VfSU5TVEFOVElBVEUpIHx8ICFkZWZpbmVkKF9TVExQX05PX0NVU1RPTV9JTykKKyMgICAgZGVmaW5lIF9TVExQX0VYUE9TRV9TVFJFQU1fSU1QTEVNRU5UQVRJT04gMQorIyAgZW5kaWYKKworLyogV2Ugb25seSBuZWVkIHRvIGV4cG9zZSBkZXRhaWxzIG9mIGdsb2JhbCBpbXBsZW1lbnRhdGlvbiBpZiB3ZSBhcmUgYnVpbGRpbmcgU1RMcG9ydAorICAgb3IgaGF2ZSBub3QgaW5zdGFudGlhdGVkIGV2ZXJ5dGhpbmcgaW4gdGhlIGxpYiAqLworIyAgaWYgZGVmaW5lZCAoX19CVUlMRElOR19TVExQT1JUKSB8fCBkZWZpbmVkIChfU1RMUF9OT19GT1JDRV9JTlNUQU5USUFURSkKKyMgICAgdW5kZWYgIF9TVExQX0VYUE9TRV9HTE9CQUxTX0lNUExFTUVOVEFUSU9OCisjICAgIGRlZmluZSBfU1RMUF9FWFBPU0VfR0xPQkFMU19JTVBMRU1FTlRBVElPTiAxCisjICBlbmRpZgorCisjZWxzZSAvKiBfU1RMUF9VU0VfTk9fSU9TVFJFQU1TICovCisvKiB3aGVuIHdlIGFyZSBub3QgdXNpbmcgU0dJIGlvc3RyZWFtcywgd2UgbXVzdCBleHBvc2UgZ2xvYmFscywgYnV0IG5vdCBzdHJlYW1zIGltcGxlbWVudGF0aW9uICovCisjICBkZWZpbmUgX1NUTFBfRVhQT1NFX0dMT0JBTFNfSU1QTEVNRU5UQVRJT04KKyNlbmRpZiAvKiBfU1RMUF9VU0VfTk9fSU9TVFJFQU1TICovCisKKyNpZmRlZiBfU1RMUF9QQVJUSUFMX1NQRUNfTkVFRFNfVEVNUExBVEVfQVJHUworIyAgZGVmaW5lIF9TVExQX1BTUEVDMih0MSx0MikgPCB0MSx0MiA+CisjICBkZWZpbmUgX1NUTFBfUFNQRUMzKHQxLHQyLHQzKSA8IHQxLHQyLHQzID4KKyNlbHNlCisjICBkZWZpbmUgX1NUTFBfUFNQRUMyKHQxLHQyKSAgLyogbm90aGluZyAqLworIyAgZGVmaW5lIF9TVExQX1BTUEVDMyh0MSx0Mix0MykgIC8qIG5vdGhpbmcgKi8KKyNlbmRpZgorCisvKiBBY3RpdmF0aW9uIG9mIHRoZSBwYXJ0aWFsIHRlbXBsYXRlIHdvcmthcm91bmQ6CisgKi8KKyNpZiAhZGVmaW5lZChfU1RMUF9ET05UX1VTRV9QQVJUSUFMX1NQRUNfV1JLRCkgJiZcCisgICAoIWRlZmluZWQoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikgfHwgIWRlZmluZWQoX1NUTFBfRlVOQ1RJT05fVE1QTF9QQVJUSUFMX09SREVSKSkKKyMgIGRlZmluZSBfU1RMUF9VU0VfUEFSVElBTF9TUEVDX1dPUktBUk9VTkQKKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX1VTRV9OT19JT1NUUkVBTVMKKyMgIGRlZmluZSBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFIF9TVExQX1NURAorIyAgZGVmaW5lIF9TVExQX05PX1dJREVfU1RSRUFNUyAgX1NUTFBfTk9fV0NIQVJfVAorI2VuZGlmCisKKyNpZmRlZiBfU1RMUF9VU0VfU0VQQVJBVEVfUkVMT1BTX05BTUVTUEFDRQorIyAgZGVmaW5lIF9TVExQX1JFTE9QU19PUEVSQVRPUlMoX1RNUEwsIF9UUCkgXAorX1RNUEwgaW5saW5lIGJvb2wgX1NUTFBfQ0FMTCBvcGVyYXRvciE9KGNvbnN0IF9UUCYgX194LCBjb25zdCBfVFAmIF9feSkge3JldHVybiAhKF9feCA9PSBfX3kpO31cCitfVE1QTCBpbmxpbmUgYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yPihjb25zdCBfVFAmIF9feCwgY29uc3QgX1RQJiBfX3kpICB7cmV0dXJuIF9feSA8IF9feDt9XAorX1RNUEwgaW5saW5lIGJvb2wgX1NUTFBfQ0FMTCBvcGVyYXRvcjw9KGNvbnN0IF9UUCYgX194LCBjb25zdCBfVFAmIF9feSkgeyByZXR1cm4gIShfX3kgPCBfX3gpO31cCitfVE1QTCBpbmxpbmUgYm9vbCBfU1RMUF9DQUxMIG9wZXJhdG9yPj0oY29uc3QgX1RQJiBfX3gsIGNvbnN0IF9UUCYgX195KSB7IHJldHVybiAhKF9feCA8IF9feSk7fQorI2Vsc2UKKyMgIGRlZmluZSBfU1RMUF9SRUxPUFNfT1BFUkFUT1JTKF9UTVBMLCBfVFApCisjZW5kaWYKKworI2lmIGRlZmluZWQgKCBfU1RMUF9VU0VfQUJCUkVWUyApCisjICBpbmNsdWRlIDxzdGwvX2FiYnJldnMuaD4KKyNlbmRpZgorCisvKiBBIHJlYWxseSB1c2VmdWwgbWFjcm8gKi8KKyNkZWZpbmUgX1NUTFBfQVJSQVlfU0laRShBKSBzaXplb2YoQSkgLyBzaXplb2YoQVswXSkKKyNkZWZpbmUgX1NUTFBfQVJSQVlfQU5EX1NJWkUoQSkgQSwgc2l6ZW9mKEEpIC8gc2l6ZW9mKEFbMF0pCisKKy8qIHNvbWUgY2xlYW51cCAqLworI3VuZGVmIF9TVExQX0RPTlRfVVNFX0JPT0xfVFlQRURFRgorI3VuZGVmIF9TVExQX1lWQUxTX0gKKyN1bmRlZiBfU1RMUF9MT09QX0lOTElORV9QUk9CTEVNUworI3VuZGVmIF9TVExQX05FRURfRVhQTElDSVQKKyN1bmRlZiBfU1RMUF9ORUVEX1RZUEVOQU1FCisjdW5kZWYgX1NUTFBfTk9fTkVXX1NUWUxFX0NBU1RTCisjdW5kZWYgX19BVVRPX0NPTkZJR1VSRUQKKworI2VuZGlmIC8qIF9TVExQX0ZFQVRVUkVTX0ggKi8KZGlmZiAtLWdpdCBhL3N0bC9jb25maWcvaG9zdC5oIGIvc3RsL2NvbmZpZy9ob3N0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTViNzFhMwotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9jb25maWcvaG9zdC5oCkBAIC0wLDAgKzEsMjc5IEBACisvKgorICogVGhpcyBmaWxlIGRlZmluZXMgc2l0ZSBjb25maWd1cmF0aW9uLgorICovCisKKy8qCisgKiBfU1RMUF9OT19USFJFQURTOiBpZiBkZWZpbmVkLCBTVExwb3J0IGRvbid0IHVzZSBhbnkKKyAqIG11bHRpdGhyZWFkaW5nIHN1cHBvcnQuIFN5bm9ueW0gaXMgX05PVEhSRUFEUworICovCisvKgorI2RlZmluZSBfTk9USFJFQURTCisjZGVmaW5lIF9TVExQX05PX1RIUkVBRFMKKyovCisKKy8qIF9QVEhSRUFEUzogaWYgZGVmaW5lZCwgdXNlIFBPU0lYIHRocmVhZHMgZm9yIG11bHRpdGhyZWFkaW5nIHN1cHBvcnQuICovCisvKgorI2RlZmluZSBfUFRIUkVBRFMKKyovCisKKy8qIGNvbXBhdGliaWxpdHkgc2VjdGlvbgorICovCisKKyNpZiAoZGVmaW5lZCAoX1NUTFBfTk9USFJFQURTKSB8fCBkZWZpbmVkIChfU1RMUF9OT19USFJFQURTKSB8fCBkZWZpbmVkIChOT1RIUkVBRFMpKQorIyAgaWYgIWRlZmluZWQgKF9OT1RIUkVBRFMpCisjICAgIGRlZmluZSBfTk9USFJFQURTCisjICBlbmRpZgorIyAgaWYgIWRlZmluZWQgKF9TVExQX05PX1RIUkVBRFMpCisjICAgIGRlZmluZSBfU1RMUF9OT19USFJFQURTCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChfU1RMUF9VU0VfRFlOQU1JQ19MSUIpICYmICFkZWZpbmVkKF9TVExQX1VTRV9TVEFUSUNfTElCKQorLyoKKyAqIFR1cm4gX1NUTFBfVVNFX0RZTkFNSUNfTElCIHRvIGVuZm9yY2UgdXNlIG9mIC5kbGwgdmVyc2lvbiBvZiBTVExwb3J0IGxpYnJhcnkuCisgKiBOT1RFOiBwbGVhc2UgZG8gdGhhdCBvbmx5IGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZyEKKyAqIENoYW5naW5nIGRlZmF1bHQgd2lsbCByZXF1aXJlIHlvdSB0byBjaGFuZ2UgbWFrZWZpbGVzIGluICJidWlsZCIgYWNjb3JkaW5nbHkKKyAqIGFuZCB0byByZWJ1aWxkIFNUTFBvcnQgbGlicmFyeSEKKyAqIE9uIFVOSVgsIHRoaXMgaGFzIG5vIGVmZmVjdCwgc2VlIGJ1aWxkL2xpYi9SRUFETUUgZm9yIG1ha2UgdGFncy4KKyAqIFNlZSBTVExwb3J0IGNvbmZpZ3VyYXRpb24gZmlsZSAoYnVpbGQvbGliL2NvbmZpZ3VyZS5iYXQpIGZvciBoZWxwIGluIGJ1aWxkaW5nCisgKiB0aGUgcmVxdWlyZSBsaWJyYXJ5IHZlcnNpb25zLgorICovCisvKgorI2RlZmluZSBfU1RMUF9VU0VfRFlOQU1JQ19MSUIKKyovCisKKy8qCisgKiBUdXJuIF9TVExQX1VTRV9TVEFUSUNfTElCIHRvIGVuZm9yY2UgdXNlIG9mIHN0YXRpYyB2ZXJzaW9uIG9mIFNUTHBvcnQgbGlicmFyeS4KKyAqIE5PVEU6IHBsZWFzZSBkbyB0aGF0IG9ubHkgaWYgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nIQorICogQ2hhbmdpbmcgZGVmYXVsdCB3aWxsIHJlcXVpcmUgeW91IHRvIGNoYW5nZSBtYWtlZmlsZSBpbiAiYnVpbGQiIGFjY29yZGluZ2x5CisgKiBhbmQgdG8gcmVidWlsZCBTVExQb3J0IGxpYnJhcnkhCisgKiBPbiBVTklYLCB0aGlzIGhhcyBubyBlZmZlY3QsIHNlZSBidWlsZC9saWIvUkVBRE1FIGZvciBtYWtlIHRhZ3MuCisgKiBTZWUgU1RMcG9ydCBjb25maWd1cmF0aW9uIGZpbGUgKGJ1aWxkL2xpYi9jb25maWd1cmUuYmF0KSBmb3IgaGVscCBpbiBidWlsZGluZworICogdGhlIHJlcXVpcmUgbGlicmFyeSB2ZXJzaW9ucy4KKyAqLworLyoKKyNkZWZpbmUgX1NUTFBfVVNFX1NUQVRJQ19MSUIKKyovCisjZW5kaWYKKworLyoKKyAqIFNpZ25hbCBTVExwb3J0IHRoYXQgd2UgYXJlIHVzaW5nIHRoZSBjeWd3aW4gZGlzdHJpYiB3aXRoIHRoZSAtbW5vLWN5Z3dpbiBvcHRpb24uCisgKiBUaGlzIGlzIHNpbWlsYXIgdG8gYSBtaW5ndyBlbnZpcm9ubWVudCBleGNlcHQgdGhhdCByZWxhdGl2ZSBwYXRoIHRvIG5hdGl2ZSBoZWFkZXJzCisgKiBpcyBkaWZmZXJlbnQsIHRoaXMgaXMgd2h5IHdlIG5lZWQgdGhpcyBtYWNyby4KKyAqLworLyoKKyNkZWZpbmUgX1NUTFBfTk9fQ1lHV0lOCisgKi8KKworLyoKKyAqIEVkaXQgcmVsYXRpdmUgcGF0aCBiZWxvdyAob3IgcHV0IGZ1bGwgcGF0aCkgdG8gZ2V0IG5hdGl2ZQorICogY29tcGlsZXIgdmVuZG9yJ3MgaGVhZGVycyBpbmNsdWRlZC4gRGVmYXVsdCBpcyAiLi4vaW5jbHVkZSIKKyAqIGZvciBfU1RMUF9OQVRJVkVfSU5DTFVERV9QQVRILCBkZWZhdWx0IGZvciBvdGhlciBtYWNyb3MgaXMKKyAqIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEguCisgKiBIaW50OiBuZXZlciBpbnN0YWxsIFNUTHBvcnQgaW4gdGhlIGRpcmVjdG9yeSB0aGF0IGVuZHMgd2l0aCAiaW5jbHVkZSIKKyAqLworLyoKKyN1bmRlZiBfU1RMUF9OQVRJVkVfSU5DTFVERV9QQVRICisjZGVmaW5lIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEggLi4vaW5jbHVkZQorKi8KKy8qIHNhbWUgZm9yIEMgbGlicmFyeSBoZWFkZXJzIGxpa2UgPGNzdHJpbmc+ICovCisvKgorI3VuZGVmIF9TVExQX05BVElWRV9DUFBfQ19JTkNMVURFX1BBVEgKKyNkZWZpbmUgX1NUTFBfTkFUSVZFX0NQUF9DX0lOQ0xVREVfUEFUSCBfU1RMUF9OQVRJVkVfSU5DTFVERV9QQVRICisqLworLyogc2FtZSBmb3IgQyBoZWFkZXJzIGxpa2UgPHN0cmluZy5oPiAqLworLyoKKyN1bmRlZiBfU1RMUF9OQVRJVkVfQ19JTkNMVURFX1BBVEgKKyNkZWZpbmUgX1NUTFBfTkFUSVZFX0NfSU5DTFVERV9QQVRIIF9TVExQX05BVElWRV9JTkNMVURFX1BBVEgKKyovCisvKiBTb21lIGNvbXBpbGVycyBsb2NhdGUgYmFzaWMgQysrIHJ1bnRpbWUgc3VwcG9ydCBoZWFkZXJzICg8bmV3PiwgPHR5cGVpbmZvPiwgPGV4Y2VwdGlvbj4pIGluIHNlcGFyYXRlIGRpcmVjdG9yeSAqLworLyoKKyN1bmRlZiBfU1RMUF9OQVRJVkVfQ1BQX1JVTlRJTUVfSU5DTFVERV9QQVRICisjZGVmaW5lIF9TVExQX05BVElWRV9DUFBfUlVOVElNRV9JTkNMVURFX1BBVEggX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSAorKi8KKworLyoKKyAqIElmIG5hbWVzcGFzZXMgYXZhaWxhYmxlLCBTVExwb3J0IHVzZSBvd24gbmFtZXNwYWNlIChhbmQgbWFzcXVlcmFkZQorICogaXQgYXMgc3RkKS4gRGlzYWJsZSBvd24gbmFtZXNwYWNlIG1heSBjYXVzZSB1bmRlZmluZWQgYmVoYXZpb3VyLgorICovCisvKgorI2RlZmluZSBfU1RMUF9OT19PV05fTkFNRVNQQUNFICAxCisqLworCisvKgorICogVW5jb21tZW50IF9TVExQX0xFQUtTX1BFREFOVElDIHRvIGZvcmNlIGRlYWxsb2NhdGlvbiBvZiBBTEwgYWxsb2NhdGVkCisgKiBtZW1vcnkgY2h1bmtzLiBOb3JtYWxseSBub3QgcmVxdWlyZWQuIEJ1dCBpZiB5b3Ugd29ycnkgYWJvdXQgcXVhemktbGVha3MKKyAqIChtYXkgYmUgcmVwb3J0ZWQgYnkgc29tZSBsZWFrcyBkZXRlY3Rpb24gdG9vbHMpLCB1c2UKKyAqIF9TVExQX0xFQUtTX1BFREFOVElDLiBJdCBzaG91bGQgYmUgdXNlZCB3aXRoIF9TVExQX1VTRV9ORVdBTExPQyBvcgorICogX1NUTFBfVVNFX01BTExPQyAoc2VlIGJlbG93KSwgdGhlIGRlZmF1bHQgbm9kZV9hbGxvYyBhbGxvY2F0b3IgYWxzbyBjbGVhbgorICogaXRzIGludGVybmFsIG1lbW9yeSBwb29sIGJ1dCBvbmx5IGlmIFNUTHBvcnQgaXMgdXNlZCBhcyBhIGR5bmFtaWMgbGlicmFyeQorICogdW5kZXIgV2luMzIgKHVzaW5nIE1TVkMgbGlrZSBjb21waWxlcnMpLgorICovCisvKgorI2RlZmluZSBfU1RMUF9MRUFLU19QRURBTlRJQyAxCisqLworCisvKgorICogVW5jb21tZW50IF9TVExQX1VTRV9ORVdBTExPQyB0byBmb3JjZSBhbGxvY2F0b3I8VD4gdG8gdXNlIHBsYWluICJuZXciCisgKiBpbnN0ZWFkIG9mIFNUTHBvcnQgb3B0aW1pemVkIG5vZGUgYWxsb2NhdG9yIGVuZ2luZS4KKyAqLworLyoKKyNkZWZpbmUgX1NUTFBfVVNFX05FV0FMTE9DIDEKKyovCisKKy8qCisgKiBVbmNvbW1lbnQgX1NUTFBfVVNFX01BTExPQyB0byBmb3JjZSBhbGxvY2F0b3I8VD4gdG8gdXNlIHBsYWluICJtYWxsb2MiCisgKiBpbnN0ZWFkIG9mIFNUTHBvcnQgb3B0aW1pemVkIG5vZGUgYWxsb2NhdG9yIGVuZ2luZS4KKyAqLworLyoKKyNkZWZpbmUgX1NUTFBfVVNFX01BTExPQyAxCisqLworCisvKgorICogVW5jb21tZW50IF9TVExQX1VTRV9QRVJUSFJFQURfQUxMT0MgdG8gZm9yY2UgYWxsb2NhdG9yPFQ+IHRvIHVzZQorICogYSBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiB0YXJnZXR0aW5nIHRoZSBtYXNzaXZlbHkgbXVsdGktdGhyZWFkZWQKKyAqIGVudmlyb25tZW50LiBUaGUgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gdGhlIFBPU0lYIHB0aHJlYWQKKyAqIGludGVyZmFjZS4KKyAqLworLyoKKyNkZWZpbmUgX1NUTFBfVVNFX1BFUlRIUkVBRF9BTExPQyAxCisqLworCisvKgorICogU2V0IF9TVExQX0RFQlVHX0FMTE9DIHRvIHVzZSBhbGxvY2F0b3JzIHRoYXQgcGVyZm9ybSBtZW1vcnkgZGVidWdnaW5nLAorICogc3VjaCBhcyBwYWRkaW5nL2NoZWNraW5nIGZvciBtZW1vcnkgY29uc2lzdGVuY3kKKyAqLworLyoKKyNkZWZpbmUgX1NUTFBfREVCVUdfQUxMT0MgMQorKi8KKworLyoKKyAqIEZvciBjb21waWxlciBub3Qgc3VwcG9ydGluZyBwYXJ0aWFsIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIG9yIG9yZGVyaW5nIG9mCisgKiB0ZW1wbGF0ZSBmdW5jdGlvbnMgU1RMcG9ydCBpbXBsZW1lbnQgYSB3b3JrYXJvdW5kIGJhc2VkIG9uIGluaGVyaXRhbmNlCisgKiBkZXRlY3Rpb24uIFRoaXMgaW5oZXJpdGFuY2UgY2FuIGludHJvZHVjZSB0cm91YmxlIGluIGNsaWVudCBjb2RlIHdoZW4KKyAqIGEgdXNlciBjbGFzcyBkZXJpdmVkIGEgU1RMIGNvbnRhaW5lciAod2hpY2ggaXMgbm90IGFkdmlzZWQgYXMgU1RMIGNvbnRhaW5lcnMKKyAqIGRvIG5vdCBoYXZlIHZpcnR1YWwgZGVzdHJ1Y3RvcnMpLiBUbyBkaXNhYmxlIHRoaXMgd29ya2Fyb3VuZCB0dXJuIHRoaXMgbWFjcm8gb246CisgKi8KKy8qCisjZGVmaW5lIF9TVExQX0RPTlRfVVNFX1BBUlRJQUxfU1BFQ19XUktEIDEKKyovCisKKy8qCisgKiBVbmNvbW1lbnQgdGhpcyB0byBmb3JjZSBhbGwgZGVidWcgZGlhZ25vc3RpYyB0byBiZSBkaXJlY3RlZCB0aHJvdWdoIGEKKyAqIHVzZXItZGVmaW5lZCBnbG9iYWwgZnVuY3Rpb246CisgKiAgdm9pZCBfX3N0bF9kZWJ1Z19tZXNzYWdlKGNvbnN0IGNoYXIgKiBmb3JtYXRfc3RyLCAuLi4pCisgKiBpbnN0ZWFkIG9mIHByZWRlZmluZWQgU1RMcG9ydCByb3V0aW5lLgorICogVGhpcyBhbGxvd3MgeW91IHRvIHRha2UgY29udHJvbCBvZiBkZWJ1ZyBtZXNzYWdlIG91dHB1dC4KKyAqIERlZmF1bHQgcm91dGluZSBjYWxscyBmcHJpbnRmKHN0ZGVyciwuLi4pCisgKiBOb3RlIDogSWYgeW91IHNldCB0aGlzIG1hY3JvLCB5b3UgbXVzdCBzdXBwbHkgX19zdGxfZGVidWdfbWVzc2FnZQorICogZnVuY3Rpb24gZGVmaW5pdGlvbiBzb21ld2hlcmUuCisgKi8KKy8qCisjZGVmaW5lIF9TVExQX0RFQlVHX01FU1NBR0UgMQorKi8KKworLyoKKyAqIFVuY29tbWVudCB0aGlzIHRvIGZvcmNlIGFsbCBmYWlsZWQgYXNzZXJ0aW9ucyB0byBiZSBleGVjdXRlZCB0aHJvdWdoCisgKiB1c2VyLWRlZmluZWQgZ2xvYmFsIGZ1bmN0aW9uOgorICogIHZvaWQgX19zdGxfZGVidWdfdGVybWluYXRlKHZvaWQpLiBUaGlzIGFsbG93cworICogeW91IHRvIHRha2UgY29udHJvbCBvZiBhc3NlcnRpb24gYmVoYXZpb3VyIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuCisgKiBEZWZhdWx0IHJvdXRpbmUgY2FsbHMgX1NUTFBfQUJPUlQoKS4KKyAqIE5vdGUgOiBJZiB5b3Ugc2V0IHRoaXMgbWFjcm8sIHlvdSBtdXN0IHN1cHBseSBfX3N0bF9kZWJ1Z190ZXJtaW5hdGUKKyAqIGZ1bmN0aW9uIGRlZmluaXRpb24gc29tZXdoZXJlLgorICovCisvKgorI2RlZmluZSBfU1RMUF9ERUJVR19URVJNSU5BVEUgMQorKi8KKworLyoKKyAqIFVuY29tbWVudCB0aGF0IHRvIGRpc2FibGUgZXhjZXB0aW9uIGhhbmRsaW5nIGNvZGUKKyAqLworLyoKKyNkZWZpbmUgX1NUTFBfRE9OVF9VU0VfRVhDRVBUSU9OUyAxCisqLworCisvKgorICogX1NUTFBfTk9fTkFNRVNQQUNFUzogaWYgZGVmaW5lZCwgZG9uJ3QgcHV0IHRoZSBsaWJyYXJ5IGluIG5hbWVzcGFjZQorICogc3RscG9ydDo6IG9yIHN0ZDo6LCBldmVuIGlmIHRoZSBjb21waWxlciBzdXBwb3J0cyBuYW1lc3BhY2VzCisgKi8KKy8qCisjZGVmaW5lIF9TVExQX05PX05BTUVTUEFDRVMgMQorKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb21wYXRpYmlsaXR5IHNlY3Rpb24KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qCisgKiBVc2UgYWJicmV2aWF0ZWQgY2xhc3MgbmFtZXMgZm9yIGxpbmtlciBiZW5lZml0IChkb24ndCBhZmZlY3QgaW50ZXJmYWNlKS4KKyAqIFRoaXMgb3B0aW9uIGlzIG9ic29sZXRlLCBidXQgc2hvdWxkIHdvcmsgaW4gdGhpcyByZWxlYXNlLgorICoKKyAqLworLyoKKyNkZWZpbmUgX1NUTFBfVVNFX0FCQlJFVlMKKyovCisKKy8qCisgKiBUaGlzIGRlZmluaXRpb24gcHJlY2x1ZGVzIFNUTHBvcnQgcmV2ZXJzZV9pdGVyYXRvciB0byBiZSBjb21wYXRpYmxlIHdpdGgKKyAqIG90aGVyIHBhcnRzIG9mIE1TVkMgbGlicmFyeS4gKFdpdGggcGFydGlhbCBzcGVjaWFsaXphdGlvbiwgaXQganVzdAorICogaGFzIG5vIGVmZmVjdCkuCisgKiBVc2UgaXQgX09OTFlfIGlmIHlvdSB1c2UgU0dJLXN0eWxlIHJldmVyc2VfaXRlcmF0b3I8PiB0ZW1wbGF0ZSBleHBsaWNpdGx5CisgKi8KKy8qCisjZGVmaW5lIF9TVExQX05PX01TVkM1MF9DT01QQVRJQklMSVRZIDEKKyovCisKKy8qCisgKiBfU1RMUF9VU0VfUkFXX1NHSV9BTExPQ0FUT1JTIGlzIGEgaG9vayBzbyB0aGF0IHVzZXJzIGNhbiBkaXNhYmxlIHVzZSBvZgorICogYWxsb2NhdG9yPFQ+IGFzIGRlZmF1bHQgcGFyYW1ldGVyIGZvciBjb250YWluZXJzLCBhbmQgdXNlIFNHSQorICogcmF3IGFsbG9jYXRvcnMgYXMgZGVmYXVsdCBvbmVzLCB3aXRob3V0IGhhdmluZyB0byBlZGl0IGxpYnJhcnkgaGVhZGVycy4KKyAqIFVzZSBvZiB0aGlzIG1hY3JvIGlzIHN0cm9uZ2x5IGRpc2NvdXJhZ2VkLgorICovCisvKgorI2RlZmluZSBfU1RMUF9VU0VfUkFXX1NHSV9BTExPQ0FUT1JTIDEKKyovCisKKy8qCisgKiBVc2Ugb2Jzb2xldGUgb3ZlcmxvYWRlZCB0ZW1wbGF0ZSBmdW5jdGlvbnMgaXRlcmF0b3JfY2F0ZWdvcnkoKSwgdmFsdWVfdHlwZSgpLCBkaXN0YW5jZV90eXBlKCkKKyAqIGZvciBxdWVyeWluZyBpdGVyYXRvciBwcm9wZXJ0aWVzLiBQbGVhc2Ugbm90ZSB0aG9zZSBuYW1lcyBhcmUgbm9uLXN0YW5kYXJkIGFuZCBhcmUgbm90IGd1YXJhbnRlZWQKKyAqIHRvIGJlIHVzZWQgYnkgZXZlcnkgaW1wbGVtZW50YXRpb24uIEhvd2V2ZXIsIHRoaXMgc2V0dGluZyBpcyBvbiBieSBkZWZhdWx0IHdoZW4gcGFydGlhbCBzcGVjaWFsaXphdGlvbgorICogaXMgbm90IGltcGxlbWVudGVkIGluIHRoZSBjb21waWxlciBhbmQgY2Fubm90IGJlIHNpbXVsYXRlZCAob25seSBpZiBfU1RMUF9OT19BTkFDSFJPTklTTVMgaXMgbm90IHNldCkuCisgKiBVc2Ugb2YgdGhvc2UgaW50ZXJmYWNlcyBmb3IgdXNlci1kZWZpbmVkIGl0ZXJhdG9ycyBpcyBzdHJvbmdseSBkaXNjb3VyYWdlZDoKKyAqIHBsZWFzZSB1c2UgcHVibGljIGluaGVyaXRhbmNlIGZyb20gaXRlcmF0b3I8PiB0ZW1wbGF0ZSB0byBhY2hpZXZlIGRlc2lyZWQgZWZmZWN0LgorICogU2Vjb25kIGZvcm0gaXMgdG8gZGlzYWJsZSBvbGQtc3R5bGUgcXVlcmllcyBpbiBhbnkgY2FzZS4KKyAqLworLyoKKyNkZWZpbmUgX1NUTFBfVVNFX09MRF9IUF9JVEVSQVRPUl9RVUVSSUVTCisjZGVmaW5lIF9TVExQX05PX09MRF9IUF9JVEVSQVRPUl9RVUVSSUVTCisqLworCisKKy8qCisgKiBPbiBzeXN0ZW1zIHdpdGggc3VwcG9ydCBvZiBsYXJnZSBmaWxlcyAoX0xBUkdFRklMRV9TT1VSQ0UsCisgKiBfTEFSR0VGSUxFNjRfU09VUkNFIGRlZmluZWQpIHdlIHdpbGwgdXNlIDY0LWJpdCBmaWxlIG9mZnNldCwgZXZlbiBpZgorICogX19VU0VfRklMRV9PRkZTRVQ2NCBvciBfRklMRV9PRkZTRVRfQklUUyBub3QgZGVmaW5lZCBvciBfRklMRV9PRkZTRVRfQklUUworICogbGVzcyB0aGFuIDY0LiBJbiB0aGUgbGFzdCBjYXNlIHNpemVvZihzdGQ6OnN0cmVhbW9mZikgbWF5IG5vdCBiZSBlcXVhbCB0bworICogc2l6ZW9mKG9mZl90KSwgaWYgeW91IHdhbnQgdG8gZm9yY2UgZXF1YWwgc2l6ZSBvZiBvZmZfdCBhbmQgc3RyZWFtb2ZmLAorICogdW5jb21tZW50IG1hY3JvIGJlbG93LiBCdXQgcGF5IGF0dGVudGlvbiwgdGhpcyBoYXMgaW5mbHVlbmNlIG9uIGxpYnN0bHBvcnQKKyAqIGFuZCBpbiBmdXR1cmUgdXNhZ2UgaXQgbWF5IGNhdXNlIGNvbmZsaWN0IHdpdGggZGVmaW5lZCBfRklMRV9PRkZTRVRfQklUUyBtYWNyby4KKyAqLworCisvKgorI2RlZmluZSBfU1RMUF9VU0VfREVGQVVMVF9GSUxFX09GRlNFVAorKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qIFRoaXMgc2VjdGlvbiBjb250YWlucyBzd2l0aGVzIHdoaWNoIHNob3VsZCBiZSBvZmYgYnkgZGVmYXVsdCwKKyAqIGJ1dCBzbyBmZXcgY29tcGlsZXJzIHdvdWxkIGhhdmUgaXQgdW5kZWZpbmVkLCBzbyB0aGF0IHdlIHNldCB0aGVtIGhlcmUsCisgKiB3aXRoIHRoZSBvcHRpb24gdG8gYmUgdHVybmVkIG9mZiBsYXRlciBpbiBjb21waWxlci1zcGVjaWZpYyBmaWxlCisgKi8KKworI2RlZmluZSBfU1RMUF9OT19VTkNBVUdIVF9FWENFUFRfU1VQUE9SVAorI2RlZmluZSBfU1RMUF9OT19VTkVYUEVDVEVEX0VYQ0VQVF9TVVBQT1JUCisKKy8qCisgIExvY2FsIFZhcmlhYmxlczoKKyAgbW9kZTpDKysKKyAgRW5kOgorKi8KZGlmZiAtLWdpdCBhL3N0bC9jb25maWcvc3RsX2NvbmZpeC5oIGIvc3RsL2NvbmZpZy9zdGxfY29uZml4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFiZTFmMgotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9jb25maWcvc3RsX2NvbmZpeC5oCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisvKgorICogU1RMcG9ydCBjb25maWd1cmF0aW9uIGZpbGUKKyAqIEl0IGlzIGludGVybmFsIFNUTHBvcnQgaGVhZGVyIC0gRE8gTk9UIGluY2x1ZGUgaXQgZGlyZWN0bHkKKyAqIFB1cnBvc2Ugb2YgdGhpcyBmaWxlIDogdG8gZGVmaW5lIFNUTHBvcnQgc2V0dGluZ3MgdGhhdCBkZXBlbmQgb24KKyAqIGNvbXBpbGVyIGZsYWdzIG9yIGNhbiBiZSBvdGhlcndpc2UgbWlzc2VkCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfQ09ORklYX0gKKyMgZGVmaW5lIF9TVExQX0NPTkZJWF9ICisKKy8qIElmLCBieSBhbnkgY2hhbmNlLCBDIGNvbXBpbGVyIGdldHMgdGhlcmUsIHRyeSB0byBoZWxwIGl0IHRvIHBhc3Mgc21vb3RobHkgKi8KKyMgaWYgISBkZWZpbmVkIChfX2NwbHVzcGx1cykgJiYgISBkZWZpbmVkIChfU1RMUF9IQVNfTk9fTkFNRVNQQUNFUykKKyMgIGRlZmluZSBfU1RMUF9IQVNfTk9fTkFNRVNQQUNFUworIyBlbmRpZgorCisjIGlmIGRlZmluZWQoX19NSU5HVzMyX18pCisjICAgZGVmaW5lIF9TVExQX05PX0RSQU5ENDgKKyMgZW5kaWYKKworLyogTW9kZW5hIEMrKyBsaWJyYXJ5ICAqLworI2lmIGRlZmluZWQgKF9fTVdFUktTX18pICYmIF9fTVdFUktTX18gPD0gMHgyMzAzIHx8IChkZWZpbmVkIChfX0tDQykgJiYgX19LQ0NfVkVSU0lPTiA8IDM0MDApCisjIGluY2x1ZGUgPG1jb21waWxlLmg+CisjIGRlZmluZSBfU1RMUF9VU0VfTVNJUEwgMQorIyBpZiBkZWZpbmVkIChfX0tDQykgfHwgKGRlZmluZWQoX19NU0xfQ1BQX18pICYmIFwKKyAgICAgICAoIChfX01TTF9DUFBfXyA+PSAweDUwMDAgJiYgZGVmaW5lZCggX01TTF9OT19NRVNTQUdFX0ZBQ0VUICkpIHx8IFwKKyAgIChfX01TTF9DUFBfXyA8IDB4NTAwMCAmJiBkZWZpbmVkKCBNU0lQTF9OTF9UWVBFUyApKSkgIFwKKyAgICkKKyMgIGRlZmluZSBfU1RMUF9OT19OQVRJVkVfTUVTU0FHRV9GQUNFVCAxCisjIGVuZGlmCisjZW5kaWYKKworLyogY29tbW9uIHN3aXRjaGVzIGZvciBFREcgZnJvbnQtZW5kICovCisjIGlmIGRlZmluZWQgKF9fRURHX1NXSVRDSEVTKQorIyAgIGlmICEoZGVmaW5lZChfVFlQRU5BTUUpIHx8IGRlZmluZWQgKF9UWVBFTkFNRV9JU19LRVlXT1JEKSkKKyMgICAgIHVuZGVmICBfU1RMUF9ORUVEX1RZUEVOQU1FCisjICAgICBkZWZpbmUgX1NUTFBfTkVFRF9UWVBFTkFNRSAxCisjICAgZW5kaWYKKyMgICBpZiAhZGVmaW5lZChfV0NIQVJfVF9JU19LRVlXT1JEKQorIyAgICAgdW5kZWYgX1NUTFBfTk9fV0NIQVJfVAorIyAgICAgZGVmaW5lIF9TVExQX05PX1dDSEFSX1QgMQorIyAgIGVuZGlmCisjICAgaWZuZGVmIF9QQVJUSUFMX1NQRUNJQUxJWkFUSU9OX09GX0NMQVNTX1RFTVBMQVRFUworIyAgICAgdW5kZWYgX1NUTFBfTk9fQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTgorIyAgICAgZGVmaW5lIF9TVExQX05PX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04gMQorIyAgIGVuZGlmCisjICAgaWZuZGVmIF9NRU1CRVJfVEVNUExBVEVTCisjICAgICB1bmRlZiBfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVTCisjICAgICBkZWZpbmUgX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFUyAxCisjICAgICB1bmRlZiBfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVfQ0xBU1NFUworIyAgICAgZGVmaW5lIF9TVExQX05PX01FTUJFUl9URU1QTEFURV9DTEFTU0VTIDEKKyMgICBlbmRpZgorIyAgIGlmICFkZWZpbmVkKF9NRU1CRVJfVEVNUExBVEVfS0VZV09SRCkKKyMgICAgIHVuZGVmICBfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVfS0VZV09SRAorIyAgICAgZGVmaW5lIF9TVExQX05PX01FTUJFUl9URU1QTEFURV9LRVlXT1JEIDEKKyMgICBlbmRpZgorIyAgIGlmICFkZWZpbmVkIChfX0VYQ0VQVElPTlMpICYmICEgZGVmaW5lZCAoX0VYQ0VQVElPTlMpCisjICAgICB1bmRlZiAgX1NUTFBfSEFTX05PX0VYQ0VQVElPTlMKKyMgICAgIGRlZmluZSBfU1RMUF9IQVNfTk9fRVhDRVBUSU9OUworIyAgIGVuZGlmCisjICAgdW5kZWYgX19FREdfU1dJVENIRVMKKyMgZW5kaWYgLyogRURHICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N0bC9jb25maWcvc3RsX2djY2UuaCBiL3N0bC9jb25maWcvc3RsX2djY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWY3MDQwCi0tLSAvZGV2L251bGwKKysrIGIvc3RsL2NvbmZpZy9zdGxfZ2NjZS5oCkBAIC0wLDAgKzEsMjAgQEAKKyNpZm5kZWYgX1NUTFBfV0lOU0NXX0gKKyNkZWZpbmUgX1NUTFBfV0lOU0NXX0gKKworI2RlZmluZSBfU1RMUF9DT01QSUxFUiAiR0NDRSIKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyMgIGRlZmluZSBfU1RMUF9MT05HX0xPTkcgbG9uZyBsb25nCisKKyNpZmRlZiBfU1RMUF9OT19VTkNBVUdIVF9FWENFUFRfU1VQUE9SVAorIyAgdW5kZWYgX1NUTFBfTk9fVU5DQVVHSFRfRVhDRVBUX1NVUFBPUlQKKyNlbmRpZgorCisjaWZkZWYgX1NUTFBfTk9fVU5FWFBFQ1RFRF9FWENFUFRfU1VQUE9SVAorIyAgdW5kZWYgX1NUTFBfTk9fVU5FWFBFQ1RFRF9FWENFUFRfU1VQUE9SVAorI2VuZGlmCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N0bC9jb25maWcvc3RsX215Y29tcC5oIGIvc3RsL2NvbmZpZy9zdGxfbXljb21wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEwZDVmYQotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9jb25maWcvc3RsX215Y29tcC5oCkBAIC0wLDAgKzEsMjkwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBNb3Njb3cgQ2VudGVyIGZvciBTUEFSQyBUZWNobm9sb2d5CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworLyoKKyAqIFB1cnBvc2Ugb2YgdGhpcyBmaWxlIDoKKyAqCisgKiBBIGxpc3Qgb2YgQ09NUElMRVItU1BFQ0lGSUMgcG9ydGlvbiBvZiBTVExwb3J0IHNldHRpbmdzLgorICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHRvIGhlbHAgaW4gbWFudWFsIGNvbmZpZ3VyYXRpb24KKyAqIG9mIFNUTHBvcnQuIFRoaXMgZmlsZSBpcyBiZWluZyBpbmNsdWRlZCBieSBzdGxjb21wLmgKKyAqIHdoZW4gU1RMcG9ydCBpcyB1bmFibGUgdG8gaWRlbnRpZnkgeW91ciBjb21waWxlci4KKyAqIFBsZWFzZSByZW1vdmUgdGhlIGVycm9yIGRpYWdub3N0aWMgYmVsb3cgYmVmb3JlIGFkanVzdGluZworICogbWFjcm9zLgorICoKKyAqLworI2lmbmRlZiBfU1RMUF9NWUNPTVBfSAorI2RlZmluZSAgX1NUTFBfTVlDT01QX0gKKworI2Vycm9yICJZb3VyIGNvbXBpbGVyIHZlcnNpb24gaXMgbm90IHJlY29nbml6ZWQgYnkgU1RMcG9ydC4gUGxlYXNlIGVkaXQgPHN0bHBvcnQvc3RsL2NvbmZpZy9zdGxfbXljb21wLmg+IgorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gdGhlIHZhbHVlcyBjaG9vc2VuIGhlcmUgYXMgZGVmYXVsdHMgdHJ5IHRvIGdpdmUKKy8vIG1heGltdW0gZnVuY3Rpb25hbGl0eSBvbiB0aGUgbW9zdCBjb25zZXJ2YXRpdmUgc2V0dGluZ3MKKworLy8gTW9zdGx5IGNvcnJlY3QgZ3Vlc3MsIGNoYW5nZSBpdCBmb3IgQWxwaGEgKGFuZCBvdGhlciBlbnZpcm9ubWVudHMKKy8vIHRoYXQgaGFzIDY0LWJpdCAibG9uZyIpCisvLyAjICBkZWZpbmUgX1NUTFBfVUlOVDMyX1QgdW5zaWduZWQgbG9uZworCisvLyBEaXNhYmxlcyB3Y2hhcl90IGZ1bmN0aW9uYWxpdHkKKy8vICMgIGRlZmluZSBfU1RMUF9OT19XQ0hBUl9UICAxCisKKy8vIERlZmluZSBpZiB3Y2hhcl90IGlzIG5vdCBhIHVuaXF1ZSB0eXBlLCBhbmQgaXMgYWN0dWFsbHkgYSB0eXBlZGVmIHRvIHVuc2lnbmVkIHNob3J0LgorLy8gIyAgZGVmaW5lIF9TVExQX1dDSEFSX1RfSVNfVVNIT1JUIDEKKworLy8gVW5jb21tZW50IGlmIGxvbmcgbG9uZyBpcyBhdmFpbGFibGUKKy8vICMgIGRlZmluZSBfU1RMUF9MT05HX0xPTkcgbG9uZyBsb25nCisKKy8vIFVuY29tbWVudCBpZiBsb25nIGRvdWJsZSBpcyBub3QgYXZhaWxhYmxlCisvLyAjICBkZWZpbmUgX1NUTFBfTk9fTE9OR19ET1VCTEUgMQorCisvLyBVbmNvbW1lbnQgdGhpcyBpZiB5b3VyIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgInR5cGVuYW1lIiBrZXl3b3JkCisvLyAjICBkZWZpbmUgX1NUTFBfTkVFRF9UWVBFTkFNRSAxCisKKy8vIFVuY29tbWVudCB0aGlzIGlmIHlvdXIgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCAibXV0YWJsZSIga2V5d29yZAorLy8gIyAgZGVmaW5lIF9TVExQX05FRURfTVVUQUJMRSAxCisKKy8vIFVuY29tbWVudCB0aGlzIGlmIHlvdXIgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCAiZXhwbGljaXQiIGtleXdvcmQKKy8vICMgIGRlZmluZSBfU1RMUF9ORUVEX0VYUExJQ0lUIDEKKworLy8gVW5jb21tZW50IGlmIG5ldy1zdHlsZS1jYXN0cyBsaWtlIGNvbnN0X2Nhc3Q8PiBhcmUgbm90IGF2YWlsYWJsZQorLy8gIyAgZGVmaW5lIF9TVExQX05PX05FV19TVFlMRV9DQVNUUyAxCisKKy8vIFVuY29tbWVudCB0aGlzIGlmIHlvdXIgY29tcGlsZXIgZG9lcyBub3QgaGF2ZSAiYm9vbCIgdHlwZQorLy8gIyAgZGVmaW5lICBfU1RMUF9OT19CT09MIDEKKworLy8gVW5jb21tZW50IHRoaXMgaWYgeW91ciBjb21waWxlciBkb2VzIG5vdCBoYXZlICJib29sIiB0eXBlLCBidXQgaGFzICJib29sIiBrZXl3b3JkIHJlc2VydmVkCisvLyAjICBkZWZpbmUgIF9TVExQX0RPTlRfVVNFX0JPT0xfVFlQRURFRiAxCisKKy8vIFVuY29tbWVudCB0aGlzIGlmIHlvdXIgY29tcGlsZXIgZG9lcyBub3QgaGF2ZSAiYm9vbCIgdHlwZSwgYnV0IGRlZmluZXMgImJvb2wiIGluIDx5dmFscy5oPgorLy8gIyAgZGVmaW5lICBfU1RMUF9ZVkFMU19IIDEKKworLy8gVW5jb21tZW50IHRoaXMgaWYgeW91ciBjb21waWxlciBoYXMgbGltaXRlZCBvciBubyBkZWZhdWx0IHRlbXBsYXRlIGFyZ3VtZW50cyBmb3IgY2xhc3NlcworLy8gIyAgZGVmaW5lIF9TVExQX0xJTUlURURfREVGQVVMVF9URU1QTEFURVMgMQorCisvLyBVbmNvbW1lbnQgdGhpcyBpZiB5b3VyIGNvbXBpbGVyIHN1cHBvcnQgb25seSBjb21wbGV0ZSAobm90IGRlcGVuZGVudCBvbiBvdGhlciBwYXJhbWV0ZXJzKQorLy8gdHlwZXMgYXMgZGVmYXVsdCBwYXJhbWV0ZXJzIGZvciBjbGFzcyB0ZW1wbGF0ZXMKKy8vICMgIGRlZmluZSBfU1RMUF9ERUZBVUxUX1RZUEVfUEFSQU0gMQorCisvLyBVbmNvbW1lbnQgdGhpcyBpZiB5b3VyIGNvbXBpbGVyIGRvIG5vdCBzdXBwb3J0IGRlZmF1bHQgcGFyYW1ldGVycyBpbiB0ZW1wbGF0ZSBjbGFzcyBtZXRob2RzCisvLyAjICBkZWZpbmUgX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSAxCisKKy8vIFVuY29tbWVudCB0aGlzIGlmIHlvdXIgY29tcGlsZXIgaGFzIHByb2JsZW0gd2l0aCBub3QtdHlwZQorLy8gZGVmYXVsdCB0ZW1wbGF0ZSBwYXJhbWV0ZXJzCisvLyAjICBkZWZpbmUgX1NUTFBfTk9fREVGQVVMVF9OT05fVFlQRV9QQVJBTSAxCisKKy8vIERlZmluZSBpZiBjb21waWxlciBoYXMKKy8vIHRyb3VibGUgd2l0aCBmdW5jdGlvbnMgZ2V0dGluZyBub24tdHlwZS1wYXJhbWV0ZXJpemVkIGNsYXNzZXMgYXMgcGFyYW1ldGVycworLy8gIyAgZGVmaW5lIF9TVExQX05PTl9UWVBFX1RNUExfUEFSQU1fQlVHIDEKKworLy8gVW5jb21tZW50IHRoaXMgaWYgeW91ciBjb21waWxlciBsYWNrcyBzdGF0aWMgZGF0YSBtZW1iZXJzLgorLy8gVW5jb21tZW50IG5leHQgbGluZSBpZiB5b3VyIGNvbXBpbGVyIHN1cHBvcnRzIF9fYXR0cmlidXRlX18oKHdlYWspKQorLy8gIyAgZGVmaW5lIF9TVExQX05PX1NUQVRJQ19URU1QTEFURV9EQVRBIDEKKy8vICMgIGRlZmluZSBfU1RMUF9XRUFLX0FUVFJJQlVURSAxCisKKy8vIFVuY29tbWVudCB0aGlzIGlmIHlvdXIgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCBuYW1lc3BhY2VzCisvLyAjICBkZWZpbmUgX1NUTFBfSEFTX05PX05BTUVTUEFDRVMgMQorCisvLyBVbmNvbW1lbnQgaWYgInVzaW5nIiBrZXl3b3JkIGRvZXMgbm90IHdvcmsgd2l0aCB0ZW1wbGF0ZSB0eXBlcworLy8gIyBkZWZpbmUgX1NUTFBfQlJPS0VOX1VTSU5HX0RJUkVDVElWRSAxCisKKy8vIFVuY29tbWVudCB0aGlzIGlmIHlvdXIgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCBleGNlcHRpb25zCisvLyAjICBkZWZpbmUgX1NUTFBfSEFTX05PX0VYQ0VQVElPTlMgMQorCisvLyBVbmNvbW1lbnQgdGhpcyB3aGVuIHlvdSBhcmUgYWJsZSB0byBkZXRlY3QgdGhhdCB0aGUgdXNlciBkbyBub3QKKy8vIHdhbnQgdG8gdXNlIHRoZSBleGNlcHRpb25zIGZlYXR1cmUuCisvLyAjICBkZWZpbmUgX1NUTFBfRE9OVF9VU0VfRVhDRVBUSU9OUyAxCisKKy8vIFVuY29tbWVudCB0aGlzIGlmIHlvdXIgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCBleGNlcHRpb24gc3BlY2lmaWNhdGlvbnMKKy8vICMgIGRlZmluZSBfU1RMUF9OT19FWENFUFRJT05fU1BFQworCisvLyBEZWZpbmUgdGhpcyBpZiB5b3VyIGNvbXBpbGVyIHJlcXVpcmVzIHJldHVybiBzdGF0ZW1lbnQgYWZ0ZXIgdGhyb3coKQorLy8gIyBkZWZpbmUgX1NUTFBfVEhST1dfUkVUVVJOX0JVRyAxCisKKy8vIERlZmluZSB0aGlzIGlmIHlvdXIgY29tcGlsZXIgZG8gbm90IHN1cHBvcnQgcmV0dXJuIG9mIHZvaWQKKy8vICMgZGVmaW5lIF9TVExQX0RPTlRfUkVUVVJOX1ZPSUQgMQorCisvLyBIZWFkZXIgPG5ldz4gdGhhdCBjb21lcyB3aXRoIHRoZSBjb21waWxlcgorLy8gZG9lcyBub3QgZGVmaW5lIGJhZF9hbGxvYyBleGNlcHRpb24KKy8vICMgIGRlZmluZSBfU1RMUF9OT19CQURfQUxMT0MgIDEKKworLy8gRGVmaW5lIHRoaXMgaWYgeW91ciBjb21waWxlciBkbyBub3QgdGhyb3cgYmFkX2FsbG9jIGZyb20gdGhlIG5ldyBvcGVyYXRvcgorLy8gIyAgZGVmaW5lIF9TVExQX05FV19ET05UX1RIUk9XX0JBRF9BTExPQyAgMQorCisvLyBVbmNvbW1lbnQgaWYgbWVtYmVyIHRlbXBsYXRlIG1ldGhvZHMgYXJlIG5vdCBhdmFpbGFibGUKKy8vICMgIGRlZmluZSBfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVTICAgMQorCisvLyBVbmNvbW1lbnQgaWYgbWVtYmVyIHRlbXBsYXRlIGNsYXNzZXMgYXJlIG5vdCBhdmFpbGFibGUKKy8vICMgIGRlZmluZSBfU1RMUF9OT19NRU1CRVJfVEVNUExBVEVfQ0xBU1NFUyAgIDEKKworLy8gVW5jb21tZW50IGlmIHlvdXIgY29tcGlsZXIgZG8gbm90IHN1cHBvcnQgdGhlIHN0ZDo6YWxsb2NhdG9yIHJlYmluZCB0ZWNobmlxdWUKKy8vIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2Ugb2YgYmFkIG1lbWJlciB0ZW1wbGF0ZSBjbGFzc2VzIHN1cHBvcnQsIGl0IGlzIGF1dG9tYXRpY2FsbHkKKy8vIGRlZmluZWQgaWYgX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFX0NMQVNTRVMgaXMgZGVmaW5lZC4KKy8vICMgZGVmaW5lIF9TVExQX0RPTlRfU1VQUE9SVF9SRUJJTkRfTUVNQkVSX1RFTVBMQVRFIDEKKworLy8gVW5jb21tZW50IGlmIG5vICJ0ZW1wbGF0ZSIga2V5d29yZCBzaG91bGQgYmUgdXNlZCB3aXRoIG1lbWJlciB0ZW1wbGF0ZSBjbGFzc2VzCisvLyAjICBkZWZpbmUgX1NUTFBfTk9fTUVNQkVSX1RFTVBMQVRFX0tFWVdPUkQgICAxCisKKy8vIFVuY29tbWVudCBpZiBmcmllbmQgbWVtYmVyIHRlbXBsYXRlcyBhcmUgbm90IGF2YWlsYWJsZQorLy8gIyAgZGVmaW5lIF9TVExQX05PX0ZSSUVORF9URU1QTEFURVMgICAxCisKKy8vIENvbXBpbGVyIGRvZXMgbm90IGFjY2VwdCBmcmllbmQgZGVjbGFyYXRpb24gcXVhbGlmaWVkIHdpdGggbmFtZXNwYWNlIG5hbWUuCisvLyAjICBkZWZpbmUgX1NUTFBfTk9fUVVBTElGSUVEX0ZSSUVORFMgMQorCisvLyBVbmNvbW1lbnQgaWYgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBpcyBub3QgYXZhaWxhYmxlCisvLyAjICBkZWZpbmUgX1NUTFBfTk9fQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTiAxCisKKy8vIERlZmluZSBpZiBjbGFzcyBiZWluZyBwYXJ0aWFsbHkgc3BlY2lhbGl6ZWQgcmVxdWlyZSBmdWxsIG5hbWUgKHRlbXBsYXRlIHBhcmFtZXRlcnMpCisvLyBvZiBpdHNlbGYgZm9yIG1ldGhvZCBkZWNsYXJhdGlvbnMKKy8vICMgIGRlZmluZSBfU1RMUF9QQVJUSUFMX1NQRUNfTkVFRFNfVEVNUExBVEVfQVJHUworCisvLyBDb21waWxlciBoYXMgcHJvYmxlbSB3aXRoIHF1YWxpZmllZCBzcGVjaWFsaXphdGlvbnMgKGNvbnQgaW50LCB2b2xhdGlsZSBpbnQuLi4pCisvLyAjICBkZWZpbmUgX1NUTFBfUVVBTElGSUVEX1NQRUNJQUxJWkFUSU9OX0JVRworCisvLyBDb21waWxlciBoYXMgcHJvYmxlbXMgc3BlY2lhbGl6aW5nIG1lbWJlcnMgb2YgcGFydGlhbGx5CisvLyBzcGVjaWFsaXplZCBjbGFzcworLy8gIyAgZGVmaW5lIF9TVExQX01FTUJFUl9TUEVDSUFMSVpBVElPTl9CVUcKKworLy8gVW5jb21tZW50IGlmIHBhcnRpYWwgb3JkZXIgb2YgdGVtcGxhdGUgZnVuY3Rpb25zIGlzIG5vdCBhdmFpbGFibGUKKy8vICMgIGRlZmluZSBfU1RMUF9OT19GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIgMQorCisvLyBVbmNvbW1lbnQgaWYgc3BlY2lhbGl6YXRpb24gb2YgbWV0aG9kcyBpcyBub3QgYWxsb3dlZAorLy8gIyAgZGVmaW5lIF9TVExQX05PX01FVEhPRF9TUEVDSUFMSVpBVElPTiAgMQorCisvLyBVbmNvbW1lbnQgaWYgZnVsbCAgc3BlY2lhbGl6YXRpb24gZG9lcyBub3QgdXNlIHBhcnRpYWwgc3BlYy4gc3ludGF4IDogdGVtcGxhdGUgPD4gc3RydWN0IC4uLi4KKy8vICMgIGRlZmluZSBfU1RMUF9OT19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OX1NZTlRBWCAgMQorCisvLyBVbmNvbW1lbnQgaWYgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCBleHBsaWNpdCB0ZW1wbGF0ZSBhcmd1bWVudHMgZm9yIGZ1bmN0aW9ucworLy8gIyBkZWZpbmUgX1NUTFBfTk9fRVhQTElDSVRfRlVOQ1RJT05fVE1QTF9BUkdTCisKKy8vIFVuY29tbWVudCB0aGlzIGlmIHlvdXIgY29tcGlsZXIgY2FuJ3QgaW5saW5lIHdoaWxlKCksIGZvcigpCisvLyAjICBkZWZpbmUgX1NUTFBfTE9PUF9JTkxJTkVfUFJPQkxFTVMgMQorCisvLyBEZWZpbmUgaWYgdGhlIGNvbXBpbGVyIGZhaWxzIHRvIG1hdGNoIGEgdGVtcGxhdGUgZnVuY3Rpb24gYXJndW1lbnQgb2YgYmFzZQorLy8gIyAgZGVmaW5lIF9TVExQX0JBU0VfTUFUQ0hfQlVHICAgICAgICAgIDEKKworLy8gRGVmaW5lIGlmIHRoZSBjb21waWxlciBmYWlscyB0byBtYXRjaCBhIHRlbXBsYXRlIGZ1bmN0aW9uIGFyZ3VtZW50IG9mIGJhc2UKKy8vIChub24tdGVtcGxhdGUpCisvLyMgIGRlZmluZSAgX1NUTFBfTk9OVEVNUExfQkFTRV9NQVRDSF9CVUcgMQorCisvLyBEZWZpbmUgaWYgdGhlIGNvbXBpbGVyIHJlamVjdHMgb3V0bGluZSBtZXRob2QgZGVmaW5pdGlvbgorLy8gZXhwbGljaXRseSB0YWtpbmcgbmVzdGVkIHR5cGVzL3R5cGVkZWZzCisvLyAjICBkZWZpbmUgX1NUTFBfTkVTVEVEX1RZUEVfUEFSQU1fQlVHICAgMQorCisvLyBDb21waWxlciByZXF1aXJlcyB0eXBlbmFtZSBrZXl3b3JkIG9uIG91dGxpbmUgbWV0aG9kIGRlZmluaXRpb24KKy8vIGV4cGxpY2l0bHkgdGFraW5nIG5lc3RlZCB0eXBlcy90eXBlZGVmcworLy8gI2RlZmluZSAgX1NUTFBfVFlQRU5BTUVfT05fUkVUVVJOX1RZUEUKKworLy8gRGVmaW5lIGlmIHRoZSBiYXNlY2xhc3MgdHlwZWRlZnMgbm90IHZpc2libGUgZnJvbSBvdXRzaWRlCisvLyAjICBkZWZpbmUgX1NUTFBfQkFTRV9UWVBFREVGX09VVFNJREVfQlVHIDEKKworLy8gaWYgeW91ciBjb21waWxlciBoYXZlIHNlcmlvdXMgcHJvYmxlbXMgd2l0aCB0eXBlZGVmcywgdHJ5IHRoaXMgb25lCisvLyAjICBkZWZpbmUgX1NUTFBfQkFTRV9UWVBFREVGX0JVRyAgICAgICAgICAxCisKKy8vIFVuY29tbWVudCBpZiBnZXR0aW5nIGVycm9ycyBjb21waWxpbmcgbWVtX2Z1biogYWRhcHRvcnMKKy8vICMgIGRlZmluZSBfU1RMUF9NRU1CRVJfUE9JTlRFUl9QQVJBTV9CVUcgMQorCisvLyAqIF9TVExQX1NUQVRJQ19DT05TVF9JTklUX0JVRzogZGVmaW5lZCBpZiB0aGUgY29tcGlsZXIgY2FuJ3QgaGFuZGxlIGEKKy8vICAgY29uc3RhbnQtaW5pdGlhbGl6ZXIgaW4gdGhlIGRlY2xhcmF0aW9uIG9mIGEgc3RhdGljIGNvbnN0IGRhdGEgbWVtYmVyCisvLyAgIG9mIGludGVnZXIgdHlwZS4gIChTZWUgc2VjdGlvbiA5LjQuMiwgcGFyYWdyYXBoIDQsIG9mIHRoZSBDKysgc3RhbmRhcmQuKQorLy8gIyBkZWZpbmUgX1NUTFBfU1RBVElDX0NPTlNUX0lOSVRfQlVHCisKKy8vIERlZmluZSBpZiBkZWZhdWx0IGNvbnN0cnVjdG9yIGZvciBidWlsdGluIGludGVnZXIgdHlwZSBmYWlscyB0byBpbml0aWFsaXplIGl0IHRvIDAKKy8vIEluIGV4cHJlc3Npb24gbGlrZSBuZXcoJmNoYXIpIGNoYXIoKToKKy8vIyBkZWZpbmUgX1NUTFBfREVGX0NPTlNUX1BMQ1RfTkVXX0JVRyAxCisvLyBJbiBkZWZhdWx0IGZ1bmN0aW9uIHBhcmFtZXRlciBsaWtlIF9NX21ldGhvZChfVHAgX194ID0gX1RwKCkpCisvLyMgZGVmaW5lIF9TVExQX0RFRl9DT05TVF9ERUZfUEFSQU1fQlVHIDEKKworLy8gRGVmaW5lZCBpZiBjb25zdHJ1Y3RvcgorLy8gcmVxdWlyZWQgdG8gZXhwbGljaXRseSBjYWxsIG1lbWJlcidzIGRlZmF1bHQgY29uc3RydWN0b3JzIGZvciBjb25zdCBvYmplY3RzCisvLyAjICBkZWZpbmUgX1NUTFBfQ09OU1RfQ09OU1RSVUNUT1JfQlVHICAgIDEKKworLy8gRGVmaW5lZCBpZiB0aGUgY29tcGlsZXIgaGFzIHRyb3VibGUgY2FsbGluZyBQT0QtdHlwZXMgY29uc3RydWN0b3JzL2Rlc3RydWN0b3JzCisvLyAjICBkZWZpbmUgX1NUTFBfVFJJVklBTF9DT05TVFJVQ1RPUl9CVUcgICAgMQorLy8gIyAgZGVmaW5lIF9TVExQX1RSSVZJQUxfREVTVFJVQ1RPUl9CVUcgICAgMQorCisvLyBEZWZpbmUgaWYgaGF2aW5nIHByb2JsZW1zIHNwZWNpYWxpemluZyBtYXBzL3NldHMgd2l0aAorLy8ga2V5IHR5cGUgYmVpbmcgY29uc3QKKy8vICMgIGRlZmluZSBfU1RMUF9NVUxUSV9DT05TVF9URU1QTEFURV9BUkdfQlVHCisKKy8vIFVuY29tbWVudCB0aGlzIHRvIGRpc2FibGUgLT4gb3BlcmF0b3JzIG9uIGFsbCBpdGVyYXRvcnMKKy8vICMgIGRlZmluZSAgIF9TVExQX05PX0FSUk9XX09QRVJBVE9SIDEKKworLy8gVW5jb21tZW50IHRoaXMgdG8gZGlzYmxlIGF0KCkgbWVtYmVyIGZ1bmN0aW9ucyBmb3IgY29udGFpbmVycworLy8gIyAgZGVmaW5lICAgX1NUTFBfTk9fQVRfTUVNQkVSX0ZVTkNUSU9OIDEKKworLy8gRGVmaW5lIHRoaXMgaWYgY29tcGlsZXIgbGFja3MgPGV4Y2VwdGlvbj4gaGVhZGVyCisvLyAjICBkZWZpbmUgX1NUTFBfTk9fRVhDRVBUSU9OX0hFQURFUiAxCisKKy8vIFVuY29tbWVudCB0aGlzIGlmIHlvdXIgQyBsaWJyYXJ5IGhhcyBscmFuZDQ4KCkgZnVuY3Rpb24KKy8vICMgIGRlZmluZSBfU1RMUF9SQU5ENDggMQorCisvLyBVbmNvbW1lbnQgaWYgbmF0aXZlIG5ldy1zdHlsZSBDIGxpYnJhcnkgaGVhZGVycyBsaWxlIDxjc3RkZGVmPiwgZXRjIGFyZSBub3QgYXZhaWxhYmxlLgorLy8gIyAgIGRlZmluZSBfU1RMUF9IQVNfTk9fTkVXX0NfSEVBREVSUyAxCisKKy8vIHVuY29tbWVudCBpZiBuZXctc3R5bGUgaGVhZGVycyA8bmV3PiBpcyBhdmFpbGFibGUKKy8vICMgIGRlZmluZSBfU1RMUF9IQVNfTkVXX05FV19IRUFERVIgMQorCisvLyB1bmNvbW1lbnQgdGhpcyBpZiA8aW9zdHJlYW0+IGFuZCBvdGhlciBTVEQgaGVhZGVycyBwdXQgdGhlaXIgc3R1ZmYgaW4gOjpuYW1lc3BhY2UsCisvLyBub3Qgc3RkOjoKKy8vICMgIGRlZmluZSBfU1RMUF9WRU5ET1JfR0xPQkFMX1NURAorCisvLyB1bmNvbW1lbnQgdGhpcyBpZiA8Y3N0ZGlvPiBhbmQgdGhlIGxpa2UgcHV0IHN0dWZmIGluIDo6bmFtZXNwYWNlLAorLy8gbm90IHN0ZDo6CisvLyAjICBkZWZpbmUgX1NUTFBfVkVORE9SX0dMT0JBTF9DU1RECisKKy8vIHVuY29tbWVudCB0aGlzIGlmIHlvdXIgY29tcGlsZXIgY29uc2lkZXIgYXMgYW1iaWd1b3VzIGEgZnVuY3Rpb24gaW1wb3J0ZWQgd2l0aGluCisvLyB0aGUgc3RscG9ydCBuYW1lc3BhY2UgYW5kIGNhbGxlZCB3aXRob3V0IHNjb3BlICg6OiBvciBzdGQ6OikKKy8vICMgIGRlZmluZSBfU1RMUF9OT19VU0lOR19GT1JfR0xPQkFMX0ZVTkNUSU9OUyAxCisKKy8vIHVuY29tbWVudCB0aGlzIGlmIHlvdXIgY29tcGlsZXIgZGVmaW5lIGFsbCB0aGUgQyBtYXRoIGZ1bmN0aW9ucyBDKysgYWRkaXRpb25hbAorLy8gb3ZlcmxvYWRzIGluIDo6bmFtZXNwYWNlIGFuZCBub3Qgb25seSBpbiBzdGQ6Oi4KKy8vICMgIGRlZmluZSBfU1RMUF9IQVNfR0xPQkFMX0NfTUFUSF9GVU5DVElPTlMgMQorCisvLyB1bmNvbW1lbnQgdGhpcyBpZiB5b3VyIGNvbXBpbGVyIGhhcyBwcm9ibGVtIHdpdGggdGhlIGltcG9ydCBvZiBhIG5hbWVzcGFjZSBpbgorLy8gYW4gb3RoZXIgb25lIHdpdGggdGhlIHVzaW5nIG5hbWVzcGFjZSBkaXJlY3RpdmUKKy8vICMgIGRlZmluZSBfU1RMUF9VU0lOR19OQU1FU1BBQ0VfQlVHIDEKKworLy8gRWRpdCByZWxhdGl2ZSBwYXRoIGJlbG93IChvciBwdXQgZnVsbCBwYXRoKSB0byBnZXQgbmF0aXZlCisvLyBjb21waWxlciBoZWFkZXJzIGluY2x1ZGVkLiBEZWZhdWx0IGlzICIuLi9pbmNsdWRlIi4KKy8vIEMgaGVhZGVycyBtYXkgcmVzaWRlIGluIGRpZmZlcmVudCBkaXJlY3RvcnksIHNvIHNlcGFyYXRlIG1hY3JvIGlzIHByb3ZpZGVkLgorLy8gSGludCA6IG5ldmVyIGluc3RhbGwgU1RMcG9ydCBpbiB0aGUgZGlyZWN0b3J5IHRoYXQgZW5kcyB3aXRoICJpbmNsdWRlIgorLy8gIyBkZWZpbmUgX1NUTFBfTkFUSVZFX0lOQ0xVREVfUEFUSCAuLi9pbmNsdWRlCisvLyAjIGRlZmluZSBfU1RMUF9OQVRJVkVfQ19JTkNMVURFX1BBVEggLi4vaW5jbHVkZQorLy8gIyBkZWZpbmUgX1NUTFBfTkFUSVZFX0NQUF9DX0lOQ0xVREVfUEFUSCAuLi9pbmNsdWRlCisKKy8vIFRoaXMgbWFjcm8gY29uc3RydWN0cyBoZWFkZXIgcGF0aCBmcm9tIGRpcmVjdG9yeSBhbmQgbmFtZS4KKy8vIFlvdSBtYXkgY2hhbmdlIGl0IGlmIHlvdXIgY29tcGlsZXIgZG9lcyBub3QgdW5kZXJzdGFuZCAiLyIuCisvLyAjICBkZWZpbmUgX1NUTFBfTUFLRV9IRUFERVIocGF0aCwgaGVhZGVyKSA8cGF0aC9oZWFkZXI+CisKKy8vIFRoaXMgbWFjcm8gY29uc3RydWN0cyBuYXRpdmUgaW5jbHVkZSBoZWFkZXIgcGF0aCBmcm9tIGluY2x1ZGUgcGF0aCBhbmQgbmFtZS4KKy8vIFlvdSBtYXkgaGF2ZSBkbyBkZWZpbmUgaXQgaWYgZXhwZXJpbWVudGluZyBwcm9ibGVtcyB3aXRoIHByZXByb2Nlc3NvcgorLy8gIyBkZWZpbmUgX1NUTFBfTkFUSVZFX0hFQURFUihoZWFkZXIpIF9TVExQX01BS0VfSEVBREVSKF9TVExQX05BVElWRV9JTkNMVURFX1BBVEgsaGVhZGVyKQorCisvLyBTYW1lIGZvciBDIGhlYWRlcnMKKy8vICNkZWZpbmUgX1NUTFBfTkFUSVZFX0NfSEVBREVSKGhlYWRlcikKKworLy8gdW5jb21tZW50IHRoaXMgaWYgeW91ciBjb21waWxlci9wbGF0Zm9ybSBkbyBub3QgZnVsbHkgc3VwcG9ydCB0aGUgSUVDIDU1OSBmbG9hdGluZyBwb2ludAorLy8gbnVtYmVycyBzcGVjaWZpY2F0aW9uIChhbHNvIGtub3duIGFzIElFRUUgNzU0IGluIHRoZSBVUykuIFRoaXMgc3BlY2lmaWNhdGlvbiBkZWZpbmUgdGhlCisvLyBpbmZpbml0eSBhbmQgTmFOIChOb3QgYSBOdW1iZXIpIHJlcHJlc2VudGF0aW9uLiBVbml0IHRlc3RzIHNob3VsZCB0ZWxsIHlvdSBpZiB5b3VyIGNvbXBpbGVyCisvLyBzdXBwb3J0IGl0LgorLy8gIyAgZGVmaW5lIF9TVExQX05PX0lFQzU1OV9TVVBQT1JUIDEKKworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3RsL2NvbmZpZy9zdGxfc3ltYmlhbi5oIGIvc3RsL2NvbmZpZy9zdGxfc3ltYmlhbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ZWUzYzQKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvY29uZmlnL3N0bF9zeW1iaWFuLmgKQEAgLTAsMCArMSw3NiBAQAorI2lmbmRlZiBfX3N0bHBfY29uZmlnX3N5bWJpYW5faAorI2RlZmluZSBfX3N0bHBfY29uZmlnX3N5bWJpYW5faAorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2lmIGRlZmluZWQoX1dJTjMyKQorIyAgdW5kZWYgX1dJTjMyCisjZW5kaWYKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpZmRlZiBfX2NwbHVzcGx1cworIyAgaW5jbHVkZSA8ZTMyY21uLmg+CisjZW5kaWYKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpZiBkZWZpbmVkKF9fTUFSTV9fKQorIyAgaWYgIWRlZmluZWQoX01fQVJNKQorIyAgICBkZWZpbmUgX01fQVJNICAxCisjICBlbmRpZgorI2Vsc2UKKyMgIGlmICFkZWZpbmVkKF9NX0lYODYpCisjICAgIGRlZmluZSBfTV9JWDg2IDEKKyMgIGVuZGlmCisjZW5kaWYKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNkZWZpbmUgX19QSVBTX18KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNkZWZpbmUgX1NUTFBfSEFTX05PX05FV19DX0hFQURFUlMgICAgICAgICAgMQorI2RlZmluZSBfU1RMUF9OT19ORVdfTkVXX0hFQURFUiAgICAgICAgICAgICAxCisjZGVmaW5lIF9TVExQX05PX05FV19IRUFERVIgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgX1NUTFBfTkVXX0RPTlRfVEhST1dfQkFEX0FMTE9DICAgICAgMQorI2RlZmluZSBfU1RMUF9OT19FWENFUFRJT05fSEVBREVSICAgICAgICAgICAxCisjZGVmaW5lIF9TVExQX05PX1RZUEVJTkZPICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgX1NUTFBfTk9fVkVORE9SX1NURExJQl9MICAgICAgICAgICAgMQorI2RlZmluZSBfU1RMUF9VU0VfTk9UX0lOSVRfU0VHTUVOVCAgICAgICAgICAxCisjZGVmaW5lIF9TVExQX05PX0xPTkdfRE9VQkxFICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgX1NUTFBfTk9fT1dOX05BTUVTUEFDRSAgICAgICAgICAgICAgMQorI2RlZmluZSBfU1RMUF9VU0VfTUFMTE9DICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIF9TVExQX1VTRV9OT19FWFRFUk5fUkFOR0VfRVJST1JTICAgIDEKKyNkZWZpbmUgX1NUTFBfVVNFX1NJTVBMRV9OT0RFX0FMTE9DICAgICAgICAgMQorI2RlZmluZSBfU1RMUF9ET05UX1RIUk9XX1JBTkdFX0VSUk9SUyAgICAgICAxCisjZGVmaW5lIF9TVExQX0VYUE9TRV9HTE9CQUxTX0lNUExFTUVOVEFUSU9OIDEKKyNkZWZpbmUgX1NUTFBfVVNFX05FV0FMTE9DICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBfU1RMUF9JTkxJTkVfRVhDRVBUSU9OX0NMQVNTICAgICAgICAxCisjZGVmaW5lIF9TVExQX1VTRV9QQVJUSUFMX1NQRUNfV09SS0FST1VORCAgIDEKKyNkZWZpbmUgX1NUTFBfTkVFRFNfRVhUUkFfVEVNUExBVEVfQ09OU1RSVUNUT1JTIDEKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaWZkZWYgX1NUTFBfUkVBTF9MT0NBTEVfSU1QTEVNRU5URUQKKyMgIHVuZGVmIF9TVExQX1JFQUxfTE9DQUxFX0lNUExFTUVOVEVECisjZW5kaWYKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNkZWZpbmUgX1NUTFBfTkFUSVZFX0NfSU5DTFVERV9QQVRIICAgc3RkYXBpcworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNkZWZpbmUgX0xvY2FsZV9TUEFDRSAgIF9DVFlQRV9TCisjZGVmaW5lIF9Mb2NhbGVfUFJJTlQgICBfQ1RZUEVfUgorI2RlZmluZSBfTG9jYWxlX0NOVFJMICAgX0NUWVBFX0MKKyNkZWZpbmUgX0xvY2FsZV9VUFBFUiAgIF9DVFlQRV9VCisjZGVmaW5lIF9Mb2NhbGVfTE9XRVIgICBfQ1RZUEVfTAorI2RlZmluZSBfTG9jYWxlX0FMUEhBICAgX0NUWVBFX0EKKyNkZWZpbmUgX0xvY2FsZV9ESUdJVCAgIF9DVFlQRV9ECisjZGVmaW5lIF9Mb2NhbGVfUFVOQ1QgICBfQ1RZUEVfUAorI2RlZmluZSBfTG9jYWxlX1hESUdJVCAgX0NUWVBFX1gKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3RsL2NvbmZpZy9zdGxfd2luc2N3LmggYi9zdGwvY29uZmlnL3N0bF93aW5zY3cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTE2MWU5Ci0tLSAvZGV2L251bGwKKysrIGIvc3RsL2NvbmZpZy9zdGxfd2luc2N3LmgKQEAgLTAsMCArMSwxNSBAQAorI2lmbmRlZiBfU1RMUF9XSU5TQ1dfSAorI2RlZmluZSBfU1RMUF9XSU5TQ1dfSAorCisjZGVmaW5lIF9TVExQX0NPTVBJTEVSICJXSU5TQ1ciCisKKyN1bmRlZiBfX01XRVJLU19fCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjICBkZWZpbmUgX1NUTFBfV0NIQVJfVF9JU19VU0hPUlQgMQorIyAgZGVmaW5lIF9TVExQX0xPTkdfTE9ORyBsb25nIGxvbmcKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3RsL2NvbmZpZy91c2VyX2NvbmZpZy5oIGIvc3RsL2NvbmZpZy91c2VyX2NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YWM3ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvY29uZmlnL3VzZXJfY29uZmlnLmgKQEAgLTAsMCArMSwzMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICovCisKKy8qCisgKiBQdXJwb3NlIG9mIHRoaXMgZmlsZSA6CisgKgorICogVG8gaG9sZCB1c2VyLWRlZmluYWJsZSBwb3J0aW9uIG9mIFNUTHBvcnQgc2V0dGluZ3Mgd2hpY2ggbWF5IGJlIG92ZXJyaWRkZW4KKyAqIG9uIHBlci1wcm9qZWN0IGJhc2lzLgorICogUGxlYXNlIG5vdGUgdGhhdCBpZiB5b3UgdXNlIFNUTHBvcnQgaW9zdHJlYW1zIChjb21waWxlZCBsaWJyYXJ5KSB0aGVuIHlvdSBoYXZlCisgKiB0byB1c2UgY29uc2lzdGVudCBzZXR0aW5ncyB3aGVuIHlvdSBjb21waWxlIFNUTHBvcnQgbGlicmFyeSBhbmQgeW91ciBwcm9qZWN0LgorICogVGhvc2Ugc2V0dGluZ3MgYXJlIGRlZmluZWQgaW4gaG9zdC5oIGFuZCBoYXZlIHRvIGJlIHRoZSBzYW1lIGZvciBhIGdpdmVuCisgKiBTVExwb3J0IGluc3RhbGxhdGlvbi4KKyAqLworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVXNlci1zZXR0YWJsZSBtYWNyb3MgdGhhdCBjb250cm9sIGNvbXBpbGF0aW9uOgorICogICAgICAgICAgICAgIEZlYXR1cmVzIHNlbGVjdGlvbgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoKKyAqIFVzZSB0aGlzIHN3aXRjaCBmb3IgZW1iZWRkZWQgc3lzdGVtcyB3aGVyZSBubyBpb3N0cmVhbXMgYXJlIGF2YWlsYWJsZQorICogYXQgYWxsLiBTVExwb3J0IG93biBpb3N0cmVhbXMgd2lsbCBhbHNvIGdldCBkaXNhYmxlZCBhdXRvbWF0aWNhbGx5IHRoZW4uCisgKiBZb3UgY2FuIGVpdGhlciB1c2UgU1RMcG9ydCBpb3N0cmVhbXMsIG9yIG5vIGlvc3RyZWFtcy4KKyAqIElmIHlvdSB3YW50IGlvc3RyZWFtcywgeW91IGhhdmUgdG8gY29tcGlsZSBsaWJyYXJ5IGluIC4uL2J1aWxkL2xpYgorICogYW5kIHN1cHBseSByZXN1bHRpbmcgbGlicmFyeSBhdCBsaW5rIHRpbWUuCisgKi8KKy8qCisjZGVmaW5lIF9TVExQX05PX0lPU1RSRUFNUyAxCisqLworCisvKgorICogU2V0IF9TVExQX0RFQlVHIHRvIHR1cm4gdGhlICJEZWJ1ZyBNb2RlIiBvbi4KKyAqIFRoYXQgZ2V0cyB5b3UgY2hlY2tlZCBpdGVyYXRvcnMvcmFuZ2VzIGluIHRoZSBtYW5uZXIKKyAqIG9mICJTYWZlIFNUTCIuIFZlcnkgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuIFRocmVhZC1zYWZlLgorICogUGxlYXNlIGRvIG5vdCBmb3JnZXQgdG8gbGluayBwcm9wZXIgU1RMcG9ydCBsaWJyYXJ5IGZsYXZvcgorICogKGUuZyBsaWJzdGxwb3J0c3RsZy5zbyBvciBsaWJzdGxwb3J0c3RsZy5hKSB3aGVuIHlvdSBzZXQgdGhpcyBmbGFnCisgKiBpbiBTVExwb3J0IGlvc3RyZWFtcyBtb2RlLCBuYW1lc3BhY2UgY3VzdG9taXphdGlvbiBndWFyYW50eSB0aGF0IHlvdQorICogbGluayB0byB0aGUgcmlnaHQgbGlicmFyeS4KKyAqLworLyoKKyNkZWZpbmUgX1NUTFBfREVCVUcgMQorKi8KKy8qCisgKiBZb3UgY2FuIGFsc28gY2hvb3NlIHRoZSBkZWJ1ZyBsZXZlbDoKKyAqIFNUTHBvcnQgZGVidWcgbGV2ZWw6IERlZmF1bHQgdmFsdWUKKyAqICAgICAgICAgICAgICAgICAgICAgIENoZWNrIG9ubHkgd2hhdCB0aGUgU1RMcG9ydCBpbXBsZW1lbnRhdGlvbiBjb25zaWRlciBhcyBpbnZhbGlkLgorICogICAgICAgICAgICAgICAgICAgICAgSXQgYWxzbyBjaGFuZ2UgdGhlIGl0ZXJhdG9yIGludmFsaWRhdGlvbiBzY2hlbWEuCisgKiBTdGFuZGFyZCBkZWJ1ZyBsZXZlbDogQ2hlY2sgZm9yIGFsbCBvcGVyYXRpb25zIHRoZSBzdGFuZGFyZCBjb25zaWRlciBhcyAidW5kZWZpbmVkIGJlaGF2aW9yIgorICogICAgICAgICAgICAgICAgICAgICAgIGV2ZW4gaWYgU1RscG9ydCBpbXBsZW1lbnQgaXQgY29ycmVjdGx5LiBJdCBhbHNvIGludmFsaWRhdGVzIGl0ZXJhdG9ycworICogICAgICAgICAgICAgICAgICAgICAgIG1vcmUgb2Z0ZW4uCisgKi8KKy8qCisjZGVmaW5lICAgX1NUTFBfREVCVUdfTEVWRUwgX1NUTFBfU1RMUE9SVF9EQkdfTEVWRUwKKyNkZWZpbmUgICBfU1RMUF9ERUJVR19MRVZFTCBfU1RMUF9TVEFOREFSRF9EQkdfTEVWRUwKKyovCisvKiBXaGVuIGFuIGluY29uc2lzdGVuY3kgaXMgZGV0ZWN0ZWQgYnkgdGhlICdzYWZlIFNUTCcgdGhlIHByb2dyYW0gd2lsbCBhYm9ydC4KKyAqIElmIHlvdSBwcmVmZXIgYW4gZXhjZXB0aW9uIGRlZmluZSB0aGUgZm9sbG93aW5nIG1hY3JvLiBUaGUgdGhyb3duIGV4Y2VwdGlvbgorICogd2lsbCBiZSB0aGUgU3RhbmRhcmQgcnVudGltZV9lcnJvciBleGNlcHRpb24uCisgKi8KKy8qCisjZGVmaW5lIF9TVExQX0RFQlVHX01PREVfVEhST1dTCisgKi8KKworLyoKKyAqIF9TVExQX05PX0NVU1RPTV9JTyA6IGRlZmluZSB0aGlzIGlmIHlvdSBkbyBub3QgaW5zdGFudGlhdGUgYmFzaWNfeHh4IGlvc3RyZWFtCisgKiBjbGFzc2VzIHdpdGggY3VzdG9tIHR5cGVzICh3aGljaCBpcyBtb3N0IGxpa2VseSB0aGUgY2FzZSkuIEN1c3RvbSBtZWFucyB0eXBlcworICogb3RoZXIgdGhhbiBjaGFyLCB3Y2hhcl90LCBjaGFyX3RyYWl0czw+IGFuZCBhbGxvY2F0b3I8PiBsaWtlCisgKiBiYXNpY19vc3RyZWFtPG15X2NoYXJfdHlwZSwgbXlfdHJhaXRzPG15X2NoYXJfdHlwZT4gPiBvcgorICogYmFzaWNfc3RyaW5nPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+LCBteV9hbGxvY2F0b3IgPgorICogV2hlbiB0aGlzIG9wdGlvbiBpcyBvbiwgbW9zdCBub24taW5saW5lIHRlbXBsYXRlIGZ1bmN0aW9ucyBkZWZpbml0aW9ucyBmb3IgaW9zdHJlYW1zCisgKiBhcmUgbm90IHNlZW4gYnkgdGhlIGNsaWVudCB3aGljaCBzYXZlcyBhIGxvdCBvZiBjb21waWxlIHRpbWUgZm9yIG1vc3QgY29tcGlsZXJzLAorICogYWxzbyBvYmplY3QgYW5kIGV4ZWN1dGFibGUgc2l6ZSBmb3Igc29tZS4KKyAqIERlZmF1bHQgaXMgb2ZmLCBqdXN0IG5vdCB0byBicmVhayBjb21waWxhdGlvbiBmb3IgdGhvc2Ugd2hvIGRvIHVzZSB0aG9zZSB0eXBlcy4KKyAqIFRoYXQgYWxzbyBndWFyYW50ZWVzIHRoYXQgeW91IHN0aWxsIHVzZSBvcHRpbWl6ZWQgc3RhbmRhcmQgaS9vIHdoZW4geW91IGNvbXBpbGUKKyAqIHlvdXIgcHJvZ3JhbSB3aXRob3V0IG9wdGltaXphdGlvbi4gT3B0aW9uIGRvZXMgbm90IGFmZmVjdCBTVExwb3J0IGxpYnJhcnkgYnVpbGQ7IHlvdQorICogbWF5IHVzZSB0aGUgc2FtZSBiaW5hcnkgbGlicmFyeSB3aXRoIGFuZCB3aXRob3V0IHRoaXMgb3B0aW9uLCBvbiBwZXItcHJvamVjdCBiYXNpcy4KKyAqLworLyoKKyNkZWZpbmUgX1NUTFBfTk9fQ1VTVE9NX0lPCisqLworCisvKgorICogX1NUTFBfTk9fUkVMT1BTX05BTUVTUEFDRTogaWYgZGVmaW5lZCwgZG9uJ3QgcHV0IHRoZSByZWxhdGlvbmFsCisgKiBvcGVyYXRvciB0ZW1wbGF0ZXMgKD4sIDw9LiA+PSwgIT0pIGluIG5hbWVzcGFjZSBzdGQ6OnJlbF9vcHMsIGV2ZW4KKyAqIGlmIHRoZSBjb21waWxlciBzdXBwb3J0cyBuYW1lc3BhY2VzLgorICogTm90ZSA6IGlmIHRoZSBjb21waWxlciBkbyBub3Qgc3VwcG9ydCBuYW1lc3BhY2VzLCB0aG9zZSBvcGVyYXRvcnMgYXJlIG5vdCBiZSBwcm92aWRlZCBieSBkZWZhdWx0LAorICogdG8gc2ltdWxhdGUgaGlkaW5nIHRoZW0gaW50byByZWxfb3BzLiBUaGlzIHdhcyBwcm92ZWQgdG8gcmVzb2x2ZSBtYW55IGNvbXBpbGVyIGJ1Z3Mgd2l0aCBhbWJpZ3VpdHkuCisgKi8KKy8qCisjZGVmaW5lIF9TVExQX05PX1JFTE9QU19OQU1FU1BBQ0UgMQorKi8KKworLyoKKyAqIElmIF9TVExQX1VTRV9PV05fTkFNRVNQQUNFIGlzIGluIGVmZmVjdCwgU1RMcG9ydCBieSBkZWZhdWx0IHdpbGwgdHJ5CisgKiB0byByZW5hbWUgc3RkOjogZm9yIHRoZSB1c2VyIHRvIHN0bHBvcnQ6Oi4gSWYgeW91IGRvIG5vdCB3YW50IHRoaXMgZmVhdHVyZSwKKyAqIHBsZWFzZSBkZWZpbmUgdGhlIGZvbGxvd2luZyBzd2l0Y2ggYW5kIHRoZW4gdXNlIHN0bHBvcnQ6OgorICovCisvKgorI2RlZmluZSBfU1RMUF9ET05UX1JFREVGSU5FX1NURCAxCisqLworCisvKgorICogX1NUTFBfV0hPTEVfTkFUSVZFX1NURCA6IG9ubHkgbWVhbmluZ2Z1bCBpbiBfU1RMUF9VU0VfT1dOX05BTUVTUEFDRSBtb2RlLgorICogTm9ybWFsbHksIFNUTHBvcnQgb25seSBpbXBvcnRzIG5lY2Vzc2FyeSBjb21wb25lbnRzIGZyb20gbmF0aXZlIHN0ZDo6IG5hbWVzcGFjZSAtCisgKiB0aG9zZSBub3QgeWV0IHByb3ZpZGVkIGJ5IFNUTHBvcnQgKDxpb3N0cmVhbT4sIDxjb21wbGV4PiwgZXRjLikKKyAqIGFuZCB0aGVpciBkZXBlbmRlbmNpZXMgKDxzdHJpbmc+LCA8c3RkZXhjZXB0PikuCisgKiBZb3UgbWlnaHQgd2FudCBldmVyeXRoaW5nIGZyb20gc3RkOjogYmVpbmcgYXZhaWxhYmxlIGluIHN0ZDo6IG5hbWVzcGFjZSB3aGVuIHlvdQorICogaW5jbHVkZSBjb3JyZXNwb25kaW5nIFNUTHBvcnQgaGVhZGVyIChsaWtlIFNUTHBvcnQgPG1hcD4gcHJvdmlkZXMgc3RkOjptYXAgYXMgd2VsbCwgZXRjLiksCisgKiBpZiB5b3UgYXJlIGdvaW5nIHRvIHVzZSBib3RoIHN0bHBvcnQ6OiBhbmQgc3RkOjogY29tcG9uZW50cyBpbiB5b3VyIGNvZGUuCisgKiBPdGhlcndpc2UgdGhpcyBvcHRpb24gaXMgbm90IHJlY29tbWVuZGVkIGFzIGl0IGluY3JlYXNlcyB0aGUgc2l6ZSBvZiB5b3VyIG9iamVjdCBmaWxlcworICogYW5kIHNsb3dzIGRvd24gY29tcGlsYXRpb24uCisgKi8KKy8qCisjZGVmaW5lIF9TVExQX1dIT0xFX05BVElWRV9TVEQKKyovCisKKy8qCisgKiBVc2UgdGhpcyBvcHRpb24gdG8gY2F0Y2ggdW5pbml0aWFsaXplZCBtZW1iZXJzIGluIHlvdXIgY2xhc3Nlcy4KKyAqIFdoZW4gaXQgaXMgc2V0LCBjb25zdHJ1Y3QoKSBhbmQgZGVzdHJveSgpIGZpbGwgdGhlIGNsYXNzIHN0b3JhZ2UKKyAqIHdpdGggX1NUTFBfU0hSRURfQllURSAoc2VlIGJlbG93KS4KKyAqIE5vdGUgOiBfU1RMUF9ERUJVRyBhbmQgX1NUTFBfREVCVUdfQUxMT0MgZG9uJ3Qgc2V0IHRoaXMgb3B0aW9uIGF1dG9tYXRpY2FsbHkuCisgKi8KKy8qCisjZGVmaW5lIF9TVExQX0RFQlVHX1VOSU5JVElBTElaRUQgMQorI2RlZmluZSBfU1RMUF9ERUJVR19BTExPQyAxCisqLworCisvKgorICogVW5jb21tZW50IGFuZCBwcm92aWRlIGEgZGVmaW5pdGlvbiBmb3IgdGhlIGJ5dGUgd2l0aCB3aGljaCByYXcgbWVtb3J5CisgKiB3aWxsIGJlIGZpbGxlZCBpZiBfU1RMUF9ERUJVR19BTExPQyBvciBfU1RMUF9ERUJVR19VTklOSVRJQUxJWkVEIGlzIGRlZmluZWQuCisgKiBDaG9vc2UgYSB2YWx1ZSB3aGljaCBpcyBsaWtlbHkgdG8gY2F1c2UgYSBub3RpY2VhYmxlIHByb2JsZW0gaWYgZGVyZWZlcmVuY2VkCisgKiBvciBvdGhlcndpc2UgYWJ1c2VkLiBBIGdvb2QgdmFsdWUgbWF5IGFscmVhZHkgYmUgZGVmaW5lZCBmb3IgeW91ciBwbGF0Zm9ybS4KKyAqLworLyoKKyNkZWZpbmUgX1NUTFBfU0hSRURfQllURSAweEEzCisqLworCisvKgorICogIFRoaXMgb3B0aW9uIGlzIGZvciBnY2MgdXNlcnMgb25seSBhbmQgb25seSBhZmZlY3RzIHN5c3RlbXMgd2hlcmUgbmF0aXZlIGxpbmtlcgorICogIGRvZXMgbm90IGxldCBnY2MgdG8gaW1wbGVtZW50IGF1dG9tYXRpYyBpbnN0YW50aWF0aW9uIG9mIHN0YXRpYyB0ZW1wbGF0ZSBkYXRhIG1lbWJlcnMvCisgKiAgSXQgaXMgYmVpbmcgcHV0IGluIHRoaXMgZmlsZSBhcyB0aGVyZSBpcyBubyB3YXkgdG8gY2hlY2sgaWYgd2UgYXJlIHVzaW5nIEdOVSBsZCBhdXRvbWF0aWNhbGx5LAorICogIHNvIGl0IGJlY29tZXMgdXNlcidzIHJlc3BvbnNpYmlsaXR5LgorICovCisvKgorI2RlZmluZSBfU1RMUF9HQ0NfVVNFU19HTlVfTEQKKyovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29tcGF0aWJpbGl0eSBzZWN0aW9uCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKgorICogIERlZmluZSB0aGlzIG1hY3JvIHRvIGRpc2FibGUgYW5hY2hyb25pc3RpYyBjb25zdHJ1Y3RzIChsaWtlIHRoZSBvbmVzIHVzZWQgaW4gSFAgU1RMIGFuZAorICogIG5vdCBpbmNsdWRlZCBpbiBmaW5hbCBzdGFuZGFyZCwgZXRjLgorICovCisvKgorI2RlZmluZSBfU1RMUF9OT19BTkFDSFJPTklTTVMgMQorKi8KKworLyoKKyAqICBEZWZpbmUgdGhpcyBtYWNybyB0byBkaXNhYmxlIFNUTHBvcnQgZXh0ZW5zaW9ucyAoZm9yIGV4YW1wbGUsIHRvIG1ha2Ugc3VyZSB5b3VyIGNvZGUgd2lsbAorICogIGNvbXBpbGUgd2l0aCBzb21lIG90aGVyIGltcGxlbWVudGF0aW9uICkKKyAqLworLyoKKyNkZWZpbmUgX1NUTFBfTk9fRVhURU5TSU9OUyAxCisqLworCisvKgorICogWW91IHNob3VsZCBkZWZpbmUgdGhpcyBtYWNybyBpZiBjb21waWxpbmcgd2l0aCBNRkMgLSBTVExwb3J0IDxzdGwvY29uZmlnL193aW5kb3dzLmg+CisgKiB0aGVuIGluY2x1ZGUgPGFmeC5oPiBpbnN0ZWFkIG9mIDx3aW5kb3dzLmg+IHRvIGdldCBzeW5jaHJvbmlzYXRpb24gcHJpbWl0aXZlcworICovCisvKgorI2RlZmluZSBfU1RMUF9VU0VfTUZDIDEKKyovCisKKy8qCisgKiBib3JpcyA6IHRoaXMgc2V0dGluZyBpcyBoZXJlIGFzIHdlIGNhbm5vdCBkZXRlY3QgcHJlY2Vuc2Ugb2YgbmV3IFBsYXRmb3JtIFNESyBhdXRvbWF0aWNhbGx5CisgKiBJZiB5b3UgYXJlIHVzaW5nIG5ldyBQU0RLIHdpdGggVkMrKyA2LjAgb3IgbG93ZXIsCisgKiBwbGVhc2UgZGVmaW5lIHRoaXMgdG8gZ2V0IGNvcnJlY3QgcHJvdG90eXBlcyBmb3IgSW50ZXJsb2NrZWRYWFggZnVuY3Rpb25zCisgKi8KKy8qCisjZGVmaW5lIF9TVExQX05FV19QTEFURk9STV9TREsgMQorKi8KKworLyoKKyAqIEZvciB0aGUgc2FtZSByZWFzb24gYXMgdGhlIG9uZSBhYm92ZSB3ZSBhcmUgbm90IGFibGUgdG8gZGV0ZWN0IGVhc2lseSB1c2UKKyAqIG9mIHRoZSBjb21waWxlciBjb21pbmcgd2l0aCB0aGUgUGxhdGZvcm0gU0RLIGluc3RlYWQgb2YgdGhlIG9uZSBjb21pbmcgd2l0aAorICogYSBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyByZWxlYXNlLiBUaGlzIGNoYW5nZSBuYXRpdmUgQy9DKysgbGlicmFyeSBsb2NhdGlvbgorICogYW5kIGltcGxlbWVudGF0aW9uLCBwbGVhc2UgZGVmaW5lIHRoaXMgdG8gZ2V0IGNvcnJlY3QgU1RMcG9ydCBjb25maWd1cmF0aW9uLgorICovCisvKgorI2RlZmluZSBfU1RMUF9VU0lOR19QTEFURk9STV9TREtfQ09NUElMRVIgMQorKi8KKworLyoKKyAqIFNvbWUgY29tcGlsZXJzIHN1cHBvcnQgdGhlIGF1dG9tYXRpYyBsaW5raW5nIGZlYXR1cmUuCisgKiBVbmNvbW1lbnQgdGhlIGZvbGxvd2luZyBpZiB5b3UgcHJlZmVyIHRvIHNwZWNpZnkgdGhlIFNUTHBvcnQgbGlicmFyeQorICogdG8gbGluayB3aXRoIHlvdXJzZWxmLgorICogRm9yIHRoZSBtb21lbnQsIHRoaXMgZmVhdHVyZSBpcyBvbmx5IHN1cHBvcnRlZCBhbmQgaW1wbGVtZW50ZWQgd2l0aGluIFNUTHBvcnQKKyAqIGJ5IHRoZSBNaWNyb3NvZnQgY29tcGlsZXJzLgorICovCisvKgorI2RlZmluZSBfU1RMUF9ET05UX1VTRV9BVVRPX0xJTksgMQorKi8KKworLyoKKyAqIElmIHlvdSBjdXN0b21pemUgdGhlIFNUTHBvcnQgZ2VuZXJhdGVkIGxpYnJhcnkgbmFtZXMgZG9uJ3QgZm9yZ2V0IHRvIGdpdmUKKyAqIHRoZSBtb3RpZiB5b3UgdXNlZCBkdXJpbmcgY29uZmlndXJhdGlvbiBoZXJlIGlmIHlvdSBzdGlsbCB3YW50IHRoZSBhdXRvIGxpbmsKKyAqIHRvIHdvcmsuIChEbyBub3QgcmVtb3ZlIGRvdWJsZSBxdW90ZXMgaW4gdGhlIG1hY3JvIHZhbHVlKQorICovCisvKgorI2RlZmluZSBfU1RMUF9MSUJfTkFNRV9NT1RJRiAiPz8/IgorICovCisKKy8qCisgKiBXaGVuIHVzaW5nIGF1dG9tYXRpYyBsaW5raW5nIChzZWUgYWJvdmUpLCBvdXRwdXQgYSBtZXNzYWdlIHRoYXQgdGVsbHMgdGhlCisgKiB1c2VyIHdoaWNoIGxpYiBpcyBnZXR0aW5nIGxpbmtlZCB2aWEgJ3ByYWdtYSBtZXNzYWdlKC4uKScuCisgKiBUaGlzIHNldHRpbmcgaGFzIG5vIGVmZmVjdCBpZiBhdXRvbWF0aWMgbGlua2luZyBpcyBub3QgYWN0aXZlLgorICovCisvKgorI2RlZmluZSBfU1RMUF9WRVJCT1NFX0FVVE9fTElOSyAxCisqLworCisvKgorICogVXNlIG1pbmltdW0gc2V0IG9mIGRlZmF1bHQgYXJndW1lbnRzIG9uIHRlbXBsYXRlIGNsYXNzZXMgdGhhdCBoYXZlIG1vcmUKKyAqIHRoYW4gb25lIC0gZm9yIGV4YW1wbGUgbWFwPD4sIHNldDw+LgorICogVGhpcyBoYXMgZWZmZWN0IG9ubHkgaWYgX1NUTFBfTElNSVRFRF9ERUZBVUxUX1RFTVBMQVRFUyBpcyBvbi4KKyAqIElmIF9TVExQX01JTklNVU1fREVGQVVMVF9URU1QTEFURV9QQVJBTVMgaXMgc2V0LCB5b3UnbGwgYmUgYWJsZSB0byBjb21waWxlCisgKiBzZXQ8VD4gd2l0aCB0aG9zZSBjb21waWxlcnMsIGJ1dCB5b3UnbGwgaGF2ZSB0byB1c2UgX19zZXRfXzxULCBsZXNzPFQ+PgorICoKKyAqIEFmZmVjdHMgOiBtYXA8PiwgbXVsdGltYXA8Piwgc2V0PD4sIG11bHRpc2V0PD4sIGhhc2hfKjw+LAorICogcXVldWU8PiwgcHJpb3JpdHlfcXVldWU8Piwgc3RhY2s8PiwgaXN0cmVhbV9pdGVyYXRvcjw+CisgKi8KKy8qCisjZGVmaW5lIF9TVExQX01JTklNVU1fREVGQVVMVF9URU1QTEFURV9QQVJBTVMgMQorKi8KKworLyoKKyAqIFRoZSBhZ3JlZ2F0aW9uIG9mIHN0cmluZ3MgdXNpbmcgdGhlICsgb3BlcmF0b3IgaXMgYW4gZXhwZW5zaXZlIG9wZXJhdGlvbgorICogYXMgaXQgcmVxdWlyZXMgY29uc3RydWN0aW9uIG9mIHRlbXBvcmFyeSBvYmplY3RzIHRoYXQgbmVlZCBtZW1vcnkgYWxsb2NhdGlvbgorICogYW5kIGRlYWxsb2NhdGlvbi4gVGhlIHByb2JsZW0gY2FuIGJlIGV2ZW4gbW9yZSBpbXBvcnRhbnQgaWYgeW91IGFyZSBhZGRpbmcKKyAqIHNldmVyYWwgc3RyaW5ncyB0b2dldGhlciBpbiBhIHNpbmdsZSBleHByZXNzaW9uLiBUbyBhdm9pZCB0aGlzIHByb2JsZW0gU1RMcG9ydAorICogaW1wbGVtZW50IGV4cHJlc3Npb24gdGVtcGxhdGUuIFdpdGggdGhpcyB0ZWNobmlxdWUgYWRkaXRpb24gb2YgMiBzdHJpbmdzIGlzIG5vdAorICogYSBzdHJpbmcgYW55bW9yZSBidXQgYSB0ZW1wb3Jhcnkgb2JqZWN0IGhhdmluZyBhIHJlZmVyZW5jZSB0byBlYWNoIG9mIHRoZQorICogb3JpZ2luYWwgc3RyaW5ncyBpbnZvbHZlZCBpbiB0aGUgZXhwcmVzc2lvbi4gVGhpcyBvYmplY3QgY2FycnkgaW5mb3JtYXRpb24KKyAqIGRpcmVjdGx5IHRvIHRoZSBkZXN0aW5hdGlvbiBzdHJpbmcgdG8gc2V0IGl0cyBzaXplIGNvcnJlY3RseSBhbmQgb25seSBtYWtlCisgKiBhIHNpbmdsZSBjYWxsIHRvIHRoZSBhbGxvY2F0b3IuIFRoaXMgdGVjaG5pcXVlIGFsc28gd29ya3MgZm9yIHRoZSBhZGRpdGlvbiBvZgorICogTiBlbGVtZW50cyB3aGVyZSBlbGVtZW50cyBhcmUgYmFzaWNfc3RyaW5nLCBDIHN0cmluZyBvciBhIHNpbmdsZSBjaGFyYWN0ZXIuCisgKiBUaGUgZHJhd2JhY2sgY2FuIGJlIGxvbmdlciBjb21waWxhdGlvbiB0aW1lIGFuZCBiaWdnZXIgZXhlY3V0YWJsZSBzaXplLgorICogU1RMcG9ydCByZWJ1aWxkOiBZZXMKKyAqLworLyoKKyNkZWZpbmUgX1NUTFBfVVNFX1RFTVBMQVRFX0VYUFJFU1NJT04gMQorKi8KKworLyoKKyAqIEJ5IGRlZmF1bHQgdGhlIFNUTHBvcnQgYmFzaWNfc3RyaW5nIGltcGxlbWVudGF0aW9uIHVzZSBhIGxpdHRsZSBzdGF0aWMgYnVmZmVyCisgKiAob2YgMTYgY2hhcnMgd2hlbiB3cml0aW5nIHRoaXMgZG9jKSB0byBhdm9pZCBzeXN0ZW1hdGljYWxseSBtZW1vcnkgYWxsb2NhdGlvbgorICogaW4gY2FzZSBvZiBsaXR0bGUgYmFzaWNfc3RyaW5nLiBUaGUgZHJhd2JhY2sgb2Ygc3VjaCBhIG1ldGhvZCBpcyBiaWdnZXIKKyAqIGJhc2ljX3N0cmluZyBzaXplIGFuZCBzb21lIHBlcmZvcm1hbmNlIHBlbmFsdHkgZm9yIG1ldGhvZCBsaWtlIHN3YXAuIElmIHlvdQorICogcHJlZmVyIHN5c3RlbWF0aWNhbCBkeW5hbWljIGFsbG9jYXRpb24gdHVybiBvbiB0aGlzIG1hY3JvLgorICogU1RMcG9ydCByZWJ1aWxkOiBZZXMKKyAqLworLyoKKyNkZWZpbmUgX1NUTFBfRE9OVF9VU0VfU0hPUlRfU1RSSU5HX09QVElNIDEKKyovCisKKy8qCisgKiBUbyByZWR1Y2UgdGhlIGZhbW91cyBjb2RlIGJsb2F0IHRyb3VibGUgZHVlIHRvIHRoZSB1c2Ugb2YgdGVtcGxhdGVzIFNUTHBvcnQgZ3JhbnQKKyAqIGEgc3BlY2lhbGl6YXRpb24gb2Ygc29tZSBjb250YWluZXJzIGZvciBwb2ludGVyIHR5cGVzLiBTbyBhbGwgaW5zdGFuY2lhdGlvbnMKKyAqIG9mIHRob3NlIGNvbnRhaW5lcnMgd2l0aCBhIHBvaW50ZXIgdHlwZSB3aWxsIHVzZSB0aGUgc2FtZSBpbXBsZW1lbnRhdGlvbiBiYXNlZCBvbgorICogYSBjb250YWluZXIgb2Ygdm9pZCouIFRoaXMgZmVhdHVyZSBoYXMgc2hvdyB2ZXJ5IGdvb2QgcmVzdWx0IG9uIG9iamVjdCBmaWxlcyBzaXplCisgKiBidXQgYWZ0ZXIgbGluayBwaGFzZSBhbmQgb3B0aW1pemF0aW9uIHlvdSB3aWxsIG9ubHkgZXhwZXJpbWVudCBiZW5lZml0IGlmIHlvdSB1c2UKKyAqIG1hbnkgY29udGFpbmVyIHdpdGggcG9pbnRlciB0eXBlcy4KKyAqLworLyoKKyNkZWZpbmUgX1NUTFBfVVNFX1BUUl9TUEVDSUFMSVpBVElPTlMgMQorKi8KKworLyoKKyAqIFRvIGFjaGlldmUgbWFueSBkaWZmZXJlbnQgb3B0aW1pemF0aW9ucyB3aXRoaW4gdGhlIHRlbXBsYXRlIGltcGxlbWVudGF0aW9ucyBTVExwb3J0CisgKiB1c2VzIHNvbWUgdHlwZSB0cmFpdHMgdGVjaG5pcXVlLiBXaXRoIHRoaXMgbWFjcm8geW91IGNhbiBhc2sgU1RMcG9ydCB0byB1c2UgdGhlIGZhbW91cworICogYm9vc3QgdHlwZSB0cmFpdHMgcmF0aGVyIHRoYW4gdGhlIGludGVybmFsIG9uZS4gVGhlIGFkdmFudGFnZXMgYXJlIG1vcmUgY29tcGlsZXIKKyAqIGludGVncmF0aW9uIGFuZCBhIGJldHRlciBzdXBwb3J0LiBJZiB5b3Ugb25seSBkZWZpbmUgdGhpcyBtYWNybyBvbmNlIHRoZSBTVExwb3J0IGhhcyBiZWVuCisgKiBidWlsdCB5b3UganVzdCBoYXZlIHRvIGFkZCB0aGUgYm9vc3QgaW5zdGFsbCBwYXRoIHdpdGhpbiB5b3VyIGluY2x1ZGUgcGF0aC4gSWYgeW91IHdhbnQKKyAqIHRvIHVzZSB0aGlzIGZlYXR1cmUgYXQgU1RMcG9ydCBidWlsdCB0aW1lIHlvdSB3aWxsIGhhdmUgdG8gZGVmaW5lIHRoZQorICogU1RMUF9CVUlMRF9CT09TVF9QQVRIIGVucmlyb25tZW50IHZhcmlhYmxlIHdpdGggdGhlIHZhbHVlIG9mIHRoZSBib29zdCBsaWJyYXJ5IHBhdGguCisgKi8KKy8qCisjZGVmaW5lIF9TVExQX1VTRV9CT09TVF9TVVBQT1JUIDEKKyovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qCisgIExvY2FsIFZhcmlhYmxlczoKKyAgbW9kZTogQysrCisgIEVuZDoKKyovCmRpZmYgLS1naXQgYS9zdGwvZGVidWcvX2RlYnVnLmMgYi9zdGwvZGVidWcvX2RlYnVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkzMmE2MgotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9kZWJ1Zy9fZGVidWcuYwpAQCAtMCwwICsxLDYzOSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX0RFQlVHX0MKKyNkZWZpbmUgX1NUTFBfREVCVUdfQworCisjaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpCisjaWYgZGVmaW5lZCAoX1NUTFBfVEhSRUFEUykKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9ORUVEX01VVEFCTEUpCisjICAgIGRlZmluZSBfU1RMUF9BQ1FVSVJFX0xPQ0soX0xvY2spIF9Mb2NrLl9NX2FjcXVpcmVfbG9jaygpOworIyAgICBkZWZpbmUgX1NUTFBfUkVMRUFTRV9MT0NLKF9Mb2NrKSBfTG9jay5fTV9yZWxlYXNlX2xvY2soKTsKKyMgIGVsc2UKKyMgICAgZGVmaW5lIF9TVExQX0FDUVVJUkVfTE9DSyhfTG9jaykgKChfU1RMUF9tdXRleCYpX0xvY2spLl9NX2FjcXVpcmVfbG9jaygpOworIyAgICBkZWZpbmUgX1NUTFBfUkVMRUFTRV9MT0NLKF9Mb2NrKSAoKF9TVExQX211dGV4JilfTG9jaykuX01fcmVsZWFzZV9sb2NrKCk7CisjICBlbmRpZiAvKiBfU1RMUF9ORUVEX01VVEFCTEUgKi8KKyNlbHNlCisjICBkZWZpbmUgX1NUTFBfQUNRVUlSRV9MT0NLKF9Mb2NrKQorIyAgZGVmaW5lIF9TVExQX1JFTEVBU0VfTE9DSyhfTG9jaykKKyNlbmRpZiAvKiBfU1RMUF9USFJFQURTICovCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBnbG9iYWwgbm9uLWlubGluZSBmdW5jdGlvbnMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gWyBpMSwgaTIpCisjaWYgIWRlZmluZWQgKF9fRE1DX18pCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgoraW5saW5lIGJvb2wgIF9TVExQX0NBTEwKK19faW5fcmFuZ2VfYXV4KGNvbnN0IF9JdGVyYXRvciYgX19pdCwgY29uc3QgX0l0ZXJhdG9yJiBfX2ZpcnN0LAorICAgICAgICAgICAgICAgY29uc3QgX0l0ZXJhdG9yJiBfX2xhc3QsIGNvbnN0IHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnICYpIHsKKyAgICByZXR1cm4gKCBfX2l0ID49IF9fZmlyc3QgJiYKKyAgICAgICAgICAgICBfX2l0IDwgX19sYXN0KTsKK30KKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yMSwgY2xhc3MgX0l0ZXJhdG9yPgorI2lmIGRlZmluZWQgKF9TVExQX01TVkMpICYmIChfU1RMUF9NU1ZDID49IDExMDApCitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMICBfX2luX3JhbmdlX2F1eChfSXRlcmF0b3IxIF9faXQsIGNvbnN0IF9JdGVyYXRvciYgX19maXJzdCwKKyNlbHNlCitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMICBfX2luX3JhbmdlX2F1eChjb25zdCBfSXRlcmF0b3IxJiBfX2l0LCBjb25zdCBfSXRlcmF0b3ImIF9fZmlyc3QsCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9JdGVyYXRvciYgX19sYXN0LCBjb25zdCBmb3J3YXJkX2l0ZXJhdG9yX3RhZyAmKSB7CisgIF9JdGVyYXRvcjEgX19pKF9fZmlyc3QpOworICBmb3IgKDsgIF9faSAhPSBfX2xhc3QgJiYgX19pICE9IF9faXQ7ICsrX19pKTsKKyAgcmV0dXJuIChfX2kgIT0gX19sYXN0KTsKK30KKworI2lmIGRlZmluZWQgKF9TVExQX05PTlRFTVBMX0JBU0VfTUFUQ0hfQlVHKQordGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcjEsIGNsYXNzIF9JdGVyYXRvcj4KK2lubGluZSBib29sICBfU1RMUF9DQUxMCitfX2luX3JhbmdlX2F1eChjb25zdCBfSXRlcmF0b3IxJiBfX2l0LCBjb25zdCBfSXRlcmF0b3ImIF9fZmlyc3QsCisgICAgICAgICAgICAgICBjb25zdCBfSXRlcmF0b3ImIF9fbGFzdCwgY29uc3QgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcgJikgeworICBfSXRlcmF0b3IxIF9faShfX2ZpcnN0KTsKKyAgZm9yICg7ICBfX2kgIT0gX19sYXN0ICYmIF9faSAhPSBfX2l0OyArK19faSk7CisgIHJldHVybiAoX19pICE9IF9fbGFzdCk7Cit9CisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcj4KK2Jvb2wgX1NUTFBfQ0FMTCBfX2NoZWNrX3JhbmdlX2F1eChjb25zdCBfSXRlcmF0b3ImIF9fZmlyc3QsIGNvbnN0IF9JdGVyYXRvciYgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypfSXNJbnRlZ3JhbCovKSB7CisgIF9TVExQX1ZFUkJPU0VfUkVUVVJOKF9fdmFsaWRfcmFuZ2UoX19maXJzdCxfX2xhc3QpLCBfU3RsTXNnX0lOVkFMSURfUkFOR0UgKQorICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9JbnRlZ3JhbD4KK2Jvb2wgX1NUTFBfQ0FMTCBfX2NoZWNrX3JhbmdlX2F1eChfSW50ZWdyYWwgLypfX2ZpcnN0Ki8sIF9JbnRlZ3JhbCAvKl9fbGFzdCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKl9Jc0ludGVncmFsKi8pCit7IHJldHVybiB0cnVlOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+Citib29sIF9TVExQX0NBTEwgIF9fY2hlY2tfcmFuZ2UoY29uc3QgX0l0ZXJhdG9yJiBfX2ZpcnN0LCBjb25zdCBfSXRlcmF0b3ImIF9fbGFzdCkgeworICB0eXBlZGVmIHR5cGVuYW1lIF9Jc0ludGVncmFsPF9JdGVyYXRvcj46Ol9SZXQgX0ludGVncmFsOworICByZXR1cm4gX19jaGVja19yYW5nZV9hdXgoX19maXJzdCwgX19sYXN0LCBfSW50ZWdyYWwoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+Citib29sIF9TVExQX0NBTEwgIF9fY2hlY2tfcmFuZ2UoY29uc3QgX0l0ZXJhdG9yJiBfX2l0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9JdGVyYXRvciYgX19zdGFydCwgY29uc3QgX0l0ZXJhdG9yJiBfX2ZpbmlzaCkgeworICBfU1RMUF9WRVJCT1NFX1JFVFVSTihfX2luX3JhbmdlKF9faXQsIF9fc3RhcnQsIF9fZmluaXNoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgX1N0bE1zZ19OT1RfSU5fUkFOR0VfMSkKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+Citib29sIF9TVExQX0NBTEwgIF9fY2hlY2tfcmFuZ2UoY29uc3QgX0l0ZXJhdG9yJiBfX2ZpcnN0LCBjb25zdCBfSXRlcmF0b3ImIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfSXRlcmF0b3ImIF9fc3RhcnQsIGNvbnN0IF9JdGVyYXRvciYgX19maW5pc2gpIHsKKyAgX1NUTFBfVkVSQk9TRV9SRVRVUk4oX19pbl9yYW5nZShfX2ZpcnN0LCBfX2xhc3QsIF9fc3RhcnQsIF9fZmluaXNoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgX1N0bE1zZ19OT1RfSU5fUkFOR0VfMikKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+Citib29sIF9TVExQX0NBTEwgX19jaGVja19wdHJfcmFuZ2UoY29uc3QgX1RwKiBfX2ZpcnN0LCBjb25zdCBfVHAqIF9fbGFzdCkgeworICBfU1RMUF9WRVJCT1NFX1JFVFVSTigoX19maXJzdCAhPSAwIHx8IF9fbGFzdCA9PSAwKSwgX1N0bE1zZ19JTlZBTElEX0FSR1VNRU5UKQorICBfU1RMUF9WRVJCT1NFX1JFVFVSTihfX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCwgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcoKSksCisgICAgICAgICAgICAgICAgICAgICAgIF9TdGxNc2dfSU5WQUxJRF9SQU5HRSkKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgordm9pZCBfU1RMUF9DQUxMIF9faW52YWxpZGF0ZV9yYW5nZShjb25zdCBfX293bmVkX2xpc3QqIF9fYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0l0ZXJhdG9yJiBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfSXRlcmF0b3ImIF9fbGFzdCkgeworICB0eXBlZGVmIF9fb3duZWRfbGluayBfTF90eXBlOworICBfU1RMUF9BQ1FVSVJFX0xPQ0soX19iYXNlLT5fTV9sb2NrKQorICBfTF90eXBlKiBfX3ByZXYgPSBfX0NPTlNUX0NBU1QoX0xfdHlwZSosICZfX2Jhc2UtPl9NX25vZGUpOworICBfTF90eXBlKiBfX3BvcyA9IF9fcHJldi0+X01fbmV4dDsKKworICB3aGlsZSAoX19wb3MgIT0gMCkgeworICAgIGlmICghKCZfX2ZpcnN0ID09IF9fU1RBVElDX0NBU1QoX0l0ZXJhdG9yKiwgX19wb3MpIHx8ICZfX2xhc3QgPT0gX19TVEFUSUNfQ0FTVChfSXRlcmF0b3IqLCBfX3BvcykpICYmCisgICAgICAgIF9faW5fcmFuZ2VfYXV4KF9fU1RBVElDX0NBU1QoX0l0ZXJhdG9yKiwgX19wb3MpLT5fTV9pdGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgX19maXJzdC5fTV9pdGVyYXRvciwgX19sYXN0Ll9NX2l0ZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9JVEVSQVRPUl9DQVRFR09SWShfX2ZpcnN0LCBfSXRlcmF0b3IpKSkgeworICAgICAgX19wb3MtPl9NX293bmVyID0gMDsKKyAgICAgIF9fcHJldi0+X01fbmV4dCA9IF9fcG9zLT5fTV9uZXh0OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIF9fcHJldiA9IF9fcG9zOworICAgIH0KKyAgICBfX3BvcyA9IF9fcHJldi0+X01fbmV4dDsKKyAgfQorICBfU1RMUF9SRUxFQVNFX0xPQ0soX19iYXNlLT5fTV9sb2NrKQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgordm9pZCBfU1RMUF9DQUxMIF9faW52YWxpZGF0ZV9pdGVyYXRvcihjb25zdCBfX293bmVkX2xpc3QqIF9fYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0l0ZXJhdG9yJiBfX2l0KSB7CisgIHR5cGVkZWYgX19vd25lZF9saW5rICAgX0xfdHlwZTsKKyAgX1NUTFBfQUNRVUlSRV9MT0NLKF9fYmFzZS0+X01fbG9jaykKKyAgX0xfdHlwZSogX19wcmV2ID0gX19DT05TVF9DQVNUKF9MX3R5cGUqLCAmX19iYXNlLT5fTV9ub2RlKTsKKyAgX0xfdHlwZSogX19wb3MgPSBfX3ByZXYtPl9NX25leHQ7CisgIHdoaWxlIChfX3BvcyAhPSAwKSB7CisgICAgLy8gdGhpcyByZXF1aXJlcyBzYWZlIGl0ZXJhdG9ycyB0byBiZSBkZXJpdmVkIGZyb20gX19vd25lZF9saW5rCisgICAgaWYgKChfX3BvcyAhPSBfX1NUQVRJQ19DQVNUKGNvbnN0IF9MX3R5cGUqLCAmX19pdCkpICYmCisgICAgICAgIChfX1NUQVRJQ19DQVNUKF9JdGVyYXRvciosIF9fcG9zKS0+X01faXRlcmF0b3IgPT0gX19pdC5fTV9pdGVyYXRvcikpIHsKKyAgICAgIF9fcG9zLT5fTV9vd25lciA9IDA7CisgICAgICBfX3ByZXYtPl9NX25leHQgPSBfX3Bvcy0+X01fbmV4dDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBfX3ByZXYgPSBfX3BvczsKKyAgICB9CisgICAgX19wb3MgPSBfX3ByZXYtPl9NX25leHQ7CisgIH0KKyAgX1NUTFBfUkVMRUFTRV9MT0NLKF9fYmFzZS0+X01fbG9jaykKK30KKwordGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcj4KK3ZvaWQgX1NUTFBfQ0FMTCAgX19jaGFuZ2VfcmFuZ2Vfb3duZXIoY29uc3QgX0l0ZXJhdG9yJiBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfSXRlcmF0b3ImIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19vd25lZF9saXN0KiBfX2RzdCkgeworICBpZiAoX19maXJzdC5fT3duZXIoKSA9PSBfX2RzdCkKKyAgICByZXR1cm47CisKKyAgdHlwZWRlZiBfX293bmVkX2xpbmsgX0xfdHlwZTsKKyAgLy8gQ2hlY2sgX19zdGxfZGVidWdfZW5naW5lPF9EdW1teT46Ol9Td2FwX293bmVycyBjb21tZW50cyB0byBzZWUgd2h5IHRoZXJlIGlzIG5vIGxvY2sgaGVyZQorICAvL19TVExQX0FDUVVJUkVfTE9DSyhfX2Jhc2UtPl9NX2xvY2spCisgIF9fb3duZWRfbGlzdCAqX19iYXNlID0gX19DT05TVF9DQVNUKF9fb3duZWRfbGlzdCosIF9fZmlyc3QuX093bmVyKCkpOworICBfTF90eXBlKiBfX3NyY19wcmV2ID0gJl9fYmFzZS0+X01fbm9kZTsKKyAgX0xfdHlwZSogX19wb3MgPSBfX3NyY19wcmV2LT5fTV9uZXh0OworICBfTF90eXBlKiBfX2RzdF9wcmV2ID0gX19DT05TVF9DQVNUKF9MX3R5cGUqLCAmX19kc3QtPl9NX25vZGUpOworCisgIHdoaWxlIChfX3BvcyAhPSAwKSB7CisgICAgaWYgKCEoJl9fZmlyc3QgPT0gX19TVEFUSUNfQ0FTVChfSXRlcmF0b3IqLCBfX3BvcykgfHwgJl9fbGFzdCA9PSBfX1NUQVRJQ19DQVNUKF9JdGVyYXRvciosIF9fcG9zKSkgJiYKKyAgICAgICAgX19pbl9yYW5nZV9hdXgoX19TVEFUSUNfQ0FTVChfSXRlcmF0b3IqLCBfX3BvcyktPl9NX2l0ZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICBfX2ZpcnN0Ll9NX2l0ZXJhdG9yLCBfX2xhc3QuX01faXRlcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9fZmlyc3QsIF9JdGVyYXRvcikpKSB7CisgICAgICBfX3Bvcy0+X01fb3duZXIgPSBfX0NPTlNUX0NBU1QoX19vd25lZF9saXN0KiwgX19kc3QpOworICAgICAgLy9yZW1vdmUgX19wb3MgZnJvbSBfX2Jhc2U6CisgICAgICBfX3NyY19wcmV2LT5fTV9uZXh0ID0gX19wb3MtPl9NX25leHQ7CisgICAgICAvL2FkZCBfX3BvcyB0byBfX2RzdDoKKyAgICAgIF9fcG9zLT5fTV9uZXh0ID0gX19kc3RfcHJldi0+X01fbmV4dDsKKyAgICAgIF9fZHN0X3ByZXYtPl9NX25leHQgPSBfX3BvczsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBfX3NyY19wcmV2ID0gX19wb3M7CisgICAgfQorICAgIF9fcG9zID0gX19zcmNfcHJldi0+X01fbmV4dDsKKyAgfQorICAvL19TVExQX1JFTEVBU0VfTE9DSyhfX2Jhc2UtPl9NX2xvY2spCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+Cit2b2lkIF9TVExQX0NBTEwgX19jaGFuZ2VfaXRlX293bmVyKGNvbnN0IF9JdGVyYXRvciYgX19pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19vd25lZF9saXN0KiBfX2RzdCkgeworICBpZiAoX19pdC5fT3duZXIoKSA9PSBfX2RzdCkKKyAgICByZXR1cm47CisKKyAgdHlwZWRlZiBfX293bmVkX2xpbmsgX0xfdHlwZTsKKyAgLy8gQ2hlY2sgX19zdGxfZGVidWdfZW5naW5lPF9EdW1teT46Ol9Td2FwX293bmVycyBjb21tZW50cyB0byBzZWUgd2h5IHRoZXJlIGlzIG5vIGxvY2sgaGVyZQorICAvL19TVExQX0FDUVVJUkVfTE9DSyhfX2Jhc2UtPl9NX2xvY2spCisgIF9fb3duZWRfbGlzdCAqX19iYXNlID0gX19DT05TVF9DQVNUKF9fb3duZWRfbGlzdCosIF9faXQuX093bmVyKCkpOworICBfTF90eXBlKiBfX3ByZXYgPSAmX19iYXNlLT5fTV9ub2RlOworICBfTF90eXBlKiBfX3BvcyA9IF9fcHJldi0+X01fbmV4dDsKKyAgX0xfdHlwZSogX19kc3RfcHJldiA9IF9fQ09OU1RfQ0FTVChfTF90eXBlKiwgJl9fZHN0LT5fTV9ub2RlKTsKKworICB3aGlsZSAoX19wb3MgIT0gMCkgeworICAgIC8vIHRoaXMgcmVxdWlyZXMgc2FmZSBpdGVyYXRvcnMgdG8gYmUgZGVyaXZlZCBmcm9tIF9fb3duZWRfbGluaworICAgIGlmICgoX19wb3MgIT0gX19TVEFUSUNfQ0FTVChjb25zdCBfTF90eXBlKiwgJl9faXQpKSAmJgorICAgICAgICAoX19TVEFUSUNfQ0FTVChfSXRlcmF0b3IqLCBfX3BvcyktPl9NX2l0ZXJhdG9yID09IF9faXQuX01faXRlcmF0b3IpKSB7CisgICAgICBfX3Bvcy0+X01fb3duZXIgPSBfX0NPTlNUX0NBU1QoX19vd25lZF9saXN0KiwgX19kc3QpOworICAgICAgLy9yZW1vdmUgX19wb3MgZnJvbSBfX2Jhc2U6CisgICAgICBfX3ByZXYtPl9NX25leHQgPSBfX3Bvcy0+X01fbmV4dDsKKyAgICAgIC8vYWRkIF9fcG9zIHRvIF9fZHN0OgorICAgICAgX19wb3MtPl9NX25leHQgPSBfX2RzdF9wcmV2LT5fTV9uZXh0OworICAgICAgX19kc3RfcHJldi0+X01fbmV4dCA9IF9fcG9zOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIF9fcHJldiA9IF9fcG9zOworICAgIH0KKyAgICBfX3BvcyA9IF9fcHJldi0+X01fbmV4dDsKKyAgfQorICAvL19TVExQX1JFTEVBU0VfTE9DSyhfX2Jhc2UtPl9NX2xvY2spCit9CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYgLyogX1NUTFBfREVCVUcgKi8KKworI2lmIGRlZmluZWQgKF9TVExQX0VYUE9TRV9HTE9CQUxTX0lNUExFTUVOVEFUSU9OKQorCisjICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfQ1NURExJQgorIyAgICBpbmNsdWRlIDxzdGwvX2NzdGRsaWIuaD4KKyMgIGVuZGlmCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gLmMgc2VjdGlvbgorLy8gIG93bmVkX2xpc3Qgbm9uLWlubGluZSBtZXRob2RzIGFuZCBnbG9iYWwgZnVuY3Rpb25zCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfQVNTRVJUSU9OUykKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKKyMgICAgaWYgIWRlZmluZWQgKF9TVExQX1NUUklOR19MSVRFUkFMKQorIyAgICAgIGRlZmluZSBfU1RMUF9TVFJJTkdfTElURVJBTChfX3gpIF9feAorIyAgICBlbmRpZgorCisjICAgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9XSURFX0lOVEVSRkFDRSkKKy8vIG5vdGU6IFdpbkNFIG5lZWRzIHRoaXMgdG8gZm9ybWF0IHNpbmdsZS1ieXRlIHN0cmluZ3MgaW4gX19zdGxfZGVidWdfZW5naW5lOjpfTWVzc2FnZQorIyAgICAgIGRlZmluZSBfU1RMUF9QRVJDRU5UX1MgIiVocyIKKyMgICAgZWxzZQorIyAgICAgIGRlZmluZSBfU1RMUF9QRVJDRU5UX1MgIiVzIgorIyAgICBlbmRpZiAvKiBfU1RMUF9VU0VfV0lERV9JTlRFUkZBQ0UgKi8KKworIyAgICBkZWZpbmUgX1NUTFBfTUVTU0FHRV9UQUJMRV9CT0RZID0geyBcCitfU1RMUF9TVFJJTkdfTElURVJBTCgiXG4iIF9TVExQX1BFUkNFTlRfUyAiKCVkKTogU1RMIGVycm9yOiAiIF9TVExQX1BFUkNFTlRfUyAiXG4iKSwgXAorX1NUTFBfU1RSSU5HX0xJVEVSQUwoX1NUTFBfUEVSQ0VOVF9TICIoJWQpOiBTVEwgYXNzZXJ0aW9uIGZhaWx1cmUgOiAiIF9TVExQX1BFUkNFTlRfUyAiXG4iIF9TVExQX0FTU0VSVF9NU0dfVFJBSUxFUiksIFwKK19TVExQX1NUUklOR19MSVRFUkFMKCJcbiIgX1NUTFBfUEVSQ0VOVF9TICIoJWQpOiBTVEwgZXJyb3IgOiAiIF9TVExQX1BFUkNFTlRfUyAiXG4iIF9TVExQX1BFUkNFTlRfUyAiKCVkKTogU1RMIGFzc2VydGlvbiBmYWlsdXJlOiAgICAgIiBfU1RMUF9QRVJDRU5UX1MgIiBcbiIgX1NUTFBfQVNTRVJUX01TR19UUkFJTEVSKSwgXAorX1NUTFBfU1RSSU5HX0xJVEVSQUwoIkludmFsaWQgYXJndW1lbnQgdG8gb3BlcmF0aW9uIChzZWUgb3BlcmF0aW9uIGRvY3VtZW50YXRpb24pIiksICAgICAgICAgICAgICAgICAgXAorX1NUTFBfU1RSSU5HX0xJVEVSQUwoIlRha2luZyBhbiBpdGVyYXRvciBvdXQgb2YgZGVzdHJveWVkIChvciBvdGhlcndpc2UgY29ycnVwdGVkKSBjb250YWluZXIiKSwgICAgICAgXAorX1NUTFBfU1RSSU5HX0xJVEVSQUwoIlRyeWluZyB0byBleHRyYWN0IGFuIG9iamVjdCBvdXQgZnJvbSBlbXB0eSBjb250YWluZXIiKSxcCitfU1RMUF9TVFJJTkdfTElURVJBTCgiUGFzdC10aGUtZW5kIGl0ZXJhdG9yIGNvdWxkIG5vdCBiZSBlcmFzZWQiKSwgIFwKK19TVExQX1NUUklOR19MSVRFUkFMKCJJbmRleCBvdXQgb2YgYm91bmRzIiksICBcCitfU1RMUF9TVFJJTkdfTElURVJBTCgiQ29udGFpbmVyIGRvZXNuJ3Qgb3duIHRoZSBpdGVyYXRvciIpLCAgXAorX1NUTFBfU1RSSU5HX0xJVEVSQUwoIkNvbnRhaW5lciBpcyBvd25lciBvZiB0aGUgaXRlcmF0b3IsIGJ1dCBzaG91bGQgbm90IiksICBcCitfU1RMUF9TVFJJTkdfTElURVJBTCgiVW5pbml0aWFsaXplZCBvciBpbnZhbGlkYXRlZCAoYnkgbXV0YXRpbmcgb3BlcmF0aW9uKSBpdGVyYXRvciB1c2VkIiksICBcCitfU1RMUF9TVFJJTkdfTElURVJBTCgiVW5pbml0aWFsaXplZCBvciBpbnZhbGlkYXRlZCAoYnkgbXV0YXRpbmcgb3BlcmF0aW9uKSBsZWZ0aGFuZCBpdGVyYXRvciBpbiBleHByZXNzaW9uIiksICBcCitfU1RMUF9TVFJJTkdfTElURVJBTCgiVW5pbml0aWFsaXplZCBvciBpbnZhbGlkYXRlZCAoYnkgbXV0YXRpbmcgb3BlcmF0aW9uKSByaWdodGhhbmQgaXRlcmF0b3IgaW4gZXhwcmVzc2lvbiIpLCAgXAorX1NUTFBfU1RSSU5HX0xJVEVSQUwoIkl0ZXJhdG9ycyB1c2VkIGluIGV4cHJlc3Npb24gYXJlIGZyb20gZGlmZmVyZW50IG93bmVycyIpLCAgXAorX1NUTFBfU1RSSU5HX0xJVEVSQUwoIkl0ZXJhdG9yIGNvdWxkIG5vdCBiZSBkZXJlZmVyZW5jZWQgKHBhc3QtdGhlLWVuZCA/KSIpLCAgXAorX1NUTFBfU1RSSU5HX0xJVEVSQUwoIlJhbmdlIFtmaXJzdCxsYXN0KSBpcyBpbnZhbGlkIiksICBcCitfU1RMUF9TVFJJTkdfTElURVJBTCgiSXRlcmF0b3IgaXMgbm90IGluIHJhbmdlIFtmaXJzdCxsYXN0KSIpLCAgXAorX1NUTFBfU1RSSU5HX0xJVEVSQUwoIlJhbmdlIFtmaXJzdCxsYXN0KSBpcyBub3QgaW4gcmFuZ2UgW3N0YXJ0LGZpbmlzaCkiKSwgIFwKK19TVExQX1NUUklOR19MSVRFUkFMKCJUaGUgYWR2YW5jZSB3b3VsZCBwcm9kdWNlIGludmFsaWQgaXRlcmF0b3IiKSwgIFwKK19TVExQX1NUUklOR19MSVRFUkFMKCJJdGVyYXRvciBpcyBzaW5ndWxhciAoYWR2YW5jZWQgYmV5b25kIHRoZSBib3VuZHMgPykiKSwgIFwKK19TVExQX1NUUklOR19MSVRFUkFMKCJJbnZhbGlkIHN0cmljdCB3ZWFrIG9yZGVyaW5nIHByZWRpY2F0ZSwgaWYgcHJlZChhLCBiKSB0aGVuIHdlIHNob3VsZCBoYXZlICFwcmVkKGIsIGEpIiksIFwKK19TVExQX1NUUklOR19MSVRFUkFMKCJJbnZhbGlkIGVxdWl2YWxlbnQgcHJlZGljYXRlLCBpZiBwcmVkKGEsIGIpIHRoZW4gd2Ugc2hvdWxkIGhhdmUgcHJlZChiLCBhKSIpLCBcCitfU1RMUF9TVFJJTkdfTElURVJBTCgiTWVtb3J5IGJsb2NrIGRlYWxsb2NhdGVkIHR3aWNlIiksICBcCitfU1RMUF9TVFJJTkdfTElURVJBTCgiRGVhbGxvY2F0aW5nIGEgYmxvY2sgdGhhdCB3YXMgbmV2ZXIgYWxsb2NhdGVkIiksICBcCitfU1RMUF9TVFJJTkdfTElURVJBTCgiRGVhbGxvY2F0aW5nIGEgbWVtb3J5IGJsb2NrIGFsbG9jYXRlZCBmb3IgYW5vdGhlciB0eXBlIiksICBcCitfU1RMUF9TVFJJTkdfTElURVJBTCgiU2l6ZSBvZiBibG9jayBwYXNzZWQgdG8gZGVhbGxvY2F0ZSgpIGRvZXNuJ3QgbWF0Y2ggYmxvY2sgc2l6ZSIpLCAgXAorX1NUTFBfU1RSSU5HX0xJVEVSQUwoIlBvaW50ZXIgdW5kZXJydW4gLSBzYWZldHkgbWFyZ2luIGF0IGZyb250IG9mIG1lbW9yeSBibG9jayBvdmVyd3JpdHRlbiIpLCAgXAorX1NUTFBfU1RSSU5HX0xJVEVSQUwoIlBvaW50ZXIgb3ZlcnJydW4gLSBzYWZldHkgbWFyZ2luIGF0IGJhY2sgb2YgbWVtb3J5IGJsb2NrIG92ZXJ3cml0dGVuIiksICAgXAorX1NUTFBfU1RSSU5HX0xJVEVSQUwoIkF0dGVtcHQgdG8gZGVyZWZlcmVuY2UgbnVsbCBwb2ludGVyIHJldHVybmVkIGJ5IGF1dG9fcHRyOjpnZXQoKSIpLCAgIFwKK19TVExQX1NUUklOR19MSVRFUkFMKCJNZW1vcnkgYWxsb2NhdGlvbiBmdW5jdGlvbiByZXR1cm5lZCBhIHdyb25nbHkgYWxpZ24gbWVtb3J5IGJsb2NrIiksICAgXAorX1NUTFBfU1RSSU5HX0xJVEVSQUwoIlVua25vd24gcHJvYmxlbSIpIFwKKyAgfQorCisjICAgIGlmIChfU1RMUF9TVEFUSUNfVEVNUExBVEVfREFUQSA+IDApCit0ZW1wbGF0ZSA8Y2xhc3MgX0R1bW15PgorY29uc3QgY2hhciogX19zdGxfZGVidWdfZW5naW5lPF9EdW1teT46Ol9NZXNzYWdlX3RhYmxlW19TdGxNc2dfTUFYXSAgX1NUTFBfTUVTU0FHRV9UQUJMRV9CT0RZOworCisjICAgICAgaWYgKGRlZmluZWQgKF9fQ1lHV0lOX18pIHx8IGRlZmluZWQgKF9fTUlOR1czMl9fKSkgJiYgXAorICAgICAgICAgICBkZWZpbmVkIChfU1RMUF9VU0VfRFlOQU1JQ19MSUIpICYmICFkZWZpbmVkIChfX0JVSUxESU5HX1NUTFBPUlQpCisvKgorICogVW5kZXIgY3lnd2luLCB3aGVuIFNUTHBvcnQgaXMgdXNlZCBhcyBhIHNoYXJlZCBsaWJyYXJ5LCB0aGUgaWQgbmVlZHMKKyAqIHRvIGJlIHNwZWNpZmllZCBhcyBpbXBvcnRlZCBvdGhlcndpc2UgdGhleSB3aWxsIGJlIGR1cGxpY2F0ZWQgaW4gdGhlCisgKiBjYWxsaW5nIGV4ZWN1dGFibGUuCisgKi8KK19TVExQX1RFTVBMQVRFX05VTEwKK19TVExQX0RFQ0xTUEVDIGNvbnN0IGNoYXIqIF9fc3RsX2RlYnVnX2VuZ2luZTxib29sPjo6X01lc3NhZ2VfdGFibGVbX1N0bE1zZ19NQVhdOworIyAgICAgIGVuZGlmCisKKyMgICAgZWxzZQorX19ERUNMQVJFX0lOU1RBTkNFKGNvbnN0IGNoYXIqLCBfX3N0bF9kZWJ1Z19lbmdpbmU8Ym9vbD46Ol9NZXNzYWdlX3RhYmxlW19TdGxNc2dfTUFYXSwKKyAgICAgICAgICAgICAgICAgICBfU1RMUF9NRVNTQUdFX1RBQkxFX0JPRFkpOworIyAgICBlbmRpZgorCisjICAgIHVuZGVmIF9TVExQX1NUUklOR19MSVRFUkFMCisjICAgIHVuZGVmIF9TVExQX1BFUkNFTlRfUworCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKK19TVExQX0VORF9OQU1FU1BBQ0UKKworLy8gYWJvcnQoKQorIyAgaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NTVERMSUIKKyMgICAgaW5jbHVkZSA8c3RsL19jc3RkbGliLmg+CisjICBlbmRpZgorCisjICBpZiAhZGVmaW5lZCAoX1NUTFBfREVCVUdfTUVTU0FHRSkKKyMgICAgaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NTVERBUkcKKyMgICAgICBpbmNsdWRlIDxzdGwvX2NzdGRhcmcuaD4KKyMgICAgZW5kaWYKKyMgICAgaWZuZGVmIF9TVExQX0lOVEVSTkFMX0NTVERJTworIyAgICAgIGluY2x1ZGUgPHN0bC9fY3N0ZGlvLmg+CisjICAgIGVuZGlmCisjICAgIGlmIGRlZmluZWQgKF9TVExQX0RFQlVHX01PREVfVEhST1dTKSAmJiAhZGVmaW5lZCAoX1NUTFBfUkFOR0VfRVJST1JTX0gpCisjICAgICAgaW5jbHVkZSA8c3RsL19yYW5nZV9lcnJvcnMuaD4KKyMgICAgZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfRHVtbXk+Cit2b2lkIF9TVExQX0NBTEwKK19fc3RsX2RlYnVnX2VuZ2luZTxfRHVtbXk+OjpfTWVzc2FnZShjb25zdCBjaGFyICogX19mb3JtYXRfc3RyLCAuLi4pIHsKKyAgU1RMUE9SVF9DU1REOjp2YV9saXN0IF9fYXJnczsKKyAgdmFfc3RhcnQoIF9fYXJncywgX19mb3JtYXRfc3RyICk7CisKKyMgICAgICBpZiAhZGVmaW5lZCAoX1NUTFBfREVCVUdfTU9ERV9USFJPV1MpCisjICAgICAgICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfV0lERV9JTlRFUkZBQ0UpCisgIFRDSEFSIF9fYnVmZmVyWzUxMl07CisgIGludCBfY29udmVydCA9IHN0cmxlbihfX2Zvcm1hdF9zdHIpICsgMTsKKyAgTFBXU1RSIF9scHcgPSAoTFBXU1RSKWFsbG9jYShfY29udmVydCAqIHNpemVvZih3Y2hhcl90KSk7CisgIF9scHdbMF0gPSAnXDAnOworICBNdWx0aUJ5dGVUb1dpZGVDaGFyKEdldEFDUCgpLCAwLCBfX2Zvcm1hdF9zdHIsIC0xLCBfbHB3LCBfY29udmVydCk7CisgIHd2c3ByaW50ZihfX2J1ZmZlciwgX2xwdywgX19hcmdzKTsKKyAgX1NUTFBfV0lOQ0VfVFJBQ0UoX19idWZmZXIpOworIyAgICAgICAgZWxpZiBkZWZpbmVkIChfU1RMUF9XSU4zMikgJiYgKGRlZmluZWQoX1NUTFBfTVNWQykgfHwgZGVmaW5lZCAoX19JQ0wpKQorICBjaGFyIF9fYnVmZmVyIFs0MDk2XTsKKworIyAgICAgICAgICBpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX1NBRkVfU1RSSU5HX0ZVTkNUSU9OUykKKyAgdnNucHJpbnRmKF9fYnVmZmVyLCBfU1RMUF9BUlJBWV9TSVpFKF9fYnVmZmVyKSwgX19mb3JtYXRfc3RyLCBfX2FyZ3MpOworIyAgICAgICAgICBlbHNlCisgIHZzbnByaW50Zl9zKF9fYnVmZmVyLCBfU1RMUF9BUlJBWV9TSVpFKF9fYnVmZmVyKSwgX1RSVU5DQVRFLCBfX2Zvcm1hdF9zdHIsIF9fYXJncyk7CisjICAgICAgICAgIGVuZGlmCisKKyAgT3V0cHV0RGVidWdTdHJpbmdBKF9fYnVmZmVyKTsKKworIyAgICAgICAgZWxpZiBkZWZpbmVkIChfX2FtaWdhb3NfXykKKyAgU1RMUE9SVF9DU1REOjp2ZnByaW50ZihzdGRlcnIsIF9fZm9ybWF0X3N0ciwgKGNoYXIgKilfX2FyZ3MpOworIyAgICAgICAgZWxzZQorICBTVExQT1JUX0NTVEQ6OnZmcHJpbnRmKHN0ZGVyciwgX19mb3JtYXRfc3RyLCBfX2FyZ3MpOworIyAgICAgICAgZW5kaWYKKyMgICAgICBlbHNlCisgIGNoYXIgX19idWZmZXJbNDA5Nl07CisKKyMgICAgICAgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9TQUZFX1NUUklOR19GVU5DVElPTlMpCisgIHZzbnByaW50Zl9zKF9fYnVmZmVyLCBfU1RMUF9BUlJBWV9TSVpFKF9fYnVmZmVyKSwgX1RSVU5DQVRFLCBfX2Zvcm1hdF9zdHIsIF9fYXJncyk7CisjICAgICAgICBlbGlmIGRlZmluZWQgKF9TVExQX1dJTjMyKSAmJiAoZGVmaW5lZChfU1RMUF9NU1ZDKSB8fCBkZWZpbmVkIChfX0lDTCkpCisgIHZzbnByaW50ZihfX2J1ZmZlciwgX1NUTFBfQVJSQVlfU0laRShfX2J1ZmZlciksIF9fZm9ybWF0X3N0ciwgX19hcmdzKTsKKyMgICAgICAgIGVsc2UKKyAgdnNwcmludGYoX19idWZmZXIsIF9fZm9ybWF0X3N0ciwgX19hcmdzKTsKKyMgICAgICAgIGVuZGlmCisjICAgICAgZW5kaWYKKworIyAgICAgIGlmZGVmIF9TVExQX0RFQlVHX01FU1NBR0VfUE9TVAorICBfU1RMUF9ERUJVR19NRVNTQUdFX1BPU1QKKyMgICAgICBlbmRpZgorCisgIHZhX2VuZChfX2FyZ3MpOworCisjICAgICAgaWYgZGVmaW5lZCAoX1NUTFBfREVCVUdfTU9ERV9USFJPV1MpCisgIF9fc3RsX3Rocm93X3J1bnRpbWVfZXJyb3IoX19idWZmZXIpOworIyAgICAgIGVuZGlmCit9CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorX1NUTFBfRU5EX05BTUVTUEFDRQorCisjICAgIGVsc2UKK19TVExQX0JFR0lOX05BTUVTUEFDRQorX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQordGVtcGxhdGUgPGNsYXNzIF9EdW1teT4KK3ZvaWQgX1NUTFBfQ0FMTAorX19zdGxfZGVidWdfZW5naW5lPF9EdW1teT46Ol9NZXNzYWdlKGNvbnN0IGNoYXIgKiBfX2Zvcm1hdF9zdHIsIC4uLikKK3t9CitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKK19TVExQX0VORF9OQU1FU1BBQ0UKKyMgICAgZW5kaWYgLyogX1NUTFBfREVCVUdfTUVTU0FHRSAqLworCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9EdW1teT4KK3ZvaWQgX1NUTFBfQ0FMTAorX19zdGxfZGVidWdfZW5naW5lPF9EdW1teT46Ol9JbmRleGVkRXJyb3IoaW50IF9fZXJyb3JfaW5kLCBjb25zdCBjaGFyKiBfX2YsIGludCBfX2wpIHsKKyAgX19zdGxfZGVidWdfbWVzc2FnZShfTWVzc2FnZV90YWJsZVtfU3RsRm9ybWF0X0VSUk9SX1JFVFVSTl0sCisgICAgICAgICAgICAgICAgICAgICAgX19mLCBfX2wsIF9NZXNzYWdlX3RhYmxlW19fZXJyb3JfaW5kXSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfRHVtbXk+Cit2b2lkIF9TVExQX0NBTEwKK19fc3RsX2RlYnVnX2VuZ2luZTxfRHVtbXk+OjpfVmVyYm9zZUFzc2VydChjb25zdCBjaGFyKiBfX2V4cHIsIGludCBfX2Vycm9yX2luZCwgY29uc3QgY2hhciogX19mLCBpbnQgX19sKSB7CisgIF9fc3RsX2RlYnVnX21lc3NhZ2UoX01lc3NhZ2VfdGFibGVbX1N0bEZvcm1hdF9WRVJCT1NFX0FTU0VSVElPTl9GQUlMVVJFXSwKKyAgICAgICAgICAgICAgICAgICAgICBfX2YsIF9fbCwgX01lc3NhZ2VfdGFibGVbX19lcnJvcl9pbmRdLCBfX2YsIF9fbCwgX19leHByKTsKKyAgX19zdGxfZGVidWdfdGVybWluYXRlKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfRHVtbXk+Cit2b2lkIF9TVExQX0NBTEwKK19fc3RsX2RlYnVnX2VuZ2luZTxfRHVtbXk+OjpfQXNzZXJ0KGNvbnN0IGNoYXIqIF9fZXhwciwgY29uc3QgY2hhciogX19mLCBpbnQgX19sKSB7CisgIF9fc3RsX2RlYnVnX21lc3NhZ2UoX01lc3NhZ2VfdGFibGVbX1N0bEZvcm1hdF9BU1NFUlRJT05fRkFJTFVSRV0sX19mLCBfX2wsIF9fZXhwcik7CisgIF9fc3RsX2RlYnVnX3Rlcm1pbmF0ZSgpOworfQorCisvLyBpZiBleGNlcHRpb25zIGFyZSBwcmVzZW50LCBzZW5kcyB1bmlxdWUgZXhjZXB0aW9uCisvLyBpZiBub3QsIGNhbGxzIGFib3J0KCkgdG8gdGVybWluYXRlCit0ZW1wbGF0ZSA8Y2xhc3MgX0R1bW15Pgordm9pZCBfU1RMUF9DQUxMCitfX3N0bF9kZWJ1Z19lbmdpbmU8X0R1bW15Pjo6X1Rlcm1pbmF0ZSgpCit7IF9TVExQX0FCT1JUKCk7IH0KKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyMgIGVuZGlmIC8qIF9TVExQX0FTU0VSVElPTlMgKi8KKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBvd25lZF9saXN0IG5vbi1pbmxpbmUgbWV0aG9kcworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3RlbXBsYXRlIDxjbGFzcyBfRHVtbXk+Cit2b2lkICBfU1RMUF9DQUxMCitfX3N0bF9kZWJ1Z19lbmdpbmU8X0R1bW15Pjo6X0ludmFsaWRhdGVfYWxsKF9fb3duZWRfbGlzdCogX19sKSB7CisgIF9TVExQX0FDUVVJUkVfTE9DSyhfX2wtPl9NX2xvY2spOworICBfU3RhbXBfYWxsKF9fbCwgMCk7CisgIF9fbC0+X01fbm9kZS5fTV9uZXh0ID0wOworICBfU1RMUF9SRUxFQVNFX0xPQ0soX19sLT5fTV9sb2NrKTsKK30KKworLy8gYm9yaXMgOiB0aGlzIGlzIHVuYXNhZmUgcm91dGluZTsgc2hvdWxkIGJlIHVzZWQgZnJvbSB3aXRoaW4gY3JpdGljYWwgc2VjdGlvbiBvbmx5ICEKK3RlbXBsYXRlIDxjbGFzcyBfRHVtbXk+Cit2b2lkICBfU1RMUF9DQUxMCitfX3N0bF9kZWJ1Z19lbmdpbmU8X0R1bW15Pjo6X1N0YW1wX2FsbChfX293bmVkX2xpc3QqIF9fbCwgX19vd25lZF9saXN0KiBfX28pIHsKKyAgLy8gY3J1Y2lhbAorICBpZiAoX19sLT5fTV9ub2RlLl9NX293bmVyKSB7CisgICAgZm9yIChfX293bmVkX2xpbmsqICBfX3BvcyA9IChfX293bmVkX2xpbmsqKV9fbC0+X01fbm9kZS5fTV9uZXh0OworICAgICAgX19wb3MgIT0gMDsgX19wb3MgPSAoX19vd25lZF9saW5rKilfX3Bvcy0+X01fbmV4dCkgeworICAgICAgX1NUTFBfQVNTRVJUKF9fcG9zLT5fT3duZXIoKT09IF9fbCkKKyAgICAgIF9fcG9zLT5fTV9vd25lcj1fX287CisgICAgfQorICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfRHVtbXk+Cit2b2lkICBfU1RMUF9DQUxMCitfX3N0bF9kZWJ1Z19lbmdpbmU8X0R1bW15Pjo6X1ZlcmlmeShjb25zdCBfX293bmVkX2xpc3QqIF9fbCkgeworICBfU1RMUF9BQ1FVSVJFX0xPQ0soX19sLT5fTV9sb2NrKTsKKyAgaWYgKF9fbCkgeworICAgIF9TVExQX0FTU0VSVChfX2wtPl9NX25vZGUuX093bmVyKCkgIT0gMCkKKyAgICBmb3IgKF9fb3duZWRfbGluayogX19wb3MgPSAoX19vd25lZF9saW5rKilfX2wtPl9NX25vZGUuX01fbmV4dDsKKyAgICAgICAgIF9fcG9zICE9IDA7IF9fcG9zID0gKF9fb3duZWRfbGluayopX19wb3MtPl9NX25leHQpIHsKKyAgICAgIF9TVExQX0FTU0VSVChfX3Bvcy0+X093bmVyKCk9PSBfX2wpCisgICAgfQorICB9CisgIF9TVExQX1JFTEVBU0VfTE9DSyhfX2wtPl9NX2xvY2spOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0R1bW15Pgordm9pZCBfU1RMUF9DQUxMCitfX3N0bF9kZWJ1Z19lbmdpbmU8X0R1bW15Pjo6X1N3YXBfb3duZXJzKF9fb3duZWRfbGlzdCYgX194LCBfX293bmVkX2xpc3QmIF9feSkgeworICAvKgorICAgKiAgYWNjb3JkaW5nIHRvIHRoZSBzdGFuZGFyZCA6IC0tbm8gc3dhcCgpIGZ1bmN0aW9uIGludmFsaWRhdGVzIGFueSByZWZlcmVuY2VzLAorICAgKiAgcG9pbnRlcnMsICBvciAgaXRlcmF0b3JzIHJlZmVycmluZyB0byB0aGUgZWxlbWVudHMgb2YgdGhlIGNvbnRhaW5lcnMgYmVpbmcgc3dhcHBlZC4KKyAgICovCisKKyAgX19vd25lZF9saW5rKiBfX3RtcDsKKworICAvKgorICAgKiBib3JpcyA6IHRoZXJlIGlzIGEgZGVhZGxvY2sgcG90ZW50aWFsIHNpdHVhdGlvbiBoZXJlIGlmIHdlIGxvY2sgdHdvIGNvbnRhaW5lcnMgc2VxdWVudGlhbGx5LgorICAgKiBBcyB1c2VyIGlzIHN1cHBvc2VkIHRvIHByb3ZpZGUgaXRzIG93biBzeW5jaHJvbml6YXRpb24gYXJvdW5kIHN3YXAoKSAoIGl0IGlzIHVuc2FmZSB0byBkbyBhbnkgY29udGFpbmVyL2l0ZXJhdG9yIGFjY2VzcworICAgKiBpbiBwYXJhbGxlbCB3aXRoIHN3YXAoKSksIHdlIGp1c3QgZG8gbm90IHVzZSBhbnkgbG9ja2luZyBhdCBhbGwgLS0gdGhhdCBiZWhhdmlvdXIgaXMgY2xvc2VyIHRvIG5vbi1kZWJ1ZyB2ZXJzaW9uCisgICAqLworCisgIF9fdG1wID0gX194Ll9NX25vZGUuX01fbmV4dDsKKworICBfU3RhbXBfYWxsKCZfX3gsICZfX3kpOworICBfU3RhbXBfYWxsKCZfX3ksICZfX3gpOworCisgIF9feC5fTV9ub2RlLl9NX25leHQgPSBfX3kuX01fbm9kZS5fTV9uZXh0OworICBfX3kuX01fbm9kZS5fTV9uZXh0ID0gX190bXA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfRHVtbXk+Cit2b2lkIF9TVExQX0NBTEwKK19fc3RsX2RlYnVnX2VuZ2luZTxfRHVtbXk+OjpfU2V0X293bmVyKF9fb3duZWRfbGlzdCYgX19zcmMsIF9fb3duZWRfbGlzdCYgX19kc3QpIHsKKyAgaWYgKCZfX3NyYyA9PSAmX19kc3QpCisgICAgcmV0dXJuOworCisgIC8vIENoZWNrIF9fc3RsX2RlYnVnX2VuZ2luZTxfRHVtbXk+OjpfU3dhcF9vd25lcnMgY29tbWVudHMgdG8gc2VlIHdoeSB0aGVyZSBpcyBubyBsb2NrIGhlcmUKKyAgdHlwZWRlZiBfX293bmVkX2xpbmsgX0xfdHlwZTsKKyAgX0xfdHlwZSogX19wcmV2ID0gJl9fc3JjLl9NX25vZGU7CisgIF9MX3R5cGUqIF9fcG9zID0gX19wcmV2LT5fTV9uZXh0OworCisgIHdoaWxlIChfX3BvcyAhPSAwKSB7CisgICAgX19wb3MtPl9NX293bmVyID0gJl9fZHN0OworICAgIF9fcHJldiA9IF9fcG9zOworICAgIF9fcG9zID0gX19wcmV2LT5fTV9uZXh0OworICB9CisgIF9fcHJldi0+X01fbmV4dCA9IF9fZHN0Ll9NX25vZGUuX01fbmV4dDsKKyAgX19kc3QuX01fbm9kZS5fTV9uZXh0ID0gX19zcmMuX01fbm9kZS5fTV9uZXh0OworICBfX3NyYy5fTV9ub2RlLl9NX25leHQgPSAwOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0R1bW15Pgordm9pZCBfU1RMUF9DQUxMCitfX3N0bF9kZWJ1Z19lbmdpbmU8X0R1bW15Pjo6X01fZGV0YWNoKF9fb3duZWRfbGlzdCogX19sLCBfX293bmVkX2xpbmsqIF9fY19ub2RlKSB7CisgIGlmIChfX2wgICE9IDApIHsKKworICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKF9fbC0+X093bmVyKCkhPTAsIF9TdGxNc2dfSU5WQUxJRF9DT05UQUlORVIpCisKKyAgICBfU1RMUF9BQ1FVSVJFX0xPQ0soX19sLT5fTV9sb2NrKQorICAgICAgLy8gYm9yaXMgOiByZS10ZXN0IHRoZSBjb25kaXRpb24gaW4gY2FzZSBzb21lb25lIGVsc2UgYWxyZWFkeSBkZWxldGVkIHVzCisgICAgICBpZihfX2Nfbm9kZS0+X01fb3duZXIgIT0gMCkgeworICAgICAgICBfX293bmVkX2xpbmsqIF9fcHJldiwgKl9fbmV4dDsKKworICAgICAgICBmb3IgKF9fcHJldiA9ICZfX2wtPl9NX25vZGU7IChfX25leHQgPSBfX3ByZXYtPl9NX25leHQpICE9IF9fY19ub2RlOworICAgICAgICAgICAgIF9fcHJldiA9IF9fbmV4dCkgeworICAgICAgICAgIF9TVExQX0FTU0VSVChfX25leHQgJiYgX19uZXh0LT5fT3duZXIoKSA9PSBfX2wpCisgICAgICAgICAgICB9CisKKyAgICAgICAgX19wcmV2LT5fTV9uZXh0ID0gX19jX25vZGUtPl9NX25leHQ7CisgICAgICAgIF9fY19ub2RlLT5fTV9vd25lcj0wOworICAgICAgfQorICAgIF9TVExQX1JFTEVBU0VfTE9DSyhfX2wtPl9NX2xvY2spCisgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9EdW1teT4KK3ZvaWQgX1NUTFBfQ0FMTAorX19zdGxfZGVidWdfZW5naW5lPF9EdW1teT46Ol9NX2F0dGFjaChfX293bmVkX2xpc3QqIF9fbCwgX19vd25lZF9saW5rKiBfX2Nfbm9kZSkgeworICBpZiAoX19sID09MCkgeworICAgIChfX2Nfbm9kZSktPl9NX293bmVyID0gMDsKKyAgfSBlbHNlIHsKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVChfX2wtPl9Pd25lcigpIT0wLCBfU3RsTXNnX0lOVkFMSURfQ09OVEFJTkVSKQorICAgIF9TVExQX0FDUVVJUkVfTE9DSyhfX2wtPl9NX2xvY2spCisgICAgX19jX25vZGUtPl9NX293bmVyID0gX19sOworICAgIF9fY19ub2RlLT5fTV9uZXh0ID0gX19sLT5fTV9ub2RlLl9NX25leHQ7CisgICAgX19sLT5fTV9ub2RlLl9NX25leHQgPSBfX2Nfbm9kZTsKKyAgICBfU1RMUF9SRUxFQVNFX0xPQ0soX19sLT5fTV9sb2NrKQorICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfRHVtbXk+Cit2b2lkKiBfU1RMUF9DQUxMCitfX3N0bF9kZWJ1Z19lbmdpbmU8X0R1bW15Pjo6X0dldF9jb250YWluZXJfcHRyKGNvbnN0IF9fb3duZWRfbGluayogX19sKSB7CisgIGNvbnN0IF9fb3duZWRfbGlzdCogX19vd25lciAgICA9IF9fbC0+X093bmVyKCk7CisgIF9TVExQX1ZFUkJPU0VfUkVUVVJOXzAoX19vd25lciAhPSAwLCBfU3RsTXNnX0lOVkFMSURfSVRFUkFUT1IpCisgIHZvaWQqIF9fcmV0ID0gX19DT05TVF9DQVNUKHZvaWQqLF9fb3duZXItPl9Pd25lcigpKTsKKyAgX1NUTFBfVkVSQk9TRV9SRVRVUk5fMChfX3JldCAhPTAsIF9TdGxNc2dfSU5WQUxJRF9DT05UQUlORVIpCisgIHJldHVybiBfX3JldDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9EdW1teT4KK2Jvb2wgX1NUTFBfQ0FMTAorX19zdGxfZGVidWdfZW5naW5lPF9EdW1teT46Ol9DaGVja19zYW1lX293bmVyKGNvbnN0IF9fb3duZWRfbGluayYgX19pMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX293bmVkX2xpbmsmIF9faTIpIHsKKyAgX1NUTFBfVkVSQk9TRV9SRVRVUk4oX19pMS5fVmFsaWQoKSwgX1N0bE1zZ19JTlZBTElEX0xFRlRIQU5EX0lURVJBVE9SKQorICBfU1RMUF9WRVJCT1NFX1JFVFVSTihfX2kyLl9WYWxpZCgpLCBfU3RsTXNnX0lOVkFMSURfUklHSFRIQU5EX0lURVJBVE9SKQorICBfU1RMUF9WRVJCT1NFX1JFVFVSTigoX19pMS5fT3duZXIoKSA9PSBfX2kyLl9Pd25lcigpKSwgX1N0bE1zZ19ESUZGRVJFTlRfT1dORVJTKQorICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9EdW1teT4KK2Jvb2wgX1NUTFBfQ0FMTAorX19zdGxfZGVidWdfZW5naW5lPF9EdW1teT46Ol9DaGVja19zYW1lX29yX251bGxfb3duZXIoY29uc3QgX19vd25lZF9saW5rJiBfX2kxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19vd25lZF9saW5rJiBfX2kyKSB7CisgIF9TVExQX1ZFUkJPU0VfUkVUVVJOKF9faTEuX093bmVyKCkgPT0gX19pMi5fT3duZXIoKSwgX1N0bE1zZ19ESUZGRVJFTlRfT1dORVJTKQorICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9EdW1teT4KK2Jvb2wgX1NUTFBfQ0FMTAorX19zdGxfZGVidWdfZW5naW5lPF9EdW1teT46Ol9DaGVja19pZl9vd25lciggY29uc3QgX19vd25lZF9saXN0ICogX19sLCBjb25zdCBfX293bmVkX2xpbmsmIF9faXQpIHsKKyAgY29uc3QgX19vd25lZF9saXN0KiBfX293bmVyX3B0ciA9IF9faXQuX093bmVyKCk7CisgIF9TVExQX1ZFUkJPU0VfUkVUVVJOKF9fb3duZXJfcHRyICE9IDAsIF9TdGxNc2dfSU5WQUxJRF9JVEVSQVRPUikKKyAgX1NUTFBfVkVSQk9TRV9SRVRVUk4oX19sID09IF9fb3duZXJfcHRyLCBfU3RsTXNnX05PVF9PV05FUikKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfRHVtbXk+Citib29sIF9TVExQX0NBTEwKK19fc3RsX2RlYnVnX2VuZ2luZTxfRHVtbXk+OjpfQ2hlY2tfaWZfbm90X293bmVyKCBjb25zdCBfX293bmVkX2xpc3QgKiBfX2wsIGNvbnN0IF9fb3duZWRfbGluayYgX19pdCkgeworICBjb25zdCBfX293bmVkX2xpc3QqIF9fb3duZXJfcHRyID0gX19pdC5fT3duZXIoKTsKKyAgX1NUTFBfVkVSQk9TRV9SRVRVUk4oX19vd25lcl9wdHIgIT0gMCwgX1N0bE1zZ19JTlZBTElEX0lURVJBVE9SKQorICBfU1RMUF9WRVJCT1NFX1JFVFVSTihfX2wgIT0gX19vd25lcl9wdHIsIF9TdGxNc2dfU0hPVUxEX05PVF9PV05FUikKKyAgcmV0dXJuIHRydWU7Cit9CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorX1NUTFBfRU5EX05BTUVTUEFDRQorCisjICBlbmRpZiAvKiBfU1RMUF9ERUJVRyAqLworCisjZW5kaWYgLyogaWYgZGVmaW5lZCAoRVhQT1NFX0dMT0JBTFNfSU1QTEVNRU5UQVRJT04pICovCisKKyNlbmRpZiAvKiBoZWFkZXIgZ3VhcmQgKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9kZWJ1Zy9fZGVidWcuaCBiL3N0bC9kZWJ1Zy9fZGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGU2MjE4Ci0tLSAvZGV2L251bGwKKysrIGIvc3RsL2RlYnVnL19kZWJ1Zy5oCkBAIC0wLDAgKzEsNDYwIEBACisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfREVCVUdfSAorI2RlZmluZSBfU1RMUF9ERUJVR19ICisKKyNpZiBkZWZpbmVkIChfU1RMUF9BU1NFUlRJT05TKSB8fCBkZWZpbmVkIChfU1RMUF9ERUJVRykKKworIyAgaWZuZGVmIF9TVExQX1RZUEVfVFJBSVRTX0gKKyMgICAgaW5jbHVkZSA8c3RsL3R5cGVfdHJhaXRzLmg+CisjICBlbmRpZgorCisjICBpZiAhZGVmaW5lZCAoX1NUTFBfRVhUUkFfT1BFUkFUT1JTX0ZPUl9ERUJVRykgJiYgXAorICAgICAgKGRlZmluZWQgKF9TVExQX0JBU0VfTUFUQ0hfQlVHKSB8fCAoZGVmaW5lZCAoX1NUTFBfTVNWQykgJiYgX1NUTFBfTVNWQyA8IDExMDApKQorIyAgICBkZWZpbmUgX1NUTFBfRVhUUkFfT1BFUkFUT1JTX0ZPUl9ERUJVRworIyAgZW5kaWYKKworIyAgaWYgIWRlZmluZWQgKF9TVExQX0ZJTEVfXykKKyMgICAgZGVmaW5lIF9TVExQX0ZJTEVfXyBfX0ZJTEVfXworIyAgZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKworZW51bSB7CisgIC8vR2VuZXJhbCBlcnJvcnMKKyAgX1N0bEZvcm1hdF9FUlJPUl9SRVRVUk4sCisgIF9TdGxGb3JtYXRfQVNTRVJUSU9OX0ZBSUxVUkUsCisgIF9TdGxGb3JtYXRfVkVSQk9TRV9BU1NFUlRJT05fRkFJTFVSRSwKKyAgX1N0bE1zZ19JTlZBTElEX0FSR1VNRU5ULAorICAvL0NvbnRhaW5lci9JdGVyYXRvciByZWxhdGVkIGVycm9ycworICBfU3RsTXNnX0lOVkFMSURfQ09OVEFJTkVSLAorICBfU3RsTXNnX0VNUFRZX0NPTlRBSU5FUiwKKyAgX1N0bE1zZ19FUkFTRV9QQVNUX1RIRV9FTkQsCisgIF9TdGxNc2dfT1VUX09GX0JPVU5EUywKKyAgX1N0bE1zZ19OT1RfT1dORVIsCisgIF9TdGxNc2dfU0hPVUxEX05PVF9PV05FUiwKKyAgX1N0bE1zZ19JTlZBTElEX0lURVJBVE9SLAorICBfU3RsTXNnX0lOVkFMSURfTEVGVEhBTkRfSVRFUkFUT1IsCisgIF9TdGxNc2dfSU5WQUxJRF9SSUdIVEhBTkRfSVRFUkFUT1IsCisgIF9TdGxNc2dfRElGRkVSRU5UX09XTkVSUyAgICAgLAorICBfU3RsTXNnX05PVF9ERVJFRkVSRU5DRUFCTEUgICwKKyAgX1N0bE1zZ19JTlZBTElEX1JBTkdFICAgICAgICAsCisgIF9TdGxNc2dfTk9UX0lOX1JBTkdFXzEgICAgICAgLAorICBfU3RsTXNnX05PVF9JTl9SQU5HRV8yICAgICAgICwKKyAgX1N0bE1zZ19JTlZBTElEX0FEVkFOQ0UgICAgICAsCisgIF9TdGxNc2dfU0lOR1VMQVJfSVRFUkFUT1IgICAgLAorICAvL0JhZCBwcmVkaWNhdGUgZm9yIHNvcnRpbmcKKyAgX1N0bE1zZ19JTlZBTElEX1NUUklDVF9XRUFLX1BSRURJQ0FURSwKKyAgX1N0bE1zZ19JTlZBTElEX0VRVUlWQUxFTlRfUFJFRElDQVRFLAorICAvLyBkZWJ1ZyBhbGxvYyBtZXNzYWdlcworICBfU3RsTXNnX0RCQV9ERUxFVEVEX1RXSUNFICAgICwKKyAgX1N0bE1zZ19EQkFfTkVWRVJfQUxMT0NBVEVEICAsCisgIF9TdGxNc2dfREJBX1RZUEVfTUlTTUFUQ0ggICAgLAorICBfU3RsTXNnX0RCQV9TSVpFX01JU01BVENIICAgICwKKyAgX1N0bE1zZ19EQkFfVU5ERVJSVU4gICAgICAgICAsCisgIF9TdGxNc2dfREJBX09WRVJSVU4gICAgICAgICAgLAorICAvLyBhdXRvX3B0ciBtZXNzYWdlcworICBfU3RsTXNnX0FVVE9fUFRSX05VTEwgICAgLAorICAvL01lbW9yeSBhbGlnbmVudCBtZXNzYWdlCisgIF9TdGxNc2dfV1JPTkdfTUVNT1JZX0FMSUdOTUVOVCwKKyAgX1N0bE1zZ19VTktOT1dOCisgIC8qIF9TdGxNc2dfTUFYICovCit9OworCisvKiBoYXZlIHRvIGhhcmRjb2RlIHRoYXQgOygpICovCisjICBkZWZpbmUgX1N0bE1zZ19NQVggMzEKKworLy8gVGhpcyBjbGFzcyBpcyB1bmlxdWUgKG5vdCBpbmhlcml0ZWQgZnJvbSBleGNlcHRpb24pLAorLy8gdG8gZGlzYWxsb3cgY2F0Y2ggaW4gYW55dGhpbmcgYnV0ICguLi4pCitzdHJ1Y3QgX19zdGxfZGVidWdfZXhjZXB0aW9uIHsKKyAgLy8gbm8gbWVtYmVycworfTsKKworY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgX19vd25lZF9saW5rOworY2xhc3MgX1NUTFBfQ0xBU1NfREVDTFNQRUMgX19vd25lZF9saXN0OworCisjaWYgZGVmaW5lZCAoX1NUTFBfREVCVUdfTU9ERV9USFJPV1MpCisjICBkZWZpbmUgX1NUTFBfTUVTU0FHRV9OT1JFVFVSTiBfU1RMUF9GVU5DVElPTl9USFJPV1MKKyNlbHNlCisjICBkZWZpbmUgX1NUTFBfTUVTU0FHRV9OT1JFVFVSTgorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfRHVtbXk+CitzdHJ1Y3QgX19zdGxfZGVidWdfZW5naW5lIHsKKworICAvLyBCYXNpYyByb3V0aW5lIHRvIHJlcG9ydCBhbnkgZGVidWcgbWVzc2FnZQorICAvLyBVc2UgX1NUTFBfREVCVUdfTUVTU0FHRSB0byBvdmVycmlkZQorICBzdGF0aWMgdm9pZCBfU1RMUF9NRVNTQUdFX05PUkVUVVJOIF9TVExQX0NBTEwgX01lc3NhZ2UoY29uc3QgY2hhciAqIGZvcm1hdF9zdHIsIC4uLik7CisKKyAgLy8gTWljc2VsbGFub3VzIGZ1bmN0aW9uIHRvIHJlcG9ydCBpbmRleGVkIGVycm9yIG1lc3NhZ2UKKyAgc3RhdGljIHZvaWQgX1NUTFBfQ0FMTCAgX0luZGV4ZWRFcnJvcihpbnQgX19pbmQsIGNvbnN0IGNoYXIqIF9fZiwgaW50IF9fbCk7CisKKyAgLy8gQmFzaWMgYXNzZXJ0aW9uIHJlcG9ydCBtZWNoYW5pc20uCisgIC8vIFJlcG9ydHMgZmFpbGVkIGFzc2VydGlvbiB2aWEgX19zdGxfZGVidWdfbWVzc2FnZSBhbmQgY2FsbHMgX1Rlcm1pbmF0ZQorICAvLyBpZiBfU1RMUF9ERUJVR19URVJNSU5BVEUgaXMgc3BlY2lmaWVkLCBjYWxscyBfX3N0bF9kZWJ1Z190ZXJtaW5hdGUgaW5zdGVhZAorICBzdGF0aWMgdm9pZCBfU1RMUF9DQUxMICBfQXNzZXJ0KGNvbnN0IGNoYXIqIF9fZXhwciwgY29uc3QgY2hhciogX19mLCBpbnQgX19sKTsKKworICAvLyBUaGUgc2FtZSwgd2l0aCBhZGRpdGlvbmFsIGRpYWdub3N0aWNzCisgIHN0YXRpYyB2b2lkIF9TVExQX0NBTEwgIF9WZXJib3NlQXNzZXJ0KGNvbnN0IGNoYXIqIF9fZXhwciwgaW50IF9fZXJyb3JfaW5kLCBjb25zdCBjaGFyKiBfX2YsIGludCBfX2wpOworCisgIC8vIElmIGV4Y2VwdGlvbnMgYXJlIHByZXNlbnQsIHNlbmRzIHVuaXF1ZSBleGNlcHRpb24KKyAgLy8gSWYgbm90LCBjYWxscyBfU1RMUF9BQk9SVCgpIHRvIHRlcm1pbmF0ZQorICAvLyBVc2UgX1NUTFBfREVCVUdfVEVSTUlOQVRFIHRvIG92ZXJyaWRlCisgIHN0YXRpYyB2b2lkIF9TVExQX0NBTEwgIF9UZXJtaW5hdGUoKTsKKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpCisgIC8vIG93bmVkX2xpc3QvbGluayBkZWxlZ2F0ZSBub24taW5saW5lIGZ1bmN0aW9ucyBoZXJlCisKKyAgc3RhdGljIGJvb2wgX1NUTFBfQ0FMTCAgX0NoZWNrX3NhbWVfb3duZXIoIGNvbnN0IF9fb3duZWRfbGluayYgX19pMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fb3duZWRfbGluayYgX19pMik7CisgIHN0YXRpYyBib29sIF9TVExQX0NBTEwgIF9DaGVja19zYW1lX29yX251bGxfb3duZXIoIGNvbnN0IF9fb3duZWRfbGluayYgX19pMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19vd25lZF9saW5rJiBfX2kyKTsKKyAgc3RhdGljIGJvb2wgX1NUTFBfQ0FMTCAgX0NoZWNrX2lmX293bmVyKCBjb25zdCBfX293bmVkX2xpc3QqLCBjb25zdCBfX293bmVkX2xpbmsmKTsKKworICBzdGF0aWMgYm9vbCBfU1RMUF9DQUxMICBfQ2hlY2tfaWZfbm90X293bmVyKCBjb25zdCBfX293bmVkX2xpc3QqLCBjb25zdCBfX293bmVkX2xpbmsmKTsKKworICBzdGF0aWMgdm9pZCBfU1RMUF9DQUxMICBfVmVyaWZ5KGNvbnN0IF9fb3duZWRfbGlzdCopOworCisgIHN0YXRpYyB2b2lkIF9TVExQX0NBTEwgIF9Td2FwX293bmVycyhfX293bmVkX2xpc3QmLCBfX293bmVkX2xpc3QmKTsKKworICBzdGF0aWMgdm9pZCBfU1RMUF9DQUxMICBfSW52YWxpZGF0ZV9hbGwoX19vd25lZF9saXN0Kik7CisKKyAgc3RhdGljIHZvaWQgX1NUTFBfQ0FMTCAgX1NldF9vd25lcihfX293bmVkX2xpc3QmIC8qc3JjKi8sIF9fb3duZWRfbGlzdCYgLypkc3QqLyk7CisKKyAgc3RhdGljIHZvaWQgX1NUTFBfQ0FMTCAgX1N0YW1wX2FsbChfX293bmVkX2xpc3QqLCBfX293bmVkX2xpc3QqKTsKKworICBzdGF0aWMgdm9pZCBfU1RMUF9DQUxMICBfTV9kZXRhY2goX19vd25lZF9saXN0KiwgX19vd25lZF9saW5rKik7CisKKyAgc3RhdGljIHZvaWQgX1NUTFBfQ0FMTCAgX01fYXR0YWNoKF9fb3duZWRfbGlzdCosIF9fb3duZWRfbGluayopOworCisgIC8vIGFjY2Vzc29yIDogY2hlY2sgYW5kIGdldCBwb2ludGVyIHRvIHRoZSBjb250YWluZXIKKyAgc3RhdGljIHZvaWQqIF9TVExQX0NBTEwgIF9HZXRfY29udGFpbmVyX3B0cihjb25zdCBfX293bmVkX2xpbmsqKTsKKyMgIGVuZGlmCisKKyAgLy8gZGVidWcgbWVzc2FnZXMgYW5kIGZvcm1hdHMKKyAgc3RhdGljIF9TVExQX1NUQVRJQ19NRU1CRVJfREVDTFNQRUMgY29uc3QgY2hhciogX01lc3NhZ2VfdGFibGVbX1N0bE1zZ19NQVhdOworfTsKKworI3VuZGVmIF9TVExQX01FU1NBR0VfTk9SRVRVUk4KKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCkKK19TVExQX0VYUE9SVF9URU1QTEFURSBzdHJ1Y3QgX1NUTFBfQ0xBU1NfREVDTFNQRUMgX19zdGxfZGVidWdfZW5naW5lPGJvb2w+OworIyAgZW5kaWYgLyogX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCAqLworCit0eXBlZGVmIF9fc3RsX2RlYnVnX2VuZ2luZTxib29sPiBfX3N0bF9kZWJ1Z2dlcjsKKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworIyAgaWYgIWRlZmluZWQgKF9TVExQX0FTU0VSVCkKKyMgICAgZGVmaW5lIF9TVExQX0FTU0VSVChleHByKSBcCisgICAgICAgaWYgKCEoZXhwcikpIHsgX1NUTFBfUFJJViBfX3N0bF9kZWJ1Z2dlcjo6X0Fzc2VydCggIyBleHByLCBfU1RMUF9GSUxFX18sIF9fTElORV9fKTsgfQorIyAgZW5kaWYKKworI2VuZGlmIC8qIF9TVExQX0FTU0VSVElPTlMgfHwgX1NUTFBfREVCVUcgKi8KKworLy8gdGhpcyBzZWN0aW9uIGlzIGZvciBfU1RMUF9ERUJVRyBvbmx5CisjaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpCisKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9WRVJCT1NFX0FTU0VSVCkKKy8vIGZicCA6IG5ldyBmb3JtIG5vdCByZXF1aXJpbmcgIjsiCisjICAgIGRlZmluZSBfU1RMUF9WRVJCT1NFX0FTU0VSVChleHByLCBfX2RpYWdfbnVtKSBcCisgICAgICAgaWYgKCEoZXhwcikpIHsgX1NUTFBfUFJJViBfX3N0bF9kZWJ1Z2dlcjo6X1ZlcmJvc2VBc3NlcnRcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAjIGV4cHIsICBfU1RMUF9QUklWIF9fZGlhZ19udW0sIF9TVExQX0ZJTEVfXywgX19MSU5FX18gKTsgXAorICAgICAgICAgIH0KKyMgIGVuZGlmCisKKyMgIGRlZmluZSBfU1RMUF9ERUJVR19DSEVDSyhleHByKSBfU1RMUF9BU1NFUlQoZXhwcikKKyMgIGRlZmluZSBfU1RMUF9ERUJVR19ETyhleHByKSAgICBleHByOworCisjICBpZiAoX1NUTFBfREVCVUdfTEVWRUwgPT0gX1NUTFBfU1RBTkRBUkRfREJHX0xFVkVMKQorIyAgICBkZWZpbmUgX1NUTFBfU1REX0RFQlVHX0NIRUNLKGV4cHIpIF9TVExQX0RFQlVHX0NIRUNLKGV4cHIpCisjICAgIGRlZmluZSBfU1RMUF9TVERfREVCVUdfRE8oZXhwcikgX1NUTFBfREVCVUdfRE8oZXhwcikKKyMgIGVsc2UKKyMgICAgZGVmaW5lIF9TVExQX1NURF9ERUJVR19DSEVDSyhleHByKQorIyAgICBkZWZpbmUgX1NUTFBfU1REX0RFQlVHX0RPKGV4cHIpCisjICBlbmRpZgorCisjICBpZiAhZGVmaW5lZCAoX1NUTFBfVkVSQk9TRV9SRVRVUk4pCisjICAgIGRlZmluZSBfU1RMUF9WRVJCT1NFX1JFVFVSTihfX2V4cHIsX19kaWFnX251bSkgaWYgKCEoX19leHByKSkgeyBcCisgICAgICAgICBfU1RMUF9QUklWIF9fc3RsX2RlYnVnZ2VyOjpfSW5kZXhlZEVycm9yKF9fZGlhZ19udW0sIF9TVExQX0ZJTEVfXyAsIF9fTElORV9fKTsgXAorICAgICAgICAgcmV0dXJuIGZhbHNlOyB9CisjICBlbmRpZgorCisjICBpZiAhZGVmaW5lZCAoX1NUTFBfVkVSQk9TRV9SRVRVUk5fMCkKKyMgICAgZGVmaW5lIF9TVExQX1ZFUkJPU0VfUkVUVVJOXzAoX19leHByLF9fZGlhZ19udW0pIGlmICghKF9fZXhwcikpIHsgXAorICAgICAgICAgX1NUTFBfUFJJViBfX3N0bF9kZWJ1Z2dlcjo6X0luZGV4ZWRFcnJvcihfX2RpYWdfbnVtLCBfU1RMUF9GSUxFX18sIF9fTElORV9fKTsgXAorICAgICAgICAgcmV0dXJuIDA7IH0KKyMgIGVuZGlmCisKKyMgIGlmbmRlZiBfU1RMUF9JTlRFUk5BTF9USFJFQURTX0gKKyMgICAgaW5jbHVkZSA8c3RsL190aHJlYWRzLmg+CisjICBlbmRpZgorCisjICBpZm5kZWYgX1NUTFBfSU5URVJOQUxfSVRFUkFUT1JfQkFTRV9ICisjICAgIGluY2x1ZGUgPHN0bC9faXRlcmF0b3JfYmFzZS5oPgorIyAgZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKworLyoKKyAqIFNwZWNpYWwgZGVidWcgaXRlcmF0b3IgdHJhaXRzIGhhdmluZyBhbiBhZGRpdGlvbm5hbCBzdGF0aWMgbWVtYmVyCisgKiBtZXRob2QgX0NoZWNrLiBJdCBpcyB1c2VkIGJ5IHRoZSBzbGl0IGRlYnVnIGltcGxlbWVudGF0aW9uIHRvIGNoZWNrCisgKiB0aGUgc3BlY2lhbCBiZWZvcmVfYmVnaW4gaXRlcmF0b3IuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBfVHJhaXRzPgorc3RydWN0IF9EYmdUcmFpdHMgOiBfVHJhaXRzIHsKKyAgdHlwZWRlZiBfRGJnVHJhaXRzPHR5cGVuYW1lIF9UcmFpdHM6Ol9Db25zdFRyYWl0cz4gX0NvbnN0VHJhaXRzOworICB0eXBlZGVmIF9EYmdUcmFpdHM8dHlwZW5hbWUgX1RyYWl0czo6X05vbkNvbnN0VHJhaXRzPiBfTm9uQ29uc3RUcmFpdHM7CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcj4KKyAgc3RhdGljIGJvb2wgX0NoZWNrKGNvbnN0IF9JdGVyYXRvciYpIHtyZXR1cm4gdHJ1ZTt9Cit9OworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3RlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+CitpbmxpbmUgYm9vbCAgX1NUTFBfQ0FMTCBfX3ZhbGlkX3JhbmdlKGNvbnN0IF9JdGVyYXRvciYgX19pMSAsY29uc3QgX0l0ZXJhdG9yJiBfX2kyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyYpCit7IHJldHVybiAoX19pMSA8IF9faTIpIHx8IChfX2kxID09IF9faTIpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+CitpbmxpbmUgYm9vbCAgX1NUTFBfQ0FMTCBfX3ZhbGlkX3JhbmdlKGNvbnN0IF9JdGVyYXRvciYgX19pMSAsY29uc3QgX0l0ZXJhdG9yJiBfX2kyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZyYpIHsKKyAgLy8gY2hlY2sgaWYgY29tcGFyYWJsZQorICBib29sIF9fZHVtbXkoX19pMT09X19pMik7CisgIHJldHVybiAoX19kdW1teT09X19kdW1teSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+CitpbmxpbmUgYm9vbCAgX1NUTFBfQ0FMTCBfX3ZhbGlkX3JhbmdlKGNvbnN0IF9JdGVyYXRvciYgX19pMSAsY29uc3QgX0l0ZXJhdG9yJiBfX2kyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3J3YXJkX2l0ZXJhdG9yX3RhZyYpIHsKKyAgLy8gY2hlY2sgaWYgY29tcGFyYWJsZQorICBib29sIF9fZHVtbXkoX19pMT09X19pMik7CisgIHJldHVybiAoX19kdW1teT09X19kdW1teSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+CitpbmxpbmUgYm9vbCAgX1NUTFBfQ0FMTCBfX3ZhbGlkX3JhbmdlKGNvbnN0IF9JdGVyYXRvciYsY29uc3QgX0l0ZXJhdG9yJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5wdXRfaXRlcmF0b3JfdGFnJikKK3sgcmV0dXJuIHRydWU7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcj4KK2lubGluZSBib29sICBfU1RMUF9DQUxMIF9fdmFsaWRfcmFuZ2UoY29uc3QgX0l0ZXJhdG9yJixjb25zdCBfSXRlcmF0b3ImLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvdXRwdXRfaXRlcmF0b3JfdGFnJikKK3sgcmV0dXJuIHRydWU7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcj4KK2lubGluZSBib29sIF9TVExQX0NBTEwgX192YWxpZF9yYW5nZShjb25zdCBfSXRlcmF0b3ImIF9faTEsIGNvbnN0IF9JdGVyYXRvciYgX19pMikKK3sgcmV0dXJuIF9fdmFsaWRfcmFuZ2UoX19pMSxfX2kyLF9TVExQX0lURVJBVE9SX0NBVEVHT1JZKF9faTEsIF9JdGVyYXRvcikpOyB9CisKKy8vIE5vdGUgOiB0aGF0IG1lYW5zIGluIHJhbmdlIFtpMSwgaTJdLgordGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcj4KK2lubGluZSBib29sICBfU1RMUF9DQUxMIF9faW5fcmFuZ2UoY29uc3QgX0l0ZXJhdG9yJiBfSXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9JdGVyYXRvciYgX19pMSwgY29uc3QgX0l0ZXJhdG9yJiBfX2kyKQoreyByZXR1cm4gX192YWxpZF9yYW5nZShfX2kxLF9JdCkgJiYgX192YWxpZF9yYW5nZShfSXQsX19pMik7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcj4KK2lubGluZSBib29sICBfU1RMUF9DQUxMIF9faW5fcmFuZ2UoY29uc3QgX0l0ZXJhdG9yJiBfX2ZpcnN0LCBjb25zdCBfSXRlcmF0b3ImIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0l0ZXJhdG9yJiBfX3N0YXJ0LCBjb25zdCBfSXRlcmF0b3ImIF9fZmluaXNoKQoreyByZXR1cm4gX192YWxpZF9yYW5nZShfX2ZpcnN0LF9fbGFzdCkgJiYgX192YWxpZF9yYW5nZShfX3N0YXJ0LF9fZmlyc3QpICYmIF9fdmFsaWRfcmFuZ2UoX19sYXN0LF9fZmluaXNoKTsgfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK2NsYXNzIF9TVExQX0NMQVNTX0RFQ0xTUEVDIF9fb3duZWRfbGluayB7CitwdWJsaWM6CisgIF9fb3duZWRfbGluaygpIDogX01fb3duZXIoMCkge30KKyAgX19vd25lZF9saW5rKGNvbnN0IF9fb3duZWRfbGlzdCogX19jKSA6IF9NX293bmVyKDApLCBfTV9uZXh0KDApCisgIHsgX19zdGxfZGVidWdnZXI6Ol9NX2F0dGFjaChfX0NPTlNUX0NBU1QoX19vd25lZF9saXN0KixfX2MpLCB0aGlzKTsgfQorICBfX293bmVkX2xpbmsoY29uc3QgX19vd25lZF9saW5rJiBfX3Jocyk6IF9NX293bmVyKDApCisgIHsgX19zdGxfZGVidWdnZXI6Ol9NX2F0dGFjaChfX0NPTlNUX0NBU1QoX19vd25lZF9saXN0KixfX3Jocy5fTV9vd25lciksIHRoaXMpOyB9CisgIF9fb3duZWRfbGluayYgb3BlcmF0b3I9KGNvbnN0IF9fb3duZWRfbGluayYgX19yaHMpIHsKKyAgICBfX293bmVkX2xpc3QqIF9fbmV3X293bmVyID0gX19DT05TVF9DQVNUKF9fb3duZWRfbGlzdCosX19yaHMuX01fb3duZXIpOworICAgIF9fb3duZWRfbGlzdCogX19vbGRfb3duZXIgPSBfTV9vd25lcjsKKyAgICBpZiAoIF9fb2xkX293bmVyICE9IF9fbmV3X293bmVyICkgeworICAgICAgX19zdGxfZGVidWdnZXI6Ol9NX2RldGFjaChfX29sZF9vd25lciwgdGhpcyk7CisgICAgICBfX3N0bF9kZWJ1Z2dlcjo6X01fYXR0YWNoKF9fbmV3X293bmVyLCB0aGlzKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIH5fX293bmVkX2xpbmsoKSB7CisgICAgX19zdGxfZGVidWdnZXI6Ol9NX2RldGFjaChfTV9vd25lciwgdGhpcyk7CisgICAgX0ludmFsaWRhdGUoKTsKKyAgfQorCisgIGNvbnN0IF9fb3duZWRfbGlzdCogX093bmVyKCkgY29uc3QgeyByZXR1cm4gX01fb3duZXI7IH0KKyAgX19vd25lZF9saXN0KiBfT3duZXIoKSB7IHJldHVybiBfTV9vd25lcjsgfQorICB2b2lkIF9TZXRfb3duZXIoY29uc3QgX19vd25lZF9saXN0KiBfX28pIHsgX01fb3duZXI9IF9fQ09OU1RfQ0FTVChfX293bmVkX2xpc3QqLF9fbyk7IH0KKyAgYm9vbCBfVmFsaWQoKSBjb25zdCB7IHJldHVybiBfTV9vd25lciAhPSAwOyB9CisgIHZvaWQgX0ludmFsaWRhdGUoKSB7IF9NX293bmVyID0gMDsgX01fbmV4dCA9IDA7IH0KKyAgdm9pZCBfTGlua190b19zZWxmKCkgeyBfTV9uZXh0ID0gMDsgfQorCisgIF9fb3duZWRfbGluayogX05leHQoKSB7IHJldHVybiBfTV9uZXh0OyB9CisgIGNvbnN0IF9fb3duZWRfbGluayogX05leHQoKSBjb25zdCB7IHJldHVybiBfTV9uZXh0OyB9CisKK3B1YmxpYzoKKyAgX19vd25lZF9saXN0KiBfTV9vd25lcjsKKyAgX19vd25lZF9saW5rKiBfTV9uZXh0OworfTsKKworCitjbGFzcyBfU1RMUF9DTEFTU19ERUNMU1BFQyBfX293bmVkX2xpc3QgeworcHVibGljOgorICBfX293bmVkX2xpc3Qodm9pZCogX19vKSB7CisgICAgLy8gICAgZnByaW50ZihzdGRlcnIsICJfX293bmVkX2xpc3QoKTogJXBcbiIsKHZvaWQqKXRoaXMpOworICAgIF9NX25vZGUuX01fb3duZXIgPSBfX1JFSU5URVJQUkVUX0NBU1QoX19vd25lZF9saXN0KixfX28pOworICAgIF9NX25vZGUuX01fbmV4dCA9IDA7CisgIH0KKyAgfl9fb3duZWRfbGlzdCgpIHsKKyAgICAvLyAgICBmcHJpbnRmKHN0ZGVyciwgIn5fX293bmVkX2xpc3QoKTogJXBcbiIsKHZvaWQqKXRoaXMpOworICAgIF9JbnZhbGlkYXRlX2FsbCgpOworICAgIC8vIHRoYXQgcHJldmVudHMgZGV0YWNoCisgICAgX01fbm9kZS5fSW52YWxpZGF0ZSgpOworICB9CisgIGNvbnN0IHZvaWQqIF9Pd25lcigpIGNvbnN0IHsgcmV0dXJuIChjb25zdCB2b2lkKilfTV9ub2RlLl9NX293bmVyOyB9CisgIHZvaWQqIF9Pd25lcigpIHsgcmV0dXJuICh2b2lkKilfTV9ub2RlLl9NX293bmVyOyB9CisgIGJvb2wgIF9WYWxpZCgpIGNvbnN0IHsgcmV0dXJuIF9NX25vZGUuX01fb3duZXIgIT0gMDsgfQorICB2b2lkIF9JbnZhbGlkYXRlKCkgeyBfTV9ub2RlLl9NX293bmVyID0gMDsgfQorCisgIF9fb3duZWRfbGluayogX0ZpcnN0KCkgeyByZXR1cm4gX01fbm9kZS5fTmV4dCgpOyB9CisgIF9fb3duZWRfbGluayogX0xhc3QoKSB7IHJldHVybiAwIDsgfQorCisgIGNvbnN0IF9fb3duZWRfbGluayogX0ZpcnN0KCkgY29uc3QgeyByZXR1cm4gKF9fb3duZWRfbGluayopX01fbm9kZS5fTV9uZXh0OyB9CisgIGNvbnN0IF9fb3duZWRfbGluayogX0xhc3QoKSBjb25zdCB7IHJldHVybiAwIDt9CisKKyAgdm9pZCBfVmVyaWZ5KCkgY29uc3QgeyBfX3N0bF9kZWJ1Z2dlcjo6X1ZlcmlmeSh0aGlzKTsgfQorICB2b2lkIF9Td2FwX293bmVycyhfX293bmVkX2xpc3QmIF9feSkgeyBfX3N0bF9kZWJ1Z2dlcjo6X1N3YXBfb3duZXJzKCp0aGlzLCBfX3kpOyB9CisgIHZvaWQgX0ludmFsaWRhdGVfYWxsKCkgeyBfX3N0bF9kZWJ1Z2dlcjo6X0ludmFsaWRhdGVfYWxsKHRoaXMpOyB9CisgIHZvaWQgX1NldF9vd25lcihfX293bmVkX2xpc3QmIF9feSkgeyBfX3N0bF9kZWJ1Z2dlcjo6X1NldF9vd25lcigqdGhpcywgX195KTsgfQorCisgIG11dGFibGUgX19vd25lZF9saW5rIF9NX25vZGU7CisgIG11dGFibGUgX1NUTFBfbXV0ZXggIF9NX2xvY2s7CisKK3ByaXZhdGU6CisgIC8vIHNob3VsZCBuZXZlciBiZSBjYWxsZWQsIHNob3VsZCBiZSBsZWZ0IG5vdCBpbXBsZW1lbnRlZCwKKyAgLy8gYnV0IHNvbWUgY29tcGlsZXJzIGNvbXBsYWluIGFib3V0IGl0IDsoCisgIF9fb3duZWRfbGlzdChjb25zdCBfX293bmVkX2xpc3QmKXt9CisgIF9fb3duZWRfbGlzdCYgb3BlcmF0b3IgPSAoY29uc3QgX19vd25lZF9saXN0JikgeyByZXR1cm4gKnRoaXM7IH0KKworICBmcmllbmQgY2xhc3MgX19vd25lZF9saW5rOworICBmcmllbmQgc3RydWN0IF9fc3RsX2RlYnVnX2VuZ2luZTxib29sPjsKK307CisKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIGZvcndhcmQgZGVjbGFyYXRpb2lucworCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgorYm9vbCBfU1RMUF9DQUxMIF9fY2hlY2tfcmFuZ2UoY29uc3QgX0l0ZXJhdG9yJiwgY29uc3QgX0l0ZXJhdG9yJik7Cit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgorYm9vbCBfU1RMUF9DQUxMIF9fY2hlY2tfcmFuZ2UoY29uc3QgX0l0ZXJhdG9yJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9JdGVyYXRvciYsIGNvbnN0IF9JdGVyYXRvciYpOwordGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcj4KK2Jvb2wgX1NUTFBfQ0FMTCBfX2NoZWNrX3JhbmdlKGNvbnN0IF9JdGVyYXRvciYsIGNvbnN0IF9JdGVyYXRvciYgLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0l0ZXJhdG9yJiwgY29uc3QgX0l0ZXJhdG9yJiApOwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2Jvb2wgX1NUTFBfQ0FMTCBfX2NoZWNrX3B0cl9yYW5nZShjb25zdCBfVHAqLCBjb25zdCBfVHAqKTsKKworCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgordm9pZCBfU1RMUF9DQUxMIF9faW52YWxpZGF0ZV9yYW5nZShjb25zdCBfX293bmVkX2xpc3QqIF9fYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0l0ZXJhdG9yJiBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfSXRlcmF0b3ImIF9fbGFzdCk7CisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+Cit2b2lkIF9TVExQX0NBTEwgX19pbnZhbGlkYXRlX2l0ZXJhdG9yKGNvbnN0IF9fb3duZWRfbGlzdCogX19iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfSXRlcmF0b3ImIF9faXQpOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgordm9pZCBfU1RMUF9DQUxMIF9fY2hhbmdlX3JhbmdlX293bmVyKGNvbnN0IF9JdGVyYXRvciYgX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfSXRlcmF0b3ImIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX293bmVkX2xpc3QqIF9fZHN0KTsKKwordGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcj4KK3ZvaWQgIF9TVExQX0NBTEwgX19jaGFuZ2VfaXRlX293bmVyKGNvbnN0IF9JdGVyYXRvciYgX19pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fb3duZWRfbGlzdCogX19kc3QpOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoraW5saW5lIGJvb2wgX1NUTFBfQ0FMTAorX19jaGVja19zYW1lX293bmVyKGNvbnN0IF9fb3duZWRfbGluayYgX19pMSwgY29uc3QgX19vd25lZF9saW5rJiBfX2kyKQoreyByZXR1cm4gX19zdGxfZGVidWdnZXI6Ol9DaGVja19zYW1lX293bmVyKF9faTEsX19pMik7IH0KKworaW5saW5lIGJvb2wgX1NUTFBfQ0FMTAorX19jaGVja19zYW1lX29yX251bGxfb3duZXIoY29uc3QgX19vd25lZF9saW5rJiBfX2kxLCBjb25zdCBfX293bmVkX2xpbmsmIF9faTIpCit7IHJldHVybiBfX3N0bF9kZWJ1Z2dlcjo6X0NoZWNrX3NhbWVfb3JfbnVsbF9vd25lcihfX2kxLF9faTIpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+CitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMICBfX2NoZWNrX2lmX293bmVyKCBjb25zdCBfX293bmVkX2xpc3QqIF9fb3duZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfSXRlcmF0b3ImIF9faXQpCit7IHJldHVybiBfX3N0bF9kZWJ1Z2dlcjo6X0NoZWNrX2lmX293bmVyKF9fb3duZXIsIChjb25zdCBfX293bmVkX2xpbmsmKV9faXQpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+CitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMIF9fY2hlY2tfaWZfbm90X293bmVyKCBjb25zdCBfX293bmVkX2xpc3QqIC8qX19vd25lciovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0l0ZXJhdG9yJiAvKl9faXQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fZmFsc2VfdHlwZSYpCit7IHJldHVybiB0cnVlOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+CitpbmxpbmUgYm9vbCBfU1RMUF9DQUxMIF9fY2hlY2tfaWZfbm90X293bmVyKCBjb25zdCBfX293bmVkX2xpc3QqIF9fb3duZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfSXRlcmF0b3ImIF9faXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX3RydWVfdHlwZSYpCit7IHJldHVybiBfX3N0bF9kZWJ1Z2dlcjo6X0NoZWNrX2lmX25vdF9vd25lcihfX293bmVyLCAoY29uc3QgX19vd25lZF9saW5rJilfX2l0KTsgfQorCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYgLyogX1NUTFBfREVCVUcgKi8KKworI2lmIGRlZmluZWQgKF9TVExQX0FTU0VSVElPTlMpCisKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9BU1NFUlRfTVNHX1RSQUlMRVIpCisjICAgIGRlZmluZSBfU1RMUF9BU1NFUlRfTVNHX1RSQUlMRVIKKyMgIGVuZGlmCisKKy8vIGR3YSAxMi8zMC85OCAtIGlmIF9TVExQX0RFQlVHX01FU1NBR0UgaXMgZGVmaW5lZCwgdGhlIHVzZXIgY2FuIHN1cHBseSBvd24gZGVmaW5pdGlvbi4KKyMgIGlmICFkZWZpbmVkIChfU1RMUF9ERUJVR19NRVNTQUdFKQorIyAgICBkZWZpbmUgX19zdGxfZGVidWdfbWVzc2FnZSBfX3N0bF9kZWJ1Z2dlcjo6X01lc3NhZ2UKKyMgIGVsc2UKK2V4dGVybiAgdm9pZCBfX3N0bF9kZWJ1Z19tZXNzYWdlKGNvbnN0IGNoYXIgKiBmb3JtYXRfc3RyLCAuLi4pOworIyAgZW5kaWYKKworLy8gZmJwOiBpZiBfU1RMUF9ERUJVR19URVJNSU5BVEUgaXMgZGVmaW5lZCwgdGhlIHVzZXIgY2FuIHN1cHBseSBvd24gZGVmaW5pdGlvbi4KKyMgIGlmICFkZWZpbmVkIChfU1RMUF9ERUJVR19URVJNSU5BVEUpCisjICAgIGRlZmluZSBfX3N0bF9kZWJ1Z190ZXJtaW5hdGUgX19zdGxfZGVidWdnZXI6Ol9UZXJtaW5hdGUKKyMgIGVsc2UKK2V4dGVybiAgdm9pZCBfX3N0bF9kZWJ1Z190ZXJtaW5hdGUoKTsKKyMgIGVuZGlmCisKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKF9TVExQX0xJTktfVElNRV9JTlNUQU5USUFUSU9OKQorIyAgaW5jbHVkZSA8c3RsL2RlYnVnL19kZWJ1Zy5jPgorI2VuZGlmCisKKyNlbmRpZiAvKiBERUJVR19IICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvZGVidWcvX2RlcXVlLmggYi9zdGwvZGVidWcvX2RlcXVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU1OTVhMAotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9kZWJ1Zy9fZGVxdWUuaApAQCAtMCwwICsxLDQwMCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKy8qIE5PVEU6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIFNUTCBoZWFkZXJzLgorICogICBZb3Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4KKyAqLworCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0RCR19ERVFVRV9ICisjZGVmaW5lIF9TVExQX0lOVEVSTkFMX0RCR19ERVFVRV9ICisKKyNpZm5kZWYgX1NUTFBfREJHX0lURVJBVE9SX0gKKyMgIGluY2x1ZGUgPHN0bC9kZWJ1Zy9faXRlcmF0b3IuaD4KKyNlbmRpZgorCisjZGVmaW5lIF9TVExQX05PTl9EQkdfREVRVUUgX1NUTFBfUFJJViBfU1RMUF9OT05fREJHX05BTUUoZGVxdWUpIDxfVHAsX0FsbG9jPgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHX1VTRV9ESVNUSU5DVF9WQUxVRV9UWVBFX0hFTFBFUlMpCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgX1RwKiB2YWx1ZV90eXBlKGNvbnN0IF9TVExQX1BSSVYgX0RCR19pdGVyX2Jhc2U8IF9TVExQX05PTl9EQkdfREVRVUUgPiYpCit7IHJldHVybiAoX1RwKikwOyB9Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnkoY29uc3QgX1NUTFBfUFJJViBfREJHX2l0ZXJfYmFzZTwgX1NUTFBfTk9OX0RCR19ERVFVRSA+JikKK3sgcmV0dXJuIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKCk7IH0KKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBfU1RMUF9EQkdfQUxMT0NBVE9SX1NFTEVDVChfVHApID4KK2NsYXNzIGRlcXVlIDoKKyNpZiAhZGVmaW5lZCAoX19ETUNfXykKKyAgICAgICAgICAgICBwcml2YXRlCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX19jb25zdHJ1Y3RfY2hlY2tlcjxfU1RMUF9OT05fREJHX0RFUVVFID4KKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUEFSVElBTF9TUEVDX1dPUktBUk9VTkQpCisgICAgICAgICAgICAsIHB1YmxpYyBfX3N0bHBvcnRfY2xhc3M8ZGVxdWU8X1RwLCBfQWxsb2M+ID4KKyNlbmRpZgoreworICB0eXBlZGVmIGRlcXVlPF9UcCxfQWxsb2M+IF9TZWxmOworICB0eXBlZGVmIF9TVExQX05PTl9EQkdfREVRVUUgX0Jhc2U7CisgIHR5cGVkZWYgX1NUTFBfUFJJViBfX2NvbnN0cnVjdF9jaGVja2VyPF9TVExQX05PTl9EQkdfREVRVUUgPiBfQ29uc3RydWN0Q2hlY2s7CisKK3B1YmxpYzoKKyAgLy8gQmFzaWMgdHlwZXMKKyAgX19JTVBPUlRfQ09OVEFJTkVSX1RZUEVERUZTKF9CYXNlKQorCisgIC8vIEl0ZXJhdG9ycworICB0eXBlZGVmIF9TVExQX1BSSVYgX0RCR19pdGVyPF9CYXNlLCBfU1RMUF9QUklWIF9EYmdUcmFpdHM8X05vbmNvbnN0X3RyYWl0czx2YWx1ZV90eXBlPiA+ID4gaXRlcmF0b3I7CisgIHR5cGVkZWYgX1NUTFBfUFJJViBfREJHX2l0ZXI8X0Jhc2UsIF9TVExQX1BSSVYgX0RiZ1RyYWl0czxfQ29uc3RfdHJhaXRzPHZhbHVlX3R5cGU+ID4gPiAgICBjb25zdF9pdGVyYXRvcjsKKworICBfU1RMUF9ERUNMQVJFX1JBTkRPTV9BQ0NFU1NfUkVWRVJTRV9JVEVSQVRPUlM7CisKK3Byb3RlY3RlZDoKKyAgX0Jhc2UgX01fbm9uX2RiZ19pbXBsOworICBfU1RMUF9QUklWIF9fb3duZWRfbGlzdCBfTV9pdGVyX2xpc3Q7CisKKyAgdm9pZCBfSW52YWxpZGF0ZV9hbGwoKQorICB7IF9NX2l0ZXJfbGlzdC5fSW52YWxpZGF0ZV9hbGwoKTsgfQorICB2b2lkIF9JbnZhbGlkYXRlX2l0ZXJhdG9yKGNvbnN0IGl0ZXJhdG9yJiBfX2l0KQorICB7IF9TVExQX1BSSVYgX19pbnZhbGlkYXRlX2l0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsX19pdCk7IH0KKyAgdm9pZCBfSW52YWxpZGF0ZV9pdGVyYXRvcnMoY29uc3QgaXRlcmF0b3ImIF9fZmlyc3QsIGNvbnN0IGl0ZXJhdG9yJiBfX2xhc3QpCisgIHsgX1NUTFBfUFJJViBfX2ludmFsaWRhdGVfcmFuZ2UoJl9NX2l0ZXJfbGlzdCwgX19maXJzdCwgX19sYXN0KTsgfQorCitwdWJsaWM6CisgIC8vIEJhc2ljIGFjY2Vzc29ycworICBhbGxvY2F0b3JfdHlwZSBnZXRfYWxsb2NhdG9yKCkgY29uc3QgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLmdldF9hbGxvY2F0b3IoKTsgfQorCisgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLmJlZ2luKCkpOyB9CisgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5lbmQoKSk7IH0KKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBjb25zdF9pdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuYmVnaW4oKSk7IH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLmVuZCgpKTsgfQorCisgIHJldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKyAgcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKworICByZWZlcmVuY2Ugb3BlcmF0b3JbXShzaXplX3R5cGUgX19uKSB7CisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoX19uIDwgc2l6ZSgpLCBfU3RsTXNnX09VVF9PRl9CT1VORFMpCisgICAgcmV0dXJuIF9NX25vbl9kYmdfaW1wbFtfX25dOworICB9CisgIGNvbnN0X3JlZmVyZW5jZSBvcGVyYXRvcltdKHNpemVfdHlwZSBfX24pIGNvbnN0IHsKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVChfX24gPCBzaXplKCksIF9TdGxNc2dfT1VUX09GX0JPVU5EUykKKyAgICByZXR1cm4gX01fbm9uX2RiZ19pbXBsW19fbl07CisgIH0KKworICByZWZlcmVuY2UgYXQoc2l6ZV90eXBlIF9fbikgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLmF0KF9fbik7IH0KKyAgY29uc3RfcmVmZXJlbmNlIGF0KHNpemVfdHlwZSBfX24pIGNvbnN0IHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5hdChfX24pOyB9CisKKyAgcmVmZXJlbmNlIGZyb250KCkgeworICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFlbXB0eSgpLCBfU3RsTXNnX0VNUFRZX0NPTlRBSU5FUikKKyAgICByZXR1cm4gKmJlZ2luKCk7CisgIH0KKyAgY29uc3RfcmVmZXJlbmNlIGZyb250KCkgY29uc3QgeworICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFlbXB0eSgpLCBfU3RsTXNnX0VNUFRZX0NPTlRBSU5FUikKKyAgICByZXR1cm4gKmJlZ2luKCk7CisgIH0KKyAgcmVmZXJlbmNlIGJhY2soKSB7CisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoIWVtcHR5KCksIF9TdGxNc2dfRU1QVFlfQ09OVEFJTkVSKQorICAgIHJldHVybiAqKC0tZW5kKCkpOworICB9CisgIGNvbnN0X3JlZmVyZW5jZSBiYWNrKCkgY29uc3QgeworICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFlbXB0eSgpLCBfU3RsTXNnX0VNUFRZX0NPTlRBSU5FUikKKyAgICByZXR1cm4gKigtLWVuZCgpKTsKKyAgfQorCisgIC8vIENvbnN0cnVjdG9yLCBkZXN0cnVjdG9yLgorICBleHBsaWNpdCBkZXF1ZShjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkgOgorICAgIF9NX25vbl9kYmdfaW1wbChfX2EpLCBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KKyAgZGVxdWUoY29uc3QgX1NlbGYmIF9feCkgOgorICAgIF9Db25zdHJ1Y3RDaGVjayhfX3gpLCBfTV9ub25fZGJnX2ltcGwoX194Ll9NX25vbl9kYmdfaW1wbCksCisgICAgX01faXRlcl9saXN0KCZfTV9ub25fZGJnX2ltcGwpIHt9CisKKyNpZiAhZGVmaW5lZChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQorICBleHBsaWNpdCBkZXF1ZShzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3ggPSBfVHAoKSwKKyNlbHNlCisgIGRlcXVlKHNpemVfdHlwZSBfX24sIHBhcmFtX3R5cGUgX194LAorI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCisgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkgOgorICAgIF9NX25vbl9kYmdfaW1wbChfX24sIF9feCwgX19hKSwgX01faXRlcl9saXN0KCZfTV9ub25fZGJnX2ltcGwpIHt9CisjaWYgZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKKyAgZXhwbGljaXQgZGVxdWUoc2l6ZV90eXBlIF9fbikgOgorICAgIF9NX25vbl9kYmdfaW1wbChfX24pLCBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KKyNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0qLworCisgIGRlcXVlKF9fbW92ZV9zb3VyY2U8X1NlbGY+IHNyYykKKyAgICA6IF9NX25vbl9kYmdfaW1wbChfX21vdmVfc291cmNlPF9CYXNlPihzcmMuZ2V0KCkuX01fbm9uX2RiZ19pbXBsKSksCisgICAgICBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkgeworI2lmIGRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpIHx8IChfU1RMUF9ERUJVR19MRVZFTCA9PSBfU1RMUF9TVEFOREFSRF9EQkdfTEVWRUwpCisgICAgc3JjLmdldCgpLl9NX2l0ZXJfbGlzdC5fSW52YWxpZGF0ZV9hbGwoKTsKKyNlbHNlCisgICAgc3JjLmdldCgpLl9NX2l0ZXJfbGlzdC5fU2V0X293bmVyKF9NX2l0ZXJfbGlzdCk7CisjZW5kaWYKKyAgfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICBkZXF1ZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgX1NUTFBfQUxMT0NBVE9SX1RZUEVfREZMKQorICAgIDogX0NvbnN0cnVjdENoZWNrKF9fZmlyc3QsIF9fbGFzdCksCisgICAgICBfTV9ub25fZGJnX2ltcGwoX1NUTFBfUFJJViBfTm9uX0RiZ19pdGVyKF9fZmlyc3QpLCBfU1RMUF9QUklWIF9Ob25fRGJnX2l0ZXIoX19sYXN0KSwgX19hKSwKKyAgICAgIF9NX2l0ZXJfbGlzdCgmX01fbm9uX2RiZ19pbXBsKSB7CisgICAgfQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfTkVFRFNfRVhUUkFfVEVNUExBVEVfQ09OU1RSVUNUT1JTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIGRlcXVlKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgICA6IF9Db25zdHJ1Y3RDaGVjayhfX2ZpcnN0LCBfX2xhc3QpLAorICAgICAgX01fbm9uX2RiZ19pbXBsKF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2ZpcnN0KSwgX1NUTFBfUFJJViBfTm9uX0RiZ19pdGVyKF9fbGFzdCkpLAorICAgICAgX01faXRlcl9saXN0KCZfTV9ub25fZGJnX2ltcGwpIHsKKyAgICB9CisjICBlbmRpZgorI2Vsc2UKKyAgZGVxdWUoY29uc3QgdmFsdWVfdHlwZSogX19maXJzdCwgY29uc3QgdmFsdWVfdHlwZSogX19sYXN0LAorICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9Db25zdHJ1Y3RDaGVjayhfX2ZpcnN0LCBfX2xhc3QpLAorICAgICAgX01fbm9uX2RiZ19pbXBsKF9fZmlyc3QsIF9fbGFzdCwgX19hKSwKKyAgICAgIF9NX2l0ZXJfbGlzdCgmX01fbm9uX2RiZ19pbXBsKSB7CisgICAgfQorCisgIGRlcXVlKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfQ29uc3RydWN0Q2hlY2soX19maXJzdCwgX19sYXN0KSwKKyAgICAgIF9NX25vbl9kYmdfaW1wbChfX2ZpcnN0Ll9NX2l0ZXJhdG9yLCBfX2xhc3QuX01faXRlcmF0b3IsIF9fYSksCisgICAgICBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkgeworICAgIH0KKyNlbmRpZgorCisgIF9TZWxmJiBvcGVyYXRvcj0oY29uc3QgX1NlbGYmIF9feCkgeworICAgIGlmICh0aGlzICE9ICZfX3gpIHsKKyAgICAgIF9JbnZhbGlkYXRlX2FsbCgpOworICAgICAgX01fbm9uX2RiZ19pbXBsID0gX194Ll9NX25vbl9kYmdfaW1wbDsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5lbXB0eSgpOyB9CisgIHNpemVfdHlwZSBzaXplKCkgY29uc3QgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLnNpemUoKTsgfQorICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwubWF4X3NpemUoKTsgfQorCisgIHZvaWQgc3dhcChfU2VsZiYgX194KSB7CisgICAgX01faXRlcl9saXN0Ll9Td2FwX293bmVycyhfX3guX01faXRlcl9saXN0KTsKKyAgICBfTV9ub25fZGJnX2ltcGwuc3dhcChfX3guX01fbm9uX2RiZ19pbXBsKTsKKyAgfQorCitwdWJsaWM6CisgIHZvaWQgYXNzaWduKHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX192YWwpIHsKKyAgICBfSW52YWxpZGF0ZV9hbGwoKTsKKyAgICBfTV9ub25fZGJnX2ltcGwuYXNzaWduKF9fbiwgX192YWwpOworICB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZvaWQgYXNzaWduKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICAgIF9JbnZhbGlkYXRlX2FsbCgpOworICAgIF9NX25vbl9kYmdfaW1wbC5hc3NpZ24oX1NUTFBfUFJJViBfTm9uX0RiZ19pdGVyKF9fZmlyc3QpLCBfU1RMUF9QUklWIF9Ob25fRGJnX2l0ZXIoX19sYXN0KSk7CisgIH0KKyNlbHNlCisgIHZvaWQgYXNzaWduKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICAgIF9JbnZhbGlkYXRlX2FsbCgpOworICAgIF9NX25vbl9kYmdfaW1wbC5hc3NpZ24oX19maXJzdC5fTV9pdGVyYXRvciwgX19sYXN0Ll9NX2l0ZXJhdG9yKTsKKyAgfQorICB2b2lkIGFzc2lnbihjb25zdCB2YWx1ZV90eXBlICpfX2ZpcnN0LCBjb25zdCB2YWx1ZV90eXBlICpfX2xhc3QpIHsKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcHRyX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgICAgX0ludmFsaWRhdGVfYWxsKCk7CisgICAgX01fbm9uX2RiZ19pbXBsLmFzc2lnbihfX2ZpcnN0LCBfX2xhc3QpOworICB9CisjZW5kaWYKKworcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwdXNoXyogYW5kIHBvcF8qCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkgJiYgIWRlZmluZWQgKF9TVExQX05PX0FOQUNIUk9OSVNNUykKKyAgdm9pZCBwdXNoX2JhY2soY29uc3QgdmFsdWVfdHlwZSYgX190ID0gX1RwKCkpIHsKKyNlbHNlCisgIHZvaWQgcHVzaF9iYWNrKGNvbnN0IHZhbHVlX3R5cGUmIF9fdCkgeworI2VuZGlmIC8qIV9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0gJiYgIV9TVExQX05PX0FOQUNIUk9OSVNNUyovCisgICAgX0ludmFsaWRhdGVfYWxsKCk7CisgICAgX01fbm9uX2RiZ19pbXBsLnB1c2hfYmFjayhfX3QpOworICB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fQU5BQ0hST05JU01TKQorICB2b2lkIHB1c2hfYmFjaygpIHsKKyAgICBfSW52YWxpZGF0ZV9hbGwoKTsKKyAgICBfTV9ub25fZGJnX2ltcGwucHVzaF9iYWNrKCk7CisgIH0KKyNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0gJiYgIV9TVExQX05PX0FOQUNIUk9OSVNNUyovCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkgJiYgIWRlZmluZWQgKF9TVExQX05PX0FOQUNIUk9OSVNNUykKKyAgdm9pZCBwdXNoX2Zyb250KGNvbnN0IHZhbHVlX3R5cGUmIF9fdCA9IF9UcCgpKSB7CisjZWxzZQorICB2b2lkIHB1c2hfZnJvbnQoY29uc3QgdmFsdWVfdHlwZSYgX190KSB7CisjZW5kaWYgLyohX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSAmJiAhX1NUTFBfTk9fQU5BQ0hST05JU01TKi8KKyAgICBfSW52YWxpZGF0ZV9hbGwoKTsKKyAgICBfTV9ub25fZGJnX2ltcGwucHVzaF9mcm9udChfX3QpOworICB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fQU5BQ0hST05JU01TKQorICB2b2lkIHB1c2hfZnJvbnQoKSB7CisgICAgX0ludmFsaWRhdGVfYWxsKCk7CisgICAgX01fbm9uX2RiZ19pbXBsLnB1c2hfZnJvbnQoKTsKKyAgfQorI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSAmJiAhX1NUTFBfTk9fQU5BQ0hST05JU01TKi8KKworICB2b2lkIHBvcF9iYWNrKCkgeworICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFlbXB0eSgpLCBfU3RsTXNnX0VNUFRZX0NPTlRBSU5FUikKKyAgICBfSW52YWxpZGF0ZV9pdGVyYXRvcihlbmQoKSk7CisgICAgX01fbm9uX2RiZ19pbXBsLnBvcF9iYWNrKCk7CisgIH0KKworICB2b2lkIHBvcF9mcm9udCgpIHsKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghZW1wdHkoKSwgX1N0bE1zZ19FTVBUWV9DT05UQUlORVIpCisgICAgX0ludmFsaWRhdGVfaXRlcmF0b3IoYmVnaW4oKSk7CisgICAgX01fbm9uX2RiZ19pbXBsLnBvcF9mcm9udCgpOworICB9CisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5zZXJ0CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkgJiYgIWRlZmluZWQgKF9TVExQX05PX0FOQUNIUk9OSVNNUykKKyAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBjb25zdCB2YWx1ZV90eXBlJiBfX3ggPSBfVHAoKSkgeworI2Vsc2UKKyAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpIHsKKyNlbmRpZiAvKiFfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNICYmICFfU1RMUF9OT19BTkFDSFJPTklTTVMqLworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9vd25lcigmX01faXRlcl9saXN0LCBfX3BvcykpCisgICAgX0ludmFsaWRhdGVfYWxsKCk7CisgICAgcmV0dXJuIGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5pbnNlcnQoX19wb3MuX01faXRlcmF0b3IsIF9feCkpOworICB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fQU5BQ0hST05JU01TKQorICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3IgX19wb3MpIHsKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfaWZfb3duZXIoJl9NX2l0ZXJfbGlzdCwgX19wb3MpKQorICAgIF9JbnZhbGlkYXRlX2FsbCgpOworICAgIHJldHVybiBpdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuaW5zZXJ0KF9fcG9zLl9NX2l0ZXJhdG9yKSk7CisgIH0KKyNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0gJiYgIV9TVExQX05PX0FOQUNIUk9OSVNNUyovCisKKyAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9vd25lcigmX01faXRlcl9saXN0LCBfX3BvcykpCisgICAgaWYgKF9fbiAhPSAwKSBfSW52YWxpZGF0ZV9hbGwoKTsKKyAgICBfTV9ub25fZGJnX2ltcGwuaW5zZXJ0KF9fcG9zLl9NX2l0ZXJhdG9yLCBfX24sIF9feCk7CisgIH0KKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FyZVNhbWVVbkNWVHlwZXM8X0lucHV0SXRlcmF0b3IsIGl0ZXJhdG9yPjo6X1JldCBfSXNOb25Db25zdEl0ZXJhdG9yOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FyZVNhbWVVbkNWVHlwZXM8X0lucHV0SXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPjo6X1JldCBfSXNDb25zdEl0ZXJhdG9yOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0xvcjI8X0lzTm9uQ29uc3RJdGVyYXRvciwgX0lzQ29uc3RJdGVyYXRvcj46Ol9SZXQgX0RvQ2hlY2s7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX2lmX293bmVyKCZfTV9pdGVyX2xpc3QsIF9fcG9zKSkKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKKyAgICAvL1NlcXVlbmNlIHJlcXVpcmVtZW50cyAyMy4xLjEgVGFibGUgNjc6CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX2lmX25vdF9vd25lcigmX01faXRlcl9saXN0LCBfX2ZpcnN0LCBfRG9DaGVjaygpKSk7CisgICAgX01fbm9uX2RiZ19pbXBsLmluc2VydChfX3Bvcy5fTV9pdGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2ZpcnN0KSwgX1NUTFBfUFJJViBfTm9uX0RiZ19pdGVyKF9fbGFzdCkpOworICAgIC8vZHVtczogYmVjYXVzZSBvZiBzZWxmIGluc2VydGlvbiBpdGVyYXRvcnMgbXVzdCBiZSBpbnZhbGlkYXRlZCBhZnRlciBpbnNlcnRpb24uCisgICAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KSBfSW52YWxpZGF0ZV9hbGwoKTsKKyAgfQorI2Vsc2UKKyAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wb3MsCisgICAgICAgICAgICAgIGNvbnN0IHZhbHVlX3R5cGUqIF9fZmlyc3QsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbGFzdCkgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9vd25lcigmX01faXRlcl9saXN0LCBfX3BvcykpCisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3B0cl9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICAgIF9NX25vbl9kYmdfaW1wbC5pbnNlcnQoX19wb3MuX01faXRlcmF0b3IsIF9fZmlyc3QsIF9fbGFzdCk7CisgICAgLy9kdW1zOiBiZWNhdXNlIG9mIHNlbGYgaW5zZXJ0aW9uIGl0ZXJhdG9ycyBtdXN0IGJlIGludmFsaWRhdGVkIGFmdGVyIGluc2VydGlvbi4KKyAgICBpZiAoX19maXJzdCAhPSBfX2xhc3QpIF9JbnZhbGlkYXRlX2FsbCgpOworICB9CisgIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLAorICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpIHsKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfaWZfb3duZXIoJl9NX2l0ZXJfbGlzdCwgX19wb3MpKQorICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICAgIC8vU2VxdWVuY2UgcmVxdWlyZW1lbnRzIDIzLjEuMSBUYWJsZSA2NzoKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfaWZfbm90X293bmVyKCZfTV9pdGVyX2xpc3QsIF9fZmlyc3QsIF9fdHJ1ZV90eXBlKCkpKTsKKyAgICBfTV9ub25fZGJnX2ltcGwuaW5zZXJ0KF9fcG9zLl9NX2l0ZXJhdG9yLCBfX2ZpcnN0Ll9NX2l0ZXJhdG9yLCBfX2xhc3QuX01faXRlcmF0b3IpOworICAgIC8vZHVtczogYmVjYXVzZSBvZiBzZWxmIGluc2VydGlvbiBpdGVyYXRvcnMgbXVzdCBiZSBpbnZhbGlkYXRlZCBhZnRlciBpbnNlcnRpb24uCisgICAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KSBfSW52YWxpZGF0ZV9hbGwoKTsKKyAgfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKKyAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9fbmV3X3NpemUsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCA9IF9UcCgpKSB7CisjZWxzZQorICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgX19uZXdfc2l6ZSwgY29uc3QgdmFsdWVfdHlwZSYgX194KSB7CisjZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKi8KKyAgICBpZiAoX19uZXdfc2l6ZSAhPSBzaXplKCkpIHsKKyAgICAgIGlmICgoX19uZXdfc2l6ZSA+IHNpemUoKSkgfHwgKF9fbmV3X3NpemUgPCBzaXplKCkgLSAxKSkKKyAgICAgICAgX0ludmFsaWRhdGVfYWxsKCk7CisgICAgICBlbHNlCisgICAgICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9yKGVuZCgpKTsKKyAgICB9CisgICAgX01fbm9uX2RiZ19pbXBsLnJlc2l6ZShfX25ld19zaXplLCBfX3gpOworICB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQorICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgbmV3X3NpemUpIHsgcmVzaXplKG5ld19zaXplLCBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKF9UcCkpOyB9CisjZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKi8KKworICAvLyBFcmFzZQorICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBfX3BvcykgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9vd25lcigmX01faXRlcl9saXN0LCBfX3BvcykpCisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfRGVyZWZlcmVuY2VhYmxlKF9fcG9zKSkKKyAgICBpZiAoX19wb3MuX01faXRlcmF0b3IgPT0gX01fbm9uX2RiZ19pbXBsLmJlZ2luKCkpCisgICAgICBfSW52YWxpZGF0ZV9pdGVyYXRvcihfX3Bvcyk7CisgICAgZWxzZSB7CisgICAgICB0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IgX190bXAgPSAtLShfTV9ub25fZGJnX2ltcGwuZW5kKCkpOworICAgICAgaWYgKF9fcG9zLl9NX2l0ZXJhdG9yID09IF9fdG1wKQorICAgICAgICBfSW52YWxpZGF0ZV9pdGVyYXRvcihfX3Bvcyk7CisgICAgICBlbHNlCisgICAgICAgIF9JbnZhbGlkYXRlX2FsbCgpOworICAgIH0KKyAgICByZXR1cm4gaXRlcmF0b3IgKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5lcmFzZShfX3Bvcy5fTV9pdGVyYXRvcikpOworICB9CisKKyAgaXRlcmF0b3IgZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KSB7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCwgYmVnaW4oKSwgZW5kKCkpKQorICAgIGlmICghZW1wdHkoKSkgeworICAgICAgaWYgKF9fZmlyc3QuX01faXRlcmF0b3IgPT0gX01fbm9uX2RiZ19pbXBsLmJlZ2luKCkgfHwKKyAgICAgICAgICBfX2xhc3QuX01faXRlcmF0b3IgPT0gX01fbm9uX2RiZ19pbXBsLmVuZCgpKQorICAgICAgICBfSW52YWxpZGF0ZV9pdGVyYXRvcnMoX19maXJzdCwgX19sYXN0KTsKKyAgICAgIGVsc2UKKyAgICAgICAgX0ludmFsaWRhdGVfYWxsKCk7CisgICAgfQorICAgIHJldHVybiBpdGVyYXRvciAoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLmVyYXNlKF9fZmlyc3QuX01faXRlcmF0b3IsIF9fbGFzdC5fTV9pdGVyYXRvcikpOworICB9CisKKyAgdm9pZCBjbGVhcigpIHsKKyAgICBfSW52YWxpZGF0ZV9hbGwoKTsKKyAgICBfTV9ub25fZGJnX2ltcGwuY2xlYXIoKTsKKyAgfQorfTsKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjdW5kZWYgX1NUTFBfTk9OX0RCR19ERVFVRQorCisjZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfREVRVUVfSCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RsL2RlYnVnL19oYXNodGFibGUuaCBiL3N0bC9kZWJ1Zy9faGFzaHRhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBkNjQxMQotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9kZWJ1Zy9faGFzaHRhYmxlLmgKQEAgLTAsMCArMSwzMzggQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisvKiBOT1RFOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBTVEwgaGVhZGVycy4KKyAqICAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuCisgKi8KKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9EQkdfSEFTSFRBQkxFX0gKKyNkZWZpbmUgX1NUTFBfSU5URVJOQUxfREJHX0hBU0hUQUJMRV9ICisKKy8vIEhhc2h0YWJsZSBjbGFzcywgdXNlZCB0byBpbXBsZW1lbnQgdGhlIGhhc2hlZCBhc3NvY2lhdGl2ZSBjb250YWluZXJzCisvLyBoYXNoX3NldCwgaGFzaF9tYXAsIGhhc2hfbXVsdGlzZXQsIGFuZCBoYXNoX211bHRpbWFwLAorLy8gdW5vcmRlcmVkX3NldCwgdW5vcmRlcmVkX21hcCwgdW5vcmRlcmVkX211bHRpc2V0LCB1bm9yZGVyZWRfbXVsdGltYXAKKworI2lmbmRlZiBfU1RMUF9EQkdfSVRFUkFUT1JfSAorIyAgaW5jbHVkZSA8c3RsL2RlYnVnL19pdGVyYXRvci5oPgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfRXF1YWw+CitjbGFzcyBfRGJnRXF1YWwgeworcHVibGljOgorICBfRGJnRXF1YWwoKSB7fQorICBfRGJnRXF1YWwoY29uc3QgX0VxdWFsJiBfX2VxKSA6IF9NX25vbl9kYmdfZXEoX19lcSkge30KKyAgX0RiZ0VxdWFsKGNvbnN0IF9EYmdFcXVhbCYgX19lcSkgOiBfTV9ub25fZGJnX2VxKF9fZXEuX01fbm9uX2RiZ19lcSkge30KKworI2lmICFkZWZpbmVkIChfU1RMUF9VU0VfQ09OVEFJTkVSU19FWFRFTlNJT04pCisgIGJvb2wgb3BlcmF0b3IgKCkgKGNvbnN0IF9LZXkmIF9fbGhzLCBjb25zdCBfS2V5JiBfX3JocykgY29uc3QKKyNlbHNlCisgIHRlbXBsYXRlIDxjbGFzcyBfS3AxLCBjbGFzcyBfS3AyPgorICBib29sIG9wZXJhdG9yICgpIChjb25zdCBfS3AxJiBfX2xocywgY29uc3QgX0twMiYgX19yaHMpIGNvbnN0CisjZW5kaWYKKyAgICAgIHsKKyNpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX0NPTlRBSU5FUlNfRVhURU5TSU9OKQorICAgICAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVChfTV9ub25fZGJnX2VxKF9fcmhzLCBfX2xocykgPT0gX01fbm9uX2RiZ19lcShfX2xocywgX19yaHMpLCBfU3RsTXNnX0lOVkFMSURfRVFVSVZBTEVOVF9QUkVESUNBVEUpCisjZW5kaWYKKyAgICAgICAgcmV0dXJuIF9NX25vbl9kYmdfZXEoX19saHMsIF9fcmhzKSA/IHRydWUgOiBmYWxzZTsKKyAgICAgIH0KKworICBfRXF1YWwgbm9uX2RiZ19rZXlfZXEoKSBjb25zdCB7IHJldHVybiBfTV9ub25fZGJnX2VxOyB9Citwcml2YXRlOgorICBfRXF1YWwgX01fbm9uX2RiZ19lcTsKK307CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCisjZGVmaW5lIF9TVExQX05PTl9EQkdfSFQgXAorX1NUTFBfUFJJViBfU1RMUF9OT05fREJHX05BTUUoaGFzaHRhYmxlKSA8X1ZhbCwgX0tleSwgX0hGLCBfVHJhaXRzLCBfRXhLLCBfU1RMUF9QUklWIF9EYmdFcXVhbDxfS2V5LCBfRXFLPiwgX0FsbD4KKworI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHX1VTRV9ESVNUSU5DVF9WQUxVRV9UWVBFX0hFTFBFUlMpCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3MgX0hGLAorICAgICAgICAgIGNsYXNzIF9FeEssIGNsYXNzIF9FcUssIGNsYXNzIF9BbGw+CitpbmxpbmUgX1ZhbCoKK3ZhbHVlX3R5cGUoY29uc3QgX1NUTFBfUFJJViBfREJHX2l0ZXJfYmFzZTwgX1NUTFBfTk9OX0RCR19IVCA+JikKK3sgcmV0dXJuIChfVmFsKikwOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSEYsCisgICAgICAgICAgY2xhc3MgX0V4SywgY2xhc3MgX0VxSywgY2xhc3MgX0FsbD4KK2lubGluZSBmb3J3YXJkX2l0ZXJhdG9yX3RhZworaXRlcmF0b3JfY2F0ZWdvcnkoY29uc3QgX1NUTFBfUFJJViBfREJHX2l0ZXJfYmFzZTwgX1NUTFBfTk9OX0RCR19IVCA+JikKK3sgcmV0dXJuIGZvcndhcmRfaXRlcmF0b3JfdGFnKCk7IH0KKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3MgX0hGLAorICAgICAgICAgIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9FeEssIGNsYXNzIF9FcUssIGNsYXNzIF9BbGw+CitjbGFzcyBoYXNodGFibGUgeworICB0eXBlZGVmIGhhc2h0YWJsZTxfVmFsLCBfS2V5LCBfSEYsIF9UcmFpdHMsIF9FeEssIF9FcUssIF9BbGw+IF9TZWxmOworICB0eXBlZGVmIF9TVExQX05PTl9EQkdfSFQgX0Jhc2U7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpfTm9uQ29uc3RUcmFpdHMgX05vbkNvbnN0VHJhaXRzOworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6Ol9Db25zdFRyYWl0cyBfQ29uc3RUcmFpdHM7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6X05vbkNvbnN0TG9jYWxUcmFpdHMgX05vbkNvbnN0TG9jYWxUcmFpdHM7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6X0NvbnN0TG9jYWxUcmFpdHMgX0NvbnN0TG9jYWxUcmFpdHM7CisKKyAgX0Jhc2UgX01fbm9uX2RiZ19pbXBsOworICBfU1RMUF9QUklWIF9fb3duZWRfbGlzdCBfTV9pdGVyX2xpc3Q7CisKK3B1YmxpYzoKKyAgdHlwZWRlZiBfS2V5IGtleV90eXBlOworICB0eXBlZGVmIF9IRiBoYXNoZXI7CisgIHR5cGVkZWYgX0VxSyBrZXlfZXF1YWw7CisKKyAgX19JTVBPUlRfQ09OVEFJTkVSX1RZUEVERUZTKF9CYXNlKQorCisgIHR5cGVkZWYgX1NUTFBfUFJJViBfREJHX2l0ZXI8X0Jhc2UsIF9TVExQX1BSSVYgX0RiZ1RyYWl0czxfTm9uQ29uc3RUcmFpdHM+ID4gaXRlcmF0b3I7CisgIHR5cGVkZWYgX1NUTFBfUFJJViBfREJHX2l0ZXI8X0Jhc2UsIF9TVExQX1BSSVYgX0RiZ1RyYWl0czxfQ29uc3RUcmFpdHM+ID4gICAgY29uc3RfaXRlcmF0b3I7CisgIC8vdHlwZWRlZiBfU1RMUF9QUklWIF9EQkdfaXRlcjxfQmFzZSwgX0RiZ1RyYWl0czxfTm9uQ29uc3RMb2NhbFRyYWl0cz4gPiBsb2NhbF9pdGVyYXRvcjsKKyAgdHlwZWRlZiBpdGVyYXRvciBsb2NhbF9pdGVyYXRvcjsKKyAgLy90eXBlZGVmIF9TVExQX1BSSVYgX0RCR19pdGVyPF9CYXNlLCBfRGJnVHJhaXRzPF9Db25zdExvY2FsVHJhaXRzPiA+ICAgIGNvbnN0X2xvY2FsX2l0ZXJhdG9yOworICB0eXBlZGVmIGNvbnN0X2l0ZXJhdG9yIGNvbnN0X2xvY2FsX2l0ZXJhdG9yOworCisgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yIF9CYXNlX2l0ZXJhdG9yOworICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9pdGVyYXRvciBfQmFzZV9jb25zdF9pdGVyYXRvcjsKKworICBoYXNoZXIgaGFzaF9mdW5jdCgpIGNvbnN0IHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5oYXNoX2Z1bmN0KCk7IH0KKyAga2V5X2VxdWFsIGtleV9lcSgpIGNvbnN0IHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5rZXlfZXEoKS5ub25fZGJnX2tleV9lcSgpOyB9CisKK3ByaXZhdGU6CisgIHZvaWQgX0ludmFsaWRhdGVfaXRlcmF0b3IoY29uc3QgY29uc3RfaXRlcmF0b3ImIF9faXQpCisgIHsgX1NUTFBfUFJJViBfX2ludmFsaWRhdGVfaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX19pdCk7IH0KKyAgdm9pZCBfSW52YWxpZGF0ZV9pdGVyYXRvcnMoY29uc3QgY29uc3RfaXRlcmF0b3ImIF9fZmlyc3QsIGNvbnN0IGNvbnN0X2l0ZXJhdG9yJiBfX2xhc3QpCisgIHsgX1NUTFBfUFJJViBfX2ludmFsaWRhdGVfcmFuZ2UoJl9NX2l0ZXJfbGlzdCwgX19maXJzdCwgX19sYXN0KTsgfQorCisgIF9TVExQX0tFWV9UWVBFX0ZPUl9DT05UX0VYVChrZXlfdHlwZSkKKworcHVibGljOgorICBhbGxvY2F0b3JfdHlwZSBnZXRfYWxsb2NhdG9yKCkgY29uc3QgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLmdldF9hbGxvY2F0b3IoKTsgfQorCisgIGhhc2h0YWJsZShzaXplX3R5cGUgX19uLAorICAgICAgICAgICAgY29uc3QgX0hGJiAgX19oZiwKKyAgICAgICAgICAgIGNvbnN0IF9FcUsmIF9fZXFsLAorICAgICAgICAgICAgY29uc3QgX0V4SyYgX19leHQsCisgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9NX25vbl9kYmdfaW1wbChfX24sIF9faGYsIF9fZXFsLCBfX2V4dCwgX19hKSwKKyAgICAgIF9NX2l0ZXJfbGlzdCgmX01fbm9uX2RiZ19pbXBsKSB7fQorCisgIGhhc2h0YWJsZShzaXplX3R5cGUgX19uLAorICAgICAgICAgICAgY29uc3QgX0hGJiAgICBfX2hmLAorICAgICAgICAgICAgY29uc3QgX0VxSyYgICBfX2VxbCwKKyAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX01fbm9uX2RiZ19pbXBsKF9fbiwgX19oZiwgX19lcWwsIF9fYSksCisgICAgICBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KKworICBoYXNodGFibGUoY29uc3QgX1NlbGYmIF9faHQpCisgICAgOiBfTV9ub25fZGJnX2ltcGwoX19odC5fTV9ub25fZGJnX2ltcGwpLAorICAgICAgX01faXRlcl9saXN0KCZfTV9ub25fZGJnX2ltcGwpIHt9CisKKyAgaGFzaHRhYmxlKF9fbW92ZV9zb3VyY2U8X1NlbGY+IHNyYykKKyAgICA6IF9NX25vbl9kYmdfaW1wbChfX21vdmVfc291cmNlPF9CYXNlPihzcmMuZ2V0KCkuX01fbm9uX2RiZ19pbXBsKSksCisgICAgICBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkgeworI2lmIGRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpIHx8IChfU1RMUF9ERUJVR19MRVZFTCA9PSBfU1RMUF9TVEFOREFSRF9EQkdfTEVWRUwpCisgICAgc3JjLmdldCgpLl9NX2l0ZXJfbGlzdC5fSW52YWxpZGF0ZV9hbGwoKTsKKyNlbHNlCisgICAgc3JjLmdldCgpLl9NX2l0ZXJfbGlzdC5fU2V0X293bmVyKF9NX2l0ZXJfbGlzdCk7CisjZW5kaWYKKyAgfQorCisgIHNpemVfdHlwZSBzaXplKCkgY29uc3QgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLnNpemUoKTsgfQorICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwubWF4X3NpemUoKTsgfQorICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLmVtcHR5KCk7IH0KKworICBfU2VsZiYgb3BlcmF0b3I9KGNvbnN0IF9TZWxmJiBfX2h0KSB7CisgICAgaWYgKHRoaXMgIT0gJl9faHQpIHsKKyAgICAgIC8vU2hvdWxkIG5vdCBpbnZhbGlkYXRlIGVuZCBpdGVyYXRvcgorICAgICAgX0ludmFsaWRhdGVfaXRlcmF0b3JzKGJlZ2luKCksIGVuZCgpKTsKKyAgICAgIF9NX25vbl9kYmdfaW1wbCA9IF9faHQuX01fbm9uX2RiZ19pbXBsOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB2b2lkIHN3YXAoX1NlbGYmIF9faHQpIHsKKyAgIF9NX2l0ZXJfbGlzdC5fU3dhcF9vd25lcnMoX19odC5fTV9pdGVyX2xpc3QpOworICAgX01fbm9uX2RiZ19pbXBsLnN3YXAoX19odC5fTV9ub25fZGJnX2ltcGwpOworICB9CisKKyAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBpdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuYmVnaW4oKSk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgICB7IHJldHVybiBpdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuZW5kKCkpOyB9CisgIGxvY2FsX2l0ZXJhdG9yIGJlZ2luKHNpemVfdHlwZSBfX24pIHsKKyAgICAvL1RPRE86IEFkZCBjaGVja3MgZm9yIGl0ZXJhdG9yIGxvY2FsaXR5IC0+IGF2b2lkcyBjb21wYXJpc29uIGJldHdlZW4gZGlmZmVyZW50IGJ1Y2tldCBpdGVyYXRvcnMKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCgoX19uIDwgYnVja2V0X2NvdW50KCkpLCBfU3RsTXNnX0lOVkFMSURfQVJHVU1FTlQpCisgICAgcmV0dXJuIGxvY2FsX2l0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5iZWdpbihfX24pKTsKKyAgfQorICBsb2NhbF9pdGVyYXRvciBlbmQoc2l6ZV90eXBlIF9fbikgeworICAgIC8vVE9ETzogQWRkIGNoZWNrcyBmb3IgaXRlcmF0b3IgbG9jYWxpdHkgLT4gYXZvaWRzIGNvbXBhcmlzb24gYmV0d2VlbiBkaWZmZXJlbnQgYnVja2V0IGl0ZXJhdG9ycworICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKChfX24gPCBidWNrZXRfY291bnQoKSksIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKKyAgICByZXR1cm4gbG9jYWxfaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLmVuZChfX24pKTsKKyAgfQorCisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLmJlZ2luKCkpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5lbmQoKSk7IH0KKyAgY29uc3RfbG9jYWxfaXRlcmF0b3IgYmVnaW4oc2l6ZV90eXBlIF9fbikgY29uc3QgeworICAgIC8vVE9ETzogQWRkIGNoZWNrcyBmb3IgaXRlcmF0b3IgbG9jYWxpdHkgLT4gYXZvaWRzIGNvbXBhcmlzb24gYmV0d2VlbiBkaWZmZXJlbnQgYnVja2V0IGl0ZXJhdG9ycworICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKChfX24gPCBidWNrZXRfY291bnQoKSksIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKKyAgICByZXR1cm4gY29uc3RfbG9jYWxfaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLmJlZ2luKF9fbikpOworICB9CisgIGNvbnN0X2xvY2FsX2l0ZXJhdG9yIGVuZChzaXplX3R5cGUgX19uKSBjb25zdCB7CisgICAgLy9UT0RPOiBBZGQgY2hlY2tzIGZvciBpdGVyYXRvciBsb2NhbGl0eSAtPiBhdm9pZHMgY29tcGFyaXNvbiBiZXR3ZWVuIGRpZmZlcmVudCBidWNrZXQgaXRlcmF0b3JzCisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoKF9fbiA8IGJ1Y2tldF9jb3VudCgpKSwgX1N0bE1zZ19JTlZBTElEX0FSR1VNRU5UKQorICAgIHJldHVybiBjb25zdF9sb2NhbF9pdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuZW5kKF9fbikpOworICB9CisKKyAgcGFpcjxpdGVyYXRvciwgYm9vbD4gaW5zZXJ0X3VuaXF1ZShjb25zdCB2YWx1ZV90eXBlJiBfX29iaikgeworICAgIHBhaXI8X0Jhc2VfaXRlcmF0b3IsIGJvb2w+IF9fcmVzID0gX01fbm9uX2RiZ19pbXBsLmluc2VydF91bmlxdWUoX19vYmopOworICAgIHJldHVybiBwYWlyPGl0ZXJhdG9yLCBib29sPihpdGVyYXRvcigmX01faXRlcl9saXN0LCBfX3Jlcy5maXJzdCksIF9fcmVzLnNlY29uZCk7CisgIH0KKworICBpdGVyYXRvciBpbnNlcnRfZXF1YWwoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopCisgIHsgcmV0dXJuIGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5pbnNlcnRfZXF1YWwoX19vYmopKTsgfQorCisgIHBhaXI8aXRlcmF0b3IsIGJvb2w+IGluc2VydF91bmlxdWVfbm9yZXNpemUoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopIHsKKyAgICBwYWlyPF9CYXNlX2l0ZXJhdG9yLCBib29sPiBfX3JlcyA9IF9NX25vbl9kYmdfaW1wbC5pbnNlcnRfdW5pcXVlX25vcmVzaXplKF9fb2JqKTsKKyAgICByZXR1cm4gcGFpcjxpdGVyYXRvciwgYm9vbD4oaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX19yZXMuZmlyc3QpLCBfX3Jlcy5zZWNvbmQpOworICB9CisKKyAgaXRlcmF0b3IgaW5zZXJ0X2VxdWFsX25vcmVzaXplKGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKQorICB7IHJldHVybiBpdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuaW5zZXJ0X2VxdWFsX25vcmVzaXplKF9fb2JqKSk7IH0KKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgdm9pZCBpbnNlcnRfdW5pcXVlKF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sKSB7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZiwgX19sKSkKKyAgICBfTV9ub25fZGJnX2ltcGwuaW5zZXJ0X3VuaXF1ZShfU1RMUF9QUklWIF9Ob25fRGJnX2l0ZXIoX19mKSwgX1NUTFBfUFJJViBfTm9uX0RiZ19pdGVyKF9fbCkpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICB2b2lkIGluc2VydF9lcXVhbChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCl7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZiwgX19sKSkKKyAgICBfTV9ub25fZGJnX2ltcGwuaW5zZXJ0X2VxdWFsKF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2YpLCBfU1RMUF9QUklWIF9Ob25fRGJnX2l0ZXIoX19sKSk7CisgIH0KKworI2Vsc2UKKyAgdm9pZCBpbnNlcnRfdW5pcXVlKGNvbnN0IHZhbHVlX3R5cGUqIF9fZiwgY29uc3QgdmFsdWVfdHlwZSogX19sKSB7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3B0cl9yYW5nZShfX2YsIF9fbCkpCisgICAgX01fbm9uX2RiZ19pbXBsLmluc2VydF91bmlxdWUoX19mLCBfX2wpOworICB9CisKKyAgdm9pZCBpbnNlcnRfZXF1YWwoY29uc3QgdmFsdWVfdHlwZSogX19mLCBjb25zdCB2YWx1ZV90eXBlKiBfX2wpIHsKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcHRyX3JhbmdlKF9fZiwgX19sKSkKKyAgICBfTV9ub25fZGJnX2ltcGwuaW5zZXJ0X2VxdWFsKF9fZiwgX19sKTsKKyAgfQorCisgIHZvaWQgaW5zZXJ0X3VuaXF1ZShjb25zdF9pdGVyYXRvciBfX2YsIGNvbnN0X2l0ZXJhdG9yIF9fbCkgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2YsIF9fbCkpCisgICAgX01fbm9uX2RiZ19pbXBsLmluc2VydF91bmlxdWUoX19mLl9NX2l0ZXJhdG9yLCBfX2wuX01faXRlcmF0b3IpOworICB9CisKKyAgdm9pZCBpbnNlcnRfZXF1YWwoY29uc3RfaXRlcmF0b3IgX19mLCBjb25zdF9pdGVyYXRvciBfX2wpIHsKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19mLCBfX2wpKQorICAgIF9NX25vbl9kYmdfaW1wbC5pbnNlcnRfZXF1YWwoX19mLl9NX2l0ZXJhdG9yLCBfX2wuX01faXRlcmF0b3IpOworICB9CisjZW5kaWYKKworICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgaXRlcmF0b3IgZmluZChjb25zdCBfS1QmIF9fa2V5KQorICB7IHJldHVybiBpdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuZmluZChfX2tleSkpOyB9CisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBjb25zdF9pdGVyYXRvciBmaW5kKGNvbnN0IF9LVCYgX19rZXkpIGNvbnN0CisgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5maW5kKF9fa2V5KSk7IH0KKworICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgc2l6ZV90eXBlIGNvdW50KGNvbnN0IF9LVCYgX19rZXkpIGNvbnN0IHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5jb3VudChfX2tleSk7IH0KKworICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgcGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+IGVxdWFsX3JhbmdlKGNvbnN0IF9LVCYgX19rZXkpIHsKKyAgICBwYWlyPF9CYXNlX2l0ZXJhdG9yLCBfQmFzZV9pdGVyYXRvcj4gX19yZXMgPSBfTV9ub25fZGJnX2ltcGwuZXF1YWxfcmFuZ2UoX19rZXkpOworICAgIHJldHVybiBwYWlyPGl0ZXJhdG9yLGl0ZXJhdG9yPiAoaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCxfX3Jlcy5maXJzdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcigmX01faXRlcl9saXN0LF9fcmVzLnNlY29uZCkpOworICB9CisKKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIHBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPiBlcXVhbF9yYW5nZShjb25zdCBfS1QmIF9fa2V5KSBjb25zdCB7CisgICAgcGFpciA8X0Jhc2VfY29uc3RfaXRlcmF0b3IsIF9CYXNlX2NvbnN0X2l0ZXJhdG9yPiBfX3JlcyA9IF9NX25vbl9kYmdfaW1wbC5lcXVhbF9yYW5nZShfX2tleSk7CisgICAgcmV0dXJuIHBhaXI8Y29uc3RfaXRlcmF0b3IsY29uc3RfaXRlcmF0b3I+IChjb25zdF9pdGVyYXRvcigmX01faXRlcl9saXN0LF9fcmVzLmZpcnN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsX19yZXMuc2Vjb25kKSk7CisgIH0KKworICBzaXplX3R5cGUgZXJhc2UoY29uc3Qga2V5X3R5cGUmIF9fa2V5KSB7CisgICAgcGFpcjxfQmFzZV9pdGVyYXRvciwgX0Jhc2VfaXRlcmF0b3I+IF9fcCA9IF9NX25vbl9kYmdfaW1wbC5lcXVhbF9yYW5nZShfX2tleSk7CisgICAgc2l6ZV90eXBlIF9fbiA9IF9TVExQX1NURDo6ZGlzdGFuY2UoX19wLmZpcnN0LCBfX3Auc2Vjb25kKTsKKyAgICBfSW52YWxpZGF0ZV9pdGVyYXRvcnMoY29uc3RfaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX19wLmZpcnN0KSwgY29uc3RfaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX19wLnNlY29uZCkpOworICAgIF9NX25vbl9kYmdfaW1wbC5lcmFzZShfX3AuZmlyc3QsIF9fcC5zZWNvbmQpOworICAgIHJldHVybiBfX247CisgIH0KKworICB2b2lkIGVyYXNlKGNvbnN0IGNvbnN0X2l0ZXJhdG9yJiBfX2l0KSB7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfRGVyZWZlcmVuY2VhYmxlKF9faXQpKQorICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9vd25lcigmX01faXRlcl9saXN0LCBfX2l0KSkKKyAgICBfSW52YWxpZGF0ZV9pdGVyYXRvcihfX2l0KTsKKyAgICBfTV9ub25fZGJnX2ltcGwuZXJhc2UoX19pdC5fTV9pdGVyYXRvcik7CisgIH0KKyAgdm9pZCBlcmFzZShjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpIHsKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvcihiZWdpbigpKSwgY29uc3RfaXRlcmF0b3IoZW5kKCkpKSkKKyAgICBfSW52YWxpZGF0ZV9pdGVyYXRvcnMoX19maXJzdCwgX19sYXN0KTsKKyAgICBfTV9ub25fZGJnX2ltcGwuZXJhc2UoX19maXJzdC5fTV9pdGVyYXRvciwgX19sYXN0Ll9NX2l0ZXJhdG9yKTsKKyAgfQorCisgIHZvaWQgcmVoYXNoKHNpemVfdHlwZSBfX251bV9idWNrZXRzX2hpbnQpIHsgX01fbm9uX2RiZ19pbXBsLnJlaGFzaChfX251bV9idWNrZXRzX2hpbnQpOyB9CisgIHZvaWQgcmVzaXplKHNpemVfdHlwZSBfX251bV9lbGVtZW50c19oaW50KSB7IF9NX25vbl9kYmdfaW1wbC5yZXNpemUoX19udW1fZWxlbWVudHNfaGludCk7IH0KKworICB2b2lkIGNsZWFyKCkgeworICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9ycyhiZWdpbigpLCBlbmQoKSk7CisgICAgX01fbm9uX2RiZ19pbXBsLmNsZWFyKCk7CisgIH0KKworICByZWZlcmVuY2UgX01faW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKSB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwuX01faW5zZXJ0KF9fb2JqKTsgfQorCisgIHNpemVfdHlwZSBidWNrZXRfY291bnQoKSBjb25zdCB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwuYnVja2V0X2NvdW50KCk7IH0KKyAgc2l6ZV90eXBlIG1heF9idWNrZXRfY291bnQoKSBjb25zdCB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwubWF4X2J1Y2tldF9jb3VudCgpOyB9CisgIHNpemVfdHlwZSBlbGVtc19pbl9idWNrZXQoc2l6ZV90eXBlIF9fbikgY29uc3QgeworICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKChfX24gPCBidWNrZXRfY291bnQoKSksIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKKyAgICByZXR1cm4gX01fbm9uX2RiZ19pbXBsLmVsZW1zX2luX2J1Y2tldChfX24pOworICB9CisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBzaXplX3R5cGUgYnVja2V0KGNvbnN0IF9LVCYgX19rKSBjb25zdCB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwuYnVja2V0KF9fayk7IH0KKworICBmbG9hdCBsb2FkX2ZhY3RvcigpIGNvbnN0IHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5sb2FkX2ZhY3RvcigpOyB9CisgIGZsb2F0IG1heF9sb2FkX2ZhY3RvcigpIGNvbnN0IHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5tYXhfbG9hZF9mYWN0b3IoKTsgfQorICB2b2lkIG1heF9sb2FkX2ZhY3RvcihmbG9hdCBfX3opIHsKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCgoX196ID4gMC4wZiksIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKKyAgICBfTV9ub25fZGJnX2ltcGwubWF4X2xvYWRfZmFjdG9yKF9feik7CisgIH0KK307CisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI3VuZGVmIF9TVExQX05PTl9EQkdfSFQKKworI2VuZGlmIC8qIF9TVExQX0lOVEVSTkFMX0hBU0hUQUJMRV9IICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvZGVidWcvX2l0ZXJhdG9yLmggYi9zdGwvZGVidWcvX2l0ZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZhYWE5ZgotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9kZWJ1Zy9faXRlcmF0b3IuaApAQCAtMCwwICsxLDQ1OCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX0RCR19JVEVSQVRPUl9ICisjZGVmaW5lIF9TVExQX0RCR19JVEVSQVRPUl9ICisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfUEFJUl9ICisjICBpbmNsdWRlIDxzdGwvX3BhaXIuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0FMTE9DX0gKKyMgIGluY2x1ZGUgPHN0bC9fYWxsb2MuaD4KKyNlbmRpZgorCisjZGVmaW5lIF9TVExQX0RCR19BTExPQ0FUT1JfU0VMRUNUKCBfVHAgKSBfU1RMUF9ERUZBVUxUX0FMTE9DQVRPUl9TRUxFQ1QoIF9UcCApCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+Cit2b2lkIF9EZWNyZW1lbnQoX0l0ZXJhdG9yJiBfX2l0LCBjb25zdCBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZyAmKQoreyAtLV9faXQ7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcj4KK3ZvaWQgX0RlY3JlbWVudChfSXRlcmF0b3ImIF9faXQsIGNvbnN0IHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnICYpCit7IC0tX19pdDsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgordm9pZCBfRGVjcmVtZW50KF9JdGVyYXRvciYgX19pdCwgY29uc3QgZm9yd2FyZF9pdGVyYXRvcl90YWcgJikKK3sgX1NUTFBfQVNTRVJUKDApIH0KKwordGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcj4KK3ZvaWQgX0FkdmFuY2UoX0l0ZXJhdG9yJiwgcHRyZGlmZl90LCBjb25zdCBmb3J3YXJkX2l0ZXJhdG9yX3RhZyAmKQoreyBfU1RMUF9BU1NFUlQoMCkgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgordm9pZCBfQWR2YW5jZShfSXRlcmF0b3ImIF9faXQsIHB0cmRpZmZfdCwgY29uc3QgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcgJikKK3sgX1NUTFBfQVNTRVJUKDApIH0KKwordGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcj4KK3ZvaWQgX0FkdmFuY2UoX0l0ZXJhdG9yJiBfX2l0LCBwdHJkaWZmX3QgX19uLCBjb25zdCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyAmKQoreyBfX2l0ICs9IF9fbjsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgorcHRyZGlmZl90IF9EQkdfZGlzdGFuY2UoY29uc3QgX0l0ZXJhdG9yJiBfX3gsIGNvbnN0IF9JdGVyYXRvciYgX195LCBjb25zdCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyAmKQoreyByZXR1cm4gX194IC0gX195OyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+CitwdHJkaWZmX3QgX0RCR19kaXN0YW5jZShjb25zdCBfSXRlcmF0b3ImLCBjb25zdCBfSXRlcmF0b3ImLCBjb25zdCBmb3J3YXJkX2l0ZXJhdG9yX3RhZyAmKSB7CisgIF9TVExQX0FTU0VSVCgwKQorICByZXR1cm4gMDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcj4KK3B0cmRpZmZfdCBfREJHX2Rpc3RhbmNlKGNvbnN0IF9JdGVyYXRvciYsIGNvbnN0IF9JdGVyYXRvciYsIGNvbnN0IGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnICYpIHsKKyAgX1NUTFBfQVNTRVJUKDApCisgIHJldHVybiAwOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgorYm9vbCBfQ29tcGFyZUl0KGNvbnN0IF9JdGVyYXRvciYsIGNvbnN0IF9JdGVyYXRvciYsIGNvbnN0IGZvcndhcmRfaXRlcmF0b3JfdGFnICYpIHsKKyAgX1NUTFBfQVNTRVJUKDApCisgIHJldHVybiBmYWxzZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcj4KK2Jvb2wgX0NvbXBhcmVJdChjb25zdCBfSXRlcmF0b3ImLCBjb25zdCBfSXRlcmF0b3ImLCBjb25zdCBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZyAmKSB7CisgIF9TVExQX0FTU0VSVCgwKQorICByZXR1cm4gZmFsc2U7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+Citib29sIF9Db21wYXJlSXQoY29uc3QgX0l0ZXJhdG9yJiBfX3gsIGNvbnN0IF9JdGVyYXRvciYgX195LCBjb25zdCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyAmKQoreyByZXR1cm4gX194IDwgX195OyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+Citib29sIF9EZXJlZmVyZW5jZWFibGUoY29uc3QgX0l0ZXJhdG9yJiBfX2l0KQoreyByZXR1cm4gKF9faXQuX0dldF9jb250YWluZXJfcHRyKCkgIT0gMCkgJiYgIShfX2l0Ll9NX2l0ZXJhdG9yID09IChfX2l0Ll9HZXRfY29udGFpbmVyX3B0cigpKS0+ZW5kKCkpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+Citib29sIF9JbmNyZW1lbnRhYmxlKGNvbnN0IF9JdGVyYXRvciYgX19pdCwgcHRyZGlmZl90IF9fbiwgY29uc3QgZm9yd2FyZF9pdGVyYXRvcl90YWcgJikKK3sgcmV0dXJuIChfX24gPT0gMSkgJiYgX0RlcmVmZXJlbmNlYWJsZShfX2l0KTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgorYm9vbCBfSW5jcmVtZW50YWJsZShjb25zdCBfSXRlcmF0b3ImIF9faXQsIHB0cmRpZmZfdCBfX24sIGNvbnN0IGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnICYpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSXRlcmF0b3I6Ol9Db250YWluZXJfdHlwZSBfX2NvbnRhaW5lcl90eXBlOworICBfX2NvbnRhaW5lcl90eXBlKiBfX2MgPSBfX2l0Ll9HZXRfY29udGFpbmVyX3B0cigpOworICByZXR1cm4gKF9fYyAhPSAwKSAmJiAoKF9fbiA9PSAxICYmIF9faXQuX01faXRlcmF0b3IgIT0gX19jLT5lbmQoKSApIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAoX19uID09IC0xICYmIF9faXQuX01faXRlcmF0b3IgIT0gX19jLT5iZWdpbigpKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+Citib29sIF9JbmNyZW1lbnRhYmxlKGNvbnN0IF9JdGVyYXRvciYgX19pdCwgcHRyZGlmZl90IF9fbiwgY29uc3QgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgJikgeworICB0eXBlZGVmIHR5cGVuYW1lIF9JdGVyYXRvcjo6X0NvbnRhaW5lcl90eXBlIF9fY29udGFpbmVyX3R5cGU7CisgIF9fY29udGFpbmVyX3R5cGUqIF9fYyA9IF9faXQuX0dldF9jb250YWluZXJfcHRyKCk7CisgIGlmIChfX2MgPT0gMCkgcmV0dXJuIGZhbHNlOworICBwdHJkaWZmX3QgX19uZXdfcG9zID0gKF9faXQuX01faXRlcmF0b3IgLSBfX2MtPmJlZ2luKCkpICsgX19uOworICByZXR1cm4gIChfX25ld19wb3MgPj0gMCkgJiYgKF9fU1RBVElDX0NBU1QodHlwZW5hbWUgX19jb250YWluZXJfdHlwZTo6c2l6ZV90eXBlLCBfX25ld19wb3MpIDw9IF9fYy0+c2l6ZSgpKTsKK30KKworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NvbnRhaW5lcj4KK3N0cnVjdCBfREJHX2l0ZXJfYmFzZSA6IHB1YmxpYyBfX293bmVkX2xpbmsgeworcHVibGljOgorICB0eXBlZGVmIHR5cGVuYW1lIF9Db250YWluZXI6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQ29udGFpbmVyOjpyZWZlcmVuY2UgIHJlZmVyZW5jZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQ29udGFpbmVyOjpwb2ludGVyICAgIHBvaW50ZXI7CisgIHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKKyAgLy9wcml2YXRlOgorICB0eXBlZGVmIHR5cGVuYW1lIF9Db250YWluZXI6Oml0ZXJhdG9yICAgICAgICBfTm9uY29uc3RfaXRlcmF0b3I7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0NvbnRhaW5lcjo6Y29uc3RfaXRlcmF0b3IgIF9Db25zdF9pdGVyYXRvcjsKKyAgdHlwZWRlZiBfQ29udGFpbmVyICAgICAgICAgICAgICAgICAgICAgX0NvbnRhaW5lcl90eXBlOworCisjaWZkZWYgX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTgorICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQ29uc3RfaXRlcmF0b3I+OjppdGVyYXRvcl9jYXRlZ29yeSBfSXRlcmF0b3JfY2F0ZWdvcnk7CisjZWxzZQorICB0eXBlZGVmIHR5cGVuYW1lIF9Db250YWluZXI6Ol9JdGVyYXRvcl9jYXRlZ29yeSAgX0l0ZXJhdG9yX2NhdGVnb3J5OworI2VuZGlmCisgIHR5cGVkZWYgX0l0ZXJhdG9yX2NhdGVnb3J5IGl0ZXJhdG9yX2NhdGVnb3J5OworCisgIF9EQkdfaXRlcl9iYXNlKCkgOiBfX293bmVkX2xpbmsoMCkgIHt9CisgIF9EQkdfaXRlcl9iYXNlKGNvbnN0IF9fb3duZWRfbGlzdCogX19jLCBjb25zdCBfQ29uc3RfaXRlcmF0b3ImIF9faXQpIDoKKyNpZiBkZWZpbmVkKF9fSFBfYUNDKSAmJiAoX19IUF9hQ0MgPCA2MDAwMCkKKyAgX19vd25lZF9saW5rKF9fYyksIF9NX2l0ZXJhdG9yKCpfX1JFSU5URVJQUkVUX0NBU1QoY29uc3QgX05vbmNvbnN0X2l0ZXJhdG9yICosICZfX2l0KSkge30KKyNlbHNlCisgICAgX19vd25lZF9saW5rKF9fYyksIF9NX2l0ZXJhdG9yKCooY29uc3QgX05vbmNvbnN0X2l0ZXJhdG9yKikmX19pdCkge30KKyNlbmRpZgorICBfQ29udGFpbmVyKiBfR2V0X2NvbnRhaW5lcl9wdHIoKSBjb25zdCB7CisgICAgcmV0dXJuIChfQ29udGFpbmVyKilfX3N0bF9kZWJ1Z2dlcjo6X0dldF9jb250YWluZXJfcHRyKHRoaXMpOworICB9CisKKyAgdm9pZCBfX2luY3JlbWVudCgpOworICB2b2lkIF9fZGVjcmVtZW50KCk7CisgIHZvaWQgX19hZHZhbmNlKHB0cmRpZmZfdCBfX24pOworCisvLyBwcm90ZWN0ZWQ6CisgIF9Ob25jb25zdF9pdGVyYXRvciBfTV9pdGVyYXRvcjsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfQ29udGFpbmVyPgoraW5saW5lIHZvaWQgX0RCR19pdGVyX2Jhc2U8X0NvbnRhaW5lcj46Ol9faW5jcmVtZW50KCkgeworICBfU1RMUF9ERUJVR19DSEVDSyhfSW5jcmVtZW50YWJsZSgqdGhpcywgMSwgX0l0ZXJhdG9yX2NhdGVnb3J5KCkpKQorICArK19NX2l0ZXJhdG9yOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NvbnRhaW5lcj4KK2lubGluZSB2b2lkIF9EQkdfaXRlcl9iYXNlPF9Db250YWluZXI+OjpfX2RlY3JlbWVudCgpIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX0luY3JlbWVudGFibGUoKnRoaXMsIC0xLCBfSXRlcmF0b3JfY2F0ZWdvcnkoKSkpCisgIF9EZWNyZW1lbnQoX01faXRlcmF0b3IsIF9JdGVyYXRvcl9jYXRlZ29yeSgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9Db250YWluZXI+CitpbmxpbmUgdm9pZCBfREJHX2l0ZXJfYmFzZTxfQ29udGFpbmVyPjo6X19hZHZhbmNlKHB0cmRpZmZfdCBfX24pIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX0luY3JlbWVudGFibGUoKnRoaXMsIF9fbiwgX0l0ZXJhdG9yX2NhdGVnb3J5KCkpKQorICBfQWR2YW5jZShfTV9pdGVyYXRvciwgX19uLCBfSXRlcmF0b3JfY2F0ZWdvcnkoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ29udGFpbmVyPgorcHRyZGlmZl90IG9wZXJhdG9yLShjb25zdCBfREJHX2l0ZXJfYmFzZTxfQ29udGFpbmVyPiYgX194LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBfREJHX2l0ZXJfYmFzZTxfQ29udGFpbmVyPiYgX195ICkgeworICB0eXBlZGVmIHR5cGVuYW1lIF9EQkdfaXRlcl9iYXNlPF9Db250YWluZXI+OjpfSXRlcmF0b3JfY2F0ZWdvcnkgIF9JdGVyYXRvcl9jYXRlZ29yeTsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX19jaGVja19zYW1lX293bmVyKF9feCwgX195KSkKKyAgcmV0dXJuIF9EQkdfZGlzdGFuY2UoX194Ll9NX2l0ZXJhdG9yLF9feS5fTV9pdGVyYXRvciwgX0l0ZXJhdG9yX2NhdGVnb3J5KCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NvbnRhaW5lciwgY2xhc3MgX1RyYWl0cz4KK3N0cnVjdCBfREJHX2l0ZXJfbWlkIDogcHVibGljIF9EQkdfaXRlcl9iYXNlPF9Db250YWluZXI+IHsKKyAgdHlwZWRlZiBfREJHX2l0ZXJfbWlkPF9Db250YWluZXIsIHR5cGVuYW1lIF9UcmFpdHM6Ol9Ob25Db25zdFRyYWl0cz4gX05vbmNvbnN0X3NlbGY7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0NvbnRhaW5lcjo6aXRlcmF0b3IgICAgICAgIF9Ob25jb25zdF9pdGVyYXRvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQ29udGFpbmVyOjpjb25zdF9pdGVyYXRvciAgX0NvbnN0X2l0ZXJhdG9yOworCisgIF9EQkdfaXRlcl9taWQoKSB7fQorCisgIGV4cGxpY2l0IF9EQkdfaXRlcl9taWQoY29uc3QgX05vbmNvbnN0X3NlbGYmIF9faXQpIDoKKyAgICAgIF9EQkdfaXRlcl9iYXNlPF9Db250YWluZXI+KF9faXQpIHt9CisKKyAgX0RCR19pdGVyX21pZChjb25zdCBfX293bmVkX2xpc3QqIF9fYywgY29uc3QgX0NvbnN0X2l0ZXJhdG9yJiBfX2l0KSA6CisgICAgICBfREJHX2l0ZXJfYmFzZTxfQ29udGFpbmVyPihfX2MsIF9faXQpIHt9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NvbnRhaW5lciwgY2xhc3MgX1RyYWl0cz4KK3N0cnVjdCBfREJHX2l0ZXIgOiBwdWJsaWMgX0RCR19pdGVyX21pZDxfQ29udGFpbmVyLCBfVHJhaXRzPiB7CisgIHR5cGVkZWYgX0RCR19pdGVyX2Jhc2U8X0NvbnRhaW5lcj4gICAgICAgICAgX0Jhc2U7CitwdWJsaWM6CisgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpyZWZlcmVuY2UgIHJlZmVyZW5jZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpwb2ludGVyICAgIHBvaW50ZXI7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6X05vbmNvbnN0X2l0ZXJhdG9yIF9Ob25jb25zdF9pdGVyYXRvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6X0NvbnN0X2l0ZXJhdG9yIF9Db25zdF9pdGVyYXRvcjsKKworcHJpdmF0ZToKKyAgdHlwZWRlZiBfREJHX2l0ZXI8X0NvbnRhaW5lciwgX1RyYWl0cz4gICAgIF9TZWxmOworICB0eXBlZGVmIF9EQkdfaXRlcl9taWQ8X0NvbnRhaW5lciwgdHlwZW5hbWUgX1RyYWl0czo6X05vbkNvbnN0VHJhaXRzPiBfTm9uY29uc3RfbWlkOworCitwdWJsaWM6CisKKyNpZmRlZiBfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OCisgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yX2NhdGVnb3J5IGl0ZXJhdG9yX2NhdGVnb3J5OworI2VuZGlmCisgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Ol9JdGVyYXRvcl9jYXRlZ29yeSAgX0l0ZXJhdG9yX2NhdGVnb3J5OworCitwdWJsaWM6CisgIF9EQkdfaXRlcigpIHt9CisgICAgLy8gYm9yaXMgOiByZWFsIHR5cGUgb2YgaXRlciB3b3VsZCBiZSBuaWNlCisgIF9EQkdfaXRlcihjb25zdCBfX293bmVkX2xpc3QqIF9fYywgY29uc3QgX0NvbnN0X2l0ZXJhdG9yJiBfX2l0KSA6CisgICAgX0RCR19pdGVyX21pZDxfQ29udGFpbmVyLCBfVHJhaXRzPihfX2MsIF9faXQpIHt9CisKKyAgLy8gVGhpcyBhbGxvd3MgY29udmVyc2lvbnMgZnJvbSBpdGVyYXRvciB0byBjb25zdF9pdGVyYXRvciB3aXRob3V0IGJlaW5nCisgIC8vIHJlZHVuZGFudCB3aXRoIHRoZSBjb3B5IGNvbnN0cnVjdG9yIGJlbG93LgorICBfREJHX2l0ZXIoY29uc3QgX05vbmNvbnN0X21pZCYgX19yaHMpIDoKKyAgICBfREJHX2l0ZXJfbWlkPF9Db250YWluZXIsIF9UcmFpdHM+KF9fcmhzKSB7fQorCisgIF9EQkdfaXRlcihjb25zdCAgX1NlbGYmIF9fcmhzKSA6CisgICAgX0RCR19pdGVyX21pZDxfQ29udGFpbmVyLCBfVHJhaXRzPihfX3Jocykge30KKworICAvLyBUaGlzIGFsbG93cyBjb252ZXJzaW9ucyBmcm9tIGl0ZXJhdG9yIHRvIGNvbnN0X2l0ZXJhdG9yIHdpdGhvdXQgYmVpbmcKKyAgLy8gcmVkdW5kYW50IHdpdGggdGhlIGNvcHkgYXNzaWdubWVudCBvcGVyYXRvciBiZWxvdy4KKyAgX1NlbGYmIG9wZXJhdG9yPShjb25zdCBfTm9uY29uc3RfbWlkJiBfX3JocykgeworICAgIChfQmFzZSYpKnRoaXMgPSBfX3JoczsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBfU2VsZiYgb3BlcmF0b3I9KGNvbnN0ICBfU2VsZiYgX19yaHMpIHsKKyAgICAoX0Jhc2UmKSp0aGlzID0gX19yaHM7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgcmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0OworCisgIF9TVExQX0RFRklORV9BUlJPV19PUEVSQVRPUgorCisgIF9TZWxmJiBvcGVyYXRvcisrKCkgeworICAgIHRoaXMtPl9faW5jcmVtZW50KCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIF9TZWxmIG9wZXJhdG9yKysoaW50KSB7CisgICAgX1NlbGYgX190bXAgPSAqdGhpczsKKyAgICB0aGlzLT5fX2luY3JlbWVudCgpOworICAgIHJldHVybiBfX3RtcDsKKyAgfQorICBfU2VsZiYgb3BlcmF0b3ItLSgpIHsKKyAgICB0aGlzLT5fX2RlY3JlbWVudCgpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBfU2VsZiBvcGVyYXRvci0tKGludCkgeworICAgIF9TZWxmIF9fdG1wID0gKnRoaXM7CisgICAgdGhpcy0+X19kZWNyZW1lbnQoKTsKKyAgICByZXR1cm4gX190bXA7CisgIH0KKworICBfU2VsZiYgb3BlcmF0b3IrPShkaWZmZXJlbmNlX3R5cGUgX19uKSB7CisgICAgdGhpcy0+X19hZHZhbmNlKF9fbik7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgX1NlbGYmIG9wZXJhdG9yLT0oZGlmZmVyZW5jZV90eXBlIF9fbikgeworICAgIHRoaXMtPl9fYWR2YW5jZSgtX19uKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgX1NlbGYgb3BlcmF0b3IrKGRpZmZlcmVuY2VfdHlwZSBfX24pIGNvbnN0IHsKKyAgICBfU2VsZiBfX3RtcCgqdGhpcyk7CisgICAgX190bXAuX19hZHZhbmNlKF9fbik7CisgICAgcmV0dXJuIF9fdG1wOworICB9CisgIF9TZWxmIG9wZXJhdG9yLShkaWZmZXJlbmNlX3R5cGUgX19uKSBjb25zdCB7CisgICAgX1NlbGYgX190bXAoKnRoaXMpOworICAgIF9fdG1wLl9fYWR2YW5jZSgtX19uKTsKKyAgICByZXR1cm4gX190bXA7CisgIH0KKyAgcmVmZXJlbmNlIG9wZXJhdG9yW10oZGlmZmVyZW5jZV90eXBlIF9fbikgY29uc3QgeyByZXR1cm4gKigqdGhpcyArIF9fbik7IH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfQ29udGFpbmVyLCBjbGFzcyBfVHJhaXRzPgoraW5saW5lCisjaWYgZGVmaW5lZCAoX1NUTFBfTkVTVEVEX1RZUEVfUEFSQU1fQlVHKQorX1NUTFBfVFlQRU5BTUVfT05fUkVUVVJOX1RZUEUgX1RyYWl0czo6cmVmZXJlbmNlCisjZWxzZQorX1NUTFBfVFlQRU5BTUVfT05fUkVUVVJOX1RZUEUgX0RCR19pdGVyPF9Db250YWluZXIsIF9UcmFpdHM+OjpyZWZlcmVuY2UKKyNlbmRpZgorX0RCR19pdGVyPF9Db250YWluZXIsIF9UcmFpdHM+OjpvcGVyYXRvciooKSBjb25zdCB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9EZXJlZmVyZW5jZWFibGUoKnRoaXMpKQorICBfU1RMUF9ERUJVR19DSEVDSyhfVHJhaXRzOjpfQ2hlY2soKnRoaXMpKQorICByZXR1cm4gKnRoaXMtPl9NX2l0ZXJhdG9yOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NvbnRhaW5lcj4KK2lubGluZSBib29sCitvcGVyYXRvcj09KGNvbnN0IF9EQkdfaXRlcl9iYXNlPF9Db250YWluZXI+JiBfX3gsIGNvbnN0IF9EQkdfaXRlcl9iYXNlPF9Db250YWluZXI+JiBfX3kpIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX19jaGVja19zYW1lX29yX251bGxfb3duZXIoX194LCBfX3kpKQorICByZXR1cm4gX194Ll9NX2l0ZXJhdG9yID09IF9feS5fTV9pdGVyYXRvcjsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9Db250YWluZXI+CitpbmxpbmUgYm9vbAorb3BlcmF0b3I8KGNvbnN0IF9EQkdfaXRlcl9iYXNlPF9Db250YWluZXI+JiBfX3gsIGNvbnN0IF9EQkdfaXRlcl9iYXNlPF9Db250YWluZXI+JiBfX3kpIHsKKyAgX1NUTFBfREVCVUdfQ0hFQ0soX19jaGVja19zYW1lX29yX251bGxfb3duZXIoX194LCBfX3kpKQorICB0eXBlZGVmIHR5cGVuYW1lIF9EQkdfaXRlcl9iYXNlPF9Db250YWluZXI+OjpfSXRlcmF0b3JfY2F0ZWdvcnkgX0NhdGVnb3J5OworICByZXR1cm4gX0NvbXBhcmVJdChfX3guX01faXRlcmF0b3IgLCBfX3kuX01faXRlcmF0b3IsIF9DYXRlZ29yeSgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9Db250YWluZXI+CitpbmxpbmUgYm9vbAorb3BlcmF0b3I+KGNvbnN0IF9EQkdfaXRlcl9iYXNlPF9Db250YWluZXI+JiBfX3gsCisgICAgICAgY29uc3QgX0RCR19pdGVyX2Jhc2U8X0NvbnRhaW5lcj4mIF9feSkgeworICB0eXBlZGVmIHR5cGVuYW1lIF9EQkdfaXRlcl9iYXNlPF9Db250YWluZXI+OjpfSXRlcmF0b3JfY2F0ZWdvcnkgX0NhdGVnb3J5OworICByZXR1cm4gX0NvbXBhcmVJdChfX3kuX01faXRlcmF0b3IgLCBfX3guX01faXRlcmF0b3IsIF9DYXRlZ29yeSgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9Db250YWluZXI+CitpbmxpbmUgYm9vbAorb3BlcmF0b3I+PShjb25zdCBfREJHX2l0ZXJfYmFzZTxfQ29udGFpbmVyPiYgX194LCBjb25zdCBfREJHX2l0ZXJfYmFzZTxfQ29udGFpbmVyPiYgX195KSB7CisgIF9TVExQX0RFQlVHX0NIRUNLKF9fY2hlY2tfc2FtZV9vcl9udWxsX293bmVyKF9feCwgX195KSkKKyAgdHlwZWRlZiB0eXBlbmFtZSBfREJHX2l0ZXJfYmFzZTxfQ29udGFpbmVyPjo6X0l0ZXJhdG9yX2NhdGVnb3J5IF9DYXRlZ29yeTsKKyAgcmV0dXJuICFfQ29tcGFyZUl0KF9feC5fTV9pdGVyYXRvciAsIF9feS5fTV9pdGVyYXRvciwgX0NhdGVnb3J5KCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NvbnRhaW5lcj4KK2lubGluZSBib29sCitvcGVyYXRvcjw9KGNvbnN0IF9EQkdfaXRlcl9iYXNlPF9Db250YWluZXI+JiBfX3gsCisgICAgICAgY29uc3QgX0RCR19pdGVyX2Jhc2U8X0NvbnRhaW5lcj4mIF9feSkgeworICB0eXBlZGVmIHR5cGVuYW1lIF9EQkdfaXRlcl9iYXNlPF9Db250YWluZXI+OjpfSXRlcmF0b3JfY2F0ZWdvcnkgX0NhdGVnb3J5OworICByZXR1cm4gIV9Db21wYXJlSXQoX195Ll9NX2l0ZXJhdG9yICwgX194Ll9NX2l0ZXJhdG9yLCBfQ2F0ZWdvcnkoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ29udGFpbmVyPgoraW5saW5lIGJvb2wKK29wZXJhdG9yIT0oY29uc3QgX0RCR19pdGVyX2Jhc2U8X0NvbnRhaW5lcj4mIF9feCwKKyAgICAgICAgY29uc3QgX0RCR19pdGVyX2Jhc2U8X0NvbnRhaW5lcj4mIF9feSkgeworICBfU1RMUF9ERUJVR19DSEVDSyhfX2NoZWNrX3NhbWVfb3JfbnVsbF9vd25lcihfX3gsIF9feSkpCisgIHJldHVybiBfX3guX01faXRlcmF0b3IgIT0gX195Ll9NX2l0ZXJhdG9yOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NvbnRhaW5lciwgY2xhc3MgX1RyYWl0cz4KK2lubGluZSBfREJHX2l0ZXI8X0NvbnRhaW5lciwgX1RyYWl0cz4KK29wZXJhdG9yKyhwdHJkaWZmX3QgX19uLCBjb25zdCBfREJHX2l0ZXI8X0NvbnRhaW5lciwgX1RyYWl0cz4mIF9faXQpIHsKKyAgX0RCR19pdGVyPF9Db250YWluZXIsIF9UcmFpdHM+IF9fdG1wKF9faXQpOworICByZXR1cm4gX190bXAgKz0gX19uOworfQorCisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+CitpbmxpbmUgX0l0ZXJhdG9yIF9Ob25fRGJnX2l0ZXIoX0l0ZXJhdG9yIF9faXQpCit7IHJldHVybiBfX2l0OyB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIpCit0ZW1wbGF0ZSA8Y2xhc3MgX0NvbnRhaW5lciwgY2xhc3MgX1RyYWl0cz4KK2lubGluZSB0eXBlbmFtZSBfREJHX2l0ZXI8X0NvbnRhaW5lciwgX1RyYWl0cz46Ol9Ob25jb25zdF9pdGVyYXRvcgorX05vbl9EYmdfaXRlcihfREJHX2l0ZXI8X0NvbnRhaW5lciwgX1RyYWl0cz4gX19pdCkKK3sgcmV0dXJuIF9faXQuX01faXRlcmF0b3I7IH0KKyNlbmRpZgorCisvKgorICogSGVscGVyIGNsYXNzZXMgdG8gY2hlY2sgaXRlcmF0b3IgcmFuZ2Ugb3IgcG9pbnRlciB2YWxpZGl0eQorICogYXQgY29uc3RydWN0aW9uIHRpbWUuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBfQ29udGFpbmVyPgorY2xhc3MgX19jb25zdHJ1Y3RfY2hlY2tlciB7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0NvbnRhaW5lcjo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworcHJvdGVjdGVkOgorICBfX2NvbnN0cnVjdF9jaGVja2VyKCkge30KKworICBfX2NvbnN0cnVjdF9jaGVja2VyKGNvbnN0IHZhbHVlX3R5cGUqIF9fcCkgeworICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKChfX3AgIT0gMCksIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKKyAgfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXI+CisgIF9fY29uc3RydWN0X2NoZWNrZXIoY29uc3QgX0lucHV0SXRlciYgX19mLCBjb25zdCBfSW5wdXRJdGVyJiBfX2wpIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Jc0ludGVncmFsPF9JbnB1dEl0ZXI+OjpfUmV0IF9JbnRlZ3JhbDsKKyAgICBfTV9jaGVja19kaXNwYXRjaChfX2YsIF9fbCwgX0ludGVncmFsKCkpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnRlZ2VyPgorICB2b2lkIF9NX2NoZWNrX2Rpc3BhdGNoKF9JbnRlZ2VyICwgX0ludGVnZXIsIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKklzSW50ZWdyYWwqLykge30KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcj4KKyAgdm9pZCBfTV9jaGVja19kaXNwYXRjaChjb25zdCBfSW5wdXRJdGVyJiBfX2YsIGNvbnN0IF9JbnB1dEl0ZXImIF9fbCwgY29uc3QgX19mYWxzZV90eXBlJiAvKklzSW50ZWdyYWwqLykgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9fY2hlY2tfcmFuZ2UoX19mLF9fbCkpCisgIH0KKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpIHx8ICFkZWZpbmVkIChfU1RMUF9OT19NRVRIT0RfU1BFQ0lBTElaQVRJT04pCisgIF9fY29uc3RydWN0X2NoZWNrZXIoY29uc3QgdmFsdWVfdHlwZSogX19mLCBjb25zdCB2YWx1ZV90eXBlKiBfX2wpIHsKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfX2NoZWNrX3B0cl9yYW5nZShfX2YsX19sKSkKKyAgfQorCisgIHR5cGVkZWYgX0RCR19pdGVyX2Jhc2U8X0NvbnRhaW5lcj4gX0l0ZVR5cGU7CisgIF9fY29uc3RydWN0X2NoZWNrZXIoY29uc3QgX0l0ZVR5cGUmIF9fZiwgY29uc3QgX0l0ZVR5cGUmIF9fbCkgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9fY2hlY2tfcmFuZ2UoX19mLF9fbCkpCisgIH0KKyNlbmRpZgorfTsKKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9PTERfSFBfSVRFUkFUT1JfUVVFUklFUykKKyMgIGlmIGRlZmluZWQgKF9TVExQX05FU1RFRF9UWVBFX1BBUkFNX0JVRykgfHxcCisgICAgIChkZWZpbmVkIChfX1NVTlBST19DQykgJiYgX19TVU5QUk9fQ0MgPCAweDYwMCkgfHxcCisgICAgIChkZWZpbmVkIChfU1RMUF9NU1ZDKSAmJiAoX1NUTFBfTVNWQyA8IDExMDApKQorIyAgICBkZWZpbmUgX1NUTFBfREVCVUdfVVNFX0RJU1RJTkNUX1ZBTFVFX1RZUEVfSEVMUEVSUyAxCisjICBlbmRpZgorCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9Db250YWluZXI+CitpbmxpbmUgcHRyZGlmZl90KgorZGlzdGFuY2VfdHlwZShjb25zdCBfU1RMUF9QUklWIF9EQkdfaXRlcl9iYXNlPF9Db250YWluZXI+JikgeyByZXR1cm4gKHB0cmRpZmZfdCopIDA7IH0KKworIyAgaWYgIWRlZmluZWQgKF9TVExQX0RFQlVHX1VTRV9ESVNUSU5DVF9WQUxVRV9UWVBFX0hFTFBFUlMpCit0ZW1wbGF0ZSA8Y2xhc3MgX0NvbnRhaW5lcj4KK2lubGluZSBfU1RMUF9UWVBFTkFNRV9PTl9SRVRVUk5fVFlQRSBfU1RMUF9QUklWIF9EQkdfaXRlcl9iYXNlPF9Db250YWluZXI+Ojp2YWx1ZV90eXBlKgordmFsdWVfdHlwZShjb25zdCBfU1RMUF9QUklWIF9EQkdfaXRlcl9iYXNlPF9Db250YWluZXI+JikgeworICB0eXBlZGVmIHR5cGVuYW1lIF9TVExQX1BSSVYgX0RCR19pdGVyX2Jhc2U8X0NvbnRhaW5lcj46OnZhbHVlX3R5cGUgX1ZhbDsKKyAgcmV0dXJuIChfVmFsKikwOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NvbnRhaW5lcj4KK2lubGluZSBfU1RMUF9UWVBFTkFNRV9PTl9SRVRVUk5fVFlQRSBfU1RMUF9QUklWIF9EQkdfaXRlcl9iYXNlPF9Db250YWluZXI+OjpfSXRlcmF0b3JfY2F0ZWdvcnkKK2l0ZXJhdG9yX2NhdGVnb3J5KGNvbnN0IF9TVExQX1BSSVYgX0RCR19pdGVyX2Jhc2U8X0NvbnRhaW5lcj4mKSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1NUTFBfUFJJViBfREJHX2l0ZXJfYmFzZTxfQ29udGFpbmVyPjo6X0l0ZXJhdG9yX2NhdGVnb3J5IF9DYXRlZ29yeTsKKyAgcmV0dXJuIF9DYXRlZ29yeSgpOworfQorIyAgZW5kaWYKKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCisjZW5kaWYgLyogX1NUTFBfVVNFX09MRF9IUF9JVEVSQVRPUl9RVUVSSUVTICovCisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNlbmRpZiAvKiBJTlRFUk5BTF9IICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvZGVidWcvX2xpc3QuaCBiL3N0bC9kZWJ1Zy9fbGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMmVjMWMKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvZGVidWcvX2xpc3QuaApAQCAtMCwwICsxLDUwMiBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKy8qIE5PVEU6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIFNUTCBoZWFkZXJzLgorICogICBZb3Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4KKyAqLworCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0RCR19MSVNUX0gKKyNkZWZpbmUgX1NUTFBfSU5URVJOQUxfREJHX0xJU1RfSAorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0FMR09fSAorIyAgaW5jbHVkZSA8c3RsL19hbGdvLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9EQkdfSVRFUkFUT1JfSAorIyAgaW5jbHVkZSA8c3RsL2RlYnVnL19pdGVyYXRvci5oPgorI2VuZGlmCisKKyNkZWZpbmUgX1NUTFBfTk9OX0RCR19MSVNUIF9TVExQX1BSSVYgX1NUTFBfTk9OX0RCR19OQU1FKGxpc3QpIDxfVHAsIF9BbGxvYz4KKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKKyNpZiBkZWZpbmVkIChfU1RMUF9ERUJVR19VU0VfRElTVElOQ1RfVkFMVUVfVFlQRV9IRUxQRVJTKQordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgoraW5saW5lIF9UcCoKK3ZhbHVlX3R5cGUoY29uc3QgX1NUTFBfUFJJViBfREJHX2l0ZXJfYmFzZTwgX1NUTFBfTk9OX0RCR19MSVNUID4mKQoreyByZXR1cm4gKF9UcCopMDsgfQordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgoraW5saW5lIGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnCitpdGVyYXRvcl9jYXRlZ29yeShjb25zdCBfU1RMUF9QUklWIF9EQkdfaXRlcl9iYXNlPCBfU1RMUF9OT05fREJHX0xJU1QgPiYpCit7IHJldHVybiBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZygpOyB9CisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgX1NUTFBfREVGQVVMVF9BTExPQ0FUT1JfU0VMRUNUKF9UcCkgPgorY2xhc3MgbGlzdCA6CisjaWYgIWRlZmluZWQgKF9fRE1DX18pCisgICAgICAgICAgICAgcHJpdmF0ZQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fY29uc3RydWN0X2NoZWNrZXI8X1NUTFBfTk9OX0RCR19MSVNUID4KKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUEFSVElBTF9TUEVDX1dPUktBUk9VTkQpCisgICAgICAgICAgICwgcHVibGljIF9fc3RscG9ydF9jbGFzczxsaXN0PF9UcCwgX0FsbG9jPiA+CisjZW5kaWYKK3sKKyAgdHlwZWRlZiBfU1RMUF9OT05fREJHX0xJU1QgX0Jhc2U7CisgIHR5cGVkZWYgbGlzdDxfVHAsIF9BbGxvYz4gX1NlbGY7CisgIHR5cGVkZWYgX1NUTFBfUFJJViBfX2NvbnN0cnVjdF9jaGVja2VyPF9TVExQX05PTl9EQkdfTElTVCA+IF9Db25zdHJ1Y3RDaGVjazsKKworcHVibGljOgorICBfX0lNUE9SVF9DT05UQUlORVJfVFlQRURFRlMoX0Jhc2UpCisKK3B1YmxpYzoKKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9EQkdfaXRlcjxfQmFzZSwgX1NUTFBfUFJJViBfRGJnVHJhaXRzPF9Ob25jb25zdF90cmFpdHM8dmFsdWVfdHlwZT4gPiA+IGl0ZXJhdG9yOworICB0eXBlZGVmIF9TVExQX1BSSVYgX0RCR19pdGVyPF9CYXNlLCBfU1RMUF9QUklWIF9EYmdUcmFpdHM8X0NvbnN0X3RyYWl0czx2YWx1ZV90eXBlPiA+ID4gICAgY29uc3RfaXRlcmF0b3I7CisKKyAgX1NUTFBfREVDTEFSRV9CSURJUkVDVElPTkFMX1JFVkVSU0VfSVRFUkFUT1JTOworCitwcml2YXRlOgorICBfQmFzZSBfTV9ub25fZGJnX2ltcGw7CisgIF9TVExQX1BSSVYgX19vd25lZF9saXN0IF9NX2l0ZXJfbGlzdDsKKworICB2b2lkIF9JbnZhbGlkYXRlX2l0ZXJhdG9yKGNvbnN0IGl0ZXJhdG9yJiBfX2l0KQorICB7IF9TVExQX1BSSVYgX19pbnZhbGlkYXRlX2l0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9faXQpOyB9CisgIHZvaWQgX0ludmFsaWRhdGVfaXRlcmF0b3JzKGNvbnN0IGl0ZXJhdG9yJiBfX2ZpcnN0LCBjb25zdCBpdGVyYXRvciYgX19sYXN0KQorICB7IF9TVExQX1BSSVYgX19pbnZhbGlkYXRlX3JhbmdlKCZfTV9pdGVyX2xpc3QsIF9fZmlyc3QsIF9fbGFzdCk7IH0KKworICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjppdGVyYXRvciBfQmFzZV9pdGVyYXRvcjsKKworcHVibGljOgorICBleHBsaWNpdCBsaXN0KGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKSA6CisgICAgX01fbm9uX2RiZ19pbXBsKF9fYSksIF9NX2l0ZXJfbGlzdCgmX01fbm9uX2RiZ19pbXBsKSB7fQorCisjaWYgIWRlZmluZWQoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKKyAgZXhwbGljaXQgbGlzdChzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9feCA9IF9UcCgpLAorI2Vsc2UKKyAgbGlzdChzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9feCwKKyNlbmRpZiAvKiFfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKi8KKyAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX01fbm9uX2RiZ19pbXBsKF9fbiwgX194LCBfX2EpLCBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KKworI2lmIGRlZmluZWQoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKKyAgZXhwbGljaXQgbGlzdChzaXplX3R5cGUgX19uKQorICAgIDogX01fbm9uX2RiZ19pbXBsKF9fbiksIF9NX2l0ZXJfbGlzdCgmX01fbm9uX2RiZ19pbXBsKSB7fQorI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCisKKyAgbGlzdChfX21vdmVfc291cmNlPF9TZWxmPiBzcmMpCisgICAgOiBfTV9ub25fZGJnX2ltcGwoX19tb3ZlX3NvdXJjZTxfQmFzZT4oc3JjLmdldCgpLl9NX25vbl9kYmdfaW1wbCkpLAorICAgICAgX01faXRlcl9saXN0KCZfTV9ub25fZGJnX2ltcGwpIHsKKyNpZiBkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKSB8fCAoX1NUTFBfREVCVUdfTEVWRUwgPT0gX1NUTFBfU1RBTkRBUkRfREJHX0xFVkVMKQorICAgIHNyYy5nZXQoKS5fTV9pdGVyX2xpc3QuX0ludmFsaWRhdGVfYWxsKCk7CisjZWxzZQorICAgIHNyYy5nZXQoKS5fTV9pdGVyX2xpc3QuX1NldF9vd25lcihfTV9pdGVyX2xpc3QpOworI2VuZGlmCisgIH0KKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIC8vIFdlIGRvbid0IG5lZWQgYW55IGRpc3BhdGNoaW5nIHRyaWNrcyBoZXJlLCBiZWNhdXNlIGluc2VydCBkb2VzIGFsbCBvZgorICAvLyB0aGF0IGFueXdheS4KKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICBsaXN0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hIF9TVExQX0FMTE9DQVRPUl9UWVBFX0RGTCkKKyAgICA6IF9Db25zdHJ1Y3RDaGVjayhfX2ZpcnN0LCBfX2xhc3QpLAorICAgICAgX01fbm9uX2RiZ19pbXBsKF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2ZpcnN0KSwgX1NUTFBfUFJJViBfTm9uX0RiZ19pdGVyKF9fbGFzdCksIF9fYSksCisgICAgICBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KKyMgIGlmIGRlZmluZWQgKF9TVExQX05FRURTX0VYVFJBX1RFTVBMQVRFX0NPTlNUUlVDVE9SUykKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICBsaXN0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgICA6IF9Db25zdHJ1Y3RDaGVjayhfX2ZpcnN0LCBfX2xhc3QpLAorICAgICAgX01fbm9uX2RiZ19pbXBsKF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2ZpcnN0KSwgX1NUTFBfUFJJViBfTm9uX0RiZ19pdGVyKF9fbGFzdCkpLAorICAgICAgX01faXRlcl9saXN0KCZfTV9ub25fZGJnX2ltcGwpIHt9CisjICBlbmRpZgorI2Vsc2UKKworICBsaXN0KGNvbnN0IHZhbHVlX3R5cGUqIF9fZmlyc3QsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbGFzdCwKKyAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9Db25zdHJ1Y3RDaGVjayhfX2ZpcnN0LCBfX2xhc3QpLAorICAgICAgX01fbm9uX2RiZ19pbXBsKF9fZmlyc3QsIF9fbGFzdCwgX19hKSwKKyAgICAgIF9NX2l0ZXJfbGlzdCgmX01fbm9uX2RiZ19pbXBsKSB7fQorICBsaXN0KGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9Db25zdHJ1Y3RDaGVjayhfX2ZpcnN0LCBfX2xhc3QpLAorICAgICAgX01fbm9uX2RiZ19pbXBsKF9fZmlyc3QuX01faXRlcmF0b3IsIF9fbGFzdC5fTV9pdGVyYXRvciwgX19hKSwKKyAgICAgIF9NX2l0ZXJfbGlzdCgmX01fbm9uX2RiZ19pbXBsKSB7fQorCisjZW5kaWYKKworICBsaXN0KGNvbnN0IF9TZWxmJiBfX3gpIDoKKyAgICBfQ29uc3RydWN0Q2hlY2soX194KSwKKyAgICBfTV9ub25fZGJnX2ltcGwoX194Ll9NX25vbl9kYmdfaW1wbCkgLCBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KKworICBfU2VsZiYgb3BlcmF0b3I9KGNvbnN0IF9TZWxmJiBfX3gpIHsKKyAgICBpZiAodGhpcyAhPSAmX194KSB7CisgICAgICAvL1Nob3VsZCBub3QgaW52YWxpZGF0ZSBlbmQgaXRlcmF0b3IKKyAgICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9ycyhiZWdpbigpLCBlbmQoKSk7CisgICAgICBfTV9ub25fZGJnX2ltcGwgPSBfX3guX01fbm9uX2RiZ19pbXBsOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBhbGxvY2F0b3JfdHlwZSBnZXRfYWxsb2NhdG9yKCkgY29uc3QgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLmdldF9hbGxvY2F0b3IoKTsgfQorCisgIGl0ZXJhdG9yIGJlZ2luKCkgICAgICAgICAgICAgeyByZXR1cm4gaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLmJlZ2luKCkpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLmJlZ2luKCkpOyB9CisKKyAgaXRlcmF0b3IgZW5kKCkgICAgICAgICAgICAgICB7IHJldHVybiBpdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuZW5kKCkpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0ICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLmVuZCgpKTsgfQorCisgIHJldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKyAgcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSBjb25zdCB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSBjb25zdCB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwuc2l6ZSgpOyB9CisgIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5tYXhfc2l6ZSgpOyB9CisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwuZW1wdHkoKTsgfQorCisgIC8vIHRob3NlIGFyZSBoZXJlIHRvIGVuZm9yY2UgY2hlY2tpbmcKKyAgcmVmZXJlbmNlIGZyb250KCkgeworICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFlbXB0eSgpLCBfU3RsTXNnX0VNUFRZX0NPTlRBSU5FUikKKyAgICByZXR1cm4gKmJlZ2luKCk7CisgIH0KKyAgY29uc3RfcmVmZXJlbmNlIGZyb250KCkgY29uc3QgeworICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFlbXB0eSgpLCBfU3RsTXNnX0VNUFRZX0NPTlRBSU5FUikKKyAgICByZXR1cm4gKmJlZ2luKCk7CisgIH0KKyAgcmVmZXJlbmNlIGJhY2soKSB7CisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoIWVtcHR5KCksIF9TdGxNc2dfRU1QVFlfQ09OVEFJTkVSKQorICAgIHJldHVybiAqKC0tZW5kKCkpOworICB9CisgIGNvbnN0X3JlZmVyZW5jZSBiYWNrKCkgY29uc3QgeworICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFlbXB0eSgpLCBfU3RsTXNnX0VNUFRZX0NPTlRBSU5FUikKKyAgICByZXR1cm4gKigtLWVuZCgpKTsKKyAgfQorCisgIHZvaWQgc3dhcChfU2VsZiYgX194KSB7CisgICAgX01faXRlcl9saXN0Ll9Td2FwX293bmVycyhfX3guX01faXRlcl9saXN0KTsKKyAgICBfTV9ub25fZGJnX2ltcGwuc3dhcChfX3guX01fbm9uX2RiZ19pbXBsKTsKKyAgfQorCisjaWYgIWRlZmluZWQoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkgJiYgIWRlZmluZWQoX1NUTFBfTk9fQU5BQ0hST05JU01TKQorICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIGNvbnN0IF9UcCYgX194ID0gX1RwKCkpIHsKKyNlbHNlCisgIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBfX3BvcywgY29uc3QgX1RwJiBfX3gpIHsKKyNlbmRpZiAvKiFfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNICYmICFfU1RMUF9OT19BTkFDSFJPTklTTVMqLworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9vd25lcigmX01faXRlcl9saXN0LF9fcG9zKSkKKyAgICByZXR1cm4gaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCxfTV9ub25fZGJnX2ltcGwuaW5zZXJ0KF9fcG9zLl9NX2l0ZXJhdG9yLCBfX3gpICk7CisgIH0KKworI2lmIGRlZmluZWQoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkgJiYgIWRlZmluZWQoX1NUTFBfTk9fQU5BQ0hST05JU01TKQorICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3IgX19wb3MpIHsgcmV0dXJuIGluc2VydChfX3BvcywgX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRChfVHApKTsgfQorI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSAmJiAhX1NUTFBfTk9fQU5BQ0hST05JU01TKi8KKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkgeworIyAgaWYgKF9TVExQX0RFQlVHX0xFVkVMID09IF9TVExQX1NUQU5EQVJEX0RCR19MRVZFTCkKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9BcmVTYW1lVW5DVlR5cGVzPF9JbnB1dEl0ZXJhdG9yLCBpdGVyYXRvcj46Ol9SZXQgX0lzTGlzdEl0ZXJhdG9yOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FyZVNhbWVVbkNWVHlwZXM8X0lucHV0SXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPjo6X1JldCBfSXNMaXN0Q29uc3RJdGVyYXRvcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Mb3IyPF9Jc0xpc3RJdGVyYXRvciwgX0lzTGlzdENvbnN0SXRlcmF0b3I+OjpfUmV0IF9Eb0NoZWNrOworIyAgZW5kaWYKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfaWZfb3duZXIoJl9NX2l0ZXJfbGlzdCwgX19wb3MpKQorICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICAgIF9TVExQX1NURF9ERUJVR19DSEVDSyhfX2NoZWNrX2lmX25vdF9vd25lcigmX01faXRlcl9saXN0LCBfX2ZpcnN0LCBfRG9DaGVjaygpKSkKKyAgICBfTV9ub25fZGJnX2ltcGwuaW5zZXJ0KF9fcG9zLl9NX2l0ZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfTm9uX0RiZ19pdGVyKF9fZmlyc3QpLCBfU1RMUF9QUklWIF9Ob25fRGJnX2l0ZXIoX19sYXN0KSk7CisgIH0KKyNlbHNlCisgIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBjb25zdCBfVHAqIF9fZmlyc3QsIGNvbnN0IF9UcCogX19sYXN0KSB7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX2lmX293bmVyKCZfTV9pdGVyX2xpc3QsX19wb3MpKQorICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19wdHJfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKKyAgICBfTV9ub25fZGJnX2ltcGwuaW5zZXJ0KF9fcG9zLl9NX2l0ZXJhdG9yLCBfX2ZpcnN0LCBfX2xhc3QpOworICB9CisKKyAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wb3MsCisgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9vd25lcigmX01faXRlcl9saXN0LCBfX3BvcykpCisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgICAgX1NUTFBfU1REX0RFQlVHX0NIRUNLKF9fY2hlY2tfaWZfbm90X293bmVyKCZfTV9pdGVyX2xpc3QsIF9fZmlyc3QsIF9Eb0NoZWNrKCkpKQorICAgIF9NX25vbl9kYmdfaW1wbC5pbnNlcnQoX19wb3MuX01faXRlcmF0b3IsIF9fZmlyc3QuX01faXRlcmF0b3IsIF9fbGFzdC5fTV9pdGVyYXRvcik7CisgIH0KKyNlbmRpZgorCisgIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9feCkgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9vd25lcigmX01faXRlcl9saXN0LF9fcG9zKSkKKyAgICBfTV9ub25fZGJnX2ltcGwuaW5zZXJ0KF9fcG9zLl9NX2l0ZXJhdG9yLCBfX24sIF9feCk7CisgIH0KKworICB2b2lkIHB1c2hfYmFjayhjb25zdF9yZWZlcmVuY2UgX194KSB7IF9NX25vbl9kYmdfaW1wbC5wdXNoX2JhY2soX194KTsgfQorICB2b2lkIHBvcF9iYWNrKCkgeworICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFlbXB0eSgpLCBfU3RsTXNnX0VNUFRZX0NPTlRBSU5FUikKKyAgICBfSW52YWxpZGF0ZV9pdGVyYXRvcihlbmQoKSk7CisgICAgX01fbm9uX2RiZ19pbXBsLnBvcF9iYWNrKCk7CisgIH0KKworICB2b2lkIHB1c2hfZnJvbnQoY29uc3RfcmVmZXJlbmNlIF9feCkgeyBfTV9ub25fZGJnX2ltcGwucHVzaF9mcm9udChfX3gpOyB9CisgIHZvaWQgcG9wX2Zyb250KCkgeworICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFlbXB0eSgpLCBfU3RsTXNnX0VNUFRZX0NPTlRBSU5FUikKKyAgICBfSW52YWxpZGF0ZV9pdGVyYXRvcihiZWdpbigpKTsKKyAgICBfTV9ub25fZGJnX2ltcGwucG9wX2Zyb250KCk7CisgIH0KKworICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBfX3BvcykgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX0RlcmVmZXJlbmNlYWJsZShfX3BvcykpCisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX2lmX293bmVyKCZfTV9pdGVyX2xpc3QsX19wb3MpKQorICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9yKF9fcG9zKTsKKyAgICByZXR1cm4gaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCxfTV9ub25fZGJnX2ltcGwuZXJhc2UoX19wb3MuX01faXRlcmF0b3IpKTsKKyAgfQorICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpIHsKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0LCBiZWdpbigpLCBlbmQoKSkpCisgICAgX0ludmFsaWRhdGVfaXRlcmF0b3JzKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgcmV0dXJuIGl0ZXJhdG9yICgmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuZXJhc2UoX19maXJzdC5fTV9pdGVyYXRvciwgX19sYXN0Ll9NX2l0ZXJhdG9yKSk7CisgIH0KKworI2lmICFkZWZpbmVkKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCisgIHZvaWQgcmVzaXplKHNpemVfdHlwZSBfX25ld19zaXplLCBjb25zdCBfVHAmIF9feCA9IF9UcCgpKSB7CisjZWxzZQorICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgX19uZXdfc2l6ZSwgY29uc3QgX1RwJiBfX3gpIHsKKyNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0qLworICAgIF9CYXNlX2l0ZXJhdG9yIF9faSA9IF9NX25vbl9kYmdfaW1wbC5iZWdpbigpOworICAgIHNpemVfdHlwZSBfX2xlbiA9IDA7CisgICAgZm9yICggOyBfX2kgIT0gX01fbm9uX2RiZ19pbXBsLmVuZCgpICYmIF9fbGVuIDwgX19uZXdfc2l6ZTsgKytfX2ksICsrX19sZW4pOworCisgICAgaWYgKF9fbGVuID09IF9fbmV3X3NpemUpCisgICAgICBlcmFzZShpdGVyYXRvcigmX01faXRlcl9saXN0LCBfX2kpLCBlbmQoKSk7CisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gX19pID09IGVuZCgpCisgICAgICBfTV9ub25fZGJnX2ltcGwuaW5zZXJ0KF9NX25vbl9kYmdfaW1wbC5lbmQoKSwgX19uZXdfc2l6ZSAtIF9fbGVuLCBfX3gpOworICB9CisKKyNpZiBkZWZpbmVkKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCisgIHZvaWQgcmVzaXplKHNpemVfdHlwZSBfX25ld19zaXplKSB7IHJlc2l6ZShfX25ld19zaXplLCBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKF9UcCkpOyB9CisjZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKi8KKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCitwcml2YXRlOgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0ludGVnZXI+CisgIHZvaWQgX01fYXNzaWduX2Rpc3BhdGNoKF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX192YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKl9Jc0ludGVncmFsKi8pIHsKKyAgICBfTV9jaGVja19hc3NpZ24oX19uKTsKKyAgICBfTV9ub25fZGJnX2ltcGwuYXNzaWduKF9fbiwgX192YWwpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXI+CisgIHZvaWQgX01fYXNzaWduX2Rpc3BhdGNoKF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypfSXNJbnRlZ3JhbCovKSB7CisgICAgc2l6ZV90eXBlIF9fbGVuID0gZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KTsKKyAgICBfTV9jaGVja19hc3NpZ24oX19sZW4pOworICAgIF9NX25vbl9kYmdfaW1wbC5hc3NpZ24oX1NUTFBfUFJJViBfTm9uX0RiZ19pdGVyKF9fZmlyc3QpLCBfU1RMUF9QUklWIF9Ob25fRGJnX2l0ZXIoX19sYXN0KSk7CisgIH0KKworcHVibGljOgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZvaWQgYXNzaWduKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lzSW50ZWdyYWw8X0lucHV0SXRlcmF0b3I+OjpfUmV0IF9JbnRlZ3JhbDsKKyAgICBfTV9hc3NpZ25fZGlzcGF0Y2goX19maXJzdCwgX19sYXN0LCBfSW50ZWdyYWwoKSk7CisgIH0KKyNlbHNlCisgIHZvaWQgYXNzaWduKGNvbnN0IF9UcCogX19maXJzdCwgY29uc3QgX1RwKiBfX2xhc3QpIHsKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcHRyX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgICAgX01fbm9uX2RiZ19pbXBsLmFzc2lnbihfX2ZpcnN0LCBfX2xhc3QpOworICB9CisKKyAgdm9pZCBhc3NpZ24oY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KSB7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgICAgX01fbm9uX2RiZ19pbXBsLmFzc2lnbihfX2ZpcnN0Ll9NX2l0ZXJhdG9yLCBfX2xhc3QuX01faXRlcmF0b3IpOworICB9CisjZW5kaWYKKworcHJpdmF0ZToKKyAgdm9pZCBfTV9jaGVja19hc3NpZ24oc2l6ZV90eXBlIF9fbikgeworICAgIHNpemVfdHlwZSBfX3NpemUgPSBzaXplKCk7CisgICAgaWYgKF9fbiA8IF9fc2l6ZSkgeworICAgICAgaXRlcmF0b3IgX19pdCA9IGJlZ2luKCk7CisgICAgICBhZHZhbmNlKF9faXQsIF9fbiArIDEpOworICAgICAgX0ludmFsaWRhdGVfaXRlcmF0b3JzKF9faXQsIGVuZCgpKTsKKyAgICB9CisgIH0KKworcHVibGljOgorICB2b2lkIGFzc2lnbihzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9fdmFsKSB7CisgICAgX01fY2hlY2tfYXNzaWduKF9fbik7CisgICAgX01fbm9uX2RiZ19pbXBsLmFzc2lnbihfX24sIF9fdmFsKTsKKyAgfQorCisgIHZvaWQgcmVtb3ZlKGNvbnN0IF9UcCYgX194KSB7CisgICAgX0Jhc2VfaXRlcmF0b3IgX19maXJzdCA9IF9NX25vbl9kYmdfaW1wbC5iZWdpbigpLCBfX2xhc3QgPSBfTV9ub25fZGJnX2ltcGwuZW5kKCk7CisgICAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0KSB7CisgICAgICBfQmFzZV9pdGVyYXRvciBfX25leHQgPSBfX2ZpcnN0OworICAgICAgKytfX25leHQ7CisgICAgICBpZiAoX194ID09ICpfX2ZpcnN0KSB7CisgICAgICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9yKGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9fZmlyc3QpKTsKKyAgICAgICAgX01fbm9uX2RiZ19pbXBsLmVyYXNlKF9fZmlyc3QpOworICAgICAgfQorICAgICAgX19maXJzdCA9IF9fbmV4dDsKKyAgICB9CisgIH0KKworICB2b2lkIGNsZWFyKCkgeworICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9ycyhiZWdpbigpLCBlbmQoKSk7CisgICAgX01fbm9uX2RiZ19pbXBsLmNsZWFyKCk7CisgIH0KKworcHVibGljOgorICB2b2lkIHNwbGljZShpdGVyYXRvciBfX3BvcywgX1NlbGYmIF9feCkgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9vd25lcigmX01faXRlcl9saXN0LF9fcG9zKSkKKyAgICBfTV9ub25fZGJnX2ltcGwuc3BsaWNlKF9fcG9zLl9NX2l0ZXJhdG9yLCBfX3guX01fbm9uX2RiZ19pbXBsKTsKKyNpZiAoX1NUTFBfREVCVUdfTEVWRUwgIT0gX1NUTFBfU1RBTkRBUkRfREJHX0xFVkVMKQorICAgIGlmIChnZXRfYWxsb2NhdG9yKCkgPT0gX194LmdldF9hbGxvY2F0b3IoKSkKKyAgICAgIF9feC5fTV9pdGVyX2xpc3QuX1NldF9vd25lcihfTV9pdGVyX2xpc3QpOworICAgIGVsc2UKKyNlbmRpZgorICAgICAgLy8gU3RkOiAyMy4yLjIuNDo0CisgICAgICAvLyBlbmQgaXRlcmF0b3IgaXMgbm90IGludmFsaWRhdGVkOgorICAgICAgX194Ll9JbnZhbGlkYXRlX2l0ZXJhdG9ycyhfX3guYmVnaW4oKSwgX194LmVuZCgpKTsKKyAgfQorCisgIHZvaWQgc3BsaWNlKGl0ZXJhdG9yIF9fcG9zLCBfU2VsZiYgX194LCBpdGVyYXRvciBfX2kpIHsKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfaWZfb3duZXIoJl9NX2l0ZXJfbGlzdCxfX3BvcykpCisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfRGVyZWZlcmVuY2VhYmxlKF9faSkpCisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX2lmX293bmVyKCYoX194Ll9NX2l0ZXJfbGlzdCksX19pKSkKKyAgICBfTV9ub25fZGJnX2ltcGwuc3BsaWNlKF9fcG9zLl9NX2l0ZXJhdG9yLCBfX3guX01fbm9uX2RiZ19pbXBsLCBfX2kuX01faXRlcmF0b3IpOworI2lmIChfU1RMUF9ERUJVR19MRVZFTCAhPSBfU1RMUF9TVEFOREFSRF9EQkdfTEVWRUwpCisgICAgaWYgKGdldF9hbGxvY2F0b3IoKSA9PSBfX3guZ2V0X2FsbG9jYXRvcigpKQorICAgICAgX1NUTFBfUFJJViBfX2NoYW5nZV9pdGVfb3duZXIoX19pLCAmX01faXRlcl9saXN0KTsKKyAgICBlbHNlCisjZW5kaWYKKyAgICAgIC8vIFN0ZDogMjMuMi4yLjQ6NworICAgICAgX194Ll9JbnZhbGlkYXRlX2l0ZXJhdG9yKF9faSk7CisgIH0KKworICB2b2lkIHNwbGljZShpdGVyYXRvciBfX3BvcywgX1NlbGYmIF9feCwgaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KSB7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX2lmX293bmVyKCZfTV9pdGVyX2xpc3QsIF9fcG9zKSkKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0LCBfX3guYmVnaW4oKSwgX194LmVuZCgpKSkKKyAgICBfU1RMUF9ERUJVR19DSEVDSyh0aGlzID09ICZfX3ggPyAhX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fcG9zLCBfX2ZpcnN0LCBfX2xhc3QpIDogdHJ1ZSkKKyNpZiAoX1NUTFBfREVCVUdfTEVWRUwgIT0gX1NUTFBfU1RBTkRBUkRfREJHX0xFVkVMKQorICAgIGlmICh0aGlzLT5nZXRfYWxsb2NhdG9yKCkgPT0gX194LmdldF9hbGxvY2F0b3IoKSkKKyAgICAgIF9TVExQX1BSSVYgX19jaGFuZ2VfcmFuZ2Vfb3duZXIoX19maXJzdCwgX19sYXN0LCAmX01faXRlcl9saXN0KTsKKyAgICBlbHNlCisjZW5kaWYKKyAgICAgIC8vIFN0ZDogMjMuMi4yLjQ6MTIKKyAgICAgIF9feC5fSW52YWxpZGF0ZV9pdGVyYXRvcnMoX19maXJzdCwgX19sYXN0KTsKKyAgICBfTV9ub25fZGJnX2ltcGwuc3BsaWNlKF9fcG9zLl9NX2l0ZXJhdG9yLCBfX3guX01fbm9uX2RiZ19pbXBsLCBfX2ZpcnN0Ll9NX2l0ZXJhdG9yLCBfX2xhc3QuX01faXRlcmF0b3IpOworICB9CisKKyAgdm9pZCBtZXJnZShfU2VsZiYgX194KSB7CisjaWYgIWRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpCisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfU1REOjppc19zb3J0ZWQoYmVnaW4oKS5fTV9pdGVyYXRvciwgZW5kKCkuX01faXRlcmF0b3IpKQorICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1NURDo6aXNfc29ydGVkKF9feC5iZWdpbigpLl9NX2l0ZXJhdG9yLCBfX3guZW5kKCkuX01faXRlcmF0b3IpKQorI2VuZGlmCisgICAgX01fbm9uX2RiZ19pbXBsLm1lcmdlKF9feC5fTV9ub25fZGJnX2ltcGwpOworICAgIGlmICh0aGlzLT5nZXRfYWxsb2NhdG9yKCkgPT0gX194LmdldF9hbGxvY2F0b3IoKSkgeworICAgICAgX194Ll9NX2l0ZXJfbGlzdC5fU2V0X293bmVyKF9NX2l0ZXJfbGlzdCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgX194Ll9JbnZhbGlkYXRlX2l0ZXJhdG9ycyhfX3guYmVnaW4oKSwgX194LmVuZCgpKTsKKyAgICB9CisgIH0KKyAgdm9pZCByZXZlcnNlKCkgeworICAgIF9NX25vbl9kYmdfaW1wbC5yZXZlcnNlKCk7CisgIH0KKyAgdm9pZCB1bmlxdWUoKSB7CisgICAgX0Jhc2VfaXRlcmF0b3IgX19maXJzdCA9IF9NX25vbl9kYmdfaW1wbC5iZWdpbigpLCBfX2xhc3QgPSBfTV9ub25fZGJnX2ltcGwuZW5kKCk7CisgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KSByZXR1cm47CisgICAgX0Jhc2VfaXRlcmF0b3IgX19uZXh0ID0gX19maXJzdDsKKyAgICB3aGlsZSAoKytfX25leHQgIT0gX19sYXN0KSB7CisgICAgICBpZiAoKl9fZmlyc3QgPT0gKl9fbmV4dCkgeworICAgICAgICBfSW52YWxpZGF0ZV9pdGVyYXRvcihpdGVyYXRvcigmX01faXRlcl9saXN0LCBfX25leHQpKTsKKyAgICAgICAgX01fbm9uX2RiZ19pbXBsLmVyYXNlKF9fbmV4dCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIF9fZmlyc3QgPSBfX25leHQ7CisgICAgICBfX25leHQgPSBfX2ZpcnN0OworICAgIH0KKyAgfQorICB2b2lkIHNvcnQoKSB7CisgICAgX01fbm9uX2RiZ19pbXBsLnNvcnQoKTsKKyAgfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyAgdGVtcGxhdGUgPGNsYXNzIF9QcmVkaWNhdGU+CisgIHZvaWQgcmVtb3ZlX2lmKF9QcmVkaWNhdGUgX19wcmVkKSB7CisgICAgX0Jhc2VfaXRlcmF0b3IgX19maXJzdCA9IF9NX25vbl9kYmdfaW1wbC5iZWdpbigpLCBfX2xhc3QgPSBfTV9ub25fZGJnX2ltcGwuZW5kKCk7CisgICAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0KSB7CisgICAgICBfQmFzZV9pdGVyYXRvciBfX25leHQgPSBfX2ZpcnN0OworICAgICAgKytfX25leHQ7CisgICAgICBpZiAoX19wcmVkKCpfX2ZpcnN0KSkgeworICAgICAgICBfSW52YWxpZGF0ZV9pdGVyYXRvcihpdGVyYXRvcigmX01faXRlcl9saXN0LCBfX2ZpcnN0KSk7CisgICAgICAgIF9NX25vbl9kYmdfaW1wbC5lcmFzZShfX2ZpcnN0KTsKKyAgICAgIH0KKyAgICAgIF9fZmlyc3QgPSBfX25leHQ7CisgICAgfQorICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9CaW5hcnlQcmVkaWNhdGU+CisgIHZvaWQgdW5pcXVlKF9CaW5hcnlQcmVkaWNhdGUgX19iaW5hcnlfcHJlZCkgeworICAgIF9CYXNlX2l0ZXJhdG9yIF9fZmlyc3QgPSBfTV9ub25fZGJnX2ltcGwuYmVnaW4oKSwgX19sYXN0ID0gX01fbm9uX2RiZ19pbXBsLmVuZCgpOworICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkgcmV0dXJuOworICAgIF9CYXNlX2l0ZXJhdG9yIF9fbmV4dCA9IF9fZmlyc3Q7CisgICAgd2hpbGUgKCsrX19uZXh0ICE9IF9fbGFzdCkgeworICAgICAgaWYgKF9fYmluYXJ5X3ByZWQoKl9fZmlyc3QsICpfX25leHQpKSB7CisgICAgICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9yKGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9fbmV4dCkpOworICAgICAgICBfTV9ub25fZGJnX2ltcGwuZXJhc2UoX19uZXh0KTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgX19maXJzdCA9IF9fbmV4dDsKKyAgICAgIF9fbmV4dCA9IF9fZmlyc3Q7CisgICAgfQorICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9TdHJpY3RXZWFrT3JkZXJpbmc+CisgIHZvaWQgbWVyZ2UoX1NlbGYmIF9feCwgX1N0cmljdFdlYWtPcmRlcmluZyBfX2NvbXApIHsKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9TVEQ6OmlzX3NvcnRlZChfTV9ub25fZGJnX2ltcGwuYmVnaW4oKSwgX01fbm9uX2RiZ19pbXBsLmVuZCgpLCBfX2NvbXApKQorICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1NURDo6aXNfc29ydGVkKF9feC5iZWdpbigpLl9NX2l0ZXJhdG9yLCBfX3guZW5kKCkuX01faXRlcmF0b3IsIF9fY29tcCkpCisjZW5kaWYKKyAgICBfTV9ub25fZGJnX2ltcGwubWVyZ2UoX194Ll9NX25vbl9kYmdfaW1wbCwgX19jb21wKTsKKyAgICBpZiAodGhpcy0+Z2V0X2FsbG9jYXRvcigpID09IF9feC5nZXRfYWxsb2NhdG9yKCkpIHsKKyAgICAgIF9feC5fTV9pdGVyX2xpc3QuX1NldF9vd25lcihfTV9pdGVyX2xpc3QpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIF9feC5fSW52YWxpZGF0ZV9pdGVyYXRvcnMoX194LmJlZ2luKCksIF9feC5lbmQoKSk7CisgICAgfQorICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9TdHJpY3RXZWFrT3JkZXJpbmc+CisgIHZvaWQgc29ydChfU3RyaWN0V2Vha09yZGVyaW5nIF9fY29tcCkgeworICAgIF9NX25vbl9kYmdfaW1wbC5zb3J0KF9fY29tcCk7CisgIH0KKyNlbmRpZgorfTsKKworCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyN1bmRlZiBfU1RMUF9OT05fREJHX0xJU1QKKworI2VuZGlmIC8qIF9TVExQX0lOVEVSTkFMX0xJU1RfSCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RsL2RlYnVnL19zbGlzdC5oIGIvc3RsL2RlYnVnL19zbGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNTcwNjYKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvZGVidWcvX3NsaXN0LmgKQEAgLTAsMCArMSw2MTIgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogTW9zY293IENlbnRlciBmb3IgU1BBUkMgVGVjaG5vbG9neQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKy8qIE5PVEU6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIFNUTCBoZWFkZXJzLgorICogICBZb3Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4KKyAqLworCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0RCR19TTElTVF9ICisjZGVmaW5lIF9TVExQX0lOVEVSTkFMX0RCR19TTElTVF9ICisKKyNpZm5kZWYgX1NUTFBfREJHX0lURVJBVE9SX0gKKyMgIGluY2x1ZGUgPHN0bC9kZWJ1Zy9faXRlcmF0b3IuaD4KKyNlbmRpZgorCisjZGVmaW5lIF9TVExQX05PTl9EQkdfU0xJU1QgX1NUTFBfUFJJViBfU1RMUF9OT05fREJHX05BTUUoc2xpc3QpIDxfVHAsIF9BbGxvYz4KKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKKyNpZiBkZWZpbmVkIChfU1RMUF9ERUJVR19VU0VfRElTVElOQ1RfVkFMVUVfVFlQRV9IRUxQRVJTKQordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgoraW5saW5lIF9UcCoKK3ZhbHVlX3R5cGUoY29uc3QgX1NUTFBfUFJJViBfREJHX2l0ZXJfYmFzZTwgX1NUTFBfTk9OX0RCR19TTElTVCA+JikKK3sgcmV0dXJuIChfVHAqKTA7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgoraW5saW5lIGZvcndhcmRfaXRlcmF0b3JfdGFnCitpdGVyYXRvcl9jYXRlZ29yeShjb25zdCBfU1RMUF9QUklWIF9EQkdfaXRlcl9iYXNlPCBfU1RMUF9OT05fREJHX1NMSVNUID4mKQoreyByZXR1cm4gZm9yd2FyZF9pdGVyYXRvcl90YWcoKTsgfQorI2VuZGlmCisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKworLyoKKyAqIHNsaXN0IHNwZWNpYWwgZGVidWcgdHJhaXRzIHZlcnNpb24uCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBfVHJhaXRzPgorc3RydWN0IF9TbGlzdERiZ1RyYWl0cyA6IF9UcmFpdHMgeworICB0eXBlZGVmIF9TbGlzdERiZ1RyYWl0czx0eXBlbmFtZSBfVHJhaXRzOjpfQ29uc3RUcmFpdHM+IF9Db25zdFRyYWl0czsKKyAgdHlwZWRlZiBfU2xpc3REYmdUcmFpdHM8dHlwZW5hbWUgX1RyYWl0czo6X05vbkNvbnN0VHJhaXRzPiBfTm9uQ29uc3RUcmFpdHM7CisKKyAgLyoKKyAgICogV2UgZG9uJ3Qgd2FudCB0aGUgYmVmb3JlX2JlZ2luIGl0ZXJhdG9yIHRvIHJldHVybiBmYWxzZSBhdCBfRGVyZWZlcmVuY2VhYmxlCisgICAqIGNhbGwgdG8gZG8gbm90IGJyZWFrIHRoZSBjdXJyZW50IGRlYnVnIGZyYW1ld29yayBidXQgY2FsbGluZyAqIG9wZXJhdG9yIHNob3VsZAorICAgKiBmYWlsLgorICAgKi8KKyAgdGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcj4KKyAgc3RhdGljIGJvb2wgX0NoZWNrKGNvbnN0IF9JdGVyYXRvciYgX19pdCkKKyAgeyByZXR1cm4gIShfX2l0Ll9NX2l0ZXJhdG9yID09IChfX2l0Ll9HZXRfY29udGFpbmVyX3B0cigpKS0+YmVmb3JlX2JlZ2luKCkpOyB9Cit9OworCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgX1NUTFBfREVGQVVMVF9BTExPQ0FUT1JfU0VMRUNUKF9UcCkgPgorY2xhc3Mgc2xpc3QgOgorI2lmICFkZWZpbmVkIChfX0RNQ19fKQorICAgICAgICAgICAgIHByaXZhdGUKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfX2NvbnN0cnVjdF9jaGVja2VyPF9TVExQX05PTl9EQkdfU0xJU1QgPgorI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QQVJUSUFMX1NQRUNfV09SS0FST1VORCkKKyAgICAgICAgICAgICwgcHVibGljIF9fc3RscG9ydF9jbGFzczxzbGlzdDxfVHAsIF9BbGxvYz4gPgorI2VuZGlmCit7Citwcml2YXRlOgorICB0eXBlZGVmIF9TVExQX05PTl9EQkdfU0xJU1QgX0Jhc2U7CisgIHR5cGVkZWYgc2xpc3Q8X1RwLF9BbGxvYz4gX1NlbGY7CisgIHR5cGVkZWYgX1NUTFBfUFJJViBfX2NvbnN0cnVjdF9jaGVja2VyPF9TVExQX05PTl9EQkdfU0xJU1QgPiBfQ29uc3RydWN0Q2hlY2s7CisKK3B1YmxpYzoKKworICBfX0lNUE9SVF9DT05UQUlORVJfVFlQRURFRlMoX0Jhc2UpCisKKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9EQkdfaXRlcjxfQmFzZSwgX1NUTFBfUFJJViBfU2xpc3REYmdUcmFpdHM8X05vbmNvbnN0X3RyYWl0czx2YWx1ZV90eXBlPiA+ID4gaXRlcmF0b3I7CisgIHR5cGVkZWYgX1NUTFBfUFJJViBfREJHX2l0ZXI8X0Jhc2UsIF9TVExQX1BSSVYgX1NsaXN0RGJnVHJhaXRzPF9Db25zdF90cmFpdHM8dmFsdWVfdHlwZT4gPiA+ICAgIGNvbnN0X2l0ZXJhdG9yOworCisgIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdCB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwuZ2V0X2FsbG9jYXRvcigpOyB9Citwcml2YXRlOgorICBfQmFzZSBfTV9ub25fZGJnX2ltcGw7CisgIF9TVExQX1BSSVYgX19vd25lZF9saXN0IF9NX2l0ZXJfbGlzdDsKKworICB2b2lkIF9JbnZhbGlkYXRlX2l0ZXJhdG9yKGNvbnN0IGl0ZXJhdG9yJiBfX2l0KQorICB7IF9TVExQX1BSSVYgX19pbnZhbGlkYXRlX2l0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9faXQpOyB9CisgIHZvaWQgX0ludmFsaWRhdGVfaXRlcmF0b3JzKGNvbnN0IGl0ZXJhdG9yJiBfX2ZpcnN0LCBjb25zdCBpdGVyYXRvciYgX19sYXN0KQorICB7IF9TVExQX1BSSVYgX19pbnZhbGlkYXRlX3JhbmdlKCZfTV9pdGVyX2xpc3QsIF9fZmlyc3QsIF9fbGFzdCk7IH0KKworICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjppdGVyYXRvciBfQmFzZV9pdGVyYXRvcjsKKworcHVibGljOgorICBleHBsaWNpdCBzbGlzdChjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9NX25vbl9kYmdfaW1wbChfX2EpICwgX01faXRlcl9saXN0KCZfTV9ub25fZGJnX2ltcGwpIHt9CisKKyNpZiAhZGVmaW5lZChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQorICBleHBsaWNpdCBzbGlzdChzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3ggPSBfVHAoKSwKKyNlbHNlCisgIHNsaXN0KHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCwKKyNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0qLworICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gIGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfTV9ub25fZGJnX2ltcGwoX19uLCBfX3gsIF9fYSksIF9NX2l0ZXJfbGlzdCgmX01fbm9uX2RiZ19pbXBsKSB7fQorCisjaWYgZGVmaW5lZChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQorICBleHBsaWNpdCBzbGlzdChzaXplX3R5cGUgX19uKSA6IF9NX25vbl9kYmdfaW1wbChfX24pICwgX01faXRlcl9saXN0KCZfTV9ub25fZGJnX2ltcGwpIHt9CisjZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKi8KKworICBzbGlzdChfX21vdmVfc291cmNlPF9TZWxmPiBzcmMpCisgICAgOiBfTV9ub25fZGJnX2ltcGwoX19tb3ZlX3NvdXJjZTxfQmFzZT4oc3JjLmdldCgpLl9NX25vbl9kYmdfaW1wbCkpLAorICAgICAgX01faXRlcl9saXN0KCZfTV9ub25fZGJnX2ltcGwpIHsKKyNpZiBkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKSB8fCAoX1NUTFBfREVCVUdfTEVWRUwgPT0gX1NUTFBfU1RBTkRBUkRfREJHX0xFVkVMKQorICAgIHNyYy5nZXQoKS5fTV9pdGVyX2xpc3QuX0ludmFsaWRhdGVfYWxsKCk7CisjZWxzZQorICAgIHNyYy5nZXQoKS5fTV9pdGVyX2xpc3QuX1NldF9vd25lcihfTV9pdGVyX2xpc3QpOworI2VuZGlmCisgIH0KKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIC8vIFdlIGRvbid0IG5lZWQgYW55IGRpc3BhdGNoaW5nIHRyaWNrcyBoZXJlLCBiZWNhdXNlIF9NX2luc2VydF9hZnRlcl9yYW5nZQorICAvLyBhbHJlYWR5IGRvZXMgdGhlbS4KKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICBzbGlzdChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgX1NUTFBfQUxMT0NBVE9SX1RZUEVfREZMKQorICAgIDogX0NvbnN0cnVjdENoZWNrKF9fZmlyc3QsIF9fbGFzdCksCisgICAgICBfTV9ub25fZGJnX2ltcGwoX1NUTFBfUFJJViBfTm9uX0RiZ19pdGVyKF9fZmlyc3QpLCBfU1RMUF9QUklWIF9Ob25fRGJnX2l0ZXIoX19sYXN0KSwgX19hKSwKKyAgICAgIF9NX2l0ZXJfbGlzdCgmX01fbm9uX2RiZ19pbXBsKSB7fQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfTkVFRFNfRVhUUkFfVEVNUExBVEVfQ09OU1RSVUNUT1JTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHNsaXN0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgICA6IF9Db25zdHJ1Y3RDaGVjayhfX2ZpcnN0LCBfX2xhc3QpLAorICAgICAgX01fbm9uX2RiZ19pbXBsKF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2ZpcnN0KSwgX1NUTFBfUFJJViBfTm9uX0RiZ19pdGVyKF9fbGFzdCkpLAorICAgICAgX01faXRlcl9saXN0KCZfTV9ub25fZGJnX2ltcGwpIHt9CisjICBlbmRpZgorI2Vsc2UKKworICBzbGlzdChjb25zdCB2YWx1ZV90eXBlKiBfX2ZpcnN0LCBjb25zdCB2YWx1ZV90eXBlKiBfX2xhc3QsCisgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSAgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9Db25zdHJ1Y3RDaGVjayhfX2ZpcnN0LCBfX2xhc3QpLAorICAgICAgX01fbm9uX2RiZ19pbXBsKF9fZmlyc3QsIF9fbGFzdCwgX19hKSwKKyAgICAgIF9NX2l0ZXJfbGlzdCgmX01fbm9uX2RiZ19pbXBsKSB7fQorCisgIHNsaXN0KGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkgKQorICAgIDogX0NvbnN0cnVjdENoZWNrKF9fZmlyc3QsIF9fbGFzdCksCisgICAgICBfTV9ub25fZGJnX2ltcGwoX19maXJzdC5fTV9pdGVyYXRvciwgX19sYXN0Ll9NX2l0ZXJhdG9yLCBfX2EpLAorICAgICAgX01faXRlcl9saXN0KCZfTV9ub25fZGJnX2ltcGwpIHt9CisjZW5kaWYKKworICBzbGlzdChjb25zdCBfU2VsZiYgX194KSA6CisgICAgX0NvbnN0cnVjdENoZWNrKF9feCksCisgICAgX01fbm9uX2RiZ19pbXBsKF9feC5fTV9ub25fZGJnX2ltcGwpLCBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KKworICBfU2VsZiYgb3BlcmF0b3I9IChjb25zdCBfU2VsZiYgX194KSB7CisgICAgaWYgKHRoaXMgIT0gJl9feCkgeworICAgICAgX0ludmFsaWRhdGVfaXRlcmF0b3JzKGJlZ2luKCksIGVuZCgpKTsKKyAgICAgIF9NX25vbl9kYmdfaW1wbCA9IF9feC5fTV9ub25fZGJnX2ltcGw7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIH5zbGlzdCgpIHt9CisKKyAgdm9pZCBhc3NpZ24oc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX192YWwpIHsKKyAgICBfSW52YWxpZGF0ZV9pdGVyYXRvcnMoYmVnaW4oKSwgZW5kKCkpOworICAgIF9NX25vbl9kYmdfaW1wbC5hc3NpZ24oX19uLCBfX3ZhbCk7CisgIH0KKworICBpdGVyYXRvciBiZWZvcmVfYmVnaW4oKQorICB7IHJldHVybiBpdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuYmVmb3JlX2JlZ2luKCkpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGJlZm9yZV9iZWdpbigpIGNvbnN0CisgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5iZWZvcmVfYmVnaW4oKSk7IH0KKworICBpdGVyYXRvciBiZWdpbigpCisgIHsgcmV0dXJuIGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5iZWdpbigpKTsgfQorICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0CisgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5iZWdpbigpKTt9CisKKyAgaXRlcmF0b3IgZW5kKCkKKyAgeyByZXR1cm4gaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLmVuZCgpKTsgfQorICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdAorICB7IHJldHVybiBjb25zdF9pdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuZW5kKCkpOyB9CisKKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5lbXB0eSgpOyB9CisgIHNpemVfdHlwZSBzaXplKCkgY29uc3QgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLnNpemUoKTsgfQorICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwubWF4X3NpemUoKTsgfQorCisgIHZvaWQgc3dhcChfU2VsZiYgX194KSB7CisgICAgX01faXRlcl9saXN0Ll9Td2FwX293bmVycyhfX3guX01faXRlcl9saXN0KTsKKyAgICBfTV9ub25fZGJnX2ltcGwuc3dhcChfX3guX01fbm9uX2RiZ19pbXBsKTsKKyAgfQorCisgIHJlZmVyZW5jZSBmcm9udCgpIHsKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghZW1wdHkoKSwgX1N0bE1zZ19FTVBUWV9DT05UQUlORVIpCisgICAgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5mcm9udCgpOworICB9CisgIGNvbnN0X3JlZmVyZW5jZSBmcm9udCgpIGNvbnN0IHsKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghZW1wdHkoKSwgX1N0bE1zZ19FTVBUWV9DT05UQUlORVIpCisgICAgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5mcm9udCgpOworICB9CisgIHZvaWQgcHVzaF9mcm9udChjb25zdF9yZWZlcmVuY2UgX194KSB7IF9NX25vbl9kYmdfaW1wbC5wdXNoX2Zyb250KF9feCk7IH0KKyAgdm9pZCBwb3BfZnJvbnQoKSB7CisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoIWVtcHR5KCksIF9TdGxNc2dfRU1QVFlfQ09OVEFJTkVSKQorICAgIF9NX25vbl9kYmdfaW1wbC5wb3BfZnJvbnQoKTsKKyAgfQorICBpdGVyYXRvciBwcmV2aW91cyhjb25zdF9pdGVyYXRvciBfX3BvcykgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9vd25lcigmX01faXRlcl9saXN0LCBfX3BvcykpCisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoIShfX3Bvcy5fTV9pdGVyYXRvciA9PSBfTV9ub25fZGJnX2ltcGwuYmVmb3JlX2JlZ2luKCkpLCBfU3RsTXNnX0lOVkFMSURfQVJHVU1FTlQpCisgICAgcmV0dXJuIGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5wcmV2aW91cyhfX3Bvcy5fTV9pdGVyYXRvcikpOworICB9CisgIGNvbnN0X2l0ZXJhdG9yIHByZXZpb3VzKGNvbnN0X2l0ZXJhdG9yIF9fcG9zKSBjb25zdCB7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX2lmX293bmVyKCZfTV9pdGVyX2xpc3QsIF9fcG9zKSkKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghKF9fcG9zLl9NX2l0ZXJhdG9yID09IF9NX25vbl9kYmdfaW1wbC5iZWZvcmVfYmVnaW4oKSksIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKKyAgICByZXR1cm4gY29uc3RfaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLnByZXZpb3VzKF9fcG9zLl9NX2l0ZXJhdG9yKSk7CisgIH0KKworcHVibGljOgorCisjaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCisgIGl0ZXJhdG9yIGluc2VydF9hZnRlcihpdGVyYXRvciBfX3BvcywgY29uc3QgdmFsdWVfdHlwZSYgX194ID0gX1RwKCkpIHsKKyNlbHNlCisgIGl0ZXJhdG9yIGluc2VydF9hZnRlcihpdGVyYXRvciBfX3BvcywgY29uc3QgdmFsdWVfdHlwZSYgX194KSB7CisjZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKi8KKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9EZXJlZmVyZW5jZWFibGUoX19wb3MpKQorICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9vd25lcigmX01faXRlcl9saXN0LCBfX3BvcykpCisgICAgcmV0dXJuIGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsX01fbm9uX2RiZ19pbXBsLmluc2VydF9hZnRlcihfX3Bvcy5fTV9pdGVyYXRvciwgX194KSk7CisgIH0KKworI2lmIGRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCisgIGl0ZXJhdG9yIGluc2VydF9hZnRlcihpdGVyYXRvciBfX3BvcykgeworICAgIHJldHVybiBpbnNlcnRfYWZ0ZXIoX19wb3MsIF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQoX1RwKSk7CisgIH0KKyNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0qLworCisgIHZvaWQgaW5zZXJ0X2FmdGVyKGl0ZXJhdG9yIF9fcG9zLCBzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpIHsKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9EZXJlZmVyZW5jZWFibGUoX19wb3MpKQorICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9vd25lcigmX01faXRlcl9saXN0LCBfX3BvcykpCisgICAgX01fbm9uX2RiZ19pbXBsLmluc2VydF9hZnRlcihfX3Bvcy5fTV9pdGVyYXRvciwgX19uLCBfX3gpOworICB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZvaWQgYXNzaWduKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9ycyhiZWdpbigpLCBlbmQoKSk7CisgICAgX01fbm9uX2RiZ19pbXBsLmFzc2lnbihfU1RMUF9QUklWIF9Ob25fRGJnX2l0ZXIoX19maXJzdCksIF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2xhc3QpKTsKKyAgfQorI2Vsc2UKKyAgdm9pZCBhc3NpZ24oY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KSB7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgICAgX0ludmFsaWRhdGVfaXRlcmF0b3JzKGJlZ2luKCksIGVuZCgpKTsKKyAgICBfTV9ub25fZGJnX2ltcGwuYXNzaWduKF9fZmlyc3QuX01faXRlcmF0b3IsIF9fbGFzdC5fTV9pdGVyYXRvcik7CisgIH0KKyAgdm9pZCBhc3NpZ24oY29uc3QgdmFsdWVfdHlwZSAqX19maXJzdCwgY29uc3QgdmFsdWVfdHlwZSAqX19sYXN0KSB7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3B0cl9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9ycyhiZWdpbigpLCBlbmQoKSk7CisgICAgX01fbm9uX2RiZ19pbXBsLmFzc2lnbihfX2ZpcnN0LCBfX2xhc3QpOworICB9CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5JdGVyPgorICB2b2lkIGluc2VydF9hZnRlcihpdGVyYXRvciBfX3BvcywgX0luSXRlciBfX2ZpcnN0LCBfSW5JdGVyIF9fbGFzdCkgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX0RlcmVmZXJlbmNlYWJsZShfX3BvcykpCisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX2lmX293bmVyKCZfTV9pdGVyX2xpc3QsIF9fcG9zKSkKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKKyAgICBfTV9ub25fZGJnX2ltcGwuaW5zZXJ0X2FmdGVyKF9fcG9zLl9NX2l0ZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfTm9uX0RiZ19pdGVyKF9fZmlyc3QpLCBfU1RMUF9QUklWIF9Ob25fRGJnX2l0ZXIoX19sYXN0KSk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0luSXRlcj4KKyAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIF9Jbkl0ZXIgX19maXJzdCwgX0luSXRlciBfX2xhc3QpIHsKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfaWZfb3duZXIoJl9NX2l0ZXJfbGlzdCwgX19wb3MpKQorICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCEoX19wb3MuX01faXRlcmF0b3IgPT0gX01fbm9uX2RiZ19pbXBsLmJlZm9yZV9iZWdpbigpKSwgX1N0bE1zZ19JTlZBTElEX0FSR1VNRU5UKQorICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICAgIF9NX25vbl9kYmdfaW1wbC5pbnNlcnQoX19wb3MuX01faXRlcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9Ob25fRGJnX2l0ZXIoX19maXJzdCksIF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2xhc3QpKTsKKyAgfQorI2Vsc2UKKyAgdm9pZCBpbnNlcnRfYWZ0ZXIoaXRlcmF0b3IgX19wb3MsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX0RlcmVmZXJlbmNlYWJsZShfX3BvcykpCisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX2lmX293bmVyKCZfTV9pdGVyX2xpc3QsIF9fcG9zKSkKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKKyAgICBfTV9ub25fZGJnX2ltcGwuaW5zZXJ0X2FmdGVyKF9fcG9zLl9NX2l0ZXJhdG9yLCBfX2ZpcnN0Ll9NX2l0ZXJhdG9yLCBfX2xhc3QuX01faXRlcmF0b3IpOworICB9CisgIHZvaWQgaW5zZXJ0X2FmdGVyKGl0ZXJhdG9yIF9fcG9zLAorICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZV90eXBlKiBfX2ZpcnN0LCBjb25zdCB2YWx1ZV90eXBlKiBfX2xhc3QpIHsKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9EZXJlZmVyZW5jZWFibGUoX19wb3MpKQorICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9vd25lcigmX01faXRlcl9saXN0LCBfX3BvcykpCisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3B0cl9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICAgIF9NX25vbl9kYmdfaW1wbC5pbnNlcnRfYWZ0ZXIoX19wb3MuX01faXRlcmF0b3IsIF9fZmlyc3QsIF9fbGFzdCk7CisgIH0KKworICB2b2lkIGluc2VydChpdGVyYXRvciBfX3BvcywgY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KSB7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX2lmX293bmVyKCZfTV9pdGVyX2xpc3QsIF9fcG9zKSkKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghKF9fcG9zLl9NX2l0ZXJhdG9yID09IF9NX25vbl9kYmdfaW1wbC5iZWZvcmVfYmVnaW4oKSksIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKKyAgICBfTV9ub25fZGJnX2ltcGwuaW5zZXJ0KF9fcG9zLl9NX2l0ZXJhdG9yLCBfX2ZpcnN0Ll9NX2l0ZXJhdG9yLCBfX2xhc3QuX01faXRlcmF0b3IpOworICB9CisgIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBjb25zdCB2YWx1ZV90eXBlKiBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWVfdHlwZSogX19sYXN0KSB7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX2lmX293bmVyKCZfTV9pdGVyX2xpc3QsX19wb3MpKQorICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCEoX19wb3MuX01faXRlcmF0b3IgPT0gX01fbm9uX2RiZ19pbXBsLmJlZm9yZV9iZWdpbigpKSwgX1N0bE1zZ19JTlZBTElEX0FSR1VNRU5UKQorICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19wdHJfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKKyAgICBfTV9ub25fZGJnX2ltcGwuaW5zZXJ0KF9fcG9zLl9NX2l0ZXJhdG9yLCBfX2ZpcnN0LCBfX2xhc3QpOworICB9CisjZW5kaWYKKworI2lmICFkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQorICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCA9IF9UcCgpKSB7CisjZWxzZQorICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkgeworI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX2lmX293bmVyKCZfTV9pdGVyX2xpc3QsIF9fcG9zKSkKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghKF9fcG9zLl9NX2l0ZXJhdG9yID09IF9NX25vbl9kYmdfaW1wbC5iZWZvcmVfYmVnaW4oKSksIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKKyAgICByZXR1cm4gaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLmluc2VydChfX3Bvcy5fTV9pdGVyYXRvciwgX194KSk7CisgIH0KKworI2lmIGRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCisgIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBfX3BvcykgeworICAgIHJldHVybiBpbnNlcnQoX19wb3MsIF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQoX1RwKSk7CisgIH0KKyNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0qLworCisgIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpIHsKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfaWZfb3duZXIoJl9NX2l0ZXJfbGlzdCwgX19wb3MpKQorICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCEoX19wb3MuX01faXRlcmF0b3IgPT0gX01fbm9uX2RiZ19pbXBsLmJlZm9yZV9iZWdpbigpKSwgX1N0bE1zZ19JTlZBTElEX0FSR1VNRU5UKQorICAgIF9NX25vbl9kYmdfaW1wbC5pbnNlcnQoX19wb3MuX01faXRlcmF0b3IsIF9fbiwgX194KTsKKyAgfQorCitwdWJsaWM6CisgIGl0ZXJhdG9yIGVyYXNlX2FmdGVyKGl0ZXJhdG9yIF9fcG9zKSB7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfRGVyZWZlcmVuY2VhYmxlKF9fcG9zKSkKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfaWZfb3duZXIoJl9NX2l0ZXJfbGlzdCxfX3BvcykpCisgICAgaXRlcmF0b3IgX190bXAgPSBfX3BvczsgKytfX3RtcDsKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9EZXJlZmVyZW5jZWFibGUoX190bXApKQorICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9yKF9fdG1wKTsKKyAgICByZXR1cm4gaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLmVyYXNlX2FmdGVyKF9fcG9zLl9NX2l0ZXJhdG9yKSk7CisgIH0KKyAgaXRlcmF0b3IgZXJhc2VfYWZ0ZXIoaXRlcmF0b3IgX19iZWZvcmVfZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX0RlcmVmZXJlbmNlYWJsZShfX2JlZm9yZV9maXJzdCkpCisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fYmVmb3JlX2ZpcnN0LCBfX2xhc3QsIGJlZ2luKCksIGVuZCgpKSkKKyAgICBpdGVyYXRvciBfX3RtcCA9IF9fYmVmb3JlX2ZpcnN0OyArK19fdG1wOworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX0RlcmVmZXJlbmNlYWJsZShfX3RtcCkpCisgICAgX0ludmFsaWRhdGVfaXRlcmF0b3JzKF9fdG1wLCBfX2xhc3QpOworICAgIHJldHVybiBpdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuZXJhc2VfYWZ0ZXIoX19iZWZvcmVfZmlyc3QuX01faXRlcmF0b3IsIF9fbGFzdC5fTV9pdGVyYXRvcikpOworICB9CisKKyAgaXRlcmF0b3IgZXJhc2UoaXRlcmF0b3IgX19wb3MpIHsKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9EZXJlZmVyZW5jZWFibGUoX19wb3MpKQorICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKF9fcG9zLl9NX2l0ZXJhdG9yICE9IF9NX25vbl9kYmdfaW1wbC5iZWZvcmVfYmVnaW4oKSwgX1N0bE1zZ19JTlZBTElEX0FSR1VNRU5UKQorICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9vd25lcigmX01faXRlcl9saXN0LCBfX3BvcykpCisgICAgX0ludmFsaWRhdGVfaXRlcmF0b3IoX19wb3MpOworICAgIHJldHVybiBpdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuZXJhc2UoX19wb3MuX01faXRlcmF0b3IpKTsKKyAgfQorICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpIHsKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0LCBiZWdpbigpLCBlbmQoKSkpCisgICAgX0ludmFsaWRhdGVfaXRlcmF0b3JzKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgcmV0dXJuIGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5lcmFzZShfX2ZpcnN0Ll9NX2l0ZXJhdG9yLCBfX2xhc3QuX01faXRlcmF0b3IpKTsKKyAgfQorCisjaWYgIWRlZmluZWQoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKKyAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9fbmV3X3NpemUsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCA9IF9UcCgpKSB7CisjZWxzZQorICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgX19uZXdfc2l6ZSwgY29uc3QgdmFsdWVfdHlwZSYgX194KSB7CisjZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKi8KKyAgICBfTV9ub25fZGJnX2ltcGwucmVzaXplKF9fbmV3X3NpemUsIF9feCk7CisgIH0KKworI2lmIGRlZmluZWQoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKKyAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9fbmV3X3NpemUpIHsgcmVzaXplKF9fbmV3X3NpemUsIF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQoX1RwKSk7IH0KKyNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0qLworCisgIHZvaWQgY2xlYXIoKSB7CisgICAgX0ludmFsaWRhdGVfaXRlcmF0b3JzKGJlZ2luKCksIGVuZCgpKTsKKyAgICBfTV9ub25fZGJnX2ltcGwuY2xlYXIoKTsKKyAgfQorCitwdWJsaWM6CisgIC8vIFJlbW92ZXMgYWxsIG9mIHRoZSBlbGVtZW50cyBmcm9tIHRoZSBsaXN0IF9feCB0byAqdGhpcywgaW5zZXJ0aW5nCisgIC8vIHRoZW0gaW1tZWRpYXRlbHkgYWZ0ZXIgX19wb3MuICBfX3ggbXVzdCBub3QgYmUgKnRoaXMuICBDb21wbGV4aXR5OgorICAvLyBsaW5lYXIgaW4gX194LnNpemUoKS4KKyAgdm9pZCBzcGxpY2VfYWZ0ZXIoaXRlcmF0b3IgX19wb3MsIF9TZWxmJiBfX3gpIHsKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9EZXJlZmVyZW5jZWFibGUoX19wb3MpKQorICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9vd25lcigmX01faXRlcl9saXN0LF9fcG9zKSkKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghKCZfX3ggPT0gdGhpcyksIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKKyAgICBfTV9ub25fZGJnX2ltcGwuc3BsaWNlX2FmdGVyKF9fcG9zLl9NX2l0ZXJhdG9yLCBfX3guX01fbm9uX2RiZ19pbXBsKTsKKyAgICBpZiAoZ2V0X2FsbG9jYXRvcigpID09IF9feC5nZXRfYWxsb2NhdG9yKCkpIHsKKyAgICAgIF9feC5fTV9pdGVyX2xpc3QuX1NldF9vd25lcihfTV9pdGVyX2xpc3QpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIF9feC5fSW52YWxpZGF0ZV9pdGVyYXRvcnMoX194LmJlZ2luKCksIF9feC5lbmQoKSk7CisgICAgfQorICB9CisKKyAgLy8gTW92ZXMgdGhlIGVsZW1lbnQgdGhhdCBmb2xsb3dzIF9fcHJldiB0byAqdGhpcywgaW5zZXJ0aW5nIGl0IGltbWVkaWF0ZWx5CisgIC8vICBhZnRlciBfX3Bvcy4gIFRoaXMgaXMgY29uc3RhbnQgdGltZS4KKyAgdm9pZCBzcGxpY2VfYWZ0ZXIoaXRlcmF0b3IgX19wb3MsIF9TZWxmJiBfX3gsIGl0ZXJhdG9yIF9fcHJldikgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX0RlcmVmZXJlbmNlYWJsZShfX3BvcykpCisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX2lmX293bmVyKCZfTV9pdGVyX2xpc3QsIF9fcG9zKSkKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9EZXJlZmVyZW5jZWFibGUoX19wcmV2KSkKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfaWZfb3duZXIoJl9feC5fTV9pdGVyX2xpc3QsIF9fcHJldikpCisgICAgaXRlcmF0b3IgX19lbGVtID0gX19wcmV2OyArK19fZWxlbTsKKyAgICBfTV9ub25fZGJnX2ltcGwuc3BsaWNlX2FmdGVyKF9fcG9zLl9NX2l0ZXJhdG9yLCBfX3guX01fbm9uX2RiZ19pbXBsLCBfX3ByZXYuX01faXRlcmF0b3IpOworICAgIGlmIChnZXRfYWxsb2NhdG9yKCkgPT0gX194LmdldF9hbGxvY2F0b3IoKSkgeworICAgICAgX1NUTFBfUFJJViBfX2NoYW5nZV9pdGVfb3duZXIoX19lbGVtLCAmX01faXRlcl9saXN0KTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBfX3guX0ludmFsaWRhdGVfaXRlcmF0b3IoX19lbGVtKTsKKyAgICB9CisgIH0KKworICAvLyBNb3ZlcyB0aGUgcmFuZ2UgW19fYmVmb3JlX2ZpcnN0ICsgMSwgX19iZWZvcmVfbGFzdCArIDEpIHRvICp0aGlzLAorICAvLyAgaW5zZXJ0aW5nIGl0IGltbWVkaWF0ZWx5IGFmdGVyIF9fcG9zLiAgVGhpcyBpcyBjb25zdGFudCB0aW1lLgorICB2b2lkIHNwbGljZV9hZnRlcihpdGVyYXRvciBfX3BvcywgX1NlbGYmIF9feCwKKyAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3IgX19iZWZvcmVfZmlyc3QsIGl0ZXJhdG9yIF9fYmVmb3JlX2xhc3QpIHsKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9EZXJlZmVyZW5jZWFibGUoX19wb3MpKQorICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9vd25lcigmX01faXRlcl9saXN0LF9fcG9zKSkKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19iZWZvcmVfZmlyc3QsIF9fYmVmb3JlX2xhc3QpKQorICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9vd25lcigmX194Ll9NX2l0ZXJfbGlzdCwgX19iZWZvcmVfZmlyc3QpKQorICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX0RlcmVmZXJlbmNlYWJsZShfX2JlZm9yZV9maXJzdCkpCisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfRGVyZWZlcmVuY2VhYmxlKF9fYmVmb3JlX2xhc3QpKQorICAgIGl0ZXJhdG9yIF9fZmlyc3QgPSBfX2JlZm9yZV9maXJzdDsgKytfX2ZpcnN0OworICAgIGl0ZXJhdG9yIF9fbGFzdCA9IF9fYmVmb3JlX2xhc3Q7ICsrX19sYXN0OworICAgIGlmIChnZXRfYWxsb2NhdG9yKCkgPT0gX194LmdldF9hbGxvY2F0b3IoKSkgeworICAgICAgX1NUTFBfUFJJViBfX2NoYW5nZV9yYW5nZV9vd25lcihfX2ZpcnN0LCBfX2xhc3QsICZfTV9pdGVyX2xpc3QpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIF9feC5fSW52YWxpZGF0ZV9pdGVyYXRvcnMoX19maXJzdCwgX19sYXN0KTsKKyAgICB9CisgICAgX01fbm9uX2RiZ19pbXBsLnNwbGljZV9hZnRlcihfX3Bvcy5fTV9pdGVyYXRvciwgX194Ll9NX25vbl9kYmdfaW1wbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYmVmb3JlX2ZpcnN0Ll9NX2l0ZXJhdG9yLCBfX2JlZm9yZV9sYXN0Ll9NX2l0ZXJhdG9yKTsKKyAgfQorCisgIC8vIExpbmVhciBpbiBkaXN0YW5jZShiZWdpbigpLCBfX3BvcyksIGFuZCBsaW5lYXIgaW4gX194LnNpemUoKS4KKyAgdm9pZCBzcGxpY2UoaXRlcmF0b3IgX19wb3MsIF9TZWxmJiBfX3gpIHsKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfaWZfb3duZXIoJl9NX2l0ZXJfbGlzdCxfX3BvcykpCisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoIShfX3Bvcy5fTV9pdGVyYXRvciA9PSBfTV9ub25fZGJnX2ltcGwuYmVmb3JlX2JlZ2luKCkpLCBfU3RsTXNnX0lOVkFMSURfQVJHVU1FTlQpCisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoISgmX194ID09IHRoaXMpLCBfU3RsTXNnX0lOVkFMSURfQVJHVU1FTlQpCisgICAgX01fbm9uX2RiZ19pbXBsLnNwbGljZShfX3Bvcy5fTV9pdGVyYXRvciwgX194Ll9NX25vbl9kYmdfaW1wbCk7CisgICAgaWYgKGdldF9hbGxvY2F0b3IoKSA9PSBfX3guZ2V0X2FsbG9jYXRvcigpKSB7CisgICAgICBfX3guX01faXRlcl9saXN0Ll9TZXRfb3duZXIoX01faXRlcl9saXN0KTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBfX3guX0ludmFsaWRhdGVfaXRlcmF0b3JzKF9feC5iZWdpbigpLCBfX3guZW5kKCkpOworICAgIH0KKyAgfQorCisgIC8vIExpbmVhciBpbiBkaXN0YW5jZShiZWdpbigpLCBfX3BvcyksIGFuZCBpbiBkaXN0YW5jZShfX3guYmVnaW4oKSwgX19pKS4KKyAgdm9pZCBzcGxpY2UoaXRlcmF0b3IgX19wb3MsIF9TZWxmJiBfX3gsIGl0ZXJhdG9yIF9faSkgeworICAgIC8vX19wb3Mgc2hvdWxkIGJlIG93bmVkIGJ5ICp0aGlzIGFuZCBub3QgYmUgdGhlIGJlZm9yZV9iZWdpbiBpdGVyYXRvcgorICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9vd25lcigmX01faXRlcl9saXN0LF9fcG9zKSkKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghKF9fcG9zLl9NX2l0ZXJhdG9yID09IF9NX25vbl9kYmdfaW1wbC5iZWZvcmVfYmVnaW4oKSksIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKKyAgICAvL19faSBzaG91bGQgYmUgZGVyZWZlcmVuY2VhYmxlLCBub3QgYmVmb3JlX2JlZ2luIGFuZCBiZSBvd25lZCBieSBfX3gKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9EZXJlZmVyZW5jZWFibGUoX19pKSkKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfaWZfb3duZXIoJl9feC5fTV9pdGVyX2xpc3QgLF9faSkpCisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoIShfX2kgPT0gX194LmJlZm9yZV9iZWdpbigpKSwgX1N0bE1zZ19JTlZBTElEX0FSR1VNRU5UKQorICAgIGlmIChnZXRfYWxsb2NhdG9yKCkgPT0gX194LmdldF9hbGxvY2F0b3IoKSkgeworICAgICAgX1NUTFBfUFJJViBfX2NoYW5nZV9pdGVfb3duZXIoX19pLCAmX01faXRlcl9saXN0KTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBfX3guX0ludmFsaWRhdGVfaXRlcmF0b3IoX19pKTsKKyAgICB9CisgICAgX01fbm9uX2RiZ19pbXBsLnNwbGljZShfX3Bvcy5fTV9pdGVyYXRvciwgX194Ll9NX25vbl9kYmdfaW1wbCwgX19pLl9NX2l0ZXJhdG9yKTsKKyAgfQorCisgIC8vIExpbmVhciBpbiBkaXN0YW5jZShiZWdpbigpLCBfX3BvcyksIGluIGRpc3RhbmNlKF9feC5iZWdpbigpLCBfX2ZpcnN0KSwKKyAgLy8gYW5kIGluIGRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCkuCisgIHZvaWQgc3BsaWNlKGl0ZXJhdG9yIF9fcG9zLCBfU2VsZiYgX194LCBpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpIHsKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfaWZfb3duZXIoJl9NX2l0ZXJfbGlzdCxfX3BvcykpCisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoIShfX3Bvcy5fTV9pdGVyYXRvciA9PSBfTV9ub25fZGJnX2ltcGwuYmVmb3JlX2JlZ2luKCkpLCBfU3RsTXNnX0lOVkFMSURfQVJHVU1FTlQpCisgICAgLy9fU1RMUF9WRVJCT1NFX0FTU0VSVCgmX194ICE9IHRoaXMsIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0LCBfX3guYmVnaW4oKSwgX194LmVuZCgpKSkKKyAgICBpZiAoZ2V0X2FsbG9jYXRvcigpID09IF9feC5nZXRfYWxsb2NhdG9yKCkpIHsKKyAgICAgIF9TVExQX1BSSVYgX19jaGFuZ2VfcmFuZ2Vfb3duZXIoX19maXJzdCwgX19sYXN0LCAmX01faXRlcl9saXN0KTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBfX3guX0ludmFsaWRhdGVfaXRlcmF0b3JzKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgfQorICAgIF9NX25vbl9kYmdfaW1wbC5zcGxpY2UoX19wb3MuX01faXRlcmF0b3IsIF9feC5fTV9ub25fZGJnX2ltcGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ZpcnN0Ll9NX2l0ZXJhdG9yLCBfX2xhc3QuX01faXRlcmF0b3IpOworICB9CisKKyAgdm9pZCByZXZlcnNlKCkKKyAgeyBfTV9ub25fZGJnX2ltcGwucmV2ZXJzZSgpOyB9CisKKyAgdm9pZCByZW1vdmUoY29uc3QgdmFsdWVfdHlwZSYgX192YWwpIHsKKyAgICBfQmFzZV9pdGVyYXRvciBfX2ZpcnN0ID0gX01fbm9uX2RiZ19pbXBsLmJlZ2luKCksIF9fbGFzdCA9IF9NX25vbl9kYmdfaW1wbC5lbmQoKTsKKyAgICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QpIHsKKyAgICAgIF9CYXNlX2l0ZXJhdG9yIF9fbmV4dCA9IF9fZmlyc3Q7CisgICAgICArK19fbmV4dDsKKyAgICAgIGlmIChfX3ZhbCA9PSAqX19maXJzdCkgeworICAgICAgICBfSW52YWxpZGF0ZV9pdGVyYXRvcihpdGVyYXRvcigmX01faXRlcl9saXN0LCBfX2ZpcnN0KSk7CisgICAgICAgIF9NX25vbl9kYmdfaW1wbC5lcmFzZShfX2ZpcnN0KTsKKyAgICAgIH0KKyAgICAgIF9fZmlyc3QgPSBfX25leHQ7CisgICAgfQorICB9CisgIHZvaWQgdW5pcXVlKCkgeworICAgIF9CYXNlX2l0ZXJhdG9yIF9fZmlyc3QgPSBfTV9ub25fZGJnX2ltcGwuYmVnaW4oKSwgX19sYXN0ID0gX01fbm9uX2RiZ19pbXBsLmVuZCgpOworICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkgcmV0dXJuOworICAgIF9CYXNlX2l0ZXJhdG9yIF9fbmV4dCA9IF9fZmlyc3Q7CisgICAgd2hpbGUgKCsrX19uZXh0ICE9IF9fbGFzdCkgeworICAgICAgaWYgKCpfX2ZpcnN0ID09ICpfX25leHQpIHsKKyAgICAgICAgX0ludmFsaWRhdGVfaXRlcmF0b3IoaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX19uZXh0KSk7CisgICAgICAgIF9NX25vbl9kYmdfaW1wbC5lcmFzZShfX25leHQpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBfX2ZpcnN0ID0gX19uZXh0OworICAgICAgX19uZXh0ID0gX19maXJzdDsKKyAgICB9CisgIH0KKyAgdm9pZCBtZXJnZShfU2VsZiYgX194KSB7CisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoJl9feCAhPSB0aGlzLCBfU3RsTXNnX0lOVkFMSURfQVJHVU1FTlQpCisjaWYgIWRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpCisgICAgLyogY29tbWVudHMgYmVsb3cgZHVlIHRvIGJ1ZyBpbiBHQ0MgY29tcGlsZXJzOiBvbmVzIGVhdCBhbGwgbWVtb3J5ICBhbmQgZGllIGlmIHNlZQorICAgICAqIHNvbWV0aGluZyBsaWtlIG5hbWVzcGFjZV9uYW1lOjpmdW5jX25hbWUoKSAtIHB0cgorICAgICAqLworICAgIF9TVExQX0RFQlVHX0NIRUNLKCAvKiBfU1RMUF9TVEQ6OiAqLyBpc19zb3J0ZWQoX01fbm9uX2RiZ19pbXBsLmJlZ2luKCksIF9NX25vbl9kYmdfaW1wbC5lbmQoKSkpCisgICAgX1NUTFBfREVCVUdfQ0hFQ0soIC8qIF9TVExQX1NURDo6ICovIGlzX3NvcnRlZChfX3guYmVnaW4oKS5fTV9pdGVyYXRvciwgX194LmVuZCgpLl9NX2l0ZXJhdG9yKSkKKyNlbmRpZgorICAgIF9NX25vbl9kYmdfaW1wbC5tZXJnZShfX3guX01fbm9uX2RiZ19pbXBsKTsKKyAgICBpZiAoZ2V0X2FsbG9jYXRvcigpID09IF9feC5nZXRfYWxsb2NhdG9yKCkpIHsKKyAgICAgIF9feC5fTV9pdGVyX2xpc3QuX1NldF9vd25lcihfTV9pdGVyX2xpc3QpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIF9feC5fSW52YWxpZGF0ZV9pdGVyYXRvcnMoX194LmJlZ2luKCksIF9feC5lbmQoKSk7CisgICAgfQorICB9CisgIHZvaWQgc29ydCgpIHsKKyAgICBfTV9ub25fZGJnX2ltcGwuc29ydCgpOworICB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX1ByZWRpY2F0ZT4KKyAgdm9pZCByZW1vdmVfaWYoX1ByZWRpY2F0ZSBfX3ByZWQpIHsKKyAgICBfQmFzZV9pdGVyYXRvciBfX2ZpcnN0ID0gX01fbm9uX2RiZ19pbXBsLmJlZ2luKCksIF9fbGFzdCA9IF9NX25vbl9kYmdfaW1wbC5lbmQoKTsKKyAgICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QpIHsKKyAgICAgIF9CYXNlX2l0ZXJhdG9yIF9fbmV4dCA9IF9fZmlyc3Q7CisgICAgICArK19fbmV4dDsKKyAgICAgIGlmIChfX3ByZWQoKl9fZmlyc3QpKSB7CisgICAgICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9yKGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9fZmlyc3QpKTsKKyAgICAgICAgX01fbm9uX2RiZ19pbXBsLmVyYXNlKF9fZmlyc3QpOworICAgICAgfQorICAgICAgX19maXJzdCA9IF9fbmV4dDsKKyAgICB9CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0JpbmFyeVByZWRpY2F0ZT4KKyAgdm9pZCB1bmlxdWUoX0JpbmFyeVByZWRpY2F0ZSBfX3ByZWQpIHsKKyAgICBfQmFzZV9pdGVyYXRvciBfX2ZpcnN0ID0gX01fbm9uX2RiZ19pbXBsLmJlZ2luKCksIF9fbGFzdCA9IF9NX25vbl9kYmdfaW1wbC5lbmQoKTsKKyAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QpIHJldHVybjsKKyAgICBfQmFzZV9pdGVyYXRvciBfX25leHQgPSBfX2ZpcnN0OworICAgIHdoaWxlICgrK19fbmV4dCAhPSBfX2xhc3QpIHsKKyAgICAgIGlmIChfX2JpbmFyeV9wcmVkKCpfX2ZpcnN0LCAqX19uZXh0KSkgeworICAgICAgICBfSW52YWxpZGF0ZV9pdGVyYXRvcihpdGVyYXRvcigmX01faXRlcl9saXN0LCBfX25leHQpKTsKKyAgICAgICAgX01fbm9uX2RiZ19pbXBsLmVyYXNlKF9fbmV4dCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIF9fZmlyc3QgPSBfX25leHQ7CisgICAgICBfX25leHQgPSBfX2ZpcnN0OworICAgIH0KKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfU3RyaWN0V2Vha09yZGVyaW5nPgorICB2b2lkIG1lcmdlKF9TZWxmJiBfX3gsIF9TdHJpY3RXZWFrT3JkZXJpbmcgX19vcmQpIHsKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCgmX194ICE9IHRoaXMsIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKKyAgICAvKiBjb21tZW50cyBiZWxvdyBkdWUgdG8gYnVnIGluIEdDQyBjb21waWxlcnM6IG9uZXMgZWF0IGFsbCBtZW1vcnkgIGFuZCBkaWUgaWYgc2VlCisgICAgICogc29tZXRoaW5nIGxpa2UgbmFtZXNwYWNlX25hbWU6OmZ1bmNfbmFtZSgpIC0gcHRyCisgICAgICovCisgICAgX1NUTFBfREVCVUdfQ0hFQ0soIC8qIF9TVExQX1NURDo6ICovIGlzX3NvcnRlZChfTV9ub25fZGJnX2ltcGwuYmVnaW4oKSwgX01fbm9uX2RiZ19pbXBsLmVuZCgpLCBfX29yZCkpCisgICAgX1NUTFBfREVCVUdfQ0hFQ0soIC8qIF9TVExQX1NURDo6ICovIGlzX3NvcnRlZChfX3guYmVnaW4oKS5fTV9pdGVyYXRvciwgX194LmVuZCgpLl9NX2l0ZXJhdG9yLCBfX29yZCkpCisjZW5kaWYKKyAgICBfTV9ub25fZGJnX2ltcGwubWVyZ2UoX194Ll9NX25vbl9kYmdfaW1wbCwgX19vcmQpOworICAgIGlmIChnZXRfYWxsb2NhdG9yKCkgPT0gX194LmdldF9hbGxvY2F0b3IoKSkgeworICAgICAgX194Ll9NX2l0ZXJfbGlzdC5fU2V0X293bmVyKF9NX2l0ZXJfbGlzdCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgX194Ll9JbnZhbGlkYXRlX2l0ZXJhdG9ycyhfX3guYmVnaW4oKSwgX194LmVuZCgpKTsKKyAgICB9CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1N0cmljdFdlYWtPcmRlcmluZz4KKyAgdm9pZCBzb3J0KF9TdHJpY3RXZWFrT3JkZXJpbmcgX19jb21wKQorICB7IF9NX25vbl9kYmdfaW1wbC5zb3J0KF9fY29tcCk7IH0KKyNlbmRpZgorfTsKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjdW5kZWYgX1NUTFBfTk9OX0RCR19TTElTVAorCisjZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfREJHX1NMSVNUX0ggKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9kZWJ1Zy9fc3RyaW5nLmggYi9zdGwvZGVidWcvX3N0cmluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyYWRjNjMKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvZGVidWcvX3N0cmluZy5oCkBAIC0wLDAgKzEsODY2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk3LTE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKi8KKworI2lmbmRlZiBfU1RMUF9EQkdfU1RSSU5HX0gKKyNkZWZpbmUgX1NUTFBfREJHX1NUUklOR19ICisKKyNpZm5kZWYgX1NUTFBfREJHX0lURVJBVE9SX0gKKyMgIGluY2x1ZGUgPHN0bC9kZWJ1Zy9faXRlcmF0b3IuaD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworI2RlZmluZSBfU1RMUF9OT05fREJHX1NUUklOR19OQU1FIF9TVExQX05PTl9EQkdfTkFNRShzdHIpCisjZGVmaW5lIF9TVExQX05PTl9EQkdfU1RSSU5HIF9TVExQX1BSSVYgX1NUTFBfTk9OX0RCR19TVFJJTkdfTkFNRSA8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+CisKKyNpZiBkZWZpbmVkIChfU1RMUF9ERUJVR19VU0VfRElTVElOQ1RfVkFMVUVfVFlQRV9IRUxQRVJTKQordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCxjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgX0NoYXJUKgordmFsdWVfdHlwZShjb25zdCBfU1RMUF9QUklWIF9EQkdfaXRlcl9iYXNlPCBfU1RMUF9OT05fREJHX1NUUklORyA+JikKK3sgcmV0dXJuIChfQ2hhclQqKTA7IH0KK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KK2lubGluZSByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZworaXRlcmF0b3JfY2F0ZWdvcnkoY29uc3QgX1NUTFBfUFJJViBfREJHX2l0ZXJfYmFzZTwgX1NUTFBfTk9OX0RCR19TVFJJTkcgPiYpCit7IHJldHVybiByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZygpOyB9CisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorY2xhc3MgYmFzaWNfc3RyaW5nIDoKKyNpZiAhZGVmaW5lZCAoX19ETUNfXykKKyAgICAgICAgICAgICAgICAgICAgIHByaXZhdGUKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICBwdWJsaWMKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU1RMUF9QUklWIF9fY29uc3RydWN0X2NoZWNrZXI8X1NUTFBfTk9OX0RCR19TVFJJTkcgPgorI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QQVJUSUFMX1NQRUNfV09SS0FST1VORCkgJiYgIWRlZmluZWQgKGJhc2ljX3N0cmluZykKKyAgICAgICAgICAgICAgICAgICAsIHB1YmxpYyBfX3N0bHBvcnRfY2xhc3M8YmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiA+CisjZW5kaWYKK3sKK3Byb3RlY3RlZDoKKyAgdHlwZWRlZiBfU1RMUF9OT05fREJHX1NUUklORyBfQmFzZTsKKyAgdHlwZWRlZiBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+IF9TZWxmOworICB0eXBlZGVmIF9TVExQX1BSSVYgX19jb25zdHJ1Y3RfY2hlY2tlcjxfU1RMUF9OT05fREJHX1NUUklORyA+IF9Db25zdHJ1Y3RDaGVjazsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSXNQT0Q8X0NoYXJUPjo6X1R5cGUgX0NoYXJfSXNfUE9EOworCitwdWJsaWM6CisgIF9fSU1QT1JUX0NPTlRBSU5FUl9UWVBFREVGUyhfQmFzZSkKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6dHJhaXRzX3R5cGUgdHJhaXRzX3R5cGU7CisgIHR5cGVkZWYgX1NUTFBfUFJJViBfREJHX2l0ZXI8X0Jhc2UsIF9TVExQX1BSSVYgX0RiZ1RyYWl0czxfTm9uY29uc3RfdHJhaXRzPHZhbHVlX3R5cGU+ID4gPiBpdGVyYXRvcjsKKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9EQkdfaXRlcjxfQmFzZSwgX1NUTFBfUFJJViBfRGJnVHJhaXRzPF9Db25zdF90cmFpdHM8dmFsdWVfdHlwZT4gPiA+IGNvbnN0X2l0ZXJhdG9yOworICBfU1RMUF9ERUNMQVJFX1JBTkRPTV9BQ0NFU1NfUkVWRVJTRV9JVEVSQVRPUlM7CisKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29uc3RydWN0b3IsIGRlc3RydWN0b3IsIGFzc2lnbm1lbnQuCisgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Ol9SZXNlcnZlX3QgX1Jlc2VydmVfdDsKKworcHJpdmF0ZToKKyAgX0Jhc2UgX01fbm9uX2RiZ19pbXBsOworICBfU1RMUF9QUklWIF9fb3duZWRfbGlzdCBfTV9pdGVyX2xpc3Q7CisKKyAgdm9pZCBfSW52YWxpZGF0ZV9hbGwoKQorICB7IF9NX2l0ZXJfbGlzdC5fSW52YWxpZGF0ZV9hbGwoKTsgfQorICB2b2lkIF9Db21wYXJlX0NhcGFjaXR5IChzaXplX3R5cGUgX19vbGRfY2FwYWNpdHkpIHsKKyAgICBpZiAodGhpcy0+Y2FwYWNpdHkoKSA+IF9fb2xkX2NhcGFjaXR5KSB7CisgICAgICBfSW52YWxpZGF0ZV9hbGwoKTsKKyAgICB9CisgIH0KKyAgdm9pZCBfSW52YWxpZGF0ZV9pdGVyYXRvcihjb25zdCBpdGVyYXRvciYgX19pdCkKKyAgeyBfU1RMUF9QUklWIF9faW52YWxpZGF0ZV9pdGVyYXRvcigmX01faXRlcl9saXN0LCBfX2l0KTsgfQorICB2b2lkIF9JbnZhbGlkYXRlX2l0ZXJhdG9ycyhjb25zdCBpdGVyYXRvciYgX19mLCBjb25zdCBpdGVyYXRvciYgX19sKQorICB7IF9TVExQX1BSSVYgX19pbnZhbGlkYXRlX3JhbmdlKCZfTV9pdGVyX2xpc3QsIF9fZiwgX19sKTsgfQorCitwdWJsaWM6CisjaW5jbHVkZSA8c3RsL19zdHJpbmdfbnBvcy5oPgorCisgIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdCB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwuZ2V0X2FsbG9jYXRvcigpOyB9CisKKyAgZXhwbGljaXQgYmFzaWNfc3RyaW5nKGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX01fbm9uX2RiZ19pbXBsKF9fYSksIF9NX2l0ZXJfbGlzdCgmX01fbm9uX2RiZ19pbXBsKSB7fQorCisgIGJhc2ljX3N0cmluZyhfUmVzZXJ2ZV90IF9fciwgc2l6ZV90IF9fbiwKKyAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX01fbm9uX2RiZ19pbXBsKF9fciwgX19uLCBfX2EpLCBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KKworICBiYXNpY19zdHJpbmcoY29uc3QgX1NlbGYmIF9fcykKKyAgICA6IF9Db25zdHJ1Y3RDaGVjayhfX3MpLAorICAgICAgX01fbm9uX2RiZ19pbXBsKF9fcy5fTV9ub25fZGJnX2ltcGwpLCBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KKworICBiYXNpY19zdHJpbmcoY29uc3QgX1NlbGYmIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uID0gbnBvcywKKyAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX01fbm9uX2RiZ19pbXBsKF9fcy5fTV9ub25fZGJnX2ltcGwsIF9fcG9zLCBfX24sIF9fYSksCisgICAgICBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KKworICBiYXNpY19zdHJpbmcoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX24sCisgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9Db25zdHJ1Y3RDaGVjayhfX3MpLCBfTV9ub25fZGJnX2ltcGwoX19zLCBfX24sIF9fYSksCisgICAgICBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KKworICBiYXNpY19zdHJpbmcoY29uc3QgX0NoYXJUKiBfX3MsCisgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9Db25zdHJ1Y3RDaGVjayhfX3MpLAorICAgICAgX01fbm9uX2RiZ19pbXBsKF9fcywgX19hKSwgX01faXRlcl9saXN0KCZfTV9ub25fZGJnX2ltcGwpIHt9CisKKyAgYmFzaWNfc3RyaW5nKHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MsCisgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9NX25vbl9kYmdfaW1wbChfX24sIF9fYywgX19hKSwgX01faXRlcl9saXN0KCZfTV9ub25fZGJnX2ltcGwpIHt9CisKKyAgYmFzaWNfc3RyaW5nKF9fbW92ZV9zb3VyY2U8X1NlbGY+IHNyYykKKyAgICA6IF9NX25vbl9kYmdfaW1wbChfX21vdmVfc291cmNlPF9CYXNlID4oc3JjLmdldCgpLl9NX25vbl9kYmdfaW1wbCkpLAorICAgICAgX01faXRlcl9saXN0KCZfTV9ub25fZGJnX2ltcGwpIHsKKyNpZiBkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKSB8fCAoX1NUTFBfREVCVUdfTEVWRUwgPT0gX1NUTFBfU1RBTkRBUkRfREJHX0xFVkVMKQorICAgIHNyYy5nZXQoKS5fTV9pdGVyX2xpc3QuX0ludmFsaWRhdGVfYWxsKCk7CisjZWxzZQorICAgIHNyYy5nZXQoKS5fTV9pdGVyX2xpc3QuX1NldF9vd25lcihfTV9pdGVyX2xpc3QpOworI2VuZGlmCisgIH0KKworI2lmICFkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKSB8fCBkZWZpbmVkKF9fTVJDX18pIHx8IGRlZmluZWQoX19TQ19fKQorICBiYXNpY19zdHJpbmcoY29uc3QgX0NoYXJUKiBfX2YsIGNvbnN0IF9DaGFyVCogX19sLAorICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfQ29uc3RydWN0Q2hlY2soX19mLCBfX2wpLAorICAgICAgX01fbm9uX2RiZ19pbXBsKF9fZiwgX19sLCBfX2EpLCBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkgeworICB9CisgIGJhc2ljX3N0cmluZyhjb25zdF9pdGVyYXRvciBfX2YsIGNvbnN0X2l0ZXJhdG9yIF9fbCwKKyAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlICYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9Db25zdHJ1Y3RDaGVjayhfX2YsIF9fbCksCisgICAgICBfTV9ub25fZGJnX2ltcGwoX19mLl9NX2l0ZXJhdG9yLCBfX2wuX01faXRlcmF0b3IsIF9fYSksIF9NX2l0ZXJfbGlzdCgmX01fbm9uX2RiZ19pbXBsKSB7CisgIH0KKyNlbHNlCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgYmFzaWNfc3RyaW5nKF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLAorICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUgJiBfX2EgX1NUTFBfQUxMT0NBVE9SX1RZUEVfREZMKQorICAgIDogX0NvbnN0cnVjdENoZWNrKF9fZiwgX19sKSwKKyAgICAgIF9NX25vbl9kYmdfaW1wbChfU1RMUF9QUklWIF9Ob25fRGJnX2l0ZXIoX19mKSwgX1NUTFBfUFJJViBfTm9uX0RiZ19pdGVyKF9fbCksIF9fYSksCisgICAgICBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KKyMgIGlmIGRlZmluZWQgKF9TVExQX05FRURTX0VYVFJBX1RFTVBMQVRFX0NPTlNUUlVDVE9SUykKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICBiYXNpY19zdHJpbmcoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wpCisgICAgOiBfQ29uc3RydWN0Q2hlY2soX19mLCBfX2wpLAorICAgICAgX01fbm9uX2RiZ19pbXBsKF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2YpLCBfU1RMUF9QUklWIF9Ob25fRGJnX2l0ZXIoX19sKSksCisgICAgICBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KKyMgIGVuZGlmCisjZW5kaWYKKworcHJpdmF0ZToKKyAgLy8gY29uc3RydWN0b3IgZnJvbSBub24tZGVidWcgdmVyc2lvbiBmb3Igc3Vic3RyCisgIGJhc2ljX3N0cmluZyAoY29uc3QgX0Jhc2UmIF9feCkKKyAgICA6IF9NX25vbl9kYmdfaW1wbChfX3gpLCBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KKworcHVibGljOgorICBfU2VsZiYgb3BlcmF0b3I9KGNvbnN0IF9TZWxmJiBfX3MpIHsKKyAgICBpZiAodGhpcyAhPSAmX19zKSB7CisgICAgICBhc3NpZ24oX19zKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgX1NlbGYmIG9wZXJhdG9yPShjb25zdCBfQ2hhclQqIF9fcykgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoKF9fcyAhPSAwKSwgX1N0bE1zZ19JTlZBTElEX0FSR1VNRU5UKQorICAgIHJldHVybiBhc3NpZ24oX19zKTsKKyAgfQorCisgIF9TZWxmJiBvcGVyYXRvcj0oX0NoYXJUIF9fYykgeworICAgIHJldHVybiBhc3NpZ24oMSwgX19jKTsKKyAgfQorCisgIC8vIEl0ZXJhdG9ycy4KKyAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBpdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuYmVnaW4oKSk7IH0KKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBjb25zdF9pdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuYmVnaW4oKSk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLmVuZCgpKTsgfQorICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBjb25zdF9pdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuZW5kKCkpOyB9CisKKyAgcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSAgICAgICAgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisgIHJldmVyc2VfaXRlcmF0b3IgcmVuZCgpICAgICAgICAgICAgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSBjb25zdCAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKworICAvLyBTaXplLCBjYXBhY2l0eSwgZXRjLgorICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5zaXplKCk7IH0KKyAgc2l6ZV90eXBlIGxlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5sZW5ndGgoKTsgfQorICBzaXplX3QgbWF4X3NpemUoKSBjb25zdCB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwubWF4X3NpemUoKTsgfQorCisgIHZvaWQgcmVzaXplKHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MpIHsKKyAgICBpZiAoX19uID4gY2FwYWNpdHkoKSkKKyAgICAgIF9JbnZhbGlkYXRlX2FsbCgpOworICAgIGVsc2UgaWYgKF9fbiA8IHNpemUoKSkKKyAgICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9ycyhiZWdpbigpICsgX19uLCBlbmQoKSk7CisgICAgX01fbm9uX2RiZ19pbXBsLnJlc2l6ZShfX24sIF9fYyk7CisgIH0KKyAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9fbikgeyByZXNpemUoX19uLCBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKF9DaGFyVCkpOyB9CisgIHNpemVfdHlwZSBjYXBhY2l0eSgpIGNvbnN0IHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5jYXBhY2l0eSgpOyB9CisKKyAgdm9pZCByZXNlcnZlKHNpemVfdHlwZSBfX3MgPSAwKSB7CisgICAgaWYgKF9fcyA+IGNhcGFjaXR5KCkpIF9JbnZhbGlkYXRlX2FsbCgpOworICAgIF9NX25vbl9kYmdfaW1wbC5yZXNlcnZlKF9fcyk7CisgIH0KKworICB2b2lkIGNsZWFyKCkgeworICAgIF9JbnZhbGlkYXRlX2FsbCgpOworICAgIF9NX25vbl9kYmdfaW1wbC5jbGVhcigpOworICB9CisKKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5lbXB0eSgpOyB9CisKKyAgY29uc3RfcmVmZXJlbmNlIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fbikgY29uc3QgeworICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKF9fbiA8PSB0aGlzLT5zaXplKCksIF9TdGxNc2dfT1VUX09GX0JPVU5EUyk7CisgICAgcmV0dXJuIF9NX25vbl9kYmdfaW1wbFtfX25dOworICB9CisKKyAgcmVmZXJlbmNlIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fbikgeworICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKF9fbiA8IHRoaXMtPnNpemUoKSwgX1N0bE1zZ19PVVRfT0ZfQk9VTkRTKQorICAgIHJldHVybiBfTV9ub25fZGJnX2ltcGxbX19uXTsKKyAgfQorCisgIGNvbnN0X3JlZmVyZW5jZSBhdChzaXplX3R5cGUgX19uKSBjb25zdCB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwuYXQoX19uKTsgfQorICByZWZlcmVuY2UgYXQoc2l6ZV90eXBlIF9fbikgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLmF0KF9fbik7IH0KKworICAvLyBBcHBlbmQsIG9wZXJhdG9yKz0sIHB1c2hfYmFjay4KKyAgX1NlbGYmIG9wZXJhdG9yKz0oY29uc3QgX1NlbGYmIF9fcykgeyByZXR1cm4gYXBwZW5kKF9fcyk7IH0KKyAgX1NlbGYmIG9wZXJhdG9yKz0oY29uc3QgX0NoYXJUKiBfX3MpIHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKQorICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKChfX3MgIT0gMCksIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKKyAgICByZXR1cm4gYXBwZW5kKF9fcyk7CisgIH0KKyAgX1NlbGYmIG9wZXJhdG9yKz0oX0NoYXJUIF9fYykgeyByZXR1cm4gYXBwZW5kKDEsIF9fYyk7IH0KKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgorICBfU2VsZiYgYXBwZW5kKF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QpIHsKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0KSkKKyAgICBzaXplX3R5cGUgX19vbGRfY2FwYWNpdHkgPSBjYXBhY2l0eSgpOworICAgIF9NX25vbl9kYmdfaW1wbC5hcHBlbmQoX1NUTFBfUFJJViBfTm9uX0RiZ19pdGVyKF9fZmlyc3QpLCBfU1RMUF9QUklWIF9Ob25fRGJnX2l0ZXIoX19sYXN0KSk7CisgICAgX0NvbXBhcmVfQ2FwYWNpdHkoX19vbGRfY2FwYWNpdHkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykgfHwgXAorICAgICFkZWZpbmVkIChfU1RMUF9OT19NRVRIT0RfU1BFQ0lBTElaQVRJT04pICYmICFkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKQorICBfU2VsZiYgYXBwZW5kKGNvbnN0IF9DaGFyVCogX19mLCBjb25zdCBfQ2hhclQqIF9fbCkgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2YpIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2wpCisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3B0cl9yYW5nZShfX2YsIF9fbCkpCisgICAgc2l6ZV90eXBlIF9fb2xkX2NhcGFjaXR5ID0gY2FwYWNpdHkoKTsKKyAgICBfTV9ub25fZGJnX2ltcGwuYXBwZW5kKF9fZiwgX19sKTsKKyAgICBfQ29tcGFyZV9DYXBhY2l0eShfX29sZF9jYXBhY2l0eSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgX1NlbGYmIGFwcGVuZChjb25zdF9pdGVyYXRvciBfX2YsIGNvbnN0X2l0ZXJhdG9yIF9fbCkgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2YsIF9fbCkpCisgICAgc2l6ZV90eXBlIF9fb2xkX2NhcGFjaXR5ID0gY2FwYWNpdHkoKTsKKyAgICBfTV9ub25fZGJnX2ltcGwuYXBwZW5kKF9fZi5fTV9pdGVyYXRvciwgX19sLl9NX2l0ZXJhdG9yKTsKKyAgICBfQ29tcGFyZV9DYXBhY2l0eShfX29sZF9jYXBhY2l0eSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisjZW5kaWYKKworICBfU2VsZiYgYXBwZW5kKGNvbnN0IF9TZWxmJiBfX3MpIHsKKyAgICBzaXplX3R5cGUgX19vbGRfY2FwYWNpdHkgPSBjYXBhY2l0eSgpOworICAgIF9NX25vbl9kYmdfaW1wbC5hcHBlbmQoX19zLl9NX25vbl9kYmdfaW1wbCk7CisgICAgX0NvbXBhcmVfQ2FwYWNpdHkoX19vbGRfY2FwYWNpdHkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIF9TZWxmJiBhcHBlbmQoY29uc3QgX1NlbGYmIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSB7CisgICAgc2l6ZV90eXBlIF9fb2xkX2NhcGFjaXR5ID0gY2FwYWNpdHkoKTsKKyAgICBfTV9ub25fZGJnX2ltcGwuYXBwZW5kKF9fcy5fTV9ub25fZGJnX2ltcGwsIF9fcG9zLCBfX24pOworICAgIF9Db21wYXJlX0NhcGFjaXR5KF9fb2xkX2NhcGFjaXR5KTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBfU2VsZiYgYXBwZW5kKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uKSB7CisgICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCgoX19zICE9IDApLCBfU3RsTXNnX0lOVkFMSURfQVJHVU1FTlQpCisgICAgc2l6ZV90eXBlIF9fb2xkX2NhcGFjaXR5ID0gY2FwYWNpdHkoKTsKKyAgICBfTV9ub25fZGJnX2ltcGwuYXBwZW5kKF9fcywgX19uKTsKKyAgICBfQ29tcGFyZV9DYXBhY2l0eShfX29sZF9jYXBhY2l0eSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgX1NlbGYmIGFwcGVuZChjb25zdCBfQ2hhclQqIF9fcykgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoKF9fcyAhPSAwKSwgX1N0bE1zZ19JTlZBTElEX0FSR1VNRU5UKQorICAgIHNpemVfdHlwZSBfX29sZF9jYXBhY2l0eSA9IGNhcGFjaXR5KCk7CisgICAgX01fbm9uX2RiZ19pbXBsLmFwcGVuZChfX3MpOworICAgIF9Db21wYXJlX0NhcGFjaXR5KF9fb2xkX2NhcGFjaXR5KTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBfU2VsZiYgYXBwZW5kKHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MpIHsKKyAgICBzaXplX3R5cGUgX19vbGRfY2FwYWNpdHkgPSB0aGlzLT5jYXBhY2l0eSgpOworICAgIF9NX25vbl9kYmdfaW1wbC5hcHBlbmQoX19uLCBfX2MpOworICAgIF9Db21wYXJlX0NhcGFjaXR5KF9fb2xkX2NhcGFjaXR5KTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB2b2lkIHB1c2hfYmFjayhfQ2hhclQgX19jKSB7CisgICAgc2l6ZV90eXBlIF9fb2xkX2NhcGFjaXR5ID0gdGhpcy0+Y2FwYWNpdHkoKTsKKyAgICBfTV9ub25fZGJnX2ltcGwucHVzaF9iYWNrKF9fYyk7CisgICAgX0NvbXBhcmVfQ2FwYWNpdHkoX19vbGRfY2FwYWNpdHkpOworICB9CisKKyAgdm9pZCBwb3BfYmFjaygpIHsKKyAgICBfSW52YWxpZGF0ZV9pdGVyYXRvcih0aGlzLT5lbmQoKSk7CisgICAgX01fbm9uX2RiZ19pbXBsLnBvcF9iYWNrKCk7CisgIH0KKworICAvLyBBc3NpZ24KK3ByaXZhdGU6CisgIHZvaWQgX01fY2hlY2tfYXNzaWduKHNpemVfdHlwZSBfX24pIHsKKyAgICBpZiAoX19uID4gY2FwYWNpdHkoKSkgeworICAgICAgX0ludmFsaWRhdGVfYWxsKCk7CisgICAgfQorICAgIGVsc2UgaWYgKF9fbiA8IHNpemUoKSkgeworICAgICAgX0ludmFsaWRhdGVfaXRlcmF0b3JzKGJlZ2luKCkgKyBfX24sIGVuZCgpKTsKKyAgICB9CisgIH0KKworcHVibGljOgorICBfU2VsZiYgYXNzaWduKGNvbnN0IF9TZWxmJiBfX3MpIHsKKyAgICBfTV9jaGVja19hc3NpZ24oX19zLnNpemUoKSk7CisgICAgX01fbm9uX2RiZ19pbXBsLmFzc2lnbihfX3MuX01fbm9uX2RiZ19pbXBsKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBfU2VsZiYgYXNzaWduKGNvbnN0IF9TZWxmJiBfX3MsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgeworICAgIGlmIChfX3BvcyA8IF9fcy5zaXplKCkpIHsKKyAgICAgIF9NX2NoZWNrX2Fzc2lnbigobWluKSAoX19uLCBfX3Muc2l6ZSgpIC0gX19wb3MpKTsKKyAgICB9CisgICAgX01fbm9uX2RiZ19pbXBsLmFzc2lnbihfX3MuX01fbm9uX2RiZ19pbXBsLCBfX3BvcywgX19uKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBfU2VsZiYgYXNzaWduKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uKSB7CisgICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCgoX19zICE9IDApLCBfU3RsTXNnX0lOVkFMSURfQVJHVU1FTlQpCisgICAgX01fY2hlY2tfYXNzaWduKChtaW4pIChfVHJhaXRzOjpsZW5ndGgoX19zKSwgX19uKSk7CisgICAgX01fbm9uX2RiZ19pbXBsLmFzc2lnbihfX3MsIF9fcyArIF9fbik7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgX1NlbGYmIGFzc2lnbihjb25zdCBfQ2hhclQqIF9fcykgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoKF9fcyAhPSAwKSwgX1N0bE1zZ19JTlZBTElEX0FSR1VNRU5UKQorICAgIF9NX2NoZWNrX2Fzc2lnbihfVHJhaXRzOjpsZW5ndGgoX19zKSk7CisgICAgX01fbm9uX2RiZ19pbXBsLmFzc2lnbihfX3MpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIF9TZWxmJiBhc3NpZ24oc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYykgeworICAgIF9NX2NoZWNrX2Fzc2lnbihfX24pOworICAgIF9NX25vbl9kYmdfaW1wbC5hc3NpZ24oX19uLCBfX2MpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisjaWYgZGVmaW5lZChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorcHJpdmF0ZToKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnRlZ2VyPgorICB2b2lkIF9NX2Fzc2lnbl9kaXNwYXRjaChfSW50ZWdlciBfX24sIF9JbnRlZ2VyIF9feCwgY29uc3QgX190cnVlX3R5cGUmIC8qX0ludGVncmFsKi8pIHsKKyAgICBfTV9jaGVja19hc3NpZ24oX19uKTsKKyAgICBfTV9ub25fZGJnX2ltcGwuYXNzaWduKChzaXplX3R5cGUpX19uLCAoX0NoYXJUKV9feCk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcj4KKyAgdm9pZCBfTV9hc3NpZ25fZGlzcGF0Y2goX0lucHV0SXRlciBfX2YsIF9JbnB1dEl0ZXIgX19sLCBjb25zdCBfX2ZhbHNlX3R5cGUmIC8qX0ludGVncmFsKi8pICB7CisgICAgX01fY2hlY2tfYXNzaWduKGRpc3RhbmNlKF9fZiwgX19sKSk7CisgICAgX01fbm9uX2RiZ19pbXBsLmFzc2lnbihfU1RMUF9QUklWIF9Ob25fRGJnX2l0ZXIoX19mKSwgX1NUTFBfUFJJViBfTm9uX0RiZ19pdGVyKF9fbCkpOworICB9CitwdWJsaWM6CisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgorICBpbmxpbmUgX1NlbGYmIGFzc2lnbihfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0KSB7CisgICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fZmlyc3QpIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2xhc3QpCisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCkpCisgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXNJbnRlZ3JhbDxfSW5wdXRJdGVyPjo6X1JldCBfSW50ZWdyYWw7CisgICAgX01fYXNzaWduX2Rpc3BhdGNoKF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykgfHwgXAorICAgICFkZWZpbmVkIChfU1RMUF9OT19NRVRIT0RfU1BFQ0lBTElaQVRJT04pICYmICFkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKQorICBfU2VsZiYgYXNzaWduKGNvbnN0IF9DaGFyVCogX19mLCBjb25zdCBfQ2hhclQqIF9fbCkgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2YpIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2wpCisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3B0cl9yYW5nZShfX2YsIF9fbCkpCisgICAgX01fY2hlY2tfYXNzaWduKGRpc3RhbmNlKF9fZiwgX19sKSk7CisgICAgX01fbm9uX2RiZ19pbXBsLmFzc2lnbihfX2YsIF9fbCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIF9TZWxmJiBhc3NpZ24oY29uc3RfaXRlcmF0b3IgX19mLCBjb25zdF9pdGVyYXRvciBfX2wpIHsKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19mLCBfX2wpKQorICAgIF9NX2NoZWNrX2Fzc2lnbihkaXN0YW5jZShfX2YsIF9fbCkpOworICAgIF9NX25vbl9kYmdfaW1wbC5hc3NpZ24oX19mLl9NX2l0ZXJhdG9yLCBfX2wuX01faXRlcmF0b3IpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorI2VuZGlmCisKKyAgLy8gSW5zZXJ0CisgIF9TZWxmJiBpbnNlcnQoc2l6ZV90eXBlIF9fcG9zLCBjb25zdCBfU2VsZiYgX19zKSB7CisgICAgc2l6ZV90eXBlIF9fb2xkX2NhcGFjaXR5ID0gY2FwYWNpdHkoKTsKKyAgICBfTV9ub25fZGJnX2ltcGwuaW5zZXJ0KF9fcG9zLCBfX3MuX01fbm9uX2RiZ19pbXBsKTsKKyAgICBfQ29tcGFyZV9DYXBhY2l0eShfX29sZF9jYXBhY2l0eSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgX1NlbGYmIGluc2VydChzaXplX3R5cGUgX19wb3MsIGNvbnN0IF9TZWxmJiBfX3MsCisgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fYmVnLCBzaXplX3R5cGUgX19uKSB7CisgICAgc2l6ZV90eXBlIF9fb2xkX2NhcGFjaXR5ID0gY2FwYWNpdHkoKTsKKyAgICBfTV9ub25fZGJnX2ltcGwuaW5zZXJ0KF9fcG9zLCBfX3MuX01fbm9uX2RiZ19pbXBsLCBfX2JlZywgX19uKTsKKyAgICBfQ29tcGFyZV9DYXBhY2l0eShfX29sZF9jYXBhY2l0eSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgX1NlbGYmIGluc2VydChzaXplX3R5cGUgX19wb3MsIGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uKSB7CisgICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCgoX19zICE9IDApLCBfU3RsTXNnX0lOVkFMSURfQVJHVU1FTlQpCisgICAgc2l6ZV90eXBlIF9fb2xkX2NhcGFjaXR5ID0gY2FwYWNpdHkoKTsKKyAgICBfTV9ub25fZGJnX2ltcGwuaW5zZXJ0KF9fcG9zLCBfX3MsIF9fbik7CisgICAgX0NvbXBhcmVfQ2FwYWNpdHkoX19vbGRfY2FwYWNpdHkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIF9TZWxmJiBpbnNlcnQoc2l6ZV90eXBlIF9fcG9zLCBjb25zdCBfQ2hhclQqIF9fcykgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoKF9fcyAhPSAwKSwgX1N0bE1zZ19JTlZBTElEX0FSR1VNRU5UKQorICAgIHJldHVybiBpbnNlcnQoX19wb3MsIF9fcywgX1RyYWl0czo6bGVuZ3RoKF9fcykpOworICB9CisKKyAgX1NlbGYmIGluc2VydChzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MpIHsKKyAgICBzaXplX3R5cGUgX19vbGRfY2FwYWNpdHkgPSBjYXBhY2l0eSgpOworICAgIF9NX25vbl9kYmdfaW1wbC5pbnNlcnQoX19wb3MsIF9fbiwgX19jKTsKKyAgICBfQ29tcGFyZV9DYXBhY2l0eShfX29sZF9jYXBhY2l0eSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIF9fcCwgX0NoYXJUIF9fYykgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9vd25lcigmX01faXRlcl9saXN0LF9fcCkpCisgICAgc2l6ZV90eXBlIF9fb2xkX2NhcGFjaXR5ID0gY2FwYWNpdHkoKTsKKyAgICB0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IgX19yZXQgPSBfTV9ub25fZGJnX2ltcGwuaW5zZXJ0KF9fcC5fTV9pdGVyYXRvciwgX19jKTsKKyAgICBfQ29tcGFyZV9DYXBhY2l0eShfX29sZF9jYXBhY2l0eSk7CisgICAgcmV0dXJuIGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9fcmV0KTsKKyAgfQorCisgIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIF9fcCwgc2l6ZV90IF9fbiwgX0NoYXJUIF9fYykgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9vd25lcigmX01faXRlcl9saXN0LF9fcCkpCisgICAgc2l6ZV90eXBlIF9fb2xkX2NhcGFjaXR5ID0gY2FwYWNpdHkoKTsKKyAgICBfTV9ub25fZGJnX2ltcGwuaW5zZXJ0KF9fcC5fTV9pdGVyYXRvciwgX19uLCBfX2MpOworICAgIF9Db21wYXJlX0NhcGFjaXR5KF9fb2xkX2NhcGFjaXR5KTsKKyAgfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKK3ByaXZhdGU6CisgIHRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tSXRlcj4KKyAgdm9pZCBfTV9pbnNlcnRfYXV4IChpdGVyYXRvciBfX3AsIF9SYW5kb21JdGVyIF9fZmlyc3QsIF9SYW5kb21JdGVyIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX3RydWVfdHlwZSYgLypfSXNJdGVyYXRvciovKQorICB7IF9NX25vbl9kYmdfaW1wbC5pbnNlcnQoX19wLl9NX2l0ZXJhdG9yLCBfX2ZpcnN0Ll9NX2l0ZXJhdG9yLCBfX2xhc3QuX01faXRlcmF0b3IpOyB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcj4KKyAgdm9pZCBfTV9pbnNlcnRfYXV4IChpdGVyYXRvciBfX3AsIF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19mYWxzZV90eXBlJiAvKl9Jc0l0ZXJhdG9yKi8pIHsKKyAgICBfTV9ub25fZGJnX2ltcGwuaW5zZXJ0KF9fcC5fTV9pdGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2ZpcnN0KSwgX1NUTFBfUFJJViBfTm9uX0RiZ19pdGVyKF9fbGFzdCkpOworICB9CisKK3B1YmxpYzoKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXI+CisgIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIF9fcCwgX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCkgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9vd25lcigmX01faXRlcl9saXN0LF9fcCkpCisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsX19sYXN0KSkKKworICAgIC8qIEluIGRlYnVnIG1vZGUgd2UgYXJlIGVuY2Fwc3VsYXRpbmcgbm9uIGRlYnVnIHN0cmluZyBpdGVyYXRvcnMgaW4gZGVidWcgb25lLgorICAgICAqIERvaW5nIHNvIHRoZSBub24gZGVidWcgaW1wbGVtZW50YXRpb24gd2lsbCBub3QgY2hlY2sgZm9yIHNlbGYgaW5zZXJ0aW9uCisgICAgICogKHguaW5zZXJ0KHguYmVnaW4oKSwgeC5iZWdpbigpLCB4LmVuZCgpKS4gVG8gYXZvaWQgdGhpcyBwcm9ibGVtIHdlIHRyeSB0bworICAgICAqIGd1ZXNzIHdoZW4gX0lucHV0SXRlciBpcyBpdGVyYXRvciBvciBjb25zdF9pdGVyYXRvciBhbmQgaW4gdGhpcyBjYXNlIGNhbGwKKyAgICAgKiB0aGUgbm9uIGRlYnVnIGluc2VydCBtZXRob2Qgd2l0aCBub24gZGVidWcgc3RyaW5nIGl0ZXJhdG9yLgorICAgICAqLworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FyZVNhbWVVbkNWVHlwZXM8X0lucHV0SXRlciwgaXRlcmF0b3I+OjpfUmV0IF9Jc05vbkNvbnN0SXRlcmF0b3I7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQXJlU2FtZVVuQ1ZUeXBlczxfSW5wdXRJdGVyLCBjb25zdF9pdGVyYXRvcj46Ol9SZXQgX0lzQ29uc3RJdGVyYXRvcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Mb3IyPF9Jc05vbkNvbnN0SXRlcmF0b3IsIF9Jc0NvbnN0SXRlcmF0b3I+OjpfUmV0IF9Jc0l0ZXJhdG9yOworCisgICAgc2l6ZV90eXBlIF9fb2xkX2NhcGFjaXR5ID0gdGhpcy0+Y2FwYWNpdHkoKTsKKyAgICBfTV9pbnNlcnRfYXV4KF9fcCwgX19maXJzdCwgX19sYXN0LCBfSXNJdGVyYXRvcigpKTsKKyAgICBfQ29tcGFyZV9DYXBhY2l0eShfX29sZF9jYXBhY2l0eSk7CisgIH0KKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpIHx8IFwKKyAgICAhZGVmaW5lZCAoX1NUTFBfTk9fTUVUSE9EX1NQRUNJQUxJWkFUSU9OKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKKyAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wLCBjb25zdF9pdGVyYXRvciBfX2YsIGNvbnN0X2l0ZXJhdG9yIF9fbCkgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9vd25lcigmX01faXRlcl9saXN0LF9fcCkpCisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZixfX2wpKQorICAgIHNpemVfdHlwZSBfX29sZF9jYXBhY2l0eSA9IGNhcGFjaXR5KCk7CisgICAgX01fbm9uX2RiZ19pbXBsLmluc2VydChfX3AuX01faXRlcmF0b3IsIF9fZi5fTV9pdGVyYXRvciwgX19sLl9NX2l0ZXJhdG9yKTsKKyAgICBfQ29tcGFyZV9DYXBhY2l0eShfX29sZF9jYXBhY2l0eSk7CisgIH0KKyAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wLCBjb25zdCBfQ2hhclQqIF9fZiwgY29uc3QgX0NoYXJUKiBfX2wpIHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19mKV9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2wpCisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX2lmX293bmVyKCZfTV9pdGVyX2xpc3QsX19wKSkKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcHRyX3JhbmdlKF9fZixfX2wpKQorICAgIHNpemVfdHlwZSBfX29sZF9jYXBhY2l0eSA9IGNhcGFjaXR5KCk7CisgICAgX01fbm9uX2RiZ19pbXBsLmluc2VydChfX3AuX01faXRlcmF0b3IsIF9fZiwgX19sKTsKKyAgICBfQ29tcGFyZV9DYXBhY2l0eShfX29sZF9jYXBhY2l0eSk7CisgIH0KKyNlbmRpZgorCisgIC8vIEVyYXNlLgorICBfU2VsZiYgZXJhc2Uoc2l6ZV90eXBlIF9fcG9zID0gMCwgc2l6ZV90eXBlIF9fbiA9IG5wb3MpIHsKKyAgICBpZiAoX19wb3MgPCBzaXplKCkpIHsKKyAgICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9ycyhiZWdpbigpICsgX19wb3MsIGVuZCgpKTsKKyAgICB9CisgICAgX01fbm9uX2RiZ19pbXBsLmVyYXNlKF9fcG9zLCBfX24pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBfX3BvcykgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX0RlcmVmZXJlbmNlYWJsZShfX3BvcykpCisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX2lmX293bmVyKCZfTV9pdGVyX2xpc3QsX19wb3MpKQorICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9ycyhfX3BvcywgZW5kKCkpOworICAgIHJldHVybiBpdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuZXJhc2UoX19wb3MuX01faXRlcmF0b3IpKTsKKyAgfQorICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBfX2YsIGl0ZXJhdG9yIF9fbCkgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2YsIF9fbCwgYmVnaW4oKSwgZW5kKCkpKQorICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9ycyhfX2YsIGVuZCgpKTsKKyAgICByZXR1cm4gaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLmVyYXNlKF9fZi5fTV9pdGVyYXRvciwgX19sLl9NX2l0ZXJhdG9yKSk7CisgIH0KKworICAvLyBTdWJzdHJpbmcuCisgIF9TZWxmIHN1YnN0cihzaXplX3R5cGUgX19wb3MgPSAwLCBzaXplX3R5cGUgX19uID0gbnBvcykgY29uc3QKKyAgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLnN1YnN0cihfX3BvcywgX19uKTsgfQorCisgIC8vIFJlcGxhY2UuICAoQ29uY2VwdHVhbGx5IGVxdWl2YWxlbnQgdG8gZXJhc2UgZm9sbG93ZWQgYnkgaW5zZXJ0LikKKyAgX1NlbGYmIHJlcGxhY2Uoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uLCBjb25zdCBfU2VsZiYgX19zKSB7CisgICAgc2l6ZV90eXBlIF9fb2xkX2NhcGFjaXR5ID0gY2FwYWNpdHkoKTsKKyAgICBfTV9ub25fZGJnX2ltcGwucmVwbGFjZShfX3BvcywgX19uLCBfX3MuX01fbm9uX2RiZ19pbXBsKTsKKyAgICBfQ29tcGFyZV9DYXBhY2l0eShfX29sZF9jYXBhY2l0eSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgX1NlbGYmIHJlcGxhY2Uoc2l6ZV90eXBlIF9fcG9zMSwgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IF9TZWxmJiBfX3MsCisgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX3BvczIsIHNpemVfdHlwZSBfX24yKSB7CisgICAgc2l6ZV90eXBlIF9fb2xkX2NhcGFjaXR5ID0gY2FwYWNpdHkoKTsKKyAgICBfTV9ub25fZGJnX2ltcGwucmVwbGFjZShfX3BvczEsIF9fbjEsIF9fcy5fTV9ub25fZGJnX2ltcGwsIF9fcG9zMiwgX19uMik7CisgICAgX0NvbXBhcmVfQ2FwYWNpdHkoX19vbGRfY2FwYWNpdHkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIF9TZWxmJiByZXBsYWNlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uMikgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoKF9fcyAhPSAwKSwgX1N0bE1zZ19JTlZBTElEX0FSR1VNRU5UKQorICAgIHNpemVfdHlwZSBfX29sZF9jYXBhY2l0eSA9IGNhcGFjaXR5KCk7CisgICAgX01fbm9uX2RiZ19pbXBsLnJlcGxhY2UoX19wb3MsIF9fbjEsIF9fcywgX19uMik7CisgICAgX0NvbXBhcmVfQ2FwYWNpdHkoX19vbGRfY2FwYWNpdHkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIF9TZWxmJiByZXBsYWNlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IF9DaGFyVCogX19zKSB7CisgICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCgoX19zICE9IDApLCBfU3RsTXNnX0lOVkFMSURfQVJHVU1FTlQpCisgICAgc2l6ZV90eXBlIF9fb2xkX2NhcGFjaXR5ID0gY2FwYWNpdHkoKTsKKyAgICBfTV9ub25fZGJnX2ltcGwucmVwbGFjZShfX3BvcywgX19uMSwgX19zKTsKKyAgICBfQ29tcGFyZV9DYXBhY2l0eShfX29sZF9jYXBhY2l0eSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgX1NlbGYmIHJlcGxhY2Uoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uMSwgc2l6ZV90eXBlIF9fbjIsIF9DaGFyVCBfX2MpIHsKKyAgICBzaXplX3R5cGUgX19vbGRfY2FwYWNpdHkgPSBjYXBhY2l0eSgpOworICAgIF9NX25vbl9kYmdfaW1wbC5yZXBsYWNlKF9fcG9zLCBfX24xLCBfX24yLCBfX2MpOworICAgIF9Db21wYXJlX0NhcGFjaXR5KF9fb2xkX2NhcGFjaXR5KTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBfU2VsZiYgcmVwbGFjZShpdGVyYXRvciBfX2YsIGl0ZXJhdG9yIF9fbCwgY29uc3QgX1NlbGYmIF9fcykgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2YsIF9fbCwgYmVnaW4oKSwgZW5kKCkpKQorICAgIHNpemVfdHlwZSBfX29sZF9jYXBhY2l0eSA9IGNhcGFjaXR5KCk7CisgICAgX01fbm9uX2RiZ19pbXBsLnJlcGxhY2UoX19mLl9NX2l0ZXJhdG9yLCBfX2wuX01faXRlcmF0b3IsIF9fcy5fTV9ub25fZGJnX2ltcGwpOworICAgIF9Db21wYXJlX0NhcGFjaXR5KF9fb2xkX2NhcGFjaXR5KTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBfU2VsZiYgcmVwbGFjZShpdGVyYXRvciBfX2YsIGl0ZXJhdG9yIF9fbCwgY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX24pIHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKQorICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2YsIF9fbCwgYmVnaW4oKSwgZW5kKCkpKQorICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKChfX3MgIT0gMCksIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKKyAgICBzaXplX3R5cGUgX19vbGRfY2FwYWNpdHkgPSBjYXBhY2l0eSgpOworICAgIF9NX25vbl9kYmdfaW1wbC5yZXBsYWNlKF9fZi5fTV9pdGVyYXRvciwgX19sLl9NX2l0ZXJhdG9yLCBfX3MsIF9fbik7CisgICAgX0NvbXBhcmVfQ2FwYWNpdHkoX19vbGRfY2FwYWNpdHkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIF9TZWxmJiByZXBsYWNlKGl0ZXJhdG9yIF9fZiwgaXRlcmF0b3IgX19sLCBjb25zdCBfQ2hhclQqIF9fcykgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZiwgX19sLCBiZWdpbigpLCBlbmQoKSkpCisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoKF9fcyAhPSAwKSwgX1N0bE1zZ19JTlZBTElEX0FSR1VNRU5UKQorICAgIHNpemVfdHlwZSBfX29sZF9jYXBhY2l0eSA9IGNhcGFjaXR5KCk7CisgICAgX01fbm9uX2RiZ19pbXBsLnJlcGxhY2UoX19mLl9NX2l0ZXJhdG9yLCBfX2wuX01faXRlcmF0b3IsIF9fcyk7CisgICAgX0NvbXBhcmVfQ2FwYWNpdHkoX19vbGRfY2FwYWNpdHkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIF9TZWxmJiByZXBsYWNlKGl0ZXJhdG9yIF9fZiwgaXRlcmF0b3IgX19sLCBzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jKSB7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZiwgX19sLCBiZWdpbigpLCBlbmQoKSkpCisgICAgc2l6ZV90eXBlIF9fb2xkX2NhcGFjaXR5ID0gY2FwYWNpdHkoKTsKKyAgICBfTV9ub25fZGJnX2ltcGwucmVwbGFjZShfX2YuX01faXRlcmF0b3IsIF9fbC5fTV9pdGVyYXRvciwgX19uLCBfX2MpOworICAgIF9Db21wYXJlX0NhcGFjaXR5KF9fb2xkX2NhcGFjaXR5KTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCitwcml2YXRlOgorICB0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUl0ZXI+CisgIHZvaWQgX01fcmVwbGFjZV9hdXgoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgIF9SYW5kb21JdGVyIF9fZiwgX1JhbmRvbUl0ZXIgX19sLCBfX3RydWVfdHlwZSBjb25zdCYgLypfSXNJdGVyYXRvciovKQorICB7IF9NX25vbl9kYmdfaW1wbC5yZXBsYWNlKF9fZmlyc3QuX01faXRlcmF0b3IsIF9fbGFzdC5fTV9pdGVyYXRvciwgX19mLl9NX2l0ZXJhdG9yLCBfX2wuX01faXRlcmF0b3IpOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXI+CisgIHZvaWQgX01fcmVwbGFjZV9hdXgoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIgX19mLCBfSW5wdXRJdGVyIF9fbCwgX19mYWxzZV90eXBlIGNvbnN0JiAvKl9Jc0l0ZXJhdG9yKi8pIHsKKyAgICBfTV9ub25fZGJnX2ltcGwucmVwbGFjZShfX2ZpcnN0Ll9NX2l0ZXJhdG9yLCBfX2xhc3QuX01faXRlcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfUFJJViBfTm9uX0RiZ19pdGVyKF9fZiksIF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2wpKTsKKyAgfQorCitwdWJsaWM6CisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgorICBfU2VsZiYgcmVwbGFjZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIgX19mLCBfSW5wdXRJdGVyIF9fbCkgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QsIGJlZ2luKCksIGVuZCgpKSkKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19mLCBfX2wpKQorCisgICAgLyogU2VlIGluc2VydCBjb21tZW50IGZvciByZXNvbiBvZiBpdGVyYXRvciBkZXRlY3Rpb24uCisgICAgICovCisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQXJlU2FtZVVuQ1ZUeXBlczxfSW5wdXRJdGVyLCBpdGVyYXRvcj46Ol9SZXQgX0lzTm9uQ29uc3RJdGVyYXRvcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9BcmVTYW1lVW5DVlR5cGVzPF9JbnB1dEl0ZXIsIGNvbnN0X2l0ZXJhdG9yPjo6X1JldCBfSXNDb25zdEl0ZXJhdG9yOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0xvcjI8X0lzTm9uQ29uc3RJdGVyYXRvciwgX0lzQ29uc3RJdGVyYXRvcj46Ol9SZXQgX0lzSXRlcmF0b3I7CisKKyAgICBzaXplX3R5cGUgX19vbGRfY2FwYWNpdHkgPSBjYXBhY2l0eSgpOworICAgIF9NX3JlcGxhY2VfYXV4KF9fZmlyc3QsIF9fbGFzdCwgX19mLCBfX2wsIF9Jc0l0ZXJhdG9yKCkpOworICAgIF9Db21wYXJlX0NhcGFjaXR5KF9fb2xkX2NhcGFjaXR5KTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpIHx8IFwKKyAgICAhZGVmaW5lZCAoX1NUTFBfTk9fTUVUSE9EX1NQRUNJQUxJWkFUSU9OKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykKKyAgX1NlbGYmIHJlcGxhY2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvciBfX2YsIGNvbnN0X2l0ZXJhdG9yIF9fbCkgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QsIGJlZ2luKCksIGVuZCgpKSkKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19mLCBfX2wpKQorICAgIHNpemVfdHlwZSBfX29sZF9jYXBhY2l0eSA9IGNhcGFjaXR5KCk7CisgICAgX01fbm9uX2RiZ19pbXBsLnJlcGxhY2UoX19maXJzdC5fTV9pdGVyYXRvciwgX19sYXN0Ll9NX2l0ZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZi5fTV9pdGVyYXRvciwgX19sLl9NX2l0ZXJhdG9yKTsKKyAgICBfQ29tcGFyZV9DYXBhY2l0eShfX29sZF9jYXBhY2l0eSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgX1NlbGYmIHJlcGxhY2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICBjb25zdCBfQ2hhclQqIF9fZiwgY29uc3QgX0NoYXJUKiBfX2wpIHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19mKV9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX2wpCisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCwgYmVnaW4oKSwgZW5kKCkpKQorICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19wdHJfcmFuZ2UoX19mLCBfX2wpKQorICAgIHNpemVfdHlwZSBfX29sZF9jYXBhY2l0eSA9IGNhcGFjaXR5KCk7CisgICAgX01fbm9uX2RiZ19pbXBsLnJlcGxhY2UoX19maXJzdC5fTV9pdGVyYXRvciwgX19sYXN0Ll9NX2l0ZXJhdG9yLCBfX2YsIF9fbCk7CisgICAgX0NvbXBhcmVfQ2FwYWNpdHkoX19vbGRfY2FwYWNpdHkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorI2VuZGlmCisKKyAgLy8gT3RoZXIgbW9kaWZpZXIgbWVtYmVyIGZ1bmN0aW9ucy4KKyAgdm9pZCBzd2FwKF9TZWxmJiBfX3MpIHsKKyAgICBfTV9pdGVyX2xpc3QuX1N3YXBfb3duZXJzKF9fcy5fTV9pdGVyX2xpc3QpOworICAgIF9NX25vbl9kYmdfaW1wbC5zd2FwKF9fcy5fTV9ub25fZGJnX2ltcGwpOworICB9CisKKyAgaW50IGNvbXBhcmUoY29uc3QgX1NlbGYmIF9fcykgY29uc3QKKyAgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLmNvbXBhcmUoX19zLl9NX25vbl9kYmdfaW1wbCk7IH0KKyAgaW50IGNvbXBhcmUoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uLCBjb25zdCBfU2VsZiYgX19zKSBjb25zdAorICB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwuY29tcGFyZShfX3BvcywgX19uLCBfX3MuX01fbm9uX2RiZ19pbXBsKTsgfQorICBpbnQgY29tcGFyZShzaXplX3R5cGUgX19wb3MxLCBzaXplX3R5cGUgX19uMSwgY29uc3QgX1NlbGYmIF9fcywKKyAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fcG9zMiwgc2l6ZV90eXBlIF9fbjIpIGNvbnN0CisgIHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5jb21wYXJlKF9fcG9zMSwgX19uMSwgX19zLl9NX25vbl9kYmdfaW1wbCwgX19wb3MyLCBfX24yKTsgfQorICBpbnQgY29tcGFyZShjb25zdCBfQ2hhclQqIF9fcykgY29uc3QgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgICAgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5jb21wYXJlKF9fcyk7CisgIH0KKyAgaW50IGNvbXBhcmUoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uLCBjb25zdCBfQ2hhclQqIF9fcykgY29uc3QgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgICAgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5jb21wYXJlKF9fcG9zLCBfX24sIF9fcyk7CisgIH0KKyAgaW50IGNvbXBhcmUoc2l6ZV90eXBlIF9fcG9zMSwgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IF9DaGFyVCogX19zLAorICAgICAgICAgICAgICBzaXplX3R5cGUgX19uMikgY29uc3QgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgICAgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5jb21wYXJlKF9fcG9zMSwgX19uMSwgX19zLCBfX24yKTsKKyAgfQorCisgIC8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIGNvbXBhcmUuCisgIHN0YXRpYyBpbnQgX1NUTFBfQ0FMTCBfTV9jb21wYXJlKGNvbnN0IF9DaGFyVCogX19mMSwgY29uc3QgX0NoYXJUKiBfX2wxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfQ2hhclQqIF9fZjIsIGNvbnN0IF9DaGFyVCogX19sMikKKyAgeyByZXR1cm4gX0Jhc2U6Ol9NX2NvbXBhcmUoX19mMSwgX19sMSwgX19mMiwgX19sMik7IH0KKyAgc3RhdGljIGludCBfU1RMUF9DQUxMIF9NX2NvbXBhcmUoY29uc3RfaXRlcmF0b3IgX19mMSwgY29uc3RfaXRlcmF0b3IgX19sMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0NoYXJUKiBfX2YyLCBjb25zdCBfQ2hhclQqIF9fbDIpCisgIHsgcmV0dXJuIF9CYXNlOjpfTV9jb21wYXJlKF9fZjEuX01faXRlcmF0b3IsIF9fbDEuX01faXRlcmF0b3IsIF9fZjIsIF9fbDIpOyB9CisgIHN0YXRpYyBpbnQgX1NUTFBfQ0FMTCBfTV9jb21wYXJlKGNvbnN0IF9DaGFyVCogX19mMSwgY29uc3QgX0NoYXJUKiBfX2wxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvciBfX2YyLCBjb25zdF9pdGVyYXRvciBfX2wyKQorICB7IHJldHVybiBfQmFzZTo6X01fY29tcGFyZShfX2YxLCBfX2wxLCBfX2YyLl9NX2l0ZXJhdG9yLCBfX2wyLl9NX2l0ZXJhdG9yKTsgfQorICBzdGF0aWMgaW50IF9TVExQX0NBTEwgX01fY29tcGFyZShjb25zdF9pdGVyYXRvciBfX2YxLCBjb25zdF9pdGVyYXRvciBfX2wxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvciBfX2YyLCBjb25zdF9pdGVyYXRvciBfX2wyKQorICB7IHJldHVybiBfQmFzZTo6X01fY29tcGFyZShfX2YxLl9NX2l0ZXJhdG9yLCBfX2wxLl9NX2l0ZXJhdG9yLCBfX2YyLl9NX2l0ZXJhdG9yLCBfX2wyLl9NX2l0ZXJhdG9yKTsgfQorCisgIGNvbnN0IF9DaGFyVCogY19zdHIoKSBjb25zdCB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwuY19zdHIoKTsgfQorICBjb25zdCBfQ2hhclQqIGRhdGEoKSAgY29uc3QgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLmRhdGEoKTsgfQorCisgIHNpemVfdHlwZSBjb3B5KF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdAorICB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwuY29weShfX3MsIF9fbiwgX19wb3MpOyB9CisKKyAgLy8gZmluZC4KKyAgc2l6ZV90eXBlIGZpbmQoY29uc3QgX1NlbGYmIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QKKyAgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLmZpbmQoX19zLl9NX25vbl9kYmdfaW1wbCwgX19wb3MpOyB9CisgIHNpemVfdHlwZSBmaW5kKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdCB7CisgICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCgoX19zICE9IDApLCBfU3RsTXNnX0lOVkFMSURfQVJHVU1FTlQpCisgICAgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5maW5kKF9fcywgX19wb3MpOworICB9CisgIHNpemVfdHlwZSBmaW5kKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIGNvbnN0IHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKQorICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKChfX3MgIT0gMCksIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKKyAgICByZXR1cm4gX01fbm9uX2RiZ19pbXBsLmZpbmQoX19zLCBfX3BvcywgX19uKTsKKyAgfQorICAvLyBXSUU6IFZlcnNhbnQgc2NoZW1hIGNvbXBpbGVyIDUuMi4yIElDRSB3b3JrYXJvdW5kCisgIHNpemVfdHlwZSBmaW5kKF9DaGFyVCBfX2MpIGNvbnN0IHsgcmV0dXJuIGZpbmQoX19jLCAwKTsgfQorICBzaXplX3R5cGUgZmluZChfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MgLyogPSAwICovKSBjb25zdAorICB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwuZmluZChfX2MsIF9fcG9zKTsgfQorCisgIC8vIHJmaW5kLgorICBzaXplX3R5cGUgcmZpbmQoY29uc3QgX1NlbGYmIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gbnBvcykgY29uc3QKKyAgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLnJmaW5kKF9fcy5fTV9ub25fZGJnX2ltcGwsIF9fcG9zKTsgfQorICBzaXplX3R5cGUgcmZpbmQoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3BvcyA9IG5wb3MpIGNvbnN0IHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKQorICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKChfX3MgIT0gMCksIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKKyAgICByZXR1cm4gX01fbm9uX2RiZ19pbXBsLnJmaW5kKF9fcywgX19wb3MpOworICB9CisgIHNpemVfdHlwZSByZmluZChjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdCB7CisgICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCgoX19zICE9IDApLCBfU3RsTXNnX0lOVkFMSURfQVJHVU1FTlQpCisgICAgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5yZmluZChfX3MsIF9fcG9zLCBfX24pOworICB9CisgIHNpemVfdHlwZSByZmluZChfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MgPSBucG9zKSBjb25zdAorICB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwucmZpbmQoX19jLCBfX3Bvcyk7IH0KKworICAvLyBmaW5kX2ZpcnN0X29mCisgIHNpemVfdHlwZSBmaW5kX2ZpcnN0X29mKGNvbnN0IF9TZWxmJiBfX3MsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0CisgIHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5maW5kX2ZpcnN0X29mKF9fcy5fTV9ub25fZGJnX2ltcGwsIF9fcG9zKTsgfQorICBzaXplX3R5cGUgZmluZF9maXJzdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoKF9fcyAhPSAwKSwgX1N0bE1zZ19JTlZBTElEX0FSR1VNRU5UKQorICAgIHJldHVybiBfTV9ub25fZGJnX2ltcGwuZmluZF9maXJzdF9vZihfX3MsIF9fcG9zKTsKKyAgfQorICBzaXplX3R5cGUgZmluZF9maXJzdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdCB7CisgICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCgoX19zICE9IDApLCBfU3RsTXNnX0lOVkFMSURfQVJHVU1FTlQpCisgICAgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5maW5kX2ZpcnN0X29mKF9fcywgX19wb3MsIF9fbik7CisgIH0KKyAgc2l6ZV90eXBlIGZpbmRfZmlyc3Rfb2YoX0NoYXJUIF9fYywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QKKyAgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLmZpbmRfZmlyc3Rfb2YoX19jLCBfX3Bvcyk7IH0KKworICAvLyBmaW5kX2xhc3Rfb2YKKyAgc2l6ZV90eXBlIGZpbmRfbGFzdF9vZihjb25zdCBfU2VsZiYgX19zLCBzaXplX3R5cGUgX19wb3MgPSBucG9zKSBjb25zdAorICB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwuZmluZF9sYXN0X29mKF9fcy5fTV9ub25fZGJnX2ltcGwsIF9fcG9zKTsgfQorICBzaXplX3R5cGUgZmluZF9sYXN0X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MgPSBucG9zKSBjb25zdCB7CisgICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCgoX19zICE9IDApLCBfU3RsTXNnX0lOVkFMSURfQVJHVU1FTlQpCisgICAgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5maW5kX2xhc3Rfb2YoX19zLCBfX3Bvcyk7CisgIH0KKyAgc2l6ZV90eXBlIGZpbmRfbGFzdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdCB7CisgICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCgoX19zICE9IDApLCBfU3RsTXNnX0lOVkFMSURfQVJHVU1FTlQpCisgICAgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5maW5kX2xhc3Rfb2YoX19zLCBfX3BvcywgX19uKTsKKyAgfQorICBzaXplX3R5cGUgZmluZF9sYXN0X29mKF9DaGFyVCBfX2MsIHNpemVfdHlwZSBfX3BvcyA9IG5wb3MpIGNvbnN0CisgIHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5yZmluZChfX2MsIF9fcG9zKTsgfQorCisgIC8vIGZpbmRfZmlyc3Rfbm90X29mCisgIHNpemVfdHlwZSBmaW5kX2ZpcnN0X25vdF9vZihjb25zdCBfU2VsZiYgX19zLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdAorICB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwuZmluZF9maXJzdF9ub3Rfb2YoX19zLl9NX25vbl9kYmdfaW1wbCwgX19wb3MpOyB9CisgIHNpemVfdHlwZSBmaW5kX2ZpcnN0X25vdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QgeworICAgIF9TVExQX0ZJWF9MSVRFUkFMX0JVRyhfX3MpCisgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoKF9fcyAhPSAwKSwgX1N0bE1zZ19JTlZBTElEX0FSR1VNRU5UKQorICAgIHJldHVybiBfTV9ub25fZGJnX2ltcGwuZmluZF9maXJzdF9ub3Rfb2YoX19zLCBfX3Bvcyk7CisgIH0KKyAgc2l6ZV90eXBlIGZpbmRfZmlyc3Rfbm90X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIGNvbnN0IHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKQorICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKChfX3MgIT0gMCksIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKKyAgICByZXR1cm4gX01fbm9uX2RiZ19pbXBsLmZpbmRfZmlyc3Rfbm90X29mKF9fcywgX19wb3MsIF9fbik7CisgIH0KKyAgc2l6ZV90eXBlIGZpbmRfZmlyc3Rfbm90X29mKF9DaGFyVCBfX2MsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0CisgIHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5maW5kX2ZpcnN0X25vdF9vZihfX2MsIF9fcG9zKTsgfQorCisgIC8vIGZpbmRfbGFzdF9ub3Rfb2YKKyAgc2l6ZV90eXBlIGZpbmRfbGFzdF9ub3Rfb2YoY29uc3QgX1NlbGYmIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gbnBvcykgY29uc3QKKyAgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLmZpbmRfbGFzdF9ub3Rfb2YoX19zLl9NX25vbl9kYmdfaW1wbCwgX19wb3MpOyB9CisgIHNpemVfdHlwZSBmaW5kX2xhc3Rfbm90X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MgPSBucG9zKSBjb25zdCB7CisgICAgX1NUTFBfRklYX0xJVEVSQUxfQlVHKF9fcykKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCgoX19zICE9IDApLCBfU3RsTXNnX0lOVkFMSURfQVJHVU1FTlQpCisgICAgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5maW5kX2xhc3Rfbm90X29mKF9fcywgX19wb3MpOworICB9CisgIHNpemVfdHlwZSBmaW5kX2xhc3Rfbm90X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIGNvbnN0IHsKKyAgICBfU1RMUF9GSVhfTElURVJBTF9CVUcoX19zKQorICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKChfX3MgIT0gMCksIF9TdGxNc2dfSU5WQUxJRF9BUkdVTUVOVCkKKyAgICByZXR1cm4gX01fbm9uX2RiZ19pbXBsLmZpbmRfbGFzdF9ub3Rfb2YoX19zLCBfX3BvcywgX19uKTsKKyAgfQorICBzaXplX3R5cGUgZmluZF9sYXN0X25vdF9vZihfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MgPSBucG9zKSBjb25zdAorICB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwuZmluZF9sYXN0X25vdF9vZihfX2MsIF9fcG9zKTsgfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1RFTVBMQVRFX0VYUFJFU1NJT04pCisjICBpbmNsdWRlIDxzdGwvZGVidWcvX3N0cmluZ19zdW1fbWV0aG9kcy5oPgorI2VuZGlmIC8qIF9TVExQX1VTRV9URU1QTEFURV9FWFBSRVNTSU9OICovCit9OworCisvLyBUaGlzIGlzIGEgaG9vayB0byBpbnN0YW50aWF0ZSBTVExwb3J0IGV4cG9ydHMgaW4gYSBkZXNpZ25hdGVkIERMTAorI2lmIGRlZmluZWQgKF9TVExQX1VTRV9URU1QTEFURV9FWFBPUlQpICYmICFkZWZpbmVkIChfU1RMUF9VU0VfTVNWQzZfTUVNX1RfQlVHX1dPUktBUk9VTkQpCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgX19jb25zdHJ1Y3RfY2hlY2tlcjxfU1RMUF9OT05fREJHX1NUUklOR19OQU1FIDxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiwgYWxsb2NhdG9yPGNoYXI+ID4gPjsKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIGJhc2ljX3N0cmluZzxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiwgYWxsb2NhdG9yPGNoYXI+ID47CisjICBpZiBkZWZpbmVkIChfU1RMUF9IQVNfV0NIQVJfVCkKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBfX2NvbnN0cnVjdF9jaGVja2VyPF9TVExQX05PTl9EQkdfU1RSSU5HX05BTUUgPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+LCBhbGxvY2F0b3I8d2NoYXJfdD4gPiA+OworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgYmFzaWNfc3RyaW5nPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+LCBhbGxvY2F0b3I8d2NoYXJfdD4gPjsKKyMgIGVuZGlmCisjZW5kaWYgLyogX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCAqLworCisjdW5kZWYgX1NUTFBfTk9OX0RCR19TVFJJTkcKKyN1bmRlZiBfU1RMUF9OT05fREJHX1NUUklOR19OQU1FCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfU1RBVElDX0NPTlNUX0lOSVRfQlVHKQorIyAgaWYgZGVmaW5lZCAoX19HTlVDX18pICYmIChfX0dOVUNfXyA9PSAyKSAmJiAoX19HTlVDX01JTk9SX18gPT0gOTYpCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+Citjb25zdCBzaXplX3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6bnBvcyA9IH4oc2l6ZV90KSAwOworIyAgZWxzZQordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorY29uc3Qgc2l6ZV90IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46Om5wb3M7CisjICBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChiYXNpY19zdHJpbmcpCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKyN1bmRlZiBiYXNpY19zdHJpbmcKKyNlbmRpZgorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNlbmRpZiAvKiBfU1RMUF9EQkdfU1RSSU5HICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvZGVidWcvX3N0cmluZ19zdW1fbWV0aG9kcy5oIGIvc3RsL2RlYnVnL19zdHJpbmdfc3VtX21ldGhvZHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmNhMTk0Ci0tLSAvZGV2L251bGwKKysrIGIvc3RsL2RlYnVnL19zdHJpbmdfc3VtX21ldGhvZHMuaApAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMworICogRnJhbmNvaXMgRHVtb250CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKy8qCisgKiBBbGwgdGhlIG5lY2Vzc2FyeSBtZXRob2RzIHVzZWQgZm9yIHRlbXBsYXRlIGV4cHJlc3Npb25zIHdpdGggYmFzaWNfc3RyaW5nCisgKiBUaGlzIGZpbGUgZG8gbm90IGhhdmUgdG8gYmUgbWFjcm8gZ3VhcmRlZCBhcyBpdCBpcyBvbmx5IHVzZWQgaW4gdGhlIF9zdHJpbmcuaAorICogZmlsZSBhbmQgaXQgaXMgYSBwYXJ0IG9mIHRoZSBiYXNpY19zdHJpbmcgZGVmaW5pdGlvbi4KKyAqLworCisgIHRlbXBsYXRlIDxjbGFzcyBfTGVmdCwgY2xhc3MgX1JpZ2h0LCBjbGFzcyBfU3RvcmFnZURpcj4KKyAgYmFzaWNfc3RyaW5nKF9TVExQX1BSSVYgX19ic3RyX3N1bTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0xlZnQsIF9SaWdodCwgX1N0b3JhZ2VEaXI+IGNvbnN0JiBfX3MpCisgICAgOiBfTV9ub25fZGJnX2ltcGwoX1Jlc2VydmVfdCgpLCBfX3Muc2l6ZSgpLCBfX3MuZ2V0X2FsbG9jYXRvcigpKSwKKyAgICAgIF9NX2l0ZXJfbGlzdCgmX01fbm9uX2RiZ19pbXBsKQorICB7IF9NX2FwcGVuZF9zdW0oX19zLCBfTV9ub25fZGJnX2ltcGwpOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9MZWZ0LCBjbGFzcyBfUmlnaHQsIGNsYXNzIF9TdG9yYWdlRGlyPgorICBiYXNpY19zdHJpbmcoX1NUTFBfUFJJViBfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfTGVmdCwgX1JpZ2h0LCBfU3RvcmFnZURpcj4gY29uc3QmIF9fcywKKyAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbiA9IG5wb3MsCisgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9NX25vbl9kYmdfaW1wbChfUmVzZXJ2ZV90KCksIChfX3BvcyA8PSBfX3Muc2l6ZSgpKSA/ICgobWluKSAoX19uLCBfX3Muc2l6ZSgpIC0gX19wb3MpKSA6IDAsIF9fYSksCisgICAgICBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkgeworICAgIHNpemVfdHlwZSBfX3NpemUgPSBfX3Muc2l6ZSgpOworICAgIGlmIChfX3BvcyA+IF9fc2l6ZSkKKyAgICAgIC8vVGhpcyBjYWxsIHdpbGwgZ2VuZXJhdGUgdGhlIG5lY2Vzc2FyeSBvdXQgb2YgcmFuZ2UgZXhjZXB0aW9uOgorICAgICAgX01fbm9uX2RiZ19pbXBsLmF0KDApOworICAgIGVsc2UKKyAgICAgIF9NX2FwcGVuZF9zdW1fcG9zKF9fcywgX19wb3MsIChtaW4pIChfX24sIF9fc2l6ZSAtIF9fcG9zKSwgX01fbm9uX2RiZ19pbXBsKTsKKyAgfQorCitwcml2YXRlOgorICBfQmFzZSYgX01fYXBwZW5kX2Zhc3QoX1NUTFBfUFJJViBfX2NoYXJfd3JhcHBlcjxfQ2hhclQ+IF9fYywgX0Jhc2UgJl9fc3RyKQorICB7IHJldHVybiBfX3N0ciArPSBfX2MuZ2V0VmFsdWUoKTsgfQorICBfQmFzZSYgX01fYXBwZW5kX2Zhc3QoX0NoYXJUIGNvbnN0KiBfX3MsIHNpemVfdHlwZSBfX3Nfc2l6ZSwgX0Jhc2UgJl9fc3RyKQorICB7IHJldHVybiBfX3N0ci5hcHBlbmQoX19zLCBfX3Nfc2l6ZSk7IH0KKyAgX0Jhc2UmIF9NX2FwcGVuZF9mYXN0KF9TVExQX1BSSVYgX19jc3RyX3dyYXBwZXI8X0NoYXJUPiBjb25zdCYgX19zLCBfQmFzZSAmX19zdHIpCisgIHsgcmV0dXJuIF9NX2FwcGVuZF9mYXN0KF9fcy5jX3N0cigpLCBfX3Muc2l6ZSgpLCBfX3N0cik7IH0KKyAgX0Jhc2UmIF9NX2FwcGVuZF9mYXN0KF9TVExQX1BSSVYgX19ic3RyX3dyYXBwZXI8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+IF9fcywgX0Jhc2UgJl9fc3RyKQorICB7IHJldHVybiBfTV9hcHBlbmRfZmFzdChfX3MuYl9zdHIoKSwgX19zdHIpOyB9CisgIF9CYXNlJiBfTV9hcHBlbmRfZmFzdChfU2VsZiBjb25zdCYgX19zLCBfQmFzZSAmX19zdHIpCisgIHsgcmV0dXJuIF9NX2FwcGVuZF9mYXN0KF9fcy5kYXRhKCksIF9fcy5zaXplKCksIF9fc3RyKTsgfQorICBfQmFzZSYgX01fYXBwZW5kX2Zhc3QoX1NUTFBfUFJJViBfX3N1bV9zdG9yYWdlX2VsZW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+IGNvbnN0JiwgX0Jhc2UgJl9fc3RyKQorICB7IHJldHVybiBfX3N0cjsgfQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0xlZnQsIGNsYXNzIF9SaWdodCwgY2xhc3MgX1N0b3JhZ2VEaXI+CisgIF9CYXNlJiBfTV9hcHBlbmRfZmFzdChfU1RMUF9QUklWIF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9MZWZ0LCBfUmlnaHQsIF9TdG9yYWdlRGlyPiBjb25zdCYgX19zLCBfQmFzZSAmX19zdHIpCisgIHsgcmV0dXJuIF9NX2FwcGVuZF9mYXN0KF9fcy5nZXRSaHMoKSwgX01fYXBwZW5kX2Zhc3QoX19zLmdldExocygpLCBfX3N0cikpOyB9CisKKyAgX0Jhc2UmIF9NX2FwcGVuZF9mYXN0X3BvcyhfU1RMUF9QUklWIF9fY2hhcl93cmFwcGVyPF9DaGFyVD4gX19jLCBfQmFzZSAmX19zdHIsIHNpemVfdHlwZSAvKl9fcG9zKi8sIHNpemVfdHlwZSBfX24pIHsKKyAgICBpZiAoX19uID09IDApCisgICAgICByZXR1cm4gX19zdHI7CisgICAgcmV0dXJuIF9fc3RyICs9IF9fYy5nZXRWYWx1ZSgpOworICB9CisgIF9CYXNlJiBfTV9hcHBlbmRfZmFzdF9wb3MoX0NoYXJUIGNvbnN0KiBfX3MsIHNpemVfdHlwZSBfX3Nfc2l6ZSwgX0Jhc2UgJl9fc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikKKyAgeyByZXR1cm4gX19zdHIuYXBwZW5kKF9fcyArIF9fcG9zLCBfX3MgKyBfX3BvcyArIChtaW4pKF9fbiwgX19zX3NpemUgLSBfX3BvcykpOyB9CisgIF9CYXNlJiBfTV9hcHBlbmRfZmFzdF9wb3MoX1NUTFBfUFJJViBfX2NzdHJfd3JhcHBlcjxfQ2hhclQ+IGNvbnN0JiBfX3MsIF9CYXNlICZfX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pCisgIHsgcmV0dXJuIF9NX2FwcGVuZF9mYXN0X3BvcyhfX3MuY19zdHIoKSwgX19zLnNpemUoKSwgX19zdHIsIF9fcG9zLCBfX24pOyB9CisgIF9CYXNlJiBfTV9hcHBlbmRfZmFzdF9wb3MoX1NUTFBfUFJJViBfX2JzdHJfd3JhcHBlcjxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4gX19zLCBfQmFzZSAmX19zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKQorICB7IHJldHVybiBfTV9hcHBlbmRfZmFzdF9wb3MoX19zLmJfc3RyKCksIF9fc3RyLCBfX3BvcywgX19uKTsgfQorICBfQmFzZSYgX01fYXBwZW5kX2Zhc3RfcG9zKF9TZWxmIGNvbnN0JiBfX3MsIF9CYXNlICZfX3N0ciwgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKQorICB7IHJldHVybiBfTV9hcHBlbmRfZmFzdF9wb3MoX19zLmRhdGEoKSwgX19zLnNpemUoKSwgX19zdHIsIF9fcG9zLCBfX24pOyB9CisgIF9CYXNlJiBfTV9hcHBlbmRfZmFzdF9wb3MoX1NUTFBfUFJJViBfX3N1bV9zdG9yYWdlX2VsZW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+IGNvbnN0JiwgX0Jhc2UgJl9fc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSAvKl9fcG9zKi8sIHNpemVfdHlwZSAvKl9fbiovKQorICB7IHJldHVybiBfX3N0cjsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfTGVmdCwgY2xhc3MgX1JpZ2h0LCBjbGFzcyBfU3RvcmFnZURpcj4KKyAgX0Jhc2UmIF9NX2FwcGVuZF9mYXN0X3BvcyhfU1RMUF9QUklWIF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9MZWZ0LCBfUmlnaHQsIF9TdG9yYWdlRGlyPiBjb25zdCYgX19zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9CYXNlICZfX3N0ciwgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSB7CisgICAgaWYgKF9fbiA9PSAwKSB7CisgICAgICByZXR1cm4gX19zdHI7CisgICAgfQorICAgIHNpemVfdHlwZSBfX2xoc19zaXplID0gX19zLmdldExocygpLnNpemUoKTsKKyAgICBpZiAoX19wb3MgPCBfX2xoc19zaXplKSB7CisgICAgICBpZiAoX19uIDwgKF9fbGhzX3NpemUgLSBfX3BvcykpIHsKKyAgICAgICAgcmV0dXJuIF9NX2FwcGVuZF9mYXN0X3BvcyhfX3MuZ2V0TGhzKCksIF9fc3RyLCBfX3BvcywgX19uKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBfTV9hcHBlbmRfZmFzdF9wb3MoX19zLmdldFJocygpLCBfTV9hcHBlbmRfZmFzdF9wb3MoX19zLmdldExocygpLCBfX3N0ciwgX19wb3MsIF9fbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgX19uIC0gKF9fbGhzX3NpemUgLSBfX3BvcykpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gX01fYXBwZW5kX2Zhc3RfcG9zKF9fcy5nZXRSaHMoKSwgX19zdHIsIF9fcG9zIC0gX19saHNfc2l6ZSwgX19uKTsKKyAgICB9CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0xlZnQsIGNsYXNzIF9SaWdodCwgY2xhc3MgX1N0b3JhZ2VEaXI+CisgIF9TZWxmJiBfTV9hcHBlbmRfc3VtIChfU1RMUF9QUklWIF9fYnN0cl9zdW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9MZWZ0LCBfUmlnaHQsIF9TdG9yYWdlRGlyPiBjb25zdCYgX19zLAorICAgICAgICAgICAgICAgICAgICAgICAgX0Jhc2UgJl9faW1wbCkgeworICAgIF9NX2FwcGVuZF9mYXN0KF9fcywgX19pbXBsKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0xlZnQsIGNsYXNzIF9SaWdodCwgY2xhc3MgX1N0b3JhZ2VEaXI+CisgIF9TZWxmJiBfTV9hcHBlbmRfc3VtX3BvcyAoX1NUTFBfUFJJViBfX2JzdHJfc3VtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfTGVmdCwgX1JpZ2h0LCBfU3RvcmFnZURpcj4gY29uc3QmIF9fcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24sIF9CYXNlICZfX2ltcGwpIHsKKyAgICBfTV9ub25fZGJnX2ltcGwucmVzZXJ2ZShfTV9ub25fZGJnX2ltcGwuc2l6ZSgpICsgKG1pbikgKF9fcy5zaXplKCkgLSBfX3BvcywgX19uKSk7CisgICAgX01fYXBwZW5kX2Zhc3RfcG9zKF9fcywgX19pbXBsLCBfX3BvcywgX19uKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KZGlmZiAtLWdpdCBhL3N0bC9kZWJ1Zy9fdHJlZS5oIGIvc3RsL2RlYnVnL190cmVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ViYjQxMAotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9kZWJ1Zy9fdHJlZS5oCkBAIC0wLDAgKzEsMzE2IEBACisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBNb3Njb3cgQ2VudGVyIGZvciBTUEFSQyBUZWNobm9sb2d5CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworLyogTk9URTogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgU1RMIGhlYWRlcnMuCisgKiAgIFlvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LgorICovCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfREJHX1RSRUVfSAorI2RlZmluZSBfU1RMUF9JTlRFUk5BTF9EQkdfVFJFRV9ICisKKyNpZm5kZWYgX1NUTFBfREJHX0lURVJBVE9SX0gKKyMgIGluY2x1ZGUgPHN0bC9kZWJ1Zy9faXRlcmF0b3IuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TVExQX0lOVEVSTkFMX0ZVTkNUSU9OX0JBU0VfSAorIyAgaW5jbHVkZSA8c3RsL19mdW5jdGlvbl9iYXNlLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9BTExPQ19ICisjICBpbmNsdWRlIDxzdGwvX2FsbG9jLmg+CisjZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9Db21wYXJlPgorY2xhc3MgX0RiZ0NvbXBhcmUgeworcHVibGljOgorICBfRGJnQ29tcGFyZSgpIHt9CisgIF9EYmdDb21wYXJlKGNvbnN0IF9Db21wYXJlJiBfX2NtcCkgOiBfTV9ub25fZGJnX2NtcChfX2NtcCkge30KKyAgX0RiZ0NvbXBhcmUoY29uc3QgX0RiZ0NvbXBhcmUmIF9fY21wKSA6IF9NX25vbl9kYmdfY21wKF9fY21wLl9NX25vbl9kYmdfY21wKSB7fQorCisjaWYgIWRlZmluZWQgKF9TVExQX1VTRV9DT05UQUlORVJTX0VYVEVOU0lPTikKKyAgYm9vbCBvcGVyYXRvciAoKSAoY29uc3QgX0tleSYgX19saHMsIGNvbnN0IF9LZXkmIF9fcmhzKSBjb25zdCB7CisjZWxzZQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0twMSwgY2xhc3MgX0twMj4KKyAgYm9vbCBvcGVyYXRvciAoKSAoY29uc3QgX0twMSYgX19saHMsIGNvbnN0IF9LcDImIF9fcmhzKSBjb25zdCB7CisjZW5kaWYKKyAgICBpZiAoX01fbm9uX2RiZ19jbXAoX19saHMsIF9fcmhzKSkgeworICAgICAgX1NUTFBfVkVSQk9TRV9BU1NFUlQoIV9NX25vbl9kYmdfY21wKF9fcmhzLCBfX2xocyksIF9TdGxNc2dfSU5WQUxJRF9TVFJJQ1RfV0VBS19QUkVESUNBVEUpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgX0NvbXBhcmUgbm9uX2RiZ19rZXlfY29tcCgpIGNvbnN0IHsgcmV0dXJuIF9NX25vbl9kYmdfY21wOyB9Citwcml2YXRlOgorICBfQ29tcGFyZSBfTV9ub25fZGJnX2NtcDsKK307CisKKyNkZWZpbmUgX1NUTFBfTk9OX0RCR19UUkVFIF9TVExQX1BSSVYgX1NUTFBfTk9OX0RCR19OQU1FKFJiX3RyZWUpIDxfS2V5LCBfU1RMUF9QUklWIF9EYmdDb21wYXJlPF9LZXksIF9Db21wYXJlPiwgX1ZhbHVlLCBfS2V5T2ZWYWx1ZSwgX1RyYWl0cywgX0FsbG9jPgorCisjaWYgZGVmaW5lZCAoX1NUTFBfREVCVUdfVVNFX0RJU1RJTkNUX1ZBTFVFX1RZUEVfSEVMUEVSUykKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9Db21wYXJlLAorICAgICAgICAgIGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0tleU9mVmFsdWUsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYyA+CitpbmxpbmUgX1ZhbHVlKgordmFsdWVfdHlwZShjb25zdCBfU1RMUF9QUklWIF9EQkdfaXRlcl9iYXNlPCBfU1RMUF9OT05fREJHX1RSRUUgPiYpCit7IHJldHVybiAoX1ZhbHVlKikwOyB9Cit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX0NvbXBhcmUsCisgICAgICAgICAgY2xhc3MgX1ZhbHVlLCBjbGFzcyBfS2V5T2ZWYWx1ZSwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jID4KK2lubGluZSBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZworaXRlcmF0b3JfY2F0ZWdvcnkoY29uc3QgX1NUTFBfUFJJViBfREJHX2l0ZXJfYmFzZTwgX1NUTFBfTk9OX0RCR19UUkVFID4mKQoreyByZXR1cm4gYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcoKTsgfQorX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfQ29tcGFyZSwKKyAgICAgICAgICBjbGFzcyBfVmFsdWUsIGNsYXNzIF9LZXlPZlZhbHVlLCBjbGFzcyBfVHJhaXRzLAorICAgICAgICAgIF9TVExQX0RCR19BTExPQ0FUT1JfU0VMRUNUKF9WYWx1ZSkgPgorY2xhc3MgX1JiX3RyZWUgeworICB0eXBlZGVmIF9TVExQX05PTl9EQkdfVFJFRSBfQmFzZTsKKyAgdHlwZWRlZiBfUmJfdHJlZTxfS2V5LCBfQ29tcGFyZSwgX1ZhbHVlLCBfS2V5T2ZWYWx1ZSwgX1RyYWl0cywgX0FsbG9jPiBfU2VsZjsKKyAgX0Jhc2UgX01fbm9uX2RiZ19pbXBsOworICBfU1RMUF9QUklWIF9fb3duZWRfbGlzdCBfTV9pdGVyX2xpc3Q7CisKK3B1YmxpYzoKKyAgX19JTVBPUlRfQ09OVEFJTkVSX1RZUEVERUZTKF9CYXNlKQorICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjprZXlfdHlwZSBrZXlfdHlwZTsKKworICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6Ol9Ob25Db25zdFRyYWl0cyBfTm9uQ29uc3RJdGVUcmFpdHM7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6X0NvbnN0VHJhaXRzICAgIF9Db25zdEl0ZVRyYWl0czsKKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9EQkdfaXRlcjxfQmFzZSwgX1NUTFBfUFJJViBfRGJnVHJhaXRzPF9Ob25Db25zdEl0ZVRyYWl0cz4gPiBpdGVyYXRvcjsKKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9EQkdfaXRlcjxfQmFzZSwgX1NUTFBfUFJJViBfRGJnVHJhaXRzPF9Db25zdEl0ZVRyYWl0cz4gPiAgICBjb25zdF9pdGVyYXRvcjsKKworICBfU1RMUF9ERUNMQVJFX0JJRElSRUNUSU9OQUxfUkVWRVJTRV9JVEVSQVRPUlM7CisKK3ByaXZhdGU6CisgIF9TVExQX0tFWV9UWVBFX0ZPUl9DT05UX0VYVChrZXlfdHlwZSkKKyAgdm9pZCBfSW52YWxpZGF0ZV9pdGVyYXRvcihjb25zdCBpdGVyYXRvciYgX19pdCkKKyAgeyBfU1RMUF9QUklWIF9faW52YWxpZGF0ZV9pdGVyYXRvcigmX01faXRlcl9saXN0LF9faXQpOyB9CisgIHZvaWQgX0ludmFsaWRhdGVfaXRlcmF0b3JzKGNvbnN0IGl0ZXJhdG9yJiBfX2ZpcnN0LCBjb25zdCBpdGVyYXRvciYgX19sYXN0KQorICB7IF9TVExQX1BSSVYgX19pbnZhbGlkYXRlX3JhbmdlKCZfTV9pdGVyX2xpc3QsIF9fZmlyc3QsIF9fbGFzdCk7IH0KKworICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjppdGVyYXRvciBfQmFzZV9pdGVyYXRvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfaXRlcmF0b3IgX0Jhc2VfY29uc3RfaXRlcmF0b3I7CisKK3B1YmxpYzoKKyAgX1JiX3RyZWUoKQorICAgIDogX01fbm9uX2RiZ19pbXBsKCksIF9NX2l0ZXJfbGlzdCgmX01fbm9uX2RiZ19pbXBsKSB7fQorICBfUmJfdHJlZShjb25zdCBfQ29tcGFyZSYgX19jb21wKQorICAgIDogX01fbm9uX2RiZ19pbXBsKF9fY29tcCksIF9NX2l0ZXJfbGlzdCgmX01fbm9uX2RiZ19pbXBsKSB7fQorICBfUmJfdHJlZShjb25zdCBfQ29tcGFyZSYgX19jb21wLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgIDogX01fbm9uX2RiZ19pbXBsKF9fY29tcCwgX19hKSwgX01faXRlcl9saXN0KCZfTV9ub25fZGJnX2ltcGwpIHt9CisgIF9SYl90cmVlKGNvbnN0IF9TZWxmJiBfX3gpCisgICAgOiBfTV9ub25fZGJnX2ltcGwoX194Ll9NX25vbl9kYmdfaW1wbCksIF9NX2l0ZXJfbGlzdCgmX01fbm9uX2RiZ19pbXBsKSB7fQorCisgIF9SYl90cmVlKF9fbW92ZV9zb3VyY2U8X1NlbGY+IHNyYyk6CisgICAgX01fbm9uX2RiZ19pbXBsKF9fbW92ZV9zb3VyY2U8X0Jhc2U+KHNyYy5nZXQoKS5fTV9ub25fZGJnX2ltcGwpKSwKKyAgICBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkgeworI2lmIGRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpIHx8IChfU1RMUF9ERUJVR19MRVZFTCA9PSBfU1RMUF9TVEFOREFSRF9EQkdfTEVWRUwpCisgICAgc3JjLmdldCgpLl9NX2l0ZXJfbGlzdC5fSW52YWxpZGF0ZV9hbGwoKTsKKyNlbHNlCisgICAgc3JjLmdldCgpLl9NX2l0ZXJfbGlzdC5fU2V0X293bmVyKF9NX2l0ZXJfbGlzdCk7CisjZW5kaWYKKyAgfQorCisgIH5fUmJfdHJlZSgpIHt9CisKKyAgX1NlbGYmIG9wZXJhdG9yPShjb25zdCBfU2VsZiYgX194KSB7CisgICAgaWYgKHRoaXMgIT0gJl9feCkgeworICAgICAgLy9TaG91bGQgbm90IGludmFsaWRhdGUgZW5kIGl0ZXJhdG9yOgorICAgICAgX0ludmFsaWRhdGVfaXRlcmF0b3JzKGJlZ2luKCksIGVuZCgpKTsKKyAgICAgIF9NX25vbl9kYmdfaW1wbCA9IF9feC5fTV9ub25fZGJnX2ltcGw7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdCB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwuZ2V0X2FsbG9jYXRvcigpOyB9CisgIF9Db21wYXJlIGtleV9jb21wKCkgY29uc3QgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLmtleV9jb21wKCkubm9uX2RiZ19rZXlfY29tcCgpOyB9CisKKyAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBpdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuYmVnaW4oKSk7IH0KKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBjb25zdF9pdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuYmVnaW4oKSk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLmVuZCgpKTsgfQorICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBjb25zdF9pdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuZW5kKCkpOyB9CisKKyAgcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisgIHJldmVyc2VfaXRlcmF0b3IgcmVuZCgpIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgY29uc3QgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorCisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwuZW1wdHkoKTsgfQorICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5zaXplKCk7IH0KKyAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLm1heF9zaXplKCk7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIHNpemVfdHlwZSBjb3VudChjb25zdCBfS1QmIF9feCkgY29uc3QgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLmNvdW50KF9feCk7IH0KKworICB2b2lkIHN3YXAoX1NlbGYmIF9fdCkgeworICAgIF9NX25vbl9kYmdfaW1wbC5zd2FwKF9fdC5fTV9ub25fZGJnX2ltcGwpOworICAgIF9NX2l0ZXJfbGlzdC5fU3dhcF9vd25lcnMoX190Ll9NX2l0ZXJfbGlzdCk7CisgIH0KKworICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgaXRlcmF0b3IgZmluZChjb25zdCBfS1QmIF9faykKKyAgeyByZXR1cm4gaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLmZpbmQoX19rKSk7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIGNvbnN0X2l0ZXJhdG9yIGZpbmQoY29uc3QgX0tUJiBfX2spIGNvbnN0CisgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5maW5kKF9faykpOyB9CisKKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIGl0ZXJhdG9yIGxvd2VyX2JvdW5kKGNvbnN0IF9LVCYgX194KQorICB7IHJldHVybiBpdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwubG93ZXJfYm91bmQoX194KSk7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIGNvbnN0X2l0ZXJhdG9yIGxvd2VyX2JvdW5kKGNvbnN0IF9LVCYgX194KSBjb25zdAorICB7IHJldHVybiBjb25zdF9pdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwubG93ZXJfYm91bmQoX194KSk7IH0KKworICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgaXRlcmF0b3IgdXBwZXJfYm91bmQoY29uc3QgX0tUJiBfX3gpCisgIHsgcmV0dXJuIGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC51cHBlcl9ib3VuZChfX3gpKTsgfQorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgY29uc3RfaXRlcmF0b3IgdXBwZXJfYm91bmQoY29uc3QgX0tUJiBfX3gpIGNvbnN0CisgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC51cHBlcl9ib3VuZChfX3gpKTsgfQorCisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBwYWlyPGl0ZXJhdG9yLGl0ZXJhdG9yPiBlcXVhbF9yYW5nZShjb25zdCBfS1QmIF9feCkgeworICAgIHJldHVybiBwYWlyPGl0ZXJhdG9yLCBpdGVyYXRvcj4oaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLmxvd2VyX2JvdW5kKF9feCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLnVwcGVyX2JvdW5kKF9feCkpKTsKKyAgfQorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgcGFpcjxjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3I+IGVxdWFsX3JhbmdlKGNvbnN0IF9LVCYgX194KSBjb25zdCB7CisgICAgcmV0dXJuIHBhaXI8Y29uc3RfaXRlcmF0b3IsY29uc3RfaXRlcmF0b3I+KGNvbnN0X2l0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5sb3dlcl9ib3VuZChfX3gpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLnVwcGVyX2JvdW5kKF9feCkpKTsKKyAgfQorCisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBwYWlyPGl0ZXJhdG9yLGl0ZXJhdG9yPiBlcXVhbF9yYW5nZV91bmlxdWUoY29uc3QgX0tUJiBfX3gpIHsKKyAgICBfU1RMUF9TVEQ6OnBhaXI8X0Jhc2VfaXRlcmF0b3IsIF9CYXNlX2l0ZXJhdG9yPiBfX3A7CisgICAgX19wID0gX01fbm9uX2RiZ19pbXBsLmVxdWFsX3JhbmdlX3VuaXF1ZShfX3gpOworICAgIHJldHVybiBwYWlyPGl0ZXJhdG9yLCBpdGVyYXRvcj4oaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX19wLmZpcnN0KSwgaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX19wLnNlY29uZCkpOworICB9CisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4gZXF1YWxfcmFuZ2VfdW5pcXVlKGNvbnN0IF9LVCYgX194KSBjb25zdCB7CisgICAgX1NUTFBfU1REOjpwYWlyPF9CYXNlX2NvbnN0X2l0ZXJhdG9yLCBfQmFzZV9jb25zdF9pdGVyYXRvcj4gX19wOworICAgIF9fcCA9IF9NX25vbl9kYmdfaW1wbC5lcXVhbF9yYW5nZV91bmlxdWUoX194KTsKKyAgICByZXR1cm4gcGFpcjxjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3I+KGNvbnN0X2l0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9fcC5maXJzdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvcigmX01faXRlcl9saXN0LCBfX3Auc2Vjb25kKSk7CisgIH0KKworICBwYWlyPGl0ZXJhdG9yLGJvb2w+IGluc2VydF91bmlxdWUoY29uc3QgdmFsdWVfdHlwZSYgX194KSB7CisgICAgX1NUTFBfU1REOjpwYWlyPF9CYXNlX2l0ZXJhdG9yLCBib29sPiBfX3JlcyA9IF9NX25vbl9kYmdfaW1wbC5pbnNlcnRfdW5pcXVlKF9feCk7CisgICAgcmV0dXJuIHBhaXI8aXRlcmF0b3IsIGJvb2w+KGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9fcmVzLmZpcnN0KSwgX19yZXMuc2Vjb25kKTsKKyAgfQorICBpdGVyYXRvciBpbnNlcnRfZXF1YWwoY29uc3QgdmFsdWVfdHlwZSYgX194KQorICB7IHJldHVybiBpdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuaW5zZXJ0X2VxdWFsKF9feCkpOyB9CisKKyAgaXRlcmF0b3IgaW5zZXJ0X3VuaXF1ZShpdGVyYXRvciBfX3BvcywgY29uc3QgdmFsdWVfdHlwZSYgX194KSB7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX19jaGVja19pZl9vd25lcigmX01faXRlcl9saXN0LF9fcG9zKSkKKyAgICByZXR1cm4gaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLmluc2VydF91bmlxdWUoX19wb3MuX01faXRlcmF0b3IsIF9feCkpOworICB9CisgIGl0ZXJhdG9yIGluc2VydF9lcXVhbChpdGVyYXRvciBfX3BvcywgY29uc3QgdmFsdWVfdHlwZSYgX194KSB7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX19jaGVja19pZl9vd25lcigmX01faXRlcl9saXN0LCBfX3BvcykpCisgICAgcmV0dXJuIGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5pbnNlcnRfZXF1YWwoX19wb3MuX01faXRlcmF0b3IsIF9feCkpOworICB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgdm9pZCBpbnNlcnRfZXF1YWwoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KSB7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX19jaGVja19yYW5nZShfX2ZpcnN0LF9fbGFzdCkpCisgICAgX01fbm9uX2RiZ19pbXBsLmluc2VydF9lcXVhbChfU1RMUF9QUklWIF9Ob25fRGJnX2l0ZXIoX19maXJzdCksIF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2xhc3QpKTsKKyAgfQorICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgdm9pZCBpbnNlcnRfdW5pcXVlKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9fY2hlY2tfcmFuZ2UoX19maXJzdCxfX2xhc3QpKQorICAgIF9NX25vbl9kYmdfaW1wbC5pbnNlcnRfdW5pcXVlKF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2ZpcnN0KSwgX1NUTFBfUFJJViBfTm9uX0RiZ19pdGVyKF9fbGFzdCkpOworICB9CisjZWxzZQorICB2b2lkIGluc2VydF91bmlxdWUoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KSB7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX19jaGVja19yYW5nZShfX2ZpcnN0LF9fbGFzdCkpCisgICAgX01fbm9uX2RiZ19pbXBsLmluc2VydF91bmlxdWUoX19maXJzdC5fTV9pdGVyYXRvciwgX19sYXN0Ll9NX2l0ZXJhdG9yKTsKKyAgfQorICB2b2lkIGluc2VydF91bmlxdWUoY29uc3QgdmFsdWVfdHlwZSogX19maXJzdCwgY29uc3QgdmFsdWVfdHlwZSogX19sYXN0KSB7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX19jaGVja19wdHJfcmFuZ2UoX19maXJzdCxfX2xhc3QpKQorICAgIF9NX25vbl9kYmdfaW1wbC5pbnNlcnRfdW5pcXVlKF9fZmlyc3QsIF9fbGFzdCk7CisgIH0KKyAgdm9pZCBpbnNlcnRfZXF1YWwoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KSB7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX19jaGVja19yYW5nZShfX2ZpcnN0LF9fbGFzdCkpCisgICAgX01fbm9uX2RiZ19pbXBsLmluc2VydF9lcXVhbChfX2ZpcnN0Ll9NX2l0ZXJhdG9yLCBfX2xhc3QuX01faXRlcmF0b3IpOworICB9CisgIHZvaWQgaW5zZXJ0X2VxdWFsKGNvbnN0IHZhbHVlX3R5cGUqIF9fZmlyc3QsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbGFzdCkgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9fY2hlY2tfcHRyX3JhbmdlKF9fZmlyc3QsX19sYXN0KSkKKyAgICBfTV9ub25fZGJnX2ltcGwuaW5zZXJ0X2VxdWFsKF9fZmlyc3QsIF9fbGFzdCk7CisgIH0KKyNlbmRpZgorCisgIHZvaWQgZXJhc2UoaXRlcmF0b3IgX19wb3MpIHsKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfX2NoZWNrX2lmX293bmVyKCZfTV9pdGVyX2xpc3QsX19wb3MpKQorICAgIF9TVExQX0RFQlVHX0NIRUNLKF9EZXJlZmVyZW5jZWFibGUoX19wb3MpKQorICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9yKF9fcG9zKTsKKyAgICBfTV9ub25fZGJnX2ltcGwuZXJhc2UoX19wb3MuX01faXRlcmF0b3IpOworICB9CisgIHNpemVfdHlwZSBlcmFzZShjb25zdCBrZXlfdHlwZSYgX194KSB7CisgICAgcGFpcjxfQmFzZV9pdGVyYXRvcixfQmFzZV9pdGVyYXRvcj4gX19wID0gX01fbm9uX2RiZ19pbXBsLmVxdWFsX3JhbmdlKF9feCk7CisgICAgc2l6ZV90eXBlIF9fbiA9IGRpc3RhbmNlKF9fcC5maXJzdCwgX19wLnNlY29uZCk7CisgICAgX0ludmFsaWRhdGVfaXRlcmF0b3JzKGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9fcC5maXJzdCksIGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9fcC5zZWNvbmQpKTsKKyAgICBfTV9ub25fZGJnX2ltcGwuZXJhc2UoX19wLmZpcnN0LCBfX3Auc2Vjb25kKTsKKyAgICByZXR1cm4gX19uOworICB9CisgIHNpemVfdHlwZSBlcmFzZV91bmlxdWUoY29uc3Qga2V5X3R5cGUmIF9feCkgeworICAgIF9CYXNlX2l0ZXJhdG9yIF9faSA9IF9NX25vbl9kYmdfaW1wbC5maW5kKF9feCk7CisgICAgaWYgKF9faSAhPSBfTV9ub25fZGJnX2ltcGwuZW5kKCkpIHsKKyAgICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9yKGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9faSkpOworICAgICAgX01fbm9uX2RiZ19pbXBsLmVyYXNlKF9faSk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7CisgIH0KKworICB2b2lkIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0LCBiZWdpbigpLCBlbmQoKSkpCisgICAgX0ludmFsaWRhdGVfaXRlcmF0b3JzKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgX01fbm9uX2RiZ19pbXBsLmVyYXNlKF9fZmlyc3QuX01faXRlcmF0b3IsIF9fbGFzdC5fTV9pdGVyYXRvcik7CisgIH0KKyAgdm9pZCBlcmFzZShjb25zdCBrZXlfdHlwZSogX19maXJzdCwgY29uc3Qga2V5X3R5cGUqIF9fbGFzdCkgeworICAgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkgZXJhc2UoKl9fZmlyc3QrKyk7CisgIH0KKworICB2b2lkIGNsZWFyKCkgeworICAgIC8vc2hvdWxkIG5vdCBpbnZhbGlkYXRlIGVuZDoKKyAgICBfSW52YWxpZGF0ZV9pdGVyYXRvcnMoYmVnaW4oKSwgZW5kKCkpOworICAgIF9NX25vbl9kYmdfaW1wbC5jbGVhcigpOworICB9Cit9OworCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI3VuZGVmIF9TVExQX05PTl9EQkdfVFJFRQorCisjZW5kaWYgLyogX1NUTFBfSU5URVJOQUxfREJHX1RSRUVfSCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RsL2RlYnVnL192ZWN0b3IuaCBiL3N0bC9kZWJ1Zy9fdmVjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcxYjc2NAotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9kZWJ1Zy9fdmVjdG9yLmgKQEAgLTAsMCArMSw0NDkgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIE1vc2NvdyBDZW50ZXIgZm9yIFNQQVJDIFRlY2hub2xvZ3kKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisvKiBOT1RFOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBTVEwgaGVhZGVycy4KKyAqICAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuCisgKi8KKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9EQkdfVkVDVE9SX0gKKyNkZWZpbmUgX1NUTFBfSU5URVJOQUxfREJHX1ZFQ1RPUl9ICisKKyNpZm5kZWYgX1NUTFBfREJHX0lURVJBVE9SX0gKKyMgIGluY2x1ZGUgPHN0bC9kZWJ1Zy9faXRlcmF0b3IuaD4KKyNlbmRpZgorCisjZGVmaW5lIF9TVExQX05PTl9EQkdfVkVDVE9SIF9TVExQX1BSSVYgX1NUTFBfTk9OX0RCR19OQU1FKHZlY3RvcikgPF9UcCwgX0FsbG9jPgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHX1VTRV9ESVNUSU5DVF9WQUxVRV9UWVBFX0hFTFBFUlMpCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgX1RwKgordmFsdWVfdHlwZShjb25zdCBfU1RMUF9QUklWIF9EQkdfaXRlcl9iYXNlPCBfU1RMUF9OT05fREJHX1ZFQ1RPUiA+JikKK3sgcmV0dXJuIChfVHAqKTA7IH0KK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK2lubGluZSByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZworaXRlcmF0b3JfY2F0ZWdvcnkoY29uc3QgX1NUTFBfUFJJViBfREJHX2l0ZXJfYmFzZTwgX1NUTFBfTk9OX0RCR19WRUNUT1IgPiYpCit7IHJldHVybiByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZygpOyB9CisjZW5kaWYKKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfTmNJdD4KK3N0cnVjdCBfVmVjdG9yX2NvbnN0X3RyYWl0czsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX05jSXQ+CitzdHJ1Y3QgX1ZlY3Rvcl9ub25jb25zdF90cmFpdHMgeworICB0eXBlZGVmIF9Ob25jb25zdF90cmFpdHM8X1RwPiBfQmFzZVQ7CisgIHR5cGVkZWYgX1RwIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgX1RwJiByZWZlcmVuY2U7CisgIHR5cGVkZWYgX1RwKiBwb2ludGVyOworICB0eXBlZGVmIF9WZWN0b3JfY29uc3RfdHJhaXRzPF9UcCwgX05jSXQ+IF9Db25zdFRyYWl0czsKKyAgdHlwZWRlZiBfVmVjdG9yX25vbmNvbnN0X3RyYWl0czxfVHAsIF9OY0l0PiBfTm9uQ29uc3RUcmFpdHM7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfTmNJdD4KK3N0cnVjdCBfVmVjdG9yX2NvbnN0X3RyYWl0cyB7CisgIHR5cGVkZWYgX0NvbnN0X3RyYWl0czxfVHA+IF9CYXNlVDsKKyAgdHlwZWRlZiBfVHAgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiBjb25zdCBfVHAmIHJlZmVyZW5jZTsKKyAgdHlwZWRlZiBjb25zdCBfVHAqIHBvaW50ZXI7CisgIHR5cGVkZWYgX1ZlY3Rvcl9jb25zdF90cmFpdHM8X1RwLCBfTmNJdD4gX0NvbnN0VHJhaXRzOworICB0eXBlZGVmIF9WZWN0b3Jfbm9uY29uc3RfdHJhaXRzPF9UcCwgX05jSXQ+IF9Ob25Db25zdFRyYWl0czsKK307CisKK19TVExQX1RFTVBMQVRFX05VTEwKK3N0cnVjdCBfVmVjdG9yX25vbmNvbnN0X3RyYWl0czxib29sLCBfQml0X2l0ZXJhdG9yPiB7CisgIHR5cGVkZWYgX0JpdF9pdGVyYXRvcjo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworICB0eXBlZGVmIF9CaXRfaXRlcmF0b3I6OnJlZmVyZW5jZSByZWZlcmVuY2U7CisgIHR5cGVkZWYgX0JpdF9pdGVyYXRvcjo6cG9pbnRlciBwb2ludGVyOworICB0eXBlZGVmIF9WZWN0b3JfY29uc3RfdHJhaXRzPGJvb2wsIF9CaXRfaXRlcmF0b3I+IF9Db25zdFRyYWl0czsKKyAgdHlwZWRlZiBfVmVjdG9yX25vbmNvbnN0X3RyYWl0czxib29sLCBfQml0X2l0ZXJhdG9yPiBfTm9uQ29uc3RUcmFpdHM7Cit9OworCitfU1RMUF9URU1QTEFURV9OVUxMCitzdHJ1Y3QgX1ZlY3Rvcl9jb25zdF90cmFpdHM8Ym9vbCwgX0JpdF9pdGVyYXRvcj4geworICB0eXBlZGVmIF9CaXRfY29uc3RfaXRlcmF0b3I6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiBfQml0X2NvbnN0X2l0ZXJhdG9yOjpyZWZlcmVuY2UgcmVmZXJlbmNlOworICB0eXBlZGVmIF9CaXRfY29uc3RfaXRlcmF0b3I6OnBvaW50ZXIgcG9pbnRlcjsKKyAgdHlwZWRlZiBfVmVjdG9yX2NvbnN0X3RyYWl0czxib29sLCBfQml0X2l0ZXJhdG9yPiBfQ29uc3RUcmFpdHM7CisgIHR5cGVkZWYgX1ZlY3Rvcl9ub25jb25zdF90cmFpdHM8Ym9vbCwgX0JpdF9pdGVyYXRvcj4gX05vbkNvbnN0VHJhaXRzOworfTsKKworX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIF9TVExQX0RCR19BTExPQ0FUT1JfU0VMRUNUKF9UcCkgPgorY2xhc3MgdmVjdG9yIDoKKyNpZiAhZGVmaW5lZCAoX19ETUNfXykKKyAgICAgICAgICAgICBwcml2YXRlCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX19jb25zdHJ1Y3RfY2hlY2tlcjwgX1NUTFBfTk9OX0RCR19WRUNUT1IgPgorI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QQVJUSUFMX1NQRUNfV09SS0FST1VORCkKKyAgICAgICAgICAgICAsIHB1YmxpYyBfX3N0bHBvcnRfY2xhc3M8dmVjdG9yPF9UcCwgX0FsbG9jPiA+CisjZW5kaWYKK3sKK3ByaXZhdGU6CisgIHR5cGVkZWYgX1NUTFBfTk9OX0RCR19WRUNUT1IgX0Jhc2U7CisgIHR5cGVkZWYgdmVjdG9yPF9UcCwgX0FsbG9jPiBfU2VsZjsKKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9fY29uc3RydWN0X2NoZWNrZXI8X1NUTFBfTk9OX0RCR19WRUNUT1IgPiBfQ29uc3RydWN0Q2hlY2s7CisgIF9CYXNlIF9NX25vbl9kYmdfaW1wbDsKKyAgX1NUTFBfUFJJViBfX293bmVkX2xpc3QgX01faXRlcl9saXN0OworCitwdWJsaWM6CisgIF9fSU1QT1JUX0NPTlRBSU5FUl9UWVBFREVGUyhfQmFzZSkKKworICB0eXBlZGVmIF9TVExQX1BSSVYgX0RCR19pdGVyPF9CYXNlLAorICAgIF9TVExQX1BSSVYgX0RiZ1RyYWl0czxfU1RMUF9QUklWIF9WZWN0b3Jfbm9uY29uc3RfdHJhaXRzPHZhbHVlX3R5cGUsIHR5cGVuYW1lIF9CYXNlOjppdGVyYXRvcj4gPiA+IGl0ZXJhdG9yOworCisgIHR5cGVkZWYgX1NUTFBfUFJJViBfREJHX2l0ZXI8X0Jhc2UsCisgICAgX1NUTFBfUFJJViBfRGJnVHJhaXRzPF9TVExQX1BSSVYgX1ZlY3Rvcl9jb25zdF90cmFpdHM8dmFsdWVfdHlwZSwgdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yPiA+ID4gY29uc3RfaXRlcmF0b3I7CisKK3ByaXZhdGU6CisgIHZvaWQgX0ludmFsaWRhdGVfYWxsKCkKKyAgeyBfTV9pdGVyX2xpc3QuX0ludmFsaWRhdGVfYWxsKCk7IH0KKyAgdm9pZCBfSW52YWxpZGF0ZV9pdGVyYXRvcihjb25zdCBpdGVyYXRvciYgX19pdCkKKyAgeyBfU1RMUF9QUklWIF9faW52YWxpZGF0ZV9pdGVyYXRvcigmX01faXRlcl9saXN0LCBfX2l0KTsgfQorICB2b2lkIF9JbnZhbGlkYXRlX2l0ZXJhdG9ycyhjb25zdCBpdGVyYXRvciYgX19maXJzdCwgY29uc3QgaXRlcmF0b3ImIF9fbGFzdCkKKyAgeyBfU1RMUF9QUklWIF9faW52YWxpZGF0ZV9yYW5nZSgmX01faXRlcl9saXN0LCBfX2ZpcnN0LCBfX2xhc3QpOyB9CisKKyAgdm9pZCBfQ2hlY2tfT3ZlcmZsb3coc2l6ZV90eXBlIF9fbmIpIHsKKyAgICBpZiAoc2l6ZSgpICsgX19uYiA+IGNhcGFjaXR5KCkpCisgICAgICBfSW52YWxpZGF0ZV9hbGwoKTsKKyAgfQorICB2b2lkIF9Db21wYXJlX0NhcGFjaXR5IChzaXplX3R5cGUgX19vbGRfY2FwYWNpdHkpIHsKKyAgICBpZiAoY2FwYWNpdHkoKSA+IF9fb2xkX2NhcGFjaXR5KSB7CisgICAgICBfSW52YWxpZGF0ZV9hbGwoKTsKKyAgICB9CisgIH0KKworcHVibGljOgorICBfU1RMUF9ERUNMQVJFX1JBTkRPTV9BQ0NFU1NfUkVWRVJTRV9JVEVSQVRPUlM7CisKKyAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5nZXRfYWxsb2NhdG9yKCk7IH0KKworICBpdGVyYXRvciBiZWdpbigpICAgICAgICAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5iZWdpbigpKTsgfQorICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5iZWdpbigpKTsgfQorICBpdGVyYXRvciBlbmQoKSAgICAgICAgICAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5lbmQoKSk7IH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuZW5kKCkpOyB9CisKKyAgcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSAgICAgICAgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisgIHJldmVyc2VfaXRlcmF0b3IgcmVuZCgpICAgICAgICAgICAgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSBjb25zdCAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKworICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0ICAgICAgICB7IHJldHVybiBfTV9ub25fZGJnX2ltcGwuc2l6ZSgpOyB9CisgIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0ICAgIHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5tYXhfc2l6ZSgpOyB9CisgIHNpemVfdHlwZSBjYXBhY2l0eSgpIGNvbnN0ICAgIHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5jYXBhY2l0eSgpOyB9CisgIGJvb2wgZW1wdHkoKSBjb25zdCAgICAgICAgICAgIHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5lbXB0eSgpOyB9CisKKyAgcmVmZXJlbmNlIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fbikgeworICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKF9fbiA8IHNpemUoKSwgX1N0bE1zZ19PVVRfT0ZfQk9VTkRTKQorICAgIHJldHVybiBfTV9ub25fZGJnX2ltcGxbX19uXTsKKyAgfQorCisgIGNvbnN0X3JlZmVyZW5jZSBvcGVyYXRvcltdKHNpemVfdHlwZSBfX24pIGNvbnN0IHsKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVChfX24gPCBzaXplKCksIF9TdGxNc2dfT1VUX09GX0JPVU5EUykKKyAgICByZXR1cm4gX01fbm9uX2RiZ19pbXBsW19fbl07CisgIH0KKworICByZWZlcmVuY2UgYXQoc2l6ZV90eXBlIF9fbikgeyByZXR1cm4gX01fbm9uX2RiZ19pbXBsLmF0KF9fbik7IH0KKyAgY29uc3RfcmVmZXJlbmNlIGF0KHNpemVfdHlwZSBfX24pIGNvbnN0IHsgcmV0dXJuIF9NX25vbl9kYmdfaW1wbC5hdChfX24pOyB9CisKKyAgZXhwbGljaXQgdmVjdG9yKGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX01fbm9uX2RiZ19pbXBsKF9fYSksIF9NX2l0ZXJfbGlzdCgmX01fbm9uX2RiZ19pbXBsKSAge30KKworI2lmICFkZWZpbmVkKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCisgIGV4cGxpY2l0IHZlY3RvcihzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9feCA9IF9UcCgpLAorI2Vsc2UKKyAgdmVjdG9yKHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX194LAorI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCisgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9NX25vbl9kYmdfaW1wbChfX24sIF9feCwgX19hKSwgX01faXRlcl9saXN0KCZfTV9ub25fZGJnX2ltcGwpIHt9CisKKyNpZiBkZWZpbmVkKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCisgIGV4cGxpY2l0IHZlY3RvcihzaXplX3R5cGUgX19uKQorICAgIDogX01fbm9uX2RiZ19pbXBsKF9fbiksIF9NX2l0ZXJfbGlzdCgmX01fbm9uX2RiZ19pbXBsKSB7fQorI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCisKKyAgdmVjdG9yKGNvbnN0IF9TZWxmJiBfX3gpCisgICAgOiBfQ29uc3RydWN0Q2hlY2soX194KSwgX01fbm9uX2RiZ19pbXBsKF9feC5fTV9ub25fZGJnX2ltcGwpLCBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KKworICB2ZWN0b3IoX19tb3ZlX3NvdXJjZTxfU2VsZj4gc3JjKQorICAgIDogX01fbm9uX2RiZ19pbXBsKF9fbW92ZV9zb3VyY2U8X0Jhc2U+KHNyYy5nZXQoKS5fTV9ub25fZGJnX2ltcGwpKSwKKyAgICAgIF9NX2l0ZXJfbGlzdCgmX01fbm9uX2RiZ19pbXBsKSB7CisjaWYgZGVmaW5lZCAoX1NUTFBfTk9fRVhURU5TSU9OUykgfHwgKF9TVExQX0RFQlVHX0xFVkVMID09IF9TVExQX1NUQU5EQVJEX0RCR19MRVZFTCkKKyAgICBzcmMuZ2V0KCkuX01faXRlcl9saXN0Ll9JbnZhbGlkYXRlX2FsbCgpOworI2Vsc2UKKyAgICBzcmMuZ2V0KCkuX01faXRlcl9saXN0Ll9TZXRfb3duZXIoX01faXRlcl9saXN0KTsKKyNlbmRpZgorICB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZlY3RvcihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hIF9TVExQX0FMTE9DQVRPUl9UWVBFX0RGTCkKKyAgICA6IF9Db25zdHJ1Y3RDaGVjayhfX2ZpcnN0LCBfX2xhc3QpLAorICAgICAgX01fbm9uX2RiZ19pbXBsKF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2ZpcnN0KSwgX1NUTFBfUFJJViBfTm9uX0RiZ19pdGVyKF9fbGFzdCksIF9fYSksCisgICAgICBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfTkVFRFNfRVhUUkFfVEVNUExBVEVfQ09OU1RSVUNUT1JTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZlY3RvcihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgOiBfQ29uc3RydWN0Q2hlY2soX19maXJzdCwgX19sYXN0KSwKKyAgICAgIF9NX25vbl9kYmdfaW1wbChfU1RMUF9QUklWIF9Ob25fRGJnX2l0ZXIoX19maXJzdCksIF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2xhc3QpKSwKKyAgICAgIF9NX2l0ZXJfbGlzdCgmX01fbm9uX2RiZ19pbXBsKSB7fQorIyAgZW5kaWYKKyNlbHNlCisgIHZlY3Rvcihjb25zdCBfVHAqIF9fZmlyc3QsIGNvbnN0IF9UcCogX19sYXN0LAorICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfQ29uc3RydWN0Q2hlY2soX19maXJzdCwgX19sYXN0KSwgX01fbm9uX2RiZ19pbXBsKF9fZmlyc3QsIF9fbGFzdCwgX19hKSwKKyAgICBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KKworICAvLyBteXN0ZXJpb3VzIFZDKysgYnVnID8KKyAgdmVjdG9yKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCAsCisgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9Db25zdHJ1Y3RDaGVjayhfX2ZpcnN0LCBfX2xhc3QpLAorICAgICAgX01fbm9uX2RiZ19pbXBsKF9fZmlyc3QuX01faXRlcmF0b3IsIF9fbGFzdC5fTV9pdGVyYXRvciwgX19hKSwKKyAgICBfTV9pdGVyX2xpc3QoJl9NX25vbl9kYmdfaW1wbCkge30KKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisKKyAgX1NlbGYmIG9wZXJhdG9yPShjb25zdCBfU2VsZiYgX194KSB7CisgICAgaWYgKHRoaXMgIT0gJl9feCkgeworICAgICAgX0ludmFsaWRhdGVfYWxsKCk7CisgICAgICBfTV9ub25fZGJnX2ltcGwgPSBfX3guX01fbm9uX2RiZ19pbXBsOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB2b2lkIHJlc2VydmUoc2l6ZV90eXBlIF9fbikgeworICAgIGlmIChjYXBhY2l0eSgpIDwgX19uKQorICAgICAgX0ludmFsaWRhdGVfYWxsKCk7CisgICAgX01fbm9uX2RiZ19pbXBsLnJlc2VydmUoX19uKTsKKyAgfQorCisgIHJlZmVyZW5jZSBmcm9udCgpIHsKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghZW1wdHkoKSwgX1N0bE1zZ19FTVBUWV9DT05UQUlORVIpCisgICAgcmV0dXJuICpiZWdpbigpOworICB9CisgIGNvbnN0X3JlZmVyZW5jZSBmcm9udCgpIGNvbnN0IHsKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghZW1wdHkoKSwgX1N0bE1zZ19FTVBUWV9DT05UQUlORVIpCisgICAgcmV0dXJuICpiZWdpbigpOworICB9CisgIHJlZmVyZW5jZSBiYWNrKCkgeworICAgIF9TVExQX1ZFUkJPU0VfQVNTRVJUKCFlbXB0eSgpLCBfU3RsTXNnX0VNUFRZX0NPTlRBSU5FUikKKyAgICByZXR1cm4gKigtLWVuZCgpKTsKKyAgfQorICBjb25zdF9yZWZlcmVuY2UgYmFjaygpIGNvbnN0IHsKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghZW1wdHkoKSwgX1N0bE1zZ19FTVBUWV9DT05UQUlORVIpCisgICAgcmV0dXJuICooLS1lbmQoKSk7CisgIH0KKworICB2b2lkIHN3YXAoX1NlbGYmIF9feCkgeworICAgIF9NX2l0ZXJfbGlzdC5fU3dhcF9vd25lcnMoX194Ll9NX2l0ZXJfbGlzdCk7CisgICAgX01fbm9uX2RiZ19pbXBsLnN3YXAoX194Ll9NX25vbl9kYmdfaW1wbCk7CisgIH0KKworI2lmICFkZWZpbmVkKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCisgIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBfX3BvcywgY29uc3QgX1RwJiBfX3ggPSBfVHAoKSkgeworI2Vsc2UKKyAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBjb25zdCBfVHAmIF9feCkgeworI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX2lmX293bmVyKCZfTV9pdGVyX2xpc3QsIF9fcG9zKSkKKyAgICBfQ2hlY2tfT3ZlcmZsb3coMSk7CisgICAgcmV0dXJuIGl0ZXJhdG9yKCZfTV9pdGVyX2xpc3QsIF9NX25vbl9kYmdfaW1wbC5pbnNlcnQoX19wb3MuX01faXRlcmF0b3IsIF9feCkpOworICB9CisKKyNpZiBkZWZpbmVkKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCisgIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBfX3BvcykKKyAgeyByZXR1cm4gaW5zZXJ0KF9fcG9zLCBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKF9UcCkpOyB9CisjZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKi8KKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIC8vIENoZWNrIHdoZXRoZXIgaXQncyBhbiBpbnRlZ3JhbCB0eXBlLiAgSWYgc28sIGl0J3Mgbm90IGFuIGl0ZXJhdG9yLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLAorICAgICAgICAgICAgICBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9BcmVTYW1lVW5DVlR5cGVzPF9JbnB1dEl0ZXJhdG9yLCBpdGVyYXRvcj46Ol9SZXQgX0lzTm9uQ29uc3RJdGVyYXRvcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9BcmVTYW1lVW5DVlR5cGVzPF9JbnB1dEl0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj46Ol9SZXQgX0lzQ29uc3RJdGVyYXRvcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Mb3IyPF9Jc05vbkNvbnN0SXRlcmF0b3IsIF9Jc0NvbnN0SXRlcmF0b3I+OjpfUmV0IF9Eb0NoZWNrOworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LCBfX2xhc3QpKQorICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9vd25lcigmX01faXRlcl9saXN0LCBfX3BvcykpCisgICAgLy9TZXF1ZW5jZSByZXF1aXJlbWVudHMgMjMuMS4xIFRhYmxlIDY3OgorICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9ub3Rfb3duZXIoJl9NX2l0ZXJfbGlzdCwgX19maXJzdCwgX0RvQ2hlY2soKSkpOworICAgIHNpemVfdHlwZSBfX29sZF9jYXBhY2l0eSA9IGNhcGFjaXR5KCk7CisgICAgX01fbm9uX2RiZ19pbXBsLmluc2VydChfX3Bvcy5fTV9pdGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVExQX1BSSVYgX05vbl9EYmdfaXRlcihfX2ZpcnN0KSwgX1NUTFBfUFJJViBfTm9uX0RiZ19pdGVyKF9fbGFzdCkpOworICAgIF9Db21wYXJlX0NhcGFjaXR5KF9fb2xkX2NhcGFjaXR5KTsKKyAgfQorI2Vsc2UKKyAgdm9pZCBpbnNlcnQgKGl0ZXJhdG9yIF9fcG9zLAorICAgICAgICAgICAgICAgY29uc3QgdmFsdWVfdHlwZSAqX19maXJzdCwgY29uc3QgdmFsdWVfdHlwZSAqX19sYXN0KSB7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3B0cl9yYW5nZShfX2ZpcnN0LF9fbGFzdCkpCisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX2lmX293bmVyKCZfTV9pdGVyX2xpc3QsIF9fcG9zKSkKKyAgICBzaXplX3R5cGUgX19vbGRfY2FwYWNpdHkgPSBjYXBhY2l0eSgpOworICAgIF9NX25vbl9kYmdfaW1wbC5pbnNlcnQoX19wb3MuX01faXRlcmF0b3IsIF9fZmlyc3QsIF9fbGFzdCk7CisgICAgX0NvbXBhcmVfQ2FwYWNpdHkoX19vbGRfY2FwYWNpdHkpOworICB9CisKKyAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wb3MsCisgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19yYW5nZShfX2ZpcnN0LF9fbGFzdCkpCisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX2lmX293bmVyKCZfTV9pdGVyX2xpc3QsIF9fcG9zKSkKKyAgICAvL1NlcXVlbmNlIHJlcXVpcmVtZW50cyAyMy4xLjEgVGFibGUgNjc6CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX2lmX25vdF9vd25lcigmX01faXRlcl9saXN0LCBfX2ZpcnN0LCBfX3RydWVfdHlwZSgpKSk7CisgICAgc2l6ZV90eXBlIF9fb2xkX2NhcGFjaXR5ID0gY2FwYWNpdHkoKTsKKyAgICBfTV9ub25fZGJnX2ltcGwuaW5zZXJ0KF9fcG9zLl9NX2l0ZXJhdG9yLCBfX2ZpcnN0Ll9NX2l0ZXJhdG9yLCBfX2xhc3QuX01faXRlcmF0b3IpOworICAgIF9Db21wYXJlX0NhcGFjaXR5KF9fb2xkX2NhcGFjaXR5KTsKK30KKyNlbmRpZgorCisgIHZvaWQgaW5zZXJ0IChpdGVyYXRvciBfX3Bvcywgc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3gpeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19pZl9vd25lcigmX01faXRlcl9saXN0LCBfX3BvcykpCisgICAgX0NoZWNrX092ZXJmbG93KF9fbik7CisgICAgX01fbm9uX2RiZ19pbXBsLmluc2VydChfX3Bvcy5fTV9pdGVyYXRvciwgX19uLCBfX3gpOworICB9CisKKyAgdm9pZCBwb3BfYmFjaygpIHsKKyAgICBfU1RMUF9WRVJCT1NFX0FTU0VSVCghZW1wdHkoKSwgX1N0bE1zZ19FTVBUWV9DT05UQUlORVIpCisgICAgX0ludmFsaWRhdGVfaXRlcmF0b3IoZW5kKCkpOworICAgIF9NX25vbl9kYmdfaW1wbC5wb3BfYmFjaygpOworICB9CisgIGl0ZXJhdG9yIGVyYXNlKGl0ZXJhdG9yIF9fcG9zKSB7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfRGVyZWZlcmVuY2VhYmxlKF9fcG9zKSkKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfaWZfb3duZXIoJl9NX2l0ZXJfbGlzdCwgX19wb3MpKQorICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9ycyhfX3BvcywgZW5kKCkpOworICAgIHJldHVybiBpdGVyYXRvcigmX01faXRlcl9saXN0LCBfTV9ub25fZGJnX2ltcGwuZXJhc2UoX19wb3MuX01faXRlcmF0b3IpKTsKKyAgfQorICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpIHsKKyAgICBfU1RMUF9ERUJVR19DSEVDSyhfU1RMUF9QUklWIF9fY2hlY2tfcmFuZ2UoX19maXJzdCwgX19sYXN0LCBiZWdpbigpLCBlbmQoKSkpCisgICAgX0ludmFsaWRhdGVfaXRlcmF0b3JzKF9fZmlyc3QsIGVuZCgpKTsKKyAgICByZXR1cm4gaXRlcmF0b3IoJl9NX2l0ZXJfbGlzdCwgX01fbm9uX2RiZ19pbXBsLmVyYXNlKF9fZmlyc3QuX01faXRlcmF0b3IsIF9fbGFzdC5fTV9pdGVyYXRvcikpOworICB9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKKyAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9fbmV3X3NpemUsIGNvbnN0IF9UcCYgX194ID0gX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRChfVHApKSB7CisjZWxzZQorICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgX19uZXdfc2l6ZSwgY29uc3QgX1RwJiBfX3gpIHsKKyNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0qLworICAgIGlmIChfX25ld19zaXplID4gY2FwYWNpdHkoKSkgeworICAgICAgX0ludmFsaWRhdGVfYWxsKCk7CisgICAgfQorICAgIGVsc2UgaWYgKF9fbmV3X3NpemUgPCBzaXplKCkpIHsKKyAgICAgIF9JbnZhbGlkYXRlX2l0ZXJhdG9ycyhiZWdpbigpICsgX19uZXdfc2l6ZSwgZW5kKCkpOworICAgIH0KKyAgICBfTV9ub25fZGJnX2ltcGwucmVzaXplKF9fbmV3X3NpemUsIF9feCk7CisgIH0KKworI2lmIGRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCisgIHZvaWQgcmVzaXplKHNpemVfdHlwZSBfX25ld19zaXplKSB7IHJlc2l6ZShfX25ld19zaXplLCBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKF9UcCkpOyB9CisjZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKi8KKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCitwcml2YXRlOgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0ludGVnZXI+CisgIHZvaWQgX01fYXNzaWduX2Rpc3BhdGNoKF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX192YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fdHJ1ZV90eXBlJiAvKl9Jc0ludGVncmFsKi8pIHsKKyAgICBfTV9jaGVja19hc3NpZ24oX19uKTsKKyAgICBfTV9ub25fZGJnX2ltcGwuYXNzaWduKF9fbiwgX192YWwpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXI+CisgIHZvaWQgX01fYXNzaWduX2Rpc3BhdGNoKF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fZmFsc2VfdHlwZSYgLypfSXNJbnRlZ3JhbCovKSB7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsX19sYXN0KSkKKyAgICBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IHNpemUoKTsKKyAgICBzaXplX3R5cGUgX19vbGRfY2FwYWNpdHkgPSBjYXBhY2l0eSgpOworICAgIGl0ZXJhdG9yIF9fb2xkX2VuZCA9IGVuZCgpOworICAgIF9NX25vbl9kYmdfaW1wbC5hc3NpZ24oX1NUTFBfUFJJViBfTm9uX0RiZ19pdGVyKF9fZmlyc3QpLCBfU1RMUF9QUklWIF9Ob25fRGJnX2l0ZXIoX19sYXN0KSk7CisgICAgaWYgKF9fb2xkX2NhcGFjaXR5ICE9IDApIHsKKyAgICAgIGlmIChlbXB0eSgpIHx8IChjYXBhY2l0eSgpID4gX19vbGRfY2FwYWNpdHkpKSB7CisgICAgICAgIF9JbnZhbGlkYXRlX2FsbCgpOworICAgICAgfQorICAgICAgZWxzZSBpZiAoc2l6ZSgpIDwgX19vbGRfc2l6ZSkgeworICAgICAgICBfSW52YWxpZGF0ZV9pdGVyYXRvcnMoYmVnaW4oKSArIHNpemUoKSwgX19vbGRfZW5kKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworcHVibGljOgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZvaWQgYXNzaWduKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lzSW50ZWdyYWw8X0lucHV0SXRlcmF0b3I+OjpfUmV0IF9JbnRlZ3JhbDsKKyAgICBfTV9hc3NpZ25fZGlzcGF0Y2goX19maXJzdCwgX19sYXN0LCBfSW50ZWdyYWwoKSk7CisgIH0KKyNlbHNlCitwcml2YXRlOgorICB2b2lkIF9NX2Fzc2lnbihjb25zdCB2YWx1ZV90eXBlICpfX2ZpcnN0LCBjb25zdCB2YWx1ZV90eXBlICpfX2xhc3QpIHsKKyAgICBzaXplX3R5cGUgX19sZW4gPSBkaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QpOworICAgIF9NX2NoZWNrX2Fzc2lnbihfX2xlbik7CisgICAgX01fbm9uX2RiZ19pbXBsLmFzc2lnbihfX2ZpcnN0LCBfX2xhc3QpOworICB9CitwdWJsaWM6CisgIHZvaWQgYXNzaWduKGNvbnN0IHZhbHVlX3R5cGUgKl9fZmlyc3QsIGNvbnN0IHZhbHVlX3R5cGUgKl9fbGFzdCkgeworICAgIF9TVExQX0RFQlVHX0NIRUNLKF9TVExQX1BSSVYgX19jaGVja19wdHJfcmFuZ2UoX19maXJzdCxfX2xhc3QpKQorICAgIF9NX2Fzc2lnbihfX2ZpcnN0LCBfX2xhc3QpOworICB9CisKKyAgdm9pZCBhc3NpZ24oY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KSB7CisgICAgX1NUTFBfREVCVUdfQ0hFQ0soX1NUTFBfUFJJViBfX2NoZWNrX3JhbmdlKF9fZmlyc3QsX19sYXN0KSkKKyAgICBfTV9hc3NpZ24oX19maXJzdC5fTV9pdGVyYXRvciwgX19sYXN0Ll9NX2l0ZXJhdG9yKTsKKyAgfQorI2VuZGlmCisKK3ByaXZhdGU6CisgIHZvaWQgX01fY2hlY2tfYXNzaWduKHNpemVfdHlwZSBfX24pIHsKKyAgICBpZiAoX19uID4gY2FwYWNpdHkoKSkgeworICAgICAgX0ludmFsaWRhdGVfYWxsKCk7CisgICAgfQorICAgIGVsc2UgaWYgKF9fbiA8IHNpemUoKSkgeworICAgICAgX0ludmFsaWRhdGVfaXRlcmF0b3JzKGJlZ2luKCkgKyBfX24sIGVuZCgpKTsKKyAgICB9CisgIH0KKworcHVibGljOgorICB2b2lkIGFzc2lnbihzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9fdmFsKSB7CisgICAgX01fY2hlY2tfYXNzaWduKF9fbik7CisgICAgX01fbm9uX2RiZ19pbXBsLmFzc2lnbihfX24sIF9fdmFsKTsKKyAgfQorCisgIHZvaWQgY2xlYXIoKSB7CisgICAgX0ludmFsaWRhdGVfYWxsKCk7CisgICAgX01fbm9uX2RiZ19pbXBsLmNsZWFyKCk7CisgIH0KKyAgdm9pZCBwdXNoX2JhY2soY29uc3QgX1RwJiBfX3gpIHsKKyAgICBfQ2hlY2tfT3ZlcmZsb3coMSk7CisgICAgX01fbm9uX2RiZ19pbXBsLnB1c2hfYmFjayhfX3gpOworICB9Cit9OworCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyN1bmRlZiBfU1RMUF9OT05fREJHX1ZFQ1RPUgorCisjZW5kaWYgLyogX1NUTFBfREJHX1ZFQ1RPUl9IICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvbXNsX3N0cmluZy5oIGIvc3RsL21zbF9zdHJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjI3NjhjCi0tLSAvZGV2L251bGwKKysrIGIvc3RsL21zbF9zdHJpbmcuaApAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk4CisgKiBNYXJrIG9mIHRoZSBVbmljb3JuLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBNYXJrIG9mIHRoZSBVbmljb3JuLCBJbmMuIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICovCisjaWYgZGVmaW5lZCggX1NUTFBfVVNFX01TSVBMICkgJiYgIWRlZmluZWQoIF9TVExQX01TTF9TVFJJTkdfSF8gKQorI2RlZmluZSBfU1RMUF9NU0xfU1RSSU5HX0hfCisKKy8vIyBkZWZpbmUgY2hhcl90cmFpdHMgX19tc2xfY2hhcl90cmFpdHMKKyMgZGVmaW5lIGJhc2ljX3N0cmluZyBfX21zbF9iYXNpY19zdHJpbmcKKyMgZGVmaW5lIGJfc3RyX3JlZiBfX21zbF9iX3N0cl9yZWYKKyMgZGVmaW5lIGJhc2ljX2lzdHJlYW0gX19tc2xfYmFzaWNfaXN0cmVhbQorIyBkZWZpbmUgYmFzaWNfb3N0cmVhbSBfX21zbF9iYXNpY19vc3RyZWFtCisjIGRlZmluZSBzdHJpbmcgX19tc2xfc3RyaW5nCisjIGRlZmluZSB3c3RyaW5nIF9fbXNsX3dzdHJpbmcKKyMgZGVmaW5lIGl0ZXJhdG9yX3RyYWl0cyBfX21zbF9pdGVyYXRvcl90cmFpdHMKKworbmFtZXNwYWNlIHN0ZAoreworICB0ZW1wbGF0ZTxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzPiBjbGFzcyBiYXNpY19pc3RyZWFtOworICB0ZW1wbGF0ZTxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzPiBjbGFzcyBiYXNpY19vc3RyZWFtOworfQorCisjIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0hFQURFUihzdHJpbmcpCisvLyAjIHVuZGVmIGNoYXJfdHJhaXRzCisjIHVuZGVmIGJhc2ljX3N0cmluZworIyB1bmRlZiBiX3N0cl9yZWYKKyMgdW5kZWYgYmFzaWNfaXN0cmVhbQorIyB1bmRlZiBiYXNpY19vc3RyZWFtCisjIHVuZGVmIHN0cmluZworIyB1bmRlZiB3c3RyaW5nCisjIHVuZGVmIGl0ZXJhdG9yX3RyYWl0cworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N0bC9wb2ludGVycy9fZGVxdWUuaCBiL3N0bC9wb2ludGVycy9fZGVxdWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmMyNzc0Ci0tLSAvZGV2L251bGwKKysrIGIvc3RsL3BvaW50ZXJzL19kZXF1ZS5oCkBAIC0wLDAgKzEsMzc5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA0CisgKiBGcmFuY29pcyBEdW1vbnQKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworLyogTk9URTogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgU1RMIGhlYWRlcnMuCisgKiAgIFlvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LgorICovCisKKyNpZm5kZWYgX1NUTFBfU1BFQ0lBTElaRURfREVRVUVfSAorI2RlZmluZSBfU1RMUF9TUEVDSUFMSVpFRF9ERVFVRV9ICisKKyNpZm5kZWYgX1NUTFBfUE9JTlRFUlNfU1BFQ19UT09MU19ICisjICBpbmNsdWRlIDxzdGwvcG9pbnRlcnMvX3Rvb2xzLmg+CisjZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKKy8qCisgKiBzdHJ1Y3QgaGVscGVyIHRvIGNhc3QgZGVxdWUgaXRlcmF0b3JzOgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgX1N0b3JhZ2VULCBjbGFzcyBfVmFsdWVUPgorc3RydWN0IF9EZXF1ZUl0ZUNhc3QgeworICB0eXBlZGVmIF9EZXF1ZV9pdGVyYXRvcjxfVmFsdWVULCBfTm9uY29uc3RfdHJhaXRzPF9WYWx1ZVQ+ID4gaXRlcmF0b3I7CisgIHR5cGVkZWYgX0RlcXVlX2l0ZXJhdG9yPF9WYWx1ZVQsIF9Db25zdF90cmFpdHM8X1ZhbHVlVD4gPiAgICBjb25zdF9pdGVyYXRvcjsKKyAgdHlwZWRlZiBfRGVxdWVfaXRlcmF0b3I8X1N0b3JhZ2VULCBfTm9uY29uc3RfdHJhaXRzPF9TdG9yYWdlVD4gPiBzdG9yYWdlX2l0ZXJhdG9yOworICB0eXBlZGVmIF9EZXF1ZV9pdGVyYXRvcjxfU3RvcmFnZVQsIF9Db25zdF90cmFpdHM8X1N0b3JhZ2VUPiA+IGNvbnN0X3N0b3JhZ2VfaXRlcmF0b3I7CisgIHR5cGVkZWYgX0Nhc3RUcmFpdHM8X1N0b3JhZ2VULCBfVmFsdWVUPiBjYXN0X3RyYWl0czsKKworICBzdGF0aWMgaXRlcmF0b3IgdG9fdmFsdWVfdHlwZV9pdGUgKHN0b3JhZ2VfaXRlcmF0b3IgY29uc3QmIF9faXRlKSB7CisgICAgaXRlcmF0b3IgdG1wOworICAgIHRtcC5fTV9jdXIgPSBjYXN0X3RyYWl0czo6dG9fdmFsdWVfdHlwZV9wdHIoX19pdGUuX01fY3VyKTsKKyAgICB0bXAuX01fZmlyc3QgPSBjYXN0X3RyYWl0czo6dG9fdmFsdWVfdHlwZV9wdHIoX19pdGUuX01fZmlyc3QpOworICAgIHRtcC5fTV9sYXN0ID0gY2FzdF90cmFpdHM6OnRvX3ZhbHVlX3R5cGVfcHRyKF9faXRlLl9NX2xhc3QpOworICAgIHRtcC5fTV9ub2RlID0gY2FzdF90cmFpdHM6OnRvX3ZhbHVlX3R5cGVfcHB0cihfX2l0ZS5fTV9ub2RlKTsKKyAgICByZXR1cm4gdG1wOworICB9CisgIHN0YXRpYyBzdG9yYWdlX2l0ZXJhdG9yIHRvX3N0b3JhZ2VfdHlwZV9pdGUgKGl0ZXJhdG9yIGNvbnN0JiBfX2l0ZSkgeworICAgIHN0b3JhZ2VfaXRlcmF0b3IgdG1wOworICAgIHRtcC5fTV9jdXIgPSBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX3B0cihfX2l0ZS5fTV9jdXIpOworICAgIHRtcC5fTV9maXJzdCA9IGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfcHRyKF9faXRlLl9NX2ZpcnN0KTsKKyAgICB0bXAuX01fbGFzdCA9IGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfcHRyKF9faXRlLl9NX2xhc3QpOworICAgIHRtcC5fTV9ub2RlID0gY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9wcHRyKF9faXRlLl9NX25vZGUpOworICAgIHJldHVybiB0bXA7CisgIH0KKworICBzdGF0aWMgY29uc3RfaXRlcmF0b3IgdG9fdmFsdWVfdHlwZV9jaXRlIChjb25zdF9zdG9yYWdlX2l0ZXJhdG9yIGNvbnN0JiBfX2l0ZSkgeworICAgIGNvbnN0X2l0ZXJhdG9yIHRtcDsKKyAgICB0bXAuX01fY3VyID0gY2FzdF90cmFpdHM6OnRvX3ZhbHVlX3R5cGVfcHRyKF9faXRlLl9NX2N1cik7CisgICAgdG1wLl9NX2ZpcnN0ID0gY2FzdF90cmFpdHM6OnRvX3ZhbHVlX3R5cGVfcHRyKF9faXRlLl9NX2ZpcnN0KTsKKyAgICB0bXAuX01fbGFzdCA9IGNhc3RfdHJhaXRzOjp0b192YWx1ZV90eXBlX3B0cihfX2l0ZS5fTV9sYXN0KTsKKyAgICB0bXAuX01fbm9kZSA9IGNhc3RfdHJhaXRzOjp0b192YWx1ZV90eXBlX3BwdHIoX19pdGUuX01fbm9kZSk7CisgICAgcmV0dXJuIHRtcDsKKyAgfQorCisgIHN0YXRpYyBjb25zdF9zdG9yYWdlX2l0ZXJhdG9yIHRvX3N0b3JhZ2VfdHlwZV9jaXRlIChjb25zdF9pdGVyYXRvciBjb25zdCYgX19pdGUpIHsKKyAgICBjb25zdF9zdG9yYWdlX2l0ZXJhdG9yIHRtcDsKKyAgICB0bXAuX01fY3VyID0gY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9wdHIoX19pdGUuX01fY3VyKTsKKyAgICB0bXAuX01fZmlyc3QgPSBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX3B0cihfX2l0ZS5fTV9maXJzdCk7CisgICAgdG1wLl9NX2xhc3QgPSBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX3B0cihfX2l0ZS5fTV9sYXN0KTsKKyAgICB0bXAuX01fbm9kZSA9IGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfcHB0cihfX2l0ZS5fTV9ub2RlKTsKKyAgICByZXR1cm4gdG1wOworICB9Cit9OworCisjZGVmaW5lIERFUVVFX0lNUEwgX1NUTFBfUFRSX0lNUExfTkFNRShkZXF1ZSkKKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9URU1QTEFURV9FWFBPUlQpICYmICFkZWZpbmVkIChfU1RMUF9VU0VfTVNWQzZfTUVNX1RfQlVHX1dPUktBUk9VTkQpCitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgX1NUTFBfYWxsb2NfcHJveHk8c2l6ZV90LCB2b2lkKiwgIGFsbG9jYXRvcjx2b2lkKj4gPjsKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBfU1RMUF9hbGxvY19wcm94eTx2b2lkKioqLCB2b2lkKiosICBhbGxvY2F0b3I8dm9pZCoqPiA+OworX1NUTFBfRVhQT1JUIHRlbXBsYXRlIHN0cnVjdCBfU1RMUF9DTEFTU19ERUNMU1BFQyBfRGVxdWVfaXRlcmF0b3I8dm9pZCosIF9Ob25jb25zdF90cmFpdHM8dm9pZCo+ID47CitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgX0RlcXVlX2Jhc2U8dm9pZCosYWxsb2NhdG9yPHZvaWQqPiA+OworX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIERFUVVFX0lNUEw8dm9pZCosYWxsb2NhdG9yPHZvaWQqPiA+OworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9ERUJVRykKKyMgIGRlZmluZSBkZXF1ZSBfU1RMUF9OT05fREJHX05BTUUoZGVxdWUpCisjZWxzZQorX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgX1NUTFBfREVGQVVMVF9BTExPQ0FUT1JfU0VMRUNUKF9UcCkgPgorY2xhc3MgZGVxdWUKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUEFSVElBTF9TUEVDX1dPUktBUk9VTkQpICYmICFkZWZpbmVkIChkZXF1ZSkKKyAgICAgICAgICAgIDogcHVibGljIF9fc3RscG9ydF9jbGFzczxkZXF1ZTxfVHAsIF9BbGxvYz4gPgorI2VuZGlmCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1NUTFBfUFJJViBfU3RvcmFnZVR5cGU8X1RwPjo6X1R5cGUgX1N0b3JhZ2VUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY190cmFpdHM8X1N0b3JhZ2VUeXBlLCBfQWxsb2M+OjphbGxvY2F0b3JfdHlwZSBfU3RvcmFnZVR5cGVBbGxvYzsKKyAgdHlwZWRlZiBfU1RMUF9QUklWIERFUVVFX0lNUEw8X1N0b3JhZ2VUeXBlLCBfU3RvcmFnZVR5cGVBbGxvYz4gX0Jhc2U7CisgIHR5cGVkZWYgZGVxdWU8X1RwLCBfQWxsb2M+IF9TZWxmOworCisgIHR5cGVkZWYgX1NUTFBfUFJJViBfQ2FzdFRyYWl0czxfU3RvcmFnZVR5cGUsIF9UcD4gY2FzdF90cmFpdHM7CisgIHR5cGVkZWYgX1NUTFBfUFJJViBfRGVxdWVJdGVDYXN0PF9TdG9yYWdlVHlwZSwgX1RwPiBpdGVfY2FzdF90cmFpdHM7CisKK3B1YmxpYzoKKyAgdHlwZWRlZiBfVHAgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiB2YWx1ZV90eXBlKiBwb2ludGVyOworICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUqIGNvbnN0X3BvaW50ZXI7CisgIHR5cGVkZWYgdmFsdWVfdHlwZSYgcmVmZXJlbmNlOworICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmIGNvbnN0X3JlZmVyZW5jZTsKKyAgdHlwZWRlZiBzaXplX3Qgc2l6ZV90eXBlOworICB0eXBlZGVmIHB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7CisgIHR5cGVkZWYgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgX0l0ZXJhdG9yX2NhdGVnb3J5OworICBfU1RMUF9GT1JDRV9BTExPQ0FUT1JTKHZhbHVlX3R5cGUsIF9BbGxvYykKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2NfdHJhaXRzPHZhbHVlX3R5cGUsIF9BbGxvYz46OmFsbG9jYXRvcl90eXBlIGFsbG9jYXRvcl90eXBlOworICB0eXBlZGVmIF9TVExQX1BSSVYgX0RlcXVlX2l0ZXJhdG9yPHZhbHVlX3R5cGUsIF9Ob25jb25zdF90cmFpdHM8dmFsdWVfdHlwZT4gPiBpdGVyYXRvcjsKKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9EZXF1ZV9pdGVyYXRvcjx2YWx1ZV90eXBlLCBfQ29uc3RfdHJhaXRzPHZhbHVlX3R5cGU+ID4gICAgY29uc3RfaXRlcmF0b3I7CisKKyAgX1NUTFBfREVDTEFSRV9SQU5ET01fQUNDRVNTX1JFVkVSU0VfSVRFUkFUT1JTOworCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJhc2ljIGFjY2Vzc29ycworICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIGl0ZV9jYXN0X3RyYWl0czo6dG9fdmFsdWVfdHlwZV9pdGUoX01faW1wbC5iZWdpbigpKTsgfQorICBpdGVyYXRvciBlbmQoKSAgIHsgcmV0dXJuIGl0ZV9jYXN0X3RyYWl0czo6dG9fdmFsdWVfdHlwZV9pdGUoX01faW1wbC5lbmQoKSk7IH0KKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBpdGVfY2FzdF90cmFpdHM6OnRvX3ZhbHVlX3R5cGVfY2l0ZShfTV9pbXBsLmJlZ2luKCkpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0ICAgeyByZXR1cm4gaXRlX2Nhc3RfdHJhaXRzOjp0b192YWx1ZV90eXBlX2NpdGUoX01faW1wbC5lbmQoKSk7IH0KKworICByZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisgIHJldmVyc2VfaXRlcmF0b3IgcmVuZCgpICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0CisgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0CisgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKworICByZWZlcmVuY2Ugb3BlcmF0b3JbXShzaXplX3R5cGUgX19uKQorICB7IHJldHVybiBjYXN0X3RyYWl0czo6dG9fdmFsdWVfdHlwZV9yZWYoX01faW1wbFtfX25dKTsgfQorICBjb25zdF9yZWZlcmVuY2Ugb3BlcmF0b3JbXShzaXplX3R5cGUgX19uKSBjb25zdAorICB7IHJldHVybiBjYXN0X3RyYWl0czo6dG9fdmFsdWVfdHlwZV9jcmVmKF9NX2ltcGxbX19uXSk7IH0KKworICByZWZlcmVuY2UgYXQoc2l6ZV90eXBlIF9fbikKKyAgeyByZXR1cm4gY2FzdF90cmFpdHM6OnRvX3ZhbHVlX3R5cGVfcmVmKF9NX2ltcGwuYXQoX19uKSk7IH0KKyAgY29uc3RfcmVmZXJlbmNlIGF0KHNpemVfdHlwZSBfX24pIGNvbnN0CisgIHsgcmV0dXJuIGNhc3RfdHJhaXRzOjp0b192YWx1ZV90eXBlX2NyZWYoX01faW1wbC5hdChfX24pKTsgfQorCisgIHJlZmVyZW5jZSBmcm9udCgpIHsgcmV0dXJuIGNhc3RfdHJhaXRzOjp0b192YWx1ZV90eXBlX3JlZihfTV9pbXBsLmZyb250KCkpOyB9CisgIHJlZmVyZW5jZSBiYWNrKCkgIHsgcmV0dXJuIGNhc3RfdHJhaXRzOjp0b192YWx1ZV90eXBlX3JlZihfTV9pbXBsLmJhY2soKSk7IH0KKyAgY29uc3RfcmVmZXJlbmNlIGZyb250KCkgY29uc3QgeyByZXR1cm4gY2FzdF90cmFpdHM6OnRvX3ZhbHVlX3R5cGVfY3JlZihfTV9pbXBsLmZyb250KCkpOyB9CisgIGNvbnN0X3JlZmVyZW5jZSBiYWNrKCkgY29uc3QgIHsgcmV0dXJuIGNhc3RfdHJhaXRzOjp0b192YWx1ZV90eXBlX2NyZWYoX01faW1wbC5iYWNrKCkpOyB9CisKKyAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCAgICAgeyByZXR1cm4gX01faW1wbC5zaXplKCk7IH0KKyAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgeyByZXR1cm4gX01faW1wbC5tYXhfc2l6ZSgpOyB9CisgIGJvb2wgZW1wdHkoKSBjb25zdCAgICAgICAgIHsgcmV0dXJuIF9NX2ltcGwuZW1wdHkoKTsgfQorICBhbGxvY2F0b3JfdHlwZSBnZXRfYWxsb2NhdG9yKCkgY29uc3QgeyByZXR1cm4gX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoX01faW1wbC5nZXRfYWxsb2NhdG9yKCksIHZhbHVlX3R5cGUpOyB9CisKKyAgZXhwbGljaXQgZGVxdWUoY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfTV9pbXBsKF9TVExQX0NPTlZFUlRfQUxMT0NBVE9SKF9fYSwgX1N0b3JhZ2VUeXBlKSkge30KKworICBkZXF1ZShjb25zdCBfU2VsZiYgX194KSA6IF9NX2ltcGwoX194Ll9NX2ltcGwpIHt9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKKyAgZXhwbGljaXQgZGVxdWUoc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX192YWwgPSBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKHZhbHVlX3R5cGUpLAorI2Vsc2UKKyAgZGVxdWUoc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX192YWwsCisjZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKi8KKyAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfTV9pbXBsKF9fbiwgY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcmVmKF9fdmFsKSwgX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoX19hLCBfU3RvcmFnZVR5cGUpKSB7fQorICAvLyBpbnQsbG9uZyB2YXJpYW50cyBtYXkgYmUgbmVlZGVkCisjaWYgZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKKyAgZXhwbGljaXQgZGVxdWUoc2l6ZV90eXBlIF9fbikgOiBfTV9pbXBsKF9fbikge30KKyNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0qLworCisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICBkZXF1ZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgX1NUTFBfQUxMT0NBVE9SX1RZUEVfREZMKQorI2lmICFkZWZpbmVkIChfU1RMUF9VU0VfSVRFUkFUT1JfV1JBUFBFUikKKyAgOiBfTV9pbXBsKF9fZmlyc3QsIF9fbGFzdCwKKyAgICAgICAgICAgIF9TVExQX0NPTlZFUlRfQUxMT0NBVE9SKF9fYSwgX1N0b3JhZ2VUeXBlKSkgeworI2Vsc2UKKyAgOiBfTV9pbXBsKF9TVExQX0NPTlZFUlRfQUxMT0NBVE9SKF9fYSwgX1N0b3JhZ2VUeXBlKSkgeworI2VuZGlmCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX0lURVJBVE9SX1dSQVBQRVIpCisgICAgaW5zZXJ0KGVuZCgpLCBfX2ZpcnN0LCBfX2xhc3QpOworI2VuZGlmCisgIH0KKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfTkVFRFNfRVhUUkFfVEVNUExBVEVfQ09OU1RSVUNUT1JTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIGRlcXVlKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyMgICAgaWYgIWRlZmluZWQgKF9TVExQX1VTRV9JVEVSQVRPUl9XUkFQUEVSKQorICAgIDogX01faW1wbChfX2ZpcnN0LCBfX2xhc3QpIHt9CisjICAgIGVsc2UKKyAgeyBpbnNlcnQoZW5kKCksIF9fZmlyc3QsIF9fbGFzdCk7IH0KKyMgICAgZW5kaWYKKyMgIGVuZGlmCisKKyNlbHNlCisgIGRlcXVlKGNvbnN0X3BvaW50ZXIgX19maXJzdCwgY29uc3RfcG9pbnRlciBfX2xhc3QsCisgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpICkKKyAgICA6IF9NX2ltcGwoY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcHRyKF9fZmlyc3QpLAorICAgICAgICAgICAgICBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NwdHIoX19sYXN0KSwKKyAgICAgICAgICAgICAgX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoX19hLCBfU3RvcmFnZVR5cGUpKSB7fQorCisgIGRlcXVlKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkgKQorICAgIDogX01faW1wbChpdGVfY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jaXRlKF9fZmlyc3QpLAorICAgICAgICAgICAgICBpdGVfY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jaXRlKF9fbGFzdCksCisgICAgICAgICAgICAgIF9TVExQX0NPTlZFUlRfQUxMT0NBVE9SKF9fYSwgX1N0b3JhZ2VUeXBlKSkge30KKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisKKyAgZGVxdWUoX19tb3ZlX3NvdXJjZTxfU2VsZj4gc3JjKQorICAgIDogX01faW1wbChfX21vdmVfc291cmNlPF9CYXNlPihzcmMuZ2V0KCkuX01faW1wbCkpIHt9CisKKyAgX1NlbGYmIG9wZXJhdG9yPSAoY29uc3QgX1NlbGYmIF9feCkgeyBfTV9pbXBsID0gX194Ll9NX2ltcGw7IHJldHVybiAqdGhpczsgfQorCisgIHZvaWQgc3dhcChfU2VsZiYgX194KSB7IF9NX2ltcGwuc3dhcChfX3guX01faW1wbCk7IH0KKworICB2b2lkIGFzc2lnbihzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3ZhbCkgeworICAgIF9NX2ltcGwuYXNzaWduKF9fbiwgY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcmVmKF9fdmFsKSk7CisgIH0KKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisjICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfSVRFUkFUT1JfV1JBUFBFUikKK3ByaXZhdGU6CisgIHRlbXBsYXRlIDxjbGFzcyBfSW50ZWdlcj4KKyAgdm9pZCBfTV9hc3NpZ25fZGlzcGF0Y2goX0ludGVnZXIgX19uLCBfSW50ZWdlciBfX3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX190cnVlX3R5cGUmKQorICB7IF9NX2ltcGwuYXNzaWduKF9fbiwgX192YWwpOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICB2b2lkIF9NX2Fzc2lnbl9kaXNwYXRjaChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fZmFsc2VfdHlwZSYpIHsKKyAgICBfTV9pbXBsLmFzc2lnbih0eXBlbmFtZSBfU1RMUF9QUklWIF9JdGVXcmFwcGVyPF9TdG9yYWdlVHlwZSwgX1RwLCBfSW5wdXRJdGVyYXRvcj46Ol9JdGUoX19maXJzdCksCisgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX1NUTFBfUFJJViBfSXRlV3JhcHBlcjxfU3RvcmFnZVR5cGUsIF9UcCwgX0lucHV0SXRlcmF0b3I+OjpfSXRlKF9fbGFzdCkpOworICB9CisKK3B1YmxpYzoKKyMgIGVuZGlmCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgdm9pZCBhc3NpZ24oX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KSB7CisjICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfSVRFUkFUT1JfV1JBUFBFUikKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Jc0ludGVncmFsPF9JbnB1dEl0ZXJhdG9yPjo6X1JldCBfSW50ZWdyYWw7CisgICAgX01fYXNzaWduX2Rpc3BhdGNoKF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOworIyAgZWxzZQorICAgIF9NX2ltcGwuYXNzaWduKF9fZmlyc3QsIF9fbGFzdCk7CisjICBlbmRpZgorICB9CisjZWxzZQorICB2b2lkIGFzc2lnbihjb25zdF9wb2ludGVyIF9fZmlyc3QsIGNvbnN0X3BvaW50ZXIgX19sYXN0KQorICB7IF9NX2ltcGwuYXNzaWduKGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3B0cihfX2ZpcnN0KSwKKyAgICAgICAgICAgICAgICAgICBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NwdHIoX19sYXN0KSk7IH0KKyAgdm9pZCBhc3NpZ24oY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KQorICB7IF9NX2ltcGwuYXNzaWduKGl0ZV9jYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NpdGUoX19maXJzdCksCisgICAgICAgICAgICAgICAgICAgaXRlX2Nhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY2l0ZShfX2xhc3QpKTsgfQorI2VuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKworI2lmICFkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fQU5BQ0hST05JU01TKQorICB2b2lkIHB1c2hfYmFjayhjb25zdCB2YWx1ZV90eXBlJiBfX3QgPSBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKHZhbHVlX3R5cGUpKQorI2Vsc2UKKyAgdm9pZCBwdXNoX2JhY2soY29uc3QgdmFsdWVfdHlwZSYgX190KQorI2VuZGlmIC8qIV9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0gJiYgIV9TVExQX05PX0FOQUNIUk9OSVNNUyovCisgIHsgX01faW1wbC5wdXNoX2JhY2soY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcmVmKF9fdCkpOyB9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkgJiYgIWRlZmluZWQgKF9TVExQX05PX0FOQUNIUk9OSVNNUykKKyAgdm9pZCBwdXNoX2Zyb250KGNvbnN0IHZhbHVlX3R5cGUmIF9fdCA9IF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQodmFsdWVfdHlwZSkpCisjZWxzZQorICB2b2lkIHB1c2hfZnJvbnQoY29uc3QgdmFsdWVfdHlwZSYgX190KQorI2VuZGlmIC8qIV9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0gJiYgIV9TVExQX05PX0FOQUNIUk9OSVNNUyovCisgIHsgX01faW1wbC5wdXNoX2Zyb250KGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3JlZihfX3QpKTsgfQorCisjIGlmIGRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pICYmICFkZWZpbmVkIChfU1RMUF9OT19BTkFDSFJPTklTTVMpCisgIHZvaWQgcHVzaF9iYWNrKCkgIHsgX01faW1wbC5wdXNoX2JhY2soKTsgfQorICB2b2lkIHB1c2hfZnJvbnQoKSB7IF9NX2ltcGwucHVzaF9mcm9udCgpOyB9CisjIGVuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSAmJiAhX1NUTFBfTk9fQU5BQ0hST05JU01TKi8KKworICB2b2lkIHBvcF9iYWNrKCkgIHsgX01faW1wbC5wb3BfYmFjaygpOyB9CisgIHZvaWQgcG9wX2Zyb250KCkgeyBfTV9pbXBsLnBvcF9mcm9udCgpOyB9CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkgJiYgIWRlZmluZWQgKF9TVExQX05PX0FOQUNIUk9OSVNNUykKKyAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBjb25zdCB2YWx1ZV90eXBlJiBfX3ggPSBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKHZhbHVlX3R5cGUpKQorI2Vsc2UKKyAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisjZW5kaWYgLyohX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSAmJiAhX1NUTFBfTk9fQU5BQ0hST05JU01TKi8KKyAgeyByZXR1cm4gaXRlX2Nhc3RfdHJhaXRzOjp0b192YWx1ZV90eXBlX2l0ZShfTV9pbXBsLmluc2VydChpdGVfY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9pdGUoX19wb3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3JlZihfX3gpKSk7IH0KKworI2lmIGRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pICYmICFkZWZpbmVkIChfU1RMUF9OT19BTkFDSFJPTklTTVMpCisgIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBfX3BvcykgeyByZXR1cm4gaW5zZXJ0KF9fcG9zLCBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKHZhbHVlX3R5cGUpKTsgfQorI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSAmJiAhX1NUTFBfTk9fQU5BQ0hST05JU01TKi8KKworICB2b2lkIGluc2VydChpdGVyYXRvciBfX3Bvcywgc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX194KQorICB7IF9NX2ltcGwuaW5zZXJ0KGl0ZV9jYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2l0ZShfX3BvcyksIF9fbiwgY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcmVmKF9feCkpOyB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX0lURVJBVE9SX1dSQVBQRVIpCitwcml2YXRlOgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0ludGVnZXI+CisgIHZvaWQgX01faW5zZXJ0X2Rpc3BhdGNoKGl0ZXJhdG9yIF9fcG9zLCBfSW50ZWdlciBfX24sIF9JbnRlZ2VyIF9fdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX3RydWVfdHlwZSYpIHsKKyAgICBfTV9pbXBsLmluc2VydChpdGVfY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9pdGUoX19wb3MpLCBfX24sIF9fdmFsKTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgdm9pZCBfTV9pbnNlcnRfZGlzcGF0Y2goaXRlcmF0b3IgX19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19mYWxzZV90eXBlJikgeworICAgIF9NX2ltcGwuaW5zZXJ0KGl0ZV9jYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2l0ZShfX3BvcyksCisgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX1NUTFBfUFJJViBfSXRlV3JhcHBlcjxfU3RvcmFnZVR5cGUsIF9UcCwgX0lucHV0SXRlcmF0b3I+OjpfSXRlKF9fZmlyc3QpLAorICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9TVExQX1BSSVYgX0l0ZVdyYXBwZXI8X1N0b3JhZ2VUeXBlLCBfVHAsIF9JbnB1dEl0ZXJhdG9yPjo6X0l0ZShfX2xhc3QpKTsKKyAgfQorCitwdWJsaWM6CisjICBlbmRpZgorCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkgeworIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX0lURVJBVE9SX1dSQVBQRVIpCisgICAgLy8gQ2hlY2sgd2hldGhlciBpdCdzIGFuIGludGVncmFsIHR5cGUuICBJZiBzbywgaXQncyBub3QgYW4gaXRlcmF0b3IuCisgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXNJbnRlZ3JhbDxfSW5wdXRJdGVyYXRvcj46Ol9SZXQgX0ludGVncmFsOworICAgIF9NX2luc2VydF9kaXNwYXRjaChfX3BvcywgX19maXJzdCwgX19sYXN0LCBfSW50ZWdyYWwoKSk7CisjICBlbHNlCisgICAgX01faW1wbC5pbnNlcnQoaXRlX2Nhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfaXRlKF9fcG9zKSwgX19maXJzdCwgX19sYXN0KTsKKyMgIGVuZGlmCisgIH0KKworI2Vsc2UgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworICB2b2lkIGluc2VydChpdGVyYXRvciBfX3BvcywKKyAgICAgICAgICAgICAgY29uc3RfcG9pbnRlciBfX2ZpcnN0LCBjb25zdF9wb2ludGVyIF9fbGFzdCkgeworICAgIF9NX2ltcGwuaW5zZXJ0KGl0ZV9jYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2l0ZShfX3BvcyksCisgICAgICAgICAgICAgICAgICAgY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcHRyKF9fZmlyc3QpLAorICAgICAgICAgICAgICAgICAgIGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3B0cihfX2xhc3QpKTsKKyAgfQorICB2b2lkIGluc2VydChpdGVyYXRvciBfX3BvcywKKyAgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KSB7CisgICAgX01faW1wbC5pbnNlcnQoaXRlX2Nhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfaXRlKF9fcG9zKSwKKyAgICAgICAgICAgICAgICAgICBpdGVfY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jaXRlKF9fZmlyc3QpLAorICAgICAgICAgICAgICAgICAgIGl0ZV9jYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NpdGUoX19sYXN0KSk7CisgIH0KKworI2VuZGlmIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKworI2lmICFkZWZpbmVkIChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQorICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgX19uZXdfc2l6ZSwgY29uc3QgdmFsdWVfdHlwZSYgX194ID0gX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRCh2YWx1ZV90eXBlKSkKKyNlbHNlCisgIHZvaWQgcmVzaXplKHNpemVfdHlwZSBfX25ld19zaXplLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisjZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKi8KKyAgeyBfTV9pbXBsLnJlc2l6ZShfX25ld19zaXplLCBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWYoX194KSk7IH0KKworI2lmIGRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCisgIHZvaWQgcmVzaXplKHNpemVfdHlwZSBfX25ld19zaXplKSB7IF9NX2ltcGwucmVzaXplKF9fbmV3X3NpemUpOyB9CisjZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKi8KKworICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBfX3BvcykKKyAgeyByZXR1cm4gaXRlX2Nhc3RfdHJhaXRzOjp0b192YWx1ZV90eXBlX2l0ZShfTV9pbXBsLmVyYXNlKGl0ZV9jYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2l0ZShfX3BvcykpKTsgfQorCisgIGl0ZXJhdG9yIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkKKyAgeyByZXR1cm4gaXRlX2Nhc3RfdHJhaXRzOjp0b192YWx1ZV90eXBlX2l0ZShfTV9pbXBsLmVyYXNlKGl0ZV9jYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2l0ZShfX2ZpcnN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZV9jYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2l0ZShfX2xhc3QpKSk7IH0KKyAgdm9pZCBjbGVhcigpIHsgX01faW1wbC5jbGVhcigpOyB9CisKK3ByaXZhdGU6CisgIF9CYXNlIF9NX2ltcGw7Cit9OworCisjaWYgZGVmaW5lZCAoZGVxdWUpCisjICB1bmRlZiBkZXF1ZQorX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCisjZW5kaWYKKworI3VuZGVmIERFUVVFX0lNUEwKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYgLyogX1NUTFBfU1BFQ0lBTElaRURfREVRVUVfSCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RsL3BvaW50ZXJzL19saXN0LmggYi9zdGwvcG9pbnRlcnMvX2xpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDFiMTFkCi0tLSAvZGV2L251bGwKKysrIGIvc3RsL3BvaW50ZXJzL19saXN0LmgKQEAgLTAsMCArMSwzMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMKKyAqIEZyYW5jb2lzIER1bW9udAorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisvKiBOT1RFOiBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBTVEwgaGVhZGVycy4KKyAqICAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuCisgKi8KKworI2lmbmRlZiBfU1RMUF9QVFJfU1BFQ0lBTElaRURfTElTVF9ICisjZGVmaW5lIF9TVExQX1BUUl9TUEVDSUFMSVpFRF9MSVNUX0gKKworI2lmbmRlZiBfU1RMUF9QT0lOVEVSU19TUEVDX1RPT0xTX0gKKyMgIGluY2x1ZGUgPHN0bC9wb2ludGVycy9fdG9vbHMuaD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworI2RlZmluZSBMSVNUX0lNUEwgX1NUTFBfUFRSX0lNUExfTkFNRShsaXN0KQorCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCkgJiYgIWRlZmluZWQgKF9TVExQX1VTRV9NU1ZDNl9NRU1fVF9CVUdfV09SS0FST1VORCkKKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgX0xpc3Rfbm9kZTx2b2lkKj47CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorCitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgYWxsb2NhdG9yPF9TVExQX1BSSVYgX0xpc3Rfbm9kZTx2b2lkKj4gPjsKKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgX1NUTFBfYWxsb2NfcHJveHk8X0xpc3Rfbm9kZV9iYXNlLCBfTGlzdF9ub2RlPHZvaWQqPiwgYWxsb2NhdG9yPF9MaXN0X25vZGU8dm9pZCo+ID4gPjsKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBfTGlzdF9iYXNlPHZvaWQqLCBhbGxvY2F0b3I8dm9pZCo+ID47CitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgTElTVF9JTVBMPHZvaWQqLCBhbGxvY2F0b3I8dm9pZCo+ID47CisKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9ERUJVRykKKyMgIGRlZmluZSBsaXN0IF9TVExQX05PTl9EQkdfTkFNRShsaXN0KQorX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIF9TVExQX0RFRkFVTFRfQUxMT0NBVE9SX1NFTEVDVChfVHApID4KK2NsYXNzIGxpc3QKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUEFSVElBTF9TUEVDX1dPUktBUk9VTkQpICYmICFkZWZpbmVkIChsaXN0KQorICAgICAgICAgICA6IHB1YmxpYyBfX3N0bHBvcnRfY2xhc3M8bGlzdDxfVHAsIF9BbGxvYz4gPgorI2VuZGlmCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1NUTFBfUFJJViBfU3RvcmFnZVR5cGU8X1RwPjo6X1R5cGUgX1N0b3JhZ2VUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY190cmFpdHM8X1N0b3JhZ2VUeXBlLCBfQWxsb2M+OjphbGxvY2F0b3JfdHlwZSBfU3RvcmFnZVR5cGVBbGxvYzsKKyAgdHlwZWRlZiBfU1RMUF9QUklWIExJU1RfSU1QTDxfU3RvcmFnZVR5cGUsIF9TdG9yYWdlVHlwZUFsbG9jPiBfQmFzZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IgX0Jhc2VJdGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X2l0ZXJhdG9yIF9CYXNlQ29uc3RJdGU7CisgIHR5cGVkZWYgX1NUTFBfUFJJViBfQ2FzdFRyYWl0czxfU3RvcmFnZVR5cGUsIF9UcD4gY2FzdF90cmFpdHM7CisgIHR5cGVkZWYgbGlzdDxfVHAsIF9BbGxvYz4gX1NlbGY7CisKK3B1YmxpYzoKKyAgdHlwZWRlZiBfVHAgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiB2YWx1ZV90eXBlKiBwb2ludGVyOworICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUqIGNvbnN0X3BvaW50ZXI7CisgIHR5cGVkZWYgdmFsdWVfdHlwZSYgcmVmZXJlbmNlOworICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmIGNvbnN0X3JlZmVyZW5jZTsKKyAgdHlwZWRlZiBzaXplX3Qgc2l6ZV90eXBlOworICB0eXBlZGVmIHB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7CisgIF9TVExQX0ZPUkNFX0FMTE9DQVRPUlModmFsdWVfdHlwZSwgX0FsbG9jKQorICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY190cmFpdHM8dmFsdWVfdHlwZSwgX0FsbG9jPjo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7CisgIHR5cGVkZWYgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcgX0l0ZXJhdG9yX2NhdGVnb3J5OworCisgIHR5cGVkZWYgX1NUTFBfUFJJViBfTGlzdF9pdGVyYXRvcjx2YWx1ZV90eXBlLCBfTm9uY29uc3RfdHJhaXRzPHZhbHVlX3R5cGU+ID4gaXRlcmF0b3I7CisgIHR5cGVkZWYgX1NUTFBfUFJJViBfTGlzdF9pdGVyYXRvcjx2YWx1ZV90eXBlLCBfQ29uc3RfdHJhaXRzPHZhbHVlX3R5cGU+ID4gICAgY29uc3RfaXRlcmF0b3I7CisKKyAgX1NUTFBfREVDTEFSRV9CSURJUkVDVElPTkFMX1JFVkVSU0VfSVRFUkFUT1JTOworCisgIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdAorICB7IHJldHVybiBfU1RMUF9DT05WRVJUX0FMTE9DQVRPUihfTV9pbXBsLmdldF9hbGxvY2F0b3IoKSwgdmFsdWVfdHlwZSk7IH0KKworIyBpZiAhKGRlZmluZWQoX19NUkNfXyl8fChkZWZpbmVkKF9fU0NfXykgJiYgIWRlZmluZWQoX19ETUNfXykpKQorICBleHBsaWNpdAorIyBlbmRpZgorICBsaXN0KGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX01faW1wbChfU1RMUF9DT05WRVJUX0FMTE9DQVRPUihfX2EsIF9TdG9yYWdlVHlwZSkpIHt9CisKKyNpZiAhZGVmaW5lZChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQorICBleHBsaWNpdCBsaXN0KHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9fdmFsID0gX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRCh2YWx1ZV90eXBlKSwKKyNlbHNlCisgIGxpc3Qoc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX192YWwsCisjZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKi8KKyAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9NX2ltcGwoX19uLCBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWYoX192YWwpLAorICAgICAgICAgICAgICBfU1RMUF9DT05WRVJUX0FMTE9DQVRPUihfX2EsIF9TdG9yYWdlVHlwZSkpIHt9CisKKyNpZiBkZWZpbmVkKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCisgIGV4cGxpY2l0IGxpc3Qoc2l6ZV90eXBlIF9fbikKKyAgICA6IF9NX2ltcGwoX19uKSB7fQorI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIGxpc3QoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgX1NUTFBfQUxMT0NBVE9SX1RZUEVfREZMKQorIyAgaWYgIWRlZmluZWQgKF9TVExQX1VTRV9JVEVSQVRPUl9XUkFQUEVSKQorICAgIDogX01faW1wbChfX2ZpcnN0LCBfX2xhc3QsIF9TVExQX0NPTlZFUlRfQUxMT0NBVE9SKF9fYSwgX1N0b3JhZ2VUeXBlKSkge30KKyMgIGVsc2UKKyAgICA6IF9NX2ltcGwoX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoX19hLCBfU3RvcmFnZVR5cGUpKSB7CisgICAgaW5zZXJ0KGJlZ2luKCksIF9fZmlyc3QsIF9fbGFzdCk7CisgIH0KKyMgIGVuZGlmCisKKyMgIGlmIGRlZmluZWQgKF9TVExQX05FRURTX0VYVFJBX1RFTVBMQVRFX0NPTlNUUlVDVE9SUykKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICBsaXN0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyMgICAgaWYgIWRlZmluZWQgKF9TVExQX1VTRV9XUkFQUEVSX0lURVJBVE9SKQorICAgIDogX01faW1wbChfX2ZpcnN0LCBfX2xhc3QpIHt9CisjICAgIGVsc2UKKyAgeyBpbnNlcnQoYmVnaW4oKSwgX19maXJzdCwgX19sYXN0KTsgfQorIyAgICBlbmRpZgorIyAgZW5kaWYKKworI2Vsc2UgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworCisgIGxpc3QoY29uc3QgdmFsdWVfdHlwZSAqX19maXJzdCwgY29uc3QgdmFsdWVfdHlwZSAqX19sYXN0LAorICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX01faW1wbChjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NwdHIoX19maXJzdCksCisgICAgICAgICAgICAgIGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3B0cihfX2xhc3QpLAorICAgICAgICAgICAgICAgX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoX19hLCBfU3RvcmFnZVR5cGUpKSB7fQorICBsaXN0KGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9NX2ltcGwoX0Jhc2VDb25zdEl0ZShfX2ZpcnN0Ll9NX25vZGUpLCBfQmFzZUNvbnN0SXRlKF9fbGFzdC5fTV9ub2RlKSwKKyAgICAgICAgICAgICAgX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoX19hLCBfU3RvcmFnZVR5cGUpKSB7fQorCisjZW5kaWYgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworCisgIGxpc3QoY29uc3QgX1NlbGYmIF9feCkgOiBfTV9pbXBsKF9feC5fTV9pbXBsKSB7fQorCisgIGxpc3QoX19tb3ZlX3NvdXJjZTxfU2VsZj4gc3JjKQorICAgIDogX01faW1wbChfX21vdmVfc291cmNlPF9CYXNlPihzcmMuZ2V0KCkuX01faW1wbCkpIHt9CisKKyAgaXRlcmF0b3IgYmVnaW4oKSAgICAgICAgICAgICB7IHJldHVybiBpdGVyYXRvcihfTV9pbXBsLmJlZ2luKCkuX01fbm9kZSk7IH0KKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfTV9pbXBsLmJlZ2luKCkuX01fbm9kZSk7IH0KKworICBpdGVyYXRvciBlbmQoKSAgICAgICAgICAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9NX2ltcGwuZW5kKCkuX01fbm9kZSk7IH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfTV9pbXBsLmVuZCgpLl9NX25vZGUpOyB9CisKKyAgcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSAgICAgICAgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgICAgICAgICAgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0ICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorCisgIGJvb2wgZW1wdHkoKSBjb25zdCAgICAgICAgIHsgcmV0dXJuIF9NX2ltcGwuZW1wdHkoKTsgfQorICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0ICAgICB7IHJldHVybiBfTV9pbXBsLnNpemUoKTsgfQorICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCB7IHJldHVybiBfTV9pbXBsLm1heF9zaXplKCk7IH0KKworICByZWZlcmVuY2UgZnJvbnQoKSAgICAgICAgICAgICB7IHJldHVybiAqYmVnaW4oKTsgfQorICBjb25zdF9yZWZlcmVuY2UgZnJvbnQoKSBjb25zdCB7IHJldHVybiAqYmVnaW4oKTsgfQorICByZWZlcmVuY2UgYmFjaygpICAgICAgICAgICAgICB7IHJldHVybiAqKC0tZW5kKCkpOyB9CisgIGNvbnN0X3JlZmVyZW5jZSBiYWNrKCkgY29uc3QgIHsgcmV0dXJuICooLS1lbmQoKSk7IH0KKworICB2b2lkIHN3YXAoX1NlbGYgJl9feCkgeyBfTV9pbXBsLnN3YXAoX194Ll9NX2ltcGwpOyB9CisgIHZvaWQgY2xlYXIoKSB7IF9NX2ltcGwuY2xlYXIoKTsgfQorCisjaWYgIWRlZmluZWQoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkgJiYgIWRlZmluZWQoX1NUTFBfTk9fQU5BQ0hST05JU01TKQorICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIGNvbnN0X3JlZmVyZW5jZSBfX3ggPSBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKHZhbHVlX3R5cGUpKQorI2Vsc2UKKyAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBjb25zdF9yZWZlcmVuY2UgX194KQorI2VuZGlmIC8qIV9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0gJiYgIV9TVExQX05PX0FOQUNIUk9OSVNNUyovCisgIHsgcmV0dXJuIGl0ZXJhdG9yKF9NX2ltcGwuaW5zZXJ0KF9CYXNlSXRlKF9fcG9zLl9NX25vZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWYoX194KSkuX01fbm9kZSk7IH0KKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisjICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfSVRFUkFUT1JfV1JBUFBFUikKK3ByaXZhdGU6CisgIHRlbXBsYXRlIDxjbGFzcyBfSW50ZWdlcj4KKyAgdm9pZCBfTV9pbnNlcnRfZGlzcGF0Y2goaXRlcmF0b3IgX19wb3MsIF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX192YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fdHJ1ZV90eXBlJikKKyAgeyBfTV9pbXBsLmluc2VydChfQmFzZUl0ZShfX3Bvcy5fTV9ub2RlKSwgX19uLCBfX3ZhbCk7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZvaWQgX01faW5zZXJ0X2Rpc3BhdGNoKGl0ZXJhdG9yIF9fcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fZmFsc2VfdHlwZSYpIHsKKyAgICBfTV9pbXBsLmluc2VydChfQmFzZUl0ZShfX3Bvcy5fTV9ub2RlKSwKKyAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfU1RMUF9QUklWIF9JdGVXcmFwcGVyPF9TdG9yYWdlVHlwZSwgX1RwLCBfSW5wdXRJdGVyYXRvcj46Ol9JdGUoX19maXJzdCksCisgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX1NUTFBfUFJJViBfSXRlV3JhcHBlcjxfU3RvcmFnZVR5cGUsIF9UcCwgX0lucHV0SXRlcmF0b3I+OjpfSXRlKF9fbGFzdCkpOworICB9CisKK3B1YmxpYzoKKyMgIGVuZGlmCisKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICB2b2lkIGluc2VydChpdGVyYXRvciBfX3BvcywgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KSB7CisjICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfSVRFUkFUT1JfV1JBUFBFUikKKyAgICAvLyBDaGVjayB3aGV0aGVyIGl0J3MgYW4gaW50ZWdyYWwgdHlwZS4gIElmIHNvLCBpdCdzIG5vdCBhbiBpdGVyYXRvci4KKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Jc0ludGVncmFsPF9JbnB1dEl0ZXJhdG9yPjo6X1JldCBfSW50ZWdyYWw7CisgICAgX01faW5zZXJ0X2Rpc3BhdGNoKF9fcG9zLCBfX2ZpcnN0LCBfX2xhc3QsIF9JbnRlZ3JhbCgpKTsKKyMgIGVsc2UKKyAgICBfTV9pbXBsLmluc2VydChfQmFzZUl0ZShfX3Bvcy5fTV9ub2RlKSwgX19maXJzdCwgX19sYXN0KTsKKyMgIGVuZGlmCisgIH0KKyNlbHNlIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKyAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIGNvbnN0IHZhbHVlX3R5cGUgKl9fZmlyc3QsIGNvbnN0IHZhbHVlX3R5cGUgKl9fbGFzdCkKKyAgeyBfTV9pbXBsLmluc2VydChfQmFzZUl0ZShfX3Bvcy5fTV9ub2RlKSwgY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcHRyKF9fZmlyc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NwdHIoX19sYXN0KSk7IH0KKyAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKKyAgeyBfTV9pbXBsLmluc2VydChfQmFzZUl0ZShfX3Bvcy5fTV9ub2RlKSwgX0Jhc2VDb25zdEl0ZShfX2ZpcnN0Ll9NX25vZGUpLCBfQmFzZUNvbnN0SXRlKF9fbGFzdC5fTV9ub2RlKSk7IH0KKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisKKyAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgeyBfTV9pbXBsLmluc2VydChfQmFzZUl0ZShfX3Bvcy5fTV9ub2RlKSwgX19uLCBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWYoX194KSk7IH0KKworICB2b2lkIHB1c2hfZnJvbnQoY29uc3QgdmFsdWVfdHlwZSYgX194KSB7IF9NX2ltcGwucHVzaF9mcm9udChjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWYoX194KSk7IH0KKyAgdm9pZCBwdXNoX2JhY2soY29uc3QgdmFsdWVfdHlwZSYgX194KSAgeyBfTV9pbXBsLnB1c2hfYmFjayhjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWYoX194KSk7IH0KKworI2lmIGRlZmluZWQgKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pICYmICFkZWZpbmVkIChfU1RMUF9OT19BTkFDSFJPTklTTVMpCisgIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBfX3BvcykgeyByZXR1cm4gaXRlcmF0b3IoX01faW1wbC5pbnNlcnQoX19wb3MuX01fbm9kZSkuX01fbm9kZSk7IH0KKyAgdm9pZCBwdXNoX2Zyb250KCkgeyBfTV9pbXBsLnB1c2hfZnJvbnQoKTt9CisgIHZvaWQgcHVzaF9iYWNrKCkgIHsgX01faW1wbC5wdXNoX2JhY2soKTt9CisjIGVuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSAmJiAhX1NUTFBfTk9fQU5BQ0hST05JU01TKi8KKworICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBfX3BvcykKKyAgeyByZXR1cm4gaXRlcmF0b3IoX01faW1wbC5lcmFzZShfQmFzZUl0ZShfX3Bvcy5fTV9ub2RlKSkuX01fbm9kZSk7IH0KKyAgaXRlcmF0b3IgZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KQorICB7IHJldHVybiBpdGVyYXRvcihfTV9pbXBsLmVyYXNlKF9CYXNlSXRlKF9fZmlyc3QuX01fbm9kZSksIF9CYXNlSXRlKF9fbGFzdC5fTV9ub2RlKSkuX01fbm9kZSk7IH0KKworI2lmICFkZWZpbmVkKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCisgIHZvaWQgcmVzaXplKHNpemVfdHlwZSBfX25ld19zaXplLCBjb25zdCB2YWx1ZV90eXBlJiBfX3ggPSBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKHZhbHVlX3R5cGUpKQorI2Vsc2UKKyAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9fbmV3X3NpemUpIHsgX01faW1wbC5yZXNpemUoX19uZXdfc2l6ZSk7IH0KKyAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9fbmV3X3NpemUsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyNlbmRpZiAvKiFfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKi8KKyAge19NX2ltcGwucmVzaXplKF9fbmV3X3NpemUsIGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3JlZihfX3gpKTt9CisKKyAgdm9pZCBwb3BfZnJvbnQoKSB7IF9NX2ltcGwucG9wX2Zyb250KCk7IH0KKyAgdm9pZCBwb3BfYmFjaygpICB7IF9NX2ltcGwucG9wX2JhY2soKTsgfQorCisgIF9TZWxmJiBvcGVyYXRvcj0oY29uc3QgX1NlbGYmIF9feCkKKyAgeyBfTV9pbXBsID0gX194Ll9NX2ltcGw7IHJldHVybiAqdGhpczsgfQorICB2b2lkIGFzc2lnbihzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3ZhbCkKKyAgeyBfTV9pbXBsLmFzc2lnbihfX24sIGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3JlZihfX3ZhbCkpOyB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX0lURVJBVE9SX1dSQVBQRVIpCitwcml2YXRlOgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0ludGVnZXI+CisgIHZvaWQgX01fYXNzaWduX2Rpc3BhdGNoKF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX192YWwsIGNvbnN0IF9fdHJ1ZV90eXBlJikKKyAgeyBfTV9pbXBsLmFzc2lnbihfX24sIF9fdmFsKTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgdm9pZCBfTV9hc3NpZ25fZGlzcGF0Y2goX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX2ZhbHNlX3R5cGUmKSB7CisgICAgX01faW1wbC5hc3NpZ24odHlwZW5hbWUgX1NUTFBfUFJJViBfSXRlV3JhcHBlcjxfU3RvcmFnZVR5cGUsIF9UcCwgX0lucHV0SXRlcmF0b3I+OjpfSXRlKF9fZmlyc3QpLAorICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9TVExQX1BSSVYgX0l0ZVdyYXBwZXI8X1N0b3JhZ2VUeXBlLCBfVHAsIF9JbnB1dEl0ZXJhdG9yPjo6X0l0ZShfX2xhc3QpKTsKKyAgfQorCitwdWJsaWM6CisjICBlbmRpZgorCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgdm9pZCBhc3NpZ24oX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KSB7CisjICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfSVRFUkFUT1JfV1JBUFBFUikKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Jc0ludGVncmFsPF9JbnB1dEl0ZXJhdG9yPjo6X1JldCBfSW50ZWdyYWw7CisgICAgX01fYXNzaWduX2Rpc3BhdGNoKF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOworIyAgZWxzZQorICAgIF9NX2ltcGwuYXNzaWduKF9fZmlyc3QsIF9fbGFzdCk7CisjICBlbmRpZgorICB9CisjZWxzZQorICB2b2lkIGFzc2lnbihjb25zdCB2YWx1ZV90eXBlICpfX2ZpcnN0LCBjb25zdCB2YWx1ZV90eXBlICpfX2xhc3QpIHsKKyAgICBfTV9pbXBsLmFzc2lnbihjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NwdHIoX19maXJzdCksCisgICAgICAgICAgICAgICAgICAgY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcHRyKF9fbGFzdCkpOworICB9CisgIHZvaWQgYXNzaWduKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKKyAgeyBfTV9pbXBsLmFzc2lnbihfQmFzZUNvbnN0SXRlKF9fZmlyc3QuX01fbm9kZSksIF9CYXNlQ29uc3RJdGUoX19sYXN0Ll9NX25vZGUpKTsgfQorI2VuZGlmCisKKyAgdm9pZCBzcGxpY2UoaXRlcmF0b3IgX19wb3MsIF9TZWxmJiBfX3gpCisgIHsgX01faW1wbC5zcGxpY2UoX0Jhc2VJdGUoX19wb3MuX01fbm9kZSksIF9feC5fTV9pbXBsKTsgfQorICB2b2lkIHNwbGljZShpdGVyYXRvciBfX3BvcywgX1NlbGYmIF9feCwgaXRlcmF0b3IgX19pKQorICB7IF9NX2ltcGwuc3BsaWNlKF9CYXNlSXRlKF9fcG9zLl9NX25vZGUpLCBfX3guX01faW1wbCwgX0Jhc2VJdGUoX19pLl9NX25vZGUpKTsgfQorICB2b2lkIHNwbGljZShpdGVyYXRvciBfX3BvcywgX1NlbGYmIF9feCwgaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KQorICB7IF9NX2ltcGwuc3BsaWNlKF9CYXNlSXRlKF9fcG9zLl9NX25vZGUpLCBfX3guX01faW1wbCwKKyAgICAgICAgICAgICAgICAgICBfQmFzZUl0ZShfX2ZpcnN0Ll9NX25vZGUpLCBfQmFzZUl0ZShfX2xhc3QuX01fbm9kZSkpOyB9CisKKyAgdm9pZCByZW1vdmUoY29uc3RfcmVmZXJlbmNlIF9fdmFsKQorICB7IF9NX2ltcGwucmVtb3ZlKGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3JlZihfX3ZhbCkpOyB9CisgIHZvaWQgdW5pcXVlKCkgeyBfTV9pbXBsLnVuaXF1ZSgpOyB9CisgIHZvaWQgbWVyZ2UoX1NlbGYmIF9feCkgeyBfTV9pbXBsLm1lcmdlKF9feC5fTV9pbXBsKTsgfQorICB2b2lkIHJldmVyc2UoKSB7IF9NX2ltcGwucmV2ZXJzZSgpOyB9CisgIHZvaWQgc29ydCgpIHsgX01faW1wbC5zb3J0KCk7IH0KKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIHRlbXBsYXRlIDxjbGFzcyBfUHJlZGljYXRlPgorICB2b2lkIHJlbW92ZV9pZihfUHJlZGljYXRlIF9fcHJlZCkKKyAgeyBfTV9pbXBsLnJlbW92ZV9pZihfU1RMUF9QUklWIF9VbmFyeVByZWRXcmFwcGVyPF9TdG9yYWdlVHlwZSwgX1RwLCBfUHJlZGljYXRlPihfX3ByZWQpKTsgfQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0JpbmFyeVByZWRpY2F0ZT4KKyAgdm9pZCB1bmlxdWUoX0JpbmFyeVByZWRpY2F0ZSBfX2Jpbl9wcmVkKQorICB7IF9NX2ltcGwudW5pcXVlKF9TVExQX1BSSVYgX0JpbmFyeVByZWRXcmFwcGVyPF9TdG9yYWdlVHlwZSwgX1RwLCBfQmluYXJ5UHJlZGljYXRlPihfX2Jpbl9wcmVkKSk7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1N0cmljdFdlYWtPcmRlcmluZz4KKyAgdm9pZCBtZXJnZShfU2VsZiAmX194LCBfU3RyaWN0V2Vha09yZGVyaW5nIF9fY29tcCkKKyAgeyBfTV9pbXBsLm1lcmdlKF9feC5fTV9pbXBsLCBfU1RMUF9QUklWIF9CaW5hcnlQcmVkV3JhcHBlcjxfU3RvcmFnZVR5cGUsIF9UcCwgX1N0cmljdFdlYWtPcmRlcmluZz4oX19jb21wKSk7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1N0cmljdFdlYWtPcmRlcmluZz4KKyAgdm9pZCBzb3J0KF9TdHJpY3RXZWFrT3JkZXJpbmcgX19jb21wKQorICB7IF9NX2ltcGwuc29ydChfU1RMUF9QUklWIF9CaW5hcnlQcmVkV3JhcHBlcjxfU3RvcmFnZVR5cGUsIF9UcCwgX1N0cmljdFdlYWtPcmRlcmluZz4oX19jb21wKSk7IH0KKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisKK3ByaXZhdGU6CisgIF9CYXNlIF9NX2ltcGw7Cit9OworCisjaWYgZGVmaW5lZCAobGlzdCkKKyMgIHVuZGVmIGxpc3QKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorI2VuZGlmCisKKyN1bmRlZiBMSVNUX0lNUEwKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYgLyogX1NUTFBfUFRSX1NQRUNJQUxJWkVEX0xJU1RfSCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RsL3BvaW50ZXJzL19zZXQuaCBiL3N0bC9wb2ludGVycy9fc2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY2ZmQ5OAotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9wb2ludGVycy9fc2V0LmgKQEAgLTAsMCArMSw1MzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUKKyAqIEZyYW5jb2lzIER1bW9udAorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICovCisKKy8qIE5PVEU6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIFNUTCBoZWFkZXJzLgorICogICBZb3Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4KKyAqLworCisjaWZuZGVmIF9TVExQX1BUUl9TUEVDSUFMSVpFRF9TRVRfSAorI2RlZmluZSBfU1RMUF9QVFJfU1BFQ0lBTElaRURfU0VUX0gKKworI2lmbmRlZiBfU1RMUF9QT0lOVEVSU19TUEVDX1RPT0xTX0gKKyMgIGluY2x1ZGUgPHN0bC9wb2ludGVycy9fdG9vbHMuaD4KKyNlbmRpZgorCitfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKKworLy9TcGVjaWZpYyBpdGVyYXRvciB0cmFpdHMgY3JlYXRpb24KK19TVExQX0NSRUFURV9JVEVSQVRPUl9UUkFJVFMoU2V0VHJhaXRzVCwgQ29uc3RfdHJhaXRzKQorCisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1RFTVBMQVRFX0VYUE9SVCkgJiYgIWRlZmluZWQgKF9TVExQX1VTRV9NU1ZDNl9NRU1fVF9CVUdfV09SS0FST1VORCkKK19TVExQX0VYUE9SVCB0ZW1wbGF0ZSBzdHJ1Y3QgX1NUTFBfQ0xBU1NfREVDTFNQRUMgbGVzczx2b2lkKj47CisKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKKwordHlwZWRlZiBfUmJfdHJlZV9ub2RlPHZvaWQqPiBfTm9kZTsKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBfU1RMUF9hbGxvY19wcm94eTxfUmJfdHJlZV9ub2RlX2Jhc2UsIF9Ob2RlLCAgYWxsb2NhdG9yPF9Ob2RlPiA+OworX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIF9SYl90cmVlX2Jhc2U8dm9pZCosIGFsbG9jYXRvcjx2b2lkKj4gPjsKKyMgIGlmIGRlZmluZWQgKF9TVExQX0RFQlVHKQorX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIF9EYmdDb21wYXJlPHZvaWQqLCBsZXNzPHZvaWQqPiA+OworIyAgICBkZWZpbmUgX1JiX3RyZWUgX1NUTFBfTk9OX0RCR19OQU1FKFJiX3RyZWUpCitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgX1JiX3RyZWU8dm9pZCosIF9EYmdDb21wYXJlPHZvaWQqLCBsZXNzPHZvaWQqPiA+LCB2b2lkKiwgX0lkZW50aXR5PHZvaWQqPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU2V0VHJhaXRzVDx2b2lkKj4sIGFsbG9jYXRvcjx2b2lkKj4gPjsKKyMgICAgdW5kZWYgX1JiX3RyZWUKKyMgIGVuZGlmCitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgX1JiX3RyZWU8dm9pZCosIGxlc3M8dm9pZCo+LCB2b2lkKiwgX0lkZW50aXR5PHZvaWQqPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU2V0VHJhaXRzVDx2b2lkKj4sIGFsbG9jYXRvcjx2b2lkKj4gPjsKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBfU1RMUF9ERkxfVE1QTF9QQVJBTShfQ29tcGFyZSwgbGVzczxfS2V5PiksCisgICAgICAgICAgICAgICAgICAgICAgX1NUTFBfREVGQVVMVF9BTExPQ0FUT1JfU0VMRUNUKF9LZXkpID4KK2NsYXNzIHNldAorI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QQVJUSUFMX1NQRUNfV09SS0FST1VORCkKKyAgICAgICAgICA6IHB1YmxpYyBfX3N0bHBvcnRfY2xhc3M8c2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2M+ID4KKyNlbmRpZgoreworICB0eXBlZGVmIF9TVExQX1BSSVYgX0Fzc29jU3RvcmFnZVR5cGVzPF9LZXksIF9Db21wYXJlPiBfQXNzb2NTdG9yYWdlVHlwZXM7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0Fzc29jU3RvcmFnZVR5cGVzOjpfS2V5U3RvcmFnZVR5cGUgX0tleVN0b3JhZ2VUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9Bc3NvY1N0b3JhZ2VUeXBlczo6X0NvbXBhcmVTdG9yYWdlVHlwZSBfQ29tcGFyZVN0b3JhZ2VUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY190cmFpdHM8X0tleVN0b3JhZ2VUeXBlLCBfQWxsb2M+OjphbGxvY2F0b3JfdHlwZSBfU3RvcmFnZVR5cGVBbGxvYzsKKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9DYXN0VHJhaXRzPF9LZXlTdG9yYWdlVHlwZSwgX0tleT4gY2FzdF90cmFpdHM7CisKKyAgdHlwZWRlZiBzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvYz4gX1NlbGY7CitwdWJsaWM6CisgIHR5cGVkZWYgX0tleSAgICAga2V5X3R5cGU7CisgIHR5cGVkZWYgX0tleSAgICAgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiBfQ29tcGFyZSBrZXlfY29tcGFyZTsKKyAgdHlwZWRlZiBfQ29tcGFyZSB2YWx1ZV9jb21wYXJlOworCitwcm90ZWN0ZWQ6CisgIC8vU3BlY2lmaWMgaXRlcmF0b3IgdHJhaXRzIGNyZWF0aW9uCisgIHR5cGVkZWYgX1NUTFBfUFJJViBfU2V0VHJhaXRzVDx2YWx1ZV90eXBlPiBfU2V0VHJhaXRzOworICB0eXBlZGVmIF9TVExQX1BSSVYgX1JiX3RyZWU8a2V5X3R5cGUsIGtleV9jb21wYXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZSwgX1NUTFBfUFJJViBfSWRlbnRpdHk8dmFsdWVfdHlwZT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU2V0VHJhaXRzLCBfQWxsb2M+IF9Qcml2X1JlcF90eXBlOworCisgIHR5cGVkZWYgX1NUTFBfUFJJViBfU2V0VHJhaXRzVDxfS2V5U3RvcmFnZVR5cGU+IF9TZXRTdG9yYWdlVHJhaXRzOworCitwdWJsaWM6CisgIC8vZHVtczogbmVlZCB0aGUgZm9sbG93aW5nIHB1YmxpYyBmb3IgdGhlIF9fbW92ZV90cmFpdHMgZnJhbWV3b3JrCisgIHR5cGVkZWYgX1NUTFBfUFJJViBfUmJfdHJlZTxfS2V5U3RvcmFnZVR5cGUsIF9Db21wYXJlU3RvcmFnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfS2V5U3RvcmFnZVR5cGUsIF9TVExQX1BSSVYgX0lkZW50aXR5PF9LZXlTdG9yYWdlVHlwZT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU2V0U3RvcmFnZVRyYWl0cywgX1N0b3JhZ2VUeXBlQWxsb2M+IF9SZXBfdHlwZTsKKworcHJpdmF0ZToKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6Oml0ZXJhdG9yIGJhc2VfaXRlcmF0b3I7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpjb25zdF9pdGVyYXRvciBjb25zdF9iYXNlX2l0ZXJhdG9yOworCitwdWJsaWM6CisgIHR5cGVkZWYgdHlwZW5hbWUgX1ByaXZfUmVwX3R5cGU6OnBvaW50ZXIgcG9pbnRlcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUHJpdl9SZXBfdHlwZTo6Y29uc3RfcG9pbnRlciBjb25zdF9wb2ludGVyOworICB0eXBlZGVmIHR5cGVuYW1lIF9Qcml2X1JlcF90eXBlOjpyZWZlcmVuY2UgcmVmZXJlbmNlOworICB0eXBlZGVmIHR5cGVuYW1lIF9Qcml2X1JlcF90eXBlOjpjb25zdF9yZWZlcmVuY2UgY29uc3RfcmVmZXJlbmNlOworICB0eXBlZGVmIHR5cGVuYW1lIF9Qcml2X1JlcF90eXBlOjppdGVyYXRvciBpdGVyYXRvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUHJpdl9SZXBfdHlwZTo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1ByaXZfUmVwX3R5cGU6OnJldmVyc2VfaXRlcmF0b3IgcmV2ZXJzZV9pdGVyYXRvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUHJpdl9SZXBfdHlwZTo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworICB0eXBlZGVmIHR5cGVuYW1lIF9Qcml2X1JlcF90eXBlOjpzaXplX3R5cGUgc2l6ZV90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9Qcml2X1JlcF90eXBlOjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9Qcml2X1JlcF90eXBlOjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKKworcHJpdmF0ZToKKyAgX1JlcF90eXBlIF9NX3Q7ICAvLyByZWQtYmxhY2sgdHJlZSByZXByZXNlbnRpbmcgc2V0CisgIF9TVExQX0tFWV9UWVBFX0ZPUl9DT05UX0VYVChrZXlfdHlwZSkKKworI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHKQorICBzdGF0aWMgaXRlcmF0b3IgX1NfdG9fdmFsdWVfaXRlKGNvbnN0X2Jhc2VfaXRlcmF0b3IgX19pdGUpCisgIHsgcmV0dXJuIGl0ZXJhdG9yKF9faXRlLl9Pd25lcigpLCBfX2l0ZS5fTV9pdGVyYXRvci5fTV9ub2RlKTsgfQorICBzdGF0aWMgYmFzZV9pdGVyYXRvciBfU190b19zdG9yYWdlX2l0ZShjb25zdF9pdGVyYXRvciBfX2l0ZSkKKyAgeyByZXR1cm4gYmFzZV9pdGVyYXRvcihfX2l0ZS5fT3duZXIoKSwgX19pdGUuX01faXRlcmF0b3IuX01fbm9kZSk7IH0KKyNlbHNlCisgIHN0YXRpYyBpdGVyYXRvciBfU190b192YWx1ZV9pdGUoY29uc3RfYmFzZV9pdGVyYXRvciBfX2l0ZSkKKyAgeyByZXR1cm4gaXRlcmF0b3IoX19pdGUuX01fbm9kZSk7IH0KKyAgc3RhdGljIGJhc2VfaXRlcmF0b3IgX1NfdG9fc3RvcmFnZV9pdGUoY29uc3RfaXRlcmF0b3IgX19pdGUpCisgIHsgcmV0dXJuIGJhc2VfaXRlcmF0b3IoX19pdGUuX01fbm9kZSk7IH0KKyNlbmRpZgorCitwdWJsaWM6CisgIHNldCgpIDogX01fdChfQ29tcGFyZVN0b3JhZ2VUeXBlKCksIF9TdG9yYWdlVHlwZUFsbG9jKCkpIHt9CisgIGV4cGxpY2l0IHNldChjb25zdCBfQ29tcGFyZSYgX19jb21wLAorICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfTV90KF9fY29tcCwgX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoX19hLCBfS2V5U3RvcmFnZVR5cGUpKSB7fQorCisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICBzZXQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgIDogX01fdChfQ29tcGFyZSgpLCBfU3RvcmFnZVR5cGVBbGxvYygpKSB7CisjICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfSVRFUkFUT1JfV1JBUFBFUikKKyAgICBfTV90Lmluc2VydF91bmlxdWUodHlwZW5hbWUgX1NUTFBfUFJJViBfSXRlV3JhcHBlcjxfS2V5U3RvcmFnZVR5cGUsIF9LZXksIF9JbnB1dEl0ZXJhdG9yPjo6X0l0ZShfX2ZpcnN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX1NUTFBfUFJJViBfSXRlV3JhcHBlcjxfS2V5U3RvcmFnZVR5cGUsIF9LZXksIF9JbnB1dEl0ZXJhdG9yPjo6X0l0ZShfX2xhc3QpKTsKKyMgIGVsc2UKKyAgICBfTV90Lmluc2VydF91bmlxdWUoX19maXJzdCwgX19sYXN0KTsKKyMgIGVuZGlmCisgIH0KKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfTkVFRFNfRVhUUkFfVEVNUExBVEVfQ09OU1RSVUNUT1JTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHNldChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsIGNvbnN0IF9Db21wYXJlJiBfX2NvbXApCisgICAgOiBfTV90KF9fY29tcCwgX1N0b3JhZ2VUeXBlQWxsb2MoKSkgeworIyAgICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfSVRFUkFUT1JfV1JBUFBFUikKKyAgICBfTV90Lmluc2VydF91bmlxdWUodHlwZW5hbWUgX1NUTFBfUFJJViBfSXRlV3JhcHBlcjxfS2V5U3RvcmFnZVR5cGUsIF9LZXksIF9JbnB1dEl0ZXJhdG9yPjo6X0l0ZShfX2ZpcnN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX1NUTFBfUFJJViBfSXRlV3JhcHBlcjxfS2V5U3RvcmFnZVR5cGUsIF9LZXksIF9JbnB1dEl0ZXJhdG9yPjo6X0l0ZShfX2xhc3QpKTsKKyMgICAgZWxzZQorICAgIF9NX3QuaW5zZXJ0X3VuaXF1ZShfX2ZpcnN0LCBfX2xhc3QpOworIyAgICBlbmRpZgorICB9CisjICBlbmRpZgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHNldChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsIGNvbnN0IF9Db21wYXJlJiBfX2NvbXAsCisgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hIF9TVExQX0FMTE9DQVRPUl9UWVBFX0RGTCkKKyAgICA6IF9NX3QoX19jb21wLCBfU1RMUF9DT05WRVJUX0FMTE9DQVRPUihfX2EsIF9LZXlTdG9yYWdlVHlwZSkpIHsKKyMgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9JVEVSQVRPUl9XUkFQUEVSKQorICAgIF9NX3QuaW5zZXJ0X3VuaXF1ZSh0eXBlbmFtZSBfU1RMUF9QUklWIF9JdGVXcmFwcGVyPF9LZXlTdG9yYWdlVHlwZSwgX0tleSwgX0lucHV0SXRlcmF0b3I+OjpfSXRlKF9fZmlyc3QpLAorICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfU1RMUF9QUklWIF9JdGVXcmFwcGVyPF9LZXlTdG9yYWdlVHlwZSwgX0tleSwgX0lucHV0SXRlcmF0b3I+OjpfSXRlKF9fbGFzdCkpOworIyAgZWxzZQorICAgIF9NX3QuaW5zZXJ0X3VuaXF1ZShfX2ZpcnN0LCBfX2xhc3QpOworIyAgZW5kaWYKKyAgfQorI2Vsc2UKKyAgc2V0KGNvbnN0IHZhbHVlX3R5cGUqIF9fZmlyc3QsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbGFzdCkKKyAgICA6IF9NX3QoX0NvbXBhcmUoKSwgX1N0b3JhZ2VUeXBlQWxsb2MoKSkgeworICAgIF9NX3QuaW5zZXJ0X3VuaXF1ZShjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NwdHIoX19maXJzdCksCisgICAgICAgICAgICAgICAgICAgICAgIGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3B0cihfX2xhc3QpKTsKKyAgfQorCisgIHNldChjb25zdCB2YWx1ZV90eXBlKiBfX2ZpcnN0LCBjb25zdCB2YWx1ZV90eXBlKiBfX2xhc3QsCisgICAgICBjb25zdCBfQ29tcGFyZSYgX19jb21wLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9NX3QoX19jb21wLCBfU1RMUF9DT05WRVJUX0FMTE9DQVRPUihfX2EsIF9LZXlTdG9yYWdlVHlwZSkpIHsKKyAgICBfTV90Lmluc2VydF91bmlxdWUoY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcHRyKF9fZmlyc3QpLAorICAgICAgICAgICAgICAgICAgICAgICBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NwdHIoX19sYXN0KSk7CisgIH0KKworICBzZXQoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KQorICAgIDogX01fdChfQ29tcGFyZSgpLCBfU3RvcmFnZVR5cGVBbGxvYygpKQorICB7IF9NX3QuaW5zZXJ0X3VuaXF1ZShfU190b19zdG9yYWdlX2l0ZShfX2ZpcnN0KSwgX1NfdG9fc3RvcmFnZV9pdGUoX19sYXN0KSk7IH0KKworICBzZXQoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0LAorICAgICAgY29uc3QgX0NvbXBhcmUmIF9fY29tcCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfTV90KF9fY29tcCwgX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoX19hLCBfS2V5U3RvcmFnZVR5cGUpKQorICB7IF9NX3QuaW5zZXJ0X3VuaXF1ZShfU190b19zdG9yYWdlX2l0ZShfX2ZpcnN0KSwgX1NfdG9fc3RvcmFnZV9pdGUoX19sYXN0KSk7IH0KKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisKKyAgc2V0KGNvbnN0IF9TZWxmJiBfX3gpIDogX01fdChfX3guX01fdCkge30KKworICBzZXQoX19tb3ZlX3NvdXJjZTxfU2VsZj4gc3JjKQorICAgIDogX01fdChfX21vdmVfc291cmNlPF9SZXBfdHlwZT4oc3JjLmdldCgpLl9NX3QpKSB7fQorCisgIF9TZWxmJiBvcGVyYXRvcj0oY29uc3QgX1NlbGYmIF9feCkgeworICAgIF9NX3QgPSBfX3guX01fdDsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLyBhY2Nlc3NvcnM6CisgIGtleV9jb21wYXJlIGtleV9jb21wKCkgY29uc3QgeyByZXR1cm4gX01fdC5rZXlfY29tcCgpOyB9CisgIHZhbHVlX2NvbXBhcmUgdmFsdWVfY29tcCgpIGNvbnN0IHsgcmV0dXJuIF9NX3Qua2V5X2NvbXAoKTsgfQorICBhbGxvY2F0b3JfdHlwZSBnZXRfYWxsb2NhdG9yKCkgY29uc3QKKyAgeyByZXR1cm4gX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoX01fdC5nZXRfYWxsb2NhdG9yKCksIHZhbHVlX3R5cGUpOyB9CisKKyAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBfU190b192YWx1ZV9pdGUoX01fdC5iZWdpbigpKTsgfQorICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBfU190b192YWx1ZV9pdGUoX01fdC5lbmQoKSk7IH0KKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBfU190b192YWx1ZV9pdGUoX01fdC5iZWdpbigpKTsgfQorICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBfU190b192YWx1ZV9pdGUoX01fdC5lbmQoKSk7IH0KKyAgcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorICByZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgY29uc3QgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgY29uc3QgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gX01fdC5lbXB0eSgpOyB9CisgIHNpemVfdHlwZSBzaXplKCkgY29uc3QgeyByZXR1cm4gX01fdC5zaXplKCk7IH0KKyAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgeyByZXR1cm4gX01fdC5tYXhfc2l6ZSgpOyB9CisgIHZvaWQgc3dhcChfU2VsZiYgX194KSB7IF9NX3Quc3dhcChfX3guX01fdCk7IH0KKworICAvLyBpbnNlcnQvZXJhc2UKKyAgcGFpcjxpdGVyYXRvcixib29sPiBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX194KSB7CisgICAgcGFpcjxiYXNlX2l0ZXJhdG9yLCBib29sPiByZXQgPSBfTV90Lmluc2VydF91bmlxdWUoY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcmVmKF9feCkpOworICAgIHJldHVybiBwYWlyPGl0ZXJhdG9yLCBib29sPihfU190b192YWx1ZV9pdGUocmV0LmZpcnN0KSwgcmV0LnNlY29uZCk7CisgIH0KKyAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgIHsgcmV0dXJuIF9TX3RvX3ZhbHVlX2l0ZShfTV90Lmluc2VydF91bmlxdWUoX1NfdG9fc3RvcmFnZV9pdGUoX19wb3MpLCBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWYoX194KSkpOyB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZvaWQgaW5zZXJ0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkgeworIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX0lURVJBVE9SX1dSQVBQRVIpCisgICAgX01fdC5pbnNlcnRfdW5pcXVlKHR5cGVuYW1lIF9TVExQX1BSSVYgX0l0ZVdyYXBwZXI8X0tleVN0b3JhZ2VUeXBlLCBfS2V5LCBfSW5wdXRJdGVyYXRvcj46Ol9JdGUoX19maXJzdCksCisgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9TVExQX1BSSVYgX0l0ZVdyYXBwZXI8X0tleVN0b3JhZ2VUeXBlLCBfS2V5LCBfSW5wdXRJdGVyYXRvcj46Ol9JdGUoX19sYXN0KSk7CisjICBlbHNlCisgICAgX01fdC5pbnNlcnRfdW5pcXVlKF9fZmlyc3QsIF9fbGFzdCk7CisjICBlbmRpZgorICB9CisjZWxzZQorICB2b2lkIGluc2VydChjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpCisgIHsgX01fdC5pbnNlcnRfdW5pcXVlKF9TX3RvX3N0b3JhZ2VfaXRlKF9fZmlyc3QpLCBfU190b19zdG9yYWdlX2l0ZShfX2xhc3QpKTsgfQorICB2b2lkIGluc2VydChjb25zdCB2YWx1ZV90eXBlKiBfX2ZpcnN0LCBjb25zdCB2YWx1ZV90eXBlKiBfX2xhc3QpIHsKKyAgICBfTV90Lmluc2VydF91bmlxdWUoY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcHRyKF9fZmlyc3QpLAorICAgICAgICAgICAgICAgICAgICAgICBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NwdHIoX19sYXN0KSk7CisgIH0KKyNlbmRpZgorICB2b2lkIGVyYXNlKGl0ZXJhdG9yIF9fcG9zKQorICB7IF9NX3QuZXJhc2UoX1NfdG9fc3RvcmFnZV9pdGUoX19wb3MpKTsgfQorICBzaXplX3R5cGUgZXJhc2UoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgeyByZXR1cm4gX01fdC5lcmFzZV91bmlxdWUoY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcmVmKF9feCkpOyB9CisgIHZvaWQgZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KQorICB7IF9NX3QuZXJhc2UoX1NfdG9fc3RvcmFnZV9pdGUoX19maXJzdCksIF9TX3RvX3N0b3JhZ2VfaXRlKF9fbGFzdCkpOyB9CisgIHZvaWQgY2xlYXIoKSB7IF9NX3QuY2xlYXIoKTsgfQorCisgIC8vIHNldCBvcGVyYXRpb25zOgorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgY29uc3RfaXRlcmF0b3IgZmluZChjb25zdCBfS1QmIF9feCkgY29uc3QKKyAgeyByZXR1cm4gX1NfdG9fdmFsdWVfaXRlKF9NX3QuZmluZChjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWZUKF9feCkpKTsgfQorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgaXRlcmF0b3IgZmluZChjb25zdCBfS1QmIF9feCkKKyAgeyByZXR1cm4gX1NfdG9fdmFsdWVfaXRlKF9NX3QuZmluZChjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWZUKF9feCkpKTsgfQorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgc2l6ZV90eXBlIGNvdW50KGNvbnN0IF9LVCYgX194KSBjb25zdAorICB7IHJldHVybiBfTV90LmZpbmQoY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcmVmVChfX3gpKSA9PSBfTV90LmVuZCgpID8gMCA6IDE7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIGl0ZXJhdG9yIGxvd2VyX2JvdW5kKGNvbnN0IF9LVCYgX194KQorICB7IHJldHVybiBfU190b192YWx1ZV9pdGUoX01fdC5sb3dlcl9ib3VuZChjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWZUKF9feCkpKTsgfQorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgY29uc3RfaXRlcmF0b3IgbG93ZXJfYm91bmQoY29uc3QgX0tUJiBfX3gpIGNvbnN0CisgIHsgcmV0dXJuIF9TX3RvX3ZhbHVlX2l0ZShfTV90Lmxvd2VyX2JvdW5kKGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3JlZlQoX194KSkpOyB9CisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBpdGVyYXRvciB1cHBlcl9ib3VuZChjb25zdCBfS1QmIF9feCkKKyAgeyByZXR1cm4gX1NfdG9fdmFsdWVfaXRlKF9NX3QudXBwZXJfYm91bmQoY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcmVmVChfX3gpKSk7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIGNvbnN0X2l0ZXJhdG9yIHVwcGVyX2JvdW5kKGNvbnN0IF9LVCYgX194KSBjb25zdAorICB7IHJldHVybiBfU190b192YWx1ZV9pdGUoX01fdC51cHBlcl9ib3VuZChjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWZUKF9feCkpKTsgfQorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgcGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+IGVxdWFsX3JhbmdlKGNvbnN0IF9LVCYgX194KSB7CisgICAgcGFpcjxiYXNlX2l0ZXJhdG9yLCBiYXNlX2l0ZXJhdG9yPiBfX3JldDsKKyAgICBfX3JldCA9IF9NX3QuZXF1YWxfcmFuZ2UoY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcmVmVChfX3gpKTsKKyAgICByZXR1cm4gcGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+KF9TX3RvX3ZhbHVlX2l0ZShfX3JldC5maXJzdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU190b192YWx1ZV9pdGUoX19yZXQuc2Vjb25kKSk7CisgIH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIHBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPiBlcXVhbF9yYW5nZShjb25zdCBfS1QmIF9feCkgY29uc3QgeworICAgIHBhaXI8Y29uc3RfYmFzZV9pdGVyYXRvciwgY29uc3RfYmFzZV9pdGVyYXRvcj4gX19yZXQ7CisgICAgX19yZXQgPSBfTV90LmVxdWFsX3JhbmdlX3VuaXF1ZShjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWZUKF9feCkpOworICAgIHJldHVybiBwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4oX1NfdG9fdmFsdWVfaXRlKF9fcmV0LmZpcnN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TX3RvX3ZhbHVlX2l0ZShfX3JldC5zZWNvbmQpKTsKKyAgfQorfTsKKworLy9TcGVjaWZpYyBpdGVyYXRvciB0cmFpdHMgY3JlYXRpb24KK19TVExQX0NSRUFURV9JVEVSQVRPUl9UUkFJVFMoTXVsdGlzZXRUcmFpdHNULCBDb25zdF90cmFpdHMpCisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBfU1RMUF9ERkxfVE1QTF9QQVJBTShfQ29tcGFyZSwgbGVzczxfS2V5PiksCisgICAgICAgICAgICAgICAgICAgICBfU1RMUF9ERUZBVUxUX0FMTE9DQVRPUl9TRUxFQ1QoX0tleSkgPgorY2xhc3MgbXVsdGlzZXQKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUEFSVElBTF9TUEVDX1dPUktBUk9VTkQpCisgICAgICAgICAgICAgICA6IHB1YmxpYyBfX3N0bHBvcnRfY2xhc3M8bXVsdGlzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvYz4gPgorI2VuZGlmCit7CisgIHR5cGVkZWYgX1NUTFBfUFJJViBfQXNzb2NTdG9yYWdlVHlwZXM8X0tleSwgX0NvbXBhcmU+IF9Bc3NvY1N0b3JhZ2VUeXBlczsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQXNzb2NTdG9yYWdlVHlwZXM6Ol9LZXlTdG9yYWdlVHlwZSBfS2V5U3RvcmFnZVR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0Fzc29jU3RvcmFnZVR5cGVzOjpfQ29tcGFyZVN0b3JhZ2VUeXBlIF9Db21wYXJlU3RvcmFnZVR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jX3RyYWl0czxfS2V5U3RvcmFnZVR5cGUsIF9BbGxvYz46OmFsbG9jYXRvcl90eXBlIF9TdG9yYWdlVHlwZUFsbG9jOworICB0eXBlZGVmIF9TVExQX1BSSVYgX0Nhc3RUcmFpdHM8X0tleVN0b3JhZ2VUeXBlLCBfS2V5PiBjYXN0X3RyYWl0czsKKworICB0eXBlZGVmIG11bHRpc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2M+IF9TZWxmOworcHVibGljOgorICAvLyB0eXBlZGVmczoKKyAgdHlwZWRlZiBfS2V5ICAgICBrZXlfdHlwZTsKKyAgdHlwZWRlZiBfS2V5ICAgICB2YWx1ZV90eXBlOworICB0eXBlZGVmIF9Db21wYXJlIGtleV9jb21wYXJlOworICB0eXBlZGVmIF9Db21wYXJlIHZhbHVlX2NvbXBhcmU7CisKK3Byb3RlY3RlZDoKKyAgLy9TcGVjaWZpYyBpdGVyYXRvciB0cmFpdHMgY3JlYXRpb24KKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9NdWx0aXNldFRyYWl0c1Q8dmFsdWVfdHlwZT4gX011bHRpc2V0VHJhaXRzOworICB0eXBlZGVmIF9TVExQX1BSSVYgX1JiX3RyZWU8a2V5X3R5cGUsIGtleV9jb21wYXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZSwgX1NUTFBfUFJJViBfSWRlbnRpdHk8dmFsdWVfdHlwZT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTXVsdGlzZXRUcmFpdHMsIF9BbGxvYz4gX1ByaXZfUmVwX3R5cGU7CisKKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9NdWx0aXNldFRyYWl0c1Q8X0tleVN0b3JhZ2VUeXBlPiBfTXVsdGlzZXRTdG9yYWdlVHJhaXRzOworcHVibGljOgorICAvL2R1bXM6IG5lZWQgdGhlIGZvbGxvd2luZyBwdWJsaWMgZm9yIHRoZSBfX21vdmVfdHJhaXRzIGZyYW1ld29yaworICB0eXBlZGVmIF9TVExQX1BSSVYgX1JiX3RyZWU8X0tleVN0b3JhZ2VUeXBlLCBfQ29tcGFyZVN0b3JhZ2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0tleVN0b3JhZ2VUeXBlLCBfU1RMUF9QUklWIF9JZGVudGl0eTxfS2V5U3RvcmFnZVR5cGU+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX011bHRpc2V0U3RvcmFnZVRyYWl0cywgX1N0b3JhZ2VUeXBlQWxsb2M+IF9SZXBfdHlwZTsKKworcHJpdmF0ZToKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6Oml0ZXJhdG9yIGJhc2VfaXRlcmF0b3I7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpjb25zdF9pdGVyYXRvciBjb25zdF9iYXNlX2l0ZXJhdG9yOworCitwdWJsaWM6CisgIHR5cGVkZWYgdHlwZW5hbWUgX1ByaXZfUmVwX3R5cGU6OnBvaW50ZXIgcG9pbnRlcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUHJpdl9SZXBfdHlwZTo6Y29uc3RfcG9pbnRlciBjb25zdF9wb2ludGVyOworICB0eXBlZGVmIHR5cGVuYW1lIF9Qcml2X1JlcF90eXBlOjpyZWZlcmVuY2UgcmVmZXJlbmNlOworICB0eXBlZGVmIHR5cGVuYW1lIF9Qcml2X1JlcF90eXBlOjpjb25zdF9yZWZlcmVuY2UgY29uc3RfcmVmZXJlbmNlOworICB0eXBlZGVmIHR5cGVuYW1lIF9Qcml2X1JlcF90eXBlOjppdGVyYXRvciBpdGVyYXRvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUHJpdl9SZXBfdHlwZTo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1ByaXZfUmVwX3R5cGU6OnJldmVyc2VfaXRlcmF0b3IgcmV2ZXJzZV9pdGVyYXRvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfUHJpdl9SZXBfdHlwZTo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworICB0eXBlZGVmIHR5cGVuYW1lIF9Qcml2X1JlcF90eXBlOjpzaXplX3R5cGUgc2l6ZV90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9Qcml2X1JlcF90eXBlOjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9Qcml2X1JlcF90eXBlOjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKKworcHJpdmF0ZToKKyAgX1JlcF90eXBlIF9NX3Q7ICAvLyByZWQtYmxhY2sgdHJlZSByZXByZXNlbnRpbmcgbXVsdGlzZXQKKyAgX1NUTFBfS0VZX1RZUEVfRk9SX0NPTlRfRVhUKGtleV90eXBlKQorCisjaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpCisgIHN0YXRpYyBpdGVyYXRvciBfU190b192YWx1ZV9pdGUoY29uc3RfYmFzZV9pdGVyYXRvciBfX2l0ZSkKKyAgeyByZXR1cm4gaXRlcmF0b3IoX19pdGUuX093bmVyKCksIF9faXRlLl9NX2l0ZXJhdG9yLl9NX25vZGUpOyB9CisgIHN0YXRpYyBiYXNlX2l0ZXJhdG9yIF9TX3RvX3N0b3JhZ2VfaXRlKGNvbnN0X2l0ZXJhdG9yIF9faXRlKQorICB7IHJldHVybiBiYXNlX2l0ZXJhdG9yKF9faXRlLl9Pd25lcigpLCBfX2l0ZS5fTV9pdGVyYXRvci5fTV9ub2RlKTsgfQorI2Vsc2UKKyAgc3RhdGljIGl0ZXJhdG9yIF9TX3RvX3ZhbHVlX2l0ZShjb25zdF9iYXNlX2l0ZXJhdG9yIF9faXRlKQorICB7IHJldHVybiBpdGVyYXRvcihfX2l0ZS5fTV9ub2RlKTsgfQorICBzdGF0aWMgYmFzZV9pdGVyYXRvciBfU190b19zdG9yYWdlX2l0ZShjb25zdF9pdGVyYXRvciBfX2l0ZSkKKyAgeyByZXR1cm4gYmFzZV9pdGVyYXRvcihfX2l0ZS5fTV9ub2RlKTsgfQorI2VuZGlmCisKK3B1YmxpYzoKKyAgbXVsdGlzZXQoKSA6IF9NX3QoX0NvbXBhcmUoKSwgX1N0b3JhZ2VUeXBlQWxsb2MoKSkge30KKyAgZXhwbGljaXQgbXVsdGlzZXQoY29uc3QgX0NvbXBhcmUmIF9fY29tcCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfTV90KF9fY29tcCwgX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoX19hLCBfS2V5U3RvcmFnZVR5cGUpKSB7fQorCisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICBtdWx0aXNldChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgOiBfTV90KF9Db21wYXJlKCksIF9TdG9yYWdlVHlwZUFsbG9jKCkpIHsKKyMgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9JVEVSQVRPUl9XUkFQUEVSKQorICAgIF9NX3QuaW5zZXJ0X2VxdWFsKHR5cGVuYW1lIF9TVExQX1BSSVYgX0l0ZVdyYXBwZXI8X0tleVN0b3JhZ2VUeXBlLCBfS2V5LCBfSW5wdXRJdGVyYXRvcj46Ol9JdGUoX19maXJzdCksCisgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX1NUTFBfUFJJViBfSXRlV3JhcHBlcjxfS2V5U3RvcmFnZVR5cGUsIF9LZXksIF9JbnB1dEl0ZXJhdG9yPjo6X0l0ZShfX2xhc3QpKTsKKyMgIGVsc2UKKyAgICBfTV90Lmluc2VydF9lcXVhbChfX2ZpcnN0LCBfX2xhc3QpOworIyAgZW5kaWYKKyAgfQorCisjICBpZiBkZWZpbmVkIChfU1RMUF9ORUVEU19FWFRSQV9URU1QTEFURV9DT05TVFJVQ1RPUlMpCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgbXVsdGlzZXQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICBjb25zdCBfQ29tcGFyZSYgX19jb21wKQorICAgIDogX01fdChfX2NvbXAsIF9TdG9yYWdlVHlwZUFsbG9jKCkpIHsKKyMgICAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX0lURVJBVE9SX1dSQVBQRVIpCisgICAgX01fdC5pbnNlcnRfZXF1YWwodHlwZW5hbWUgX1NUTFBfUFJJViBfSXRlV3JhcHBlcjxfS2V5U3RvcmFnZVR5cGUsIF9LZXksIF9JbnB1dEl0ZXJhdG9yPjo6X0l0ZShfX2ZpcnN0KSwKKyAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfU1RMUF9QUklWIF9JdGVXcmFwcGVyPF9LZXlTdG9yYWdlVHlwZSwgX0tleSwgX0lucHV0SXRlcmF0b3I+OjpfSXRlKF9fbGFzdCkpOworIyAgICBlbHNlCisgICAgX01fdC5pbnNlcnRfZXF1YWwoX19maXJzdCwgX19sYXN0KTsKKyMgICAgZW5kaWYKKyAgfQorIyAgZW5kaWYKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICBtdWx0aXNldChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgIGNvbnN0IF9Db21wYXJlJiBfX2NvbXAsCisgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgX1NUTFBfQUxMT0NBVE9SX1RZUEVfREZMKQorICAgIDogX01fdChfX2NvbXAsIF9TVExQX0NPTlZFUlRfQUxMT0NBVE9SKF9fYSwgX0tleVN0b3JhZ2VUeXBlKSkgeworIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX0lURVJBVE9SX1dSQVBQRVIpCisgICAgX01fdC5pbnNlcnRfZXF1YWwodHlwZW5hbWUgX1NUTFBfUFJJViBfSXRlV3JhcHBlcjxfS2V5U3RvcmFnZVR5cGUsIF9LZXksIF9JbnB1dEl0ZXJhdG9yPjo6X0l0ZShfX2ZpcnN0KSwKKyAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfU1RMUF9QUklWIF9JdGVXcmFwcGVyPF9LZXlTdG9yYWdlVHlwZSwgX0tleSwgX0lucHV0SXRlcmF0b3I+OjpfSXRlKF9fbGFzdCkpOworIyAgZWxzZQorICAgIF9NX3QuaW5zZXJ0X2VxdWFsKF9fZmlyc3QsIF9fbGFzdCk7CisjICBlbmRpZgorICB9CisKKyNlbHNlCisgIG11bHRpc2V0KGNvbnN0IHZhbHVlX3R5cGUqIF9fZmlyc3QsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbGFzdCkKKyAgICA6IF9NX3QoX0NvbXBhcmUoKSwgX1N0b3JhZ2VUeXBlQWxsb2MoKSkgeworICAgIF9NX3QuaW5zZXJ0X2VxdWFsKGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3B0cihfX2ZpcnN0KSwKKyAgICAgICAgICAgICAgICAgICAgICBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NwdHIoX19sYXN0KSk7CisgIH0KKworICBtdWx0aXNldChjb25zdCB2YWx1ZV90eXBlKiBfX2ZpcnN0LCBjb25zdCB2YWx1ZV90eXBlKiBfX2xhc3QsCisgICAgICAgICAgIGNvbnN0IF9Db21wYXJlJiBfX2NvbXAsCisgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX01fdChfX2NvbXAsIF9TVExQX0NPTlZFUlRfQUxMT0NBVE9SKF9fYSwgX0tleVN0b3JhZ2VUeXBlKSkgeworICAgIF9NX3QuaW5zZXJ0X2VxdWFsKGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3B0cihfX2ZpcnN0KSwKKyAgICAgICAgICAgICAgICAgICAgICBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NwdHIoX19sYXN0KSk7CisgIH0KKworICBtdWx0aXNldChjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpCisgICAgOiBfTV90KF9Db21wYXJlKCksIF9TdG9yYWdlVHlwZUFsbG9jKCkpCisgIHsgX01fdC5pbnNlcnRfZXF1YWwoX1NfdG9fc3RvcmFnZV9pdGUoX19maXJzdCksIF9TX3RvX3N0b3JhZ2VfaXRlKF9fbGFzdCkpOyB9CisKKyAgbXVsdGlzZXQoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICBjb25zdCBfQ29tcGFyZSYgX19jb21wLAorICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9NX3QoX19jb21wLCBfU1RMUF9DT05WRVJUX0FMTE9DQVRPUihfX2EsIF9LZXlTdG9yYWdlVHlwZSkpCisgIHsgX01fdC5pbnNlcnRfZXF1YWwoX1NfdG9fc3RvcmFnZV9pdGUoX19maXJzdCksIF9TX3RvX3N0b3JhZ2VfaXRlKF9fbGFzdCkpOyB9CisjZW5kaWYgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworCisgIG11bHRpc2V0KGNvbnN0IF9TZWxmJiBfX3gpCisgICAgOiBfTV90KF9feC5fTV90KSB7fQorCisgIF9TZWxmJiBvcGVyYXRvcj0oY29uc3QgX1NlbGYmIF9feCkgeworICAgIF9NX3QgPSBfX3guX01fdDsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBtdWx0aXNldChfX21vdmVfc291cmNlPF9TZWxmPiBzcmMpCisgICAgOiBfTV90KF9fbW92ZV9zb3VyY2U8X1JlcF90eXBlPihzcmMuZ2V0KCkuX01fdCkpIHt9CisKKyAgLy8gYWNjZXNzb3JzOgorICBrZXlfY29tcGFyZSBrZXlfY29tcCgpIGNvbnN0IHsgcmV0dXJuIF9NX3Qua2V5X2NvbXAoKTsgfQorICB2YWx1ZV9jb21wYXJlIHZhbHVlX2NvbXAoKSBjb25zdCB7IHJldHVybiBfTV90LmtleV9jb21wKCk7IH0KKyAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0CisgIHsgcmV0dXJuIF9TVExQX0NPTlZFUlRfQUxMT0NBVE9SKF9NX3QuZ2V0X2FsbG9jYXRvcigpLCB2YWx1ZV90eXBlKTsgfQorCisgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gX1NfdG9fdmFsdWVfaXRlKF9NX3QuYmVnaW4oKSk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gX1NfdG9fdmFsdWVfaXRlKF9NX3QuZW5kKCkpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gX1NfdG9fdmFsdWVfaXRlKF9NX3QuYmVnaW4oKSk7IH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gX1NfdG9fdmFsdWVfaXRlKF9NX3QuZW5kKCkpOyB9CisgIHJldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKyAgcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIF9NX3QuZW1wdHkoKTsgfQorICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX3Quc2l6ZSgpOyB9CisgIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX3QubWF4X3NpemUoKTsgfQorICB2b2lkIHN3YXAoX1NlbGYmIF9feCkgeyBfTV90LnN3YXAoX194Ll9NX3QpOyB9CisKKyAgLy8gaW5zZXJ0L2VyYXNlCisgIGl0ZXJhdG9yIGluc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgIHsgcmV0dXJuIF9TX3RvX3ZhbHVlX2l0ZShfTV90Lmluc2VydF9lcXVhbChjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWYoX194KSkpOyB9CisgIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBfX3BvcywgY29uc3QgdmFsdWVfdHlwZSYgX194KSB7CisgICAgcmV0dXJuIF9TX3RvX3ZhbHVlX2l0ZShfTV90Lmluc2VydF9lcXVhbChfU190b19zdG9yYWdlX2l0ZShfX3BvcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWYoX194KSkpOworICB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZvaWQgaW5zZXJ0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkgeworIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX0lURVJBVE9SX1dSQVBQRVIpCisgICAgX01fdC5pbnNlcnRfZXF1YWwodHlwZW5hbWUgX1NUTFBfUFJJViBfSXRlV3JhcHBlcjxfS2V5U3RvcmFnZVR5cGUsIF9LZXksIF9JbnB1dEl0ZXJhdG9yPjo6X0l0ZShfX2ZpcnN0KSwKKyAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfU1RMUF9QUklWIF9JdGVXcmFwcGVyPF9LZXlTdG9yYWdlVHlwZSwgX0tleSwgX0lucHV0SXRlcmF0b3I+OjpfSXRlKF9fbGFzdCkpOworIyAgZWxzZQorICAgIF9NX3QuaW5zZXJ0X2VxdWFsKF9fZmlyc3QsIF9fbGFzdCk7CisjICBlbmRpZgorICB9CisjZWxzZQorICB2b2lkIGluc2VydChjb25zdCB2YWx1ZV90eXBlKiBfX2ZpcnN0LCBjb25zdCB2YWx1ZV90eXBlKiBfX2xhc3QpIHsKKyAgICBfTV90Lmluc2VydF9lcXVhbChjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NwdHIoX19maXJzdCksCisgICAgICAgICAgICAgICAgICAgICAgY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcHRyKF9fbGFzdCkpOworICB9CisgIHZvaWQgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKKyAgeyBfTV90Lmluc2VydF9lcXVhbChfU190b19zdG9yYWdlX2l0ZShfX2ZpcnN0KSwgX1NfdG9fc3RvcmFnZV9pdGUoX19sYXN0KSk7IH0KKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisKKyAgdm9pZCBlcmFzZShpdGVyYXRvciBfX3BvcykKKyAgeyBfTV90LmVyYXNlKF9TX3RvX3N0b3JhZ2VfaXRlKF9fcG9zKSk7IH0KKyAgc2l6ZV90eXBlIGVyYXNlKGNvbnN0IGtleV90eXBlJiBfX3gpCisgIHsgcmV0dXJuIF9NX3QuZXJhc2UoY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcmVmKF9feCkpOyB9CisgIHZvaWQgZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KQorICB7IF9NX3QuZXJhc2UoX1NfdG9fc3RvcmFnZV9pdGUoX19maXJzdCksIF9TX3RvX3N0b3JhZ2VfaXRlKF9fbGFzdCkpOyB9CisgIHZvaWQgY2xlYXIoKSB7IF9NX3QuY2xlYXIoKTsgfQorCisgIC8vIG11bHRpc2V0IG9wZXJhdGlvbnM6CisKKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIGl0ZXJhdG9yIGZpbmQoY29uc3QgX0tUJiBfX3gpCisgIHsgcmV0dXJuIF9TX3RvX3ZhbHVlX2l0ZShfTV90LmZpbmQoY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcmVmVChfX3gpKSk7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIGNvbnN0X2l0ZXJhdG9yIGZpbmQoY29uc3QgX0tUJiBfX3gpIGNvbnN0CisgIHsgcmV0dXJuIF9TX3RvX3ZhbHVlX2l0ZShfTV90LmZpbmQoY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcmVmVChfX3gpKSk7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIHNpemVfdHlwZSBjb3VudChjb25zdCBfS1QmIF9feCkgY29uc3QKKyAgeyByZXR1cm4gX01fdC5jb3VudChjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWZUKF9feCkpOyB9CisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBpdGVyYXRvciBsb3dlcl9ib3VuZChjb25zdCBfS1QmIF9feCkKKyAgeyByZXR1cm4gX1NfdG9fdmFsdWVfaXRlKF9NX3QubG93ZXJfYm91bmQoY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcmVmVChfX3gpKSk7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIGNvbnN0X2l0ZXJhdG9yIGxvd2VyX2JvdW5kKGNvbnN0IF9LVCYgX194KSBjb25zdAorICB7IHJldHVybiBfU190b192YWx1ZV9pdGUoX01fdC5sb3dlcl9ib3VuZChjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWZUKF9feCkpKTsgfQorICBfU1RMUF9URU1QTEFURV9GT1JfQ09OVF9FWFQKKyAgaXRlcmF0b3IgdXBwZXJfYm91bmQoY29uc3QgX0tUJiBfX3gpCisgIHsgcmV0dXJuIF9TX3RvX3ZhbHVlX2l0ZShfTV90LnVwcGVyX2JvdW5kKGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3JlZlQoX194KSkpOyB9CisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBjb25zdF9pdGVyYXRvciB1cHBlcl9ib3VuZChjb25zdCBfS1QmIF9feCkgY29uc3QKKyAgeyByZXR1cm4gX1NfdG9fdmFsdWVfaXRlKF9NX3QudXBwZXJfYm91bmQoY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcmVmVChfX3gpKSk7IH0KKyAgX1NUTFBfVEVNUExBVEVfRk9SX0NPTlRfRVhUCisgIHBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPiBlcXVhbF9yYW5nZShjb25zdCBfS1QmIF9feCkgeworICAgIHBhaXI8YmFzZV9pdGVyYXRvciwgYmFzZV9pdGVyYXRvcj4gX19yZXQ7CisgICAgX19yZXQgPSBfTV90LmVxdWFsX3JhbmdlKGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3JlZlQoX194KSk7CisgICAgcmV0dXJuIHBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPihfU190b192YWx1ZV9pdGUoX19yZXQuZmlyc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NfdG9fdmFsdWVfaXRlKF9fcmV0LnNlY29uZCkpOworICB9CisgIF9TVExQX1RFTVBMQVRFX0ZPUl9DT05UX0VYVAorICBwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4gZXF1YWxfcmFuZ2UoY29uc3QgX0tUJiBfX3gpIGNvbnN0IHsKKyAgICBwYWlyPGNvbnN0X2Jhc2VfaXRlcmF0b3IsIGNvbnN0X2Jhc2VfaXRlcmF0b3I+IF9fcmV0OworICAgIF9fcmV0ID0gX01fdC5lcXVhbF9yYW5nZShjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWZUKF9feCkpOworICAgIHJldHVybiBwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4oX1NfdG9fdmFsdWVfaXRlKF9fcmV0LmZpcnN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TX3RvX3ZhbHVlX2l0ZShfX3JldC5zZWNvbmQpKTsKKyAgfQorfTsKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYgLyogX1NUTFBfUFRSX1NQRUNJQUxJWkVEX1NFVF9IICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdGwvcG9pbnRlcnMvX3NsaXN0LmggYi9zdGwvcG9pbnRlcnMvX3NsaXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNmZjIxMQotLS0gL2Rldi9udWxsCisrKyBiL3N0bC9wb2ludGVycy9fc2xpc3QuaApAQCAtMCwwICsxLDQxMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMworICogRnJhbmNvaXMgRHVtb250CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKy8qIE5PVEU6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIFNUTCBoZWFkZXJzLgorICogICBZb3Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4KKyAqLworCisjaWZuZGVmIF9TVExQX1NQRUNJQUxJWkVEX1NMSVNUX0gKKyNkZWZpbmUgX1NUTFBfU1BFQ0lBTElaRURfU0xJU1RfSAorCisjaWZuZGVmIF9TVExQX1BPSU5URVJTX1NQRUNfVE9PTFNfSAorIyAgaW5jbHVkZSA8c3RsL3BvaW50ZXJzL190b29scy5oPgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisjZGVmaW5lIFNMSVNUX0lNUEwgX1NUTFBfUFRSX0lNUExfTkFNRShzbGlzdCkKKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9URU1QTEFURV9FWFBPUlQpICYmICFkZWZpbmVkIChfU1RMUF9VU0VfTVNWQzZfTUVNX1RfQlVHX1dPUktBUk9VTkQpCitfU1RMUF9NT1ZFX1RPX1BSSVZfTkFNRVNQQUNFCisKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBfU2xpc3Rfbm9kZTx2b2lkKj47Cit0eXBlZGVmIF9TbGlzdF9ub2RlPHZvaWQqPiBfVm9pZFB0clNOb2RlOworX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIF9TVExQX2FsbG9jX3Byb3h5PF9TbGlzdF9ub2RlX2Jhc2UsIF9Wb2lkUHRyU05vZGUsIGFsbG9jYXRvcjxfVm9pZFB0clNOb2RlPiA+OworX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIF9TbGlzdF9iYXNlPHZvaWQqLCBhbGxvY2F0b3I8dm9pZCo+ID47CitfU1RMUF9FWFBPUlRfVEVNUExBVEVfQ0xBU1MgU0xJU1RfSU1QTDx2b2lkKiwgYWxsb2NhdG9yPHZvaWQqPiA+OworCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfREVCVUcpCisjICBkZWZpbmUgc2xpc3QgX1NUTFBfTk9OX0RCR19OQU1FKHNsaXN0KQorX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIF9TVExQX0RFRkFVTFRfQUxMT0NBVE9SX1NFTEVDVChfVHApID4KK2NsYXNzIHNsaXN0CisjaWYgZGVmaW5lZCAoX1NUTFBfVVNFX1BBUlRJQUxfU1BFQ19XT1JLQVJPVU5EKSAmJiAhZGVmaW5lZCAoc2xpc3QpCisgICAgICAgICAgICAgOiBwdWJsaWMgX19zdGxwb3J0X2NsYXNzPHNsaXN0PF9UcCwgX0FsbG9jPiA+CisjZW5kaWYKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBfU1RMUF9QUklWIF9TdG9yYWdlVHlwZTxfVHA+OjpfVHlwZSBfU3RvcmFnZVR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jX3RyYWl0czxfU3RvcmFnZVR5cGUsIF9BbGxvYz46OmFsbG9jYXRvcl90eXBlIF9TdG9yYWdlVHlwZUFsbG9jOworICB0eXBlZGVmIF9TVExQX1BSSVYgU0xJU1RfSU1QTDxfU3RvcmFnZVR5cGUsIF9TdG9yYWdlVHlwZUFsbG9jPiBfQmFzZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IgX0Jhc2VJdGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X2l0ZXJhdG9yIF9CYXNlQ29uc3RJdGU7CisgIHR5cGVkZWYgc2xpc3Q8X1RwLCBfQWxsb2M+IF9TZWxmOworICB0eXBlZGVmIF9TVExQX1BSSVYgX0Nhc3RUcmFpdHM8X1N0b3JhZ2VUeXBlLCBfVHA+IGNhc3RfdHJhaXRzOworICB0eXBlZGVmIF9TVExQX1BSSVYgX1NsaXN0X25vZGVfYmFzZSBfTm9kZV9iYXNlOworCitwdWJsaWM6CisgIHR5cGVkZWYgX1RwICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiB2YWx1ZV90eXBlKiAgICAgICBwb2ludGVyOworICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUqIGNvbnN0X3BvaW50ZXI7CisgIHR5cGVkZWYgdmFsdWVfdHlwZSYgICAgICAgcmVmZXJlbmNlOworICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmIGNvbnN0X3JlZmVyZW5jZTsKKyAgdHlwZWRlZiBzaXplX3QgICAgICAgICAgICBzaXplX3R5cGU7CisgIHR5cGVkZWYgcHRyZGlmZl90ICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICB0eXBlZGVmIGZvcndhcmRfaXRlcmF0b3JfdGFnIF9JdGVyYXRvcl9jYXRlZ29yeTsKKworICB0eXBlZGVmIF9TVExQX1BSSVYgX1NsaXN0X2l0ZXJhdG9yPHZhbHVlX3R5cGUsIF9Ob25jb25zdF90cmFpdHM8dmFsdWVfdHlwZT4gPiAgaXRlcmF0b3I7CisgIHR5cGVkZWYgX1NUTFBfUFJJViBfU2xpc3RfaXRlcmF0b3I8dmFsdWVfdHlwZSwgX0NvbnN0X3RyYWl0czx2YWx1ZV90eXBlPiA+ICAgICBjb25zdF9pdGVyYXRvcjsKKworICBfU1RMUF9GT1JDRV9BTExPQ0FUT1JTKHZhbHVlX3R5cGUsIF9BbGxvYykKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2NfdHJhaXRzPHZhbHVlX3R5cGUsIF9BbGxvYz46OmFsbG9jYXRvcl90eXBlIGFsbG9jYXRvcl90eXBlOworCitwdWJsaWM6CisgIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdAorICB7IHJldHVybiBfU1RMUF9DT05WRVJUX0FMTE9DQVRPUihfTV9pbXBsLmdldF9hbGxvY2F0b3IoKSwgdmFsdWVfdHlwZSk7IH0KKworICBleHBsaWNpdCBzbGlzdChjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9NX2ltcGwoX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoX19hLCBfU3RvcmFnZVR5cGUpKSB7fQorCisjaWYgIWRlZmluZWQoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKKyAgZXhwbGljaXQgc2xpc3Qoc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX194ID0gX1NUTFBfREVGQVVMVF9DT05TVFJVQ1RFRCh2YWx1ZV90eXBlKSwKKyNlbHNlCisgIHNsaXN0KHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCwKKyNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0qLworICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gIGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfTV9pbXBsKF9fbiwgY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcmVmKF9feCksIF9TVExQX0NPTlZFUlRfQUxMT0NBVE9SKF9fYSwgX1N0b3JhZ2VUeXBlKSkge30KKworI2lmIGRlZmluZWQoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKKyAgZXhwbGljaXQgc2xpc3Qoc2l6ZV90eXBlIF9fbikgOiBfTV9pbXBsKF9fbikge30KKyNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0qLworCisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyAgLy8gV2UgZG9uJ3QgbmVlZCBhbnkgZGlzcGF0Y2hpbmcgdHJpY2tzIGhlcmUsIGJlY2F1c2UgX01faW5zZXJ0X2FmdGVyX3JhbmdlCisgIC8vIGFscmVhZHkgZG9lcyB0aGVtLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHNsaXN0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSBfU1RMUF9BTExPQ0FUT1JfVFlQRV9ERkwpCisjICBpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX0lURVJBVE9SX1dSQVBQRVIpCisgICAgOiBfTV9pbXBsKF9fZmlyc3QsIF9fbGFzdCwgX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoX19hLCBfU3RvcmFnZVR5cGUpKSB7fQorIyAgZWxzZQorICAgIDogX01faW1wbChfU1RMUF9DT05WRVJUX0FMTE9DQVRPUihfX2EsIF9TdG9yYWdlVHlwZSkpIHsKKyAgICBpbnNlcnRfYWZ0ZXIoYmVmb3JlX2JlZ2luKCksIF9fZmlyc3QsIF9fbGFzdCk7CisgIH0KKyMgIGVuZGlmCisjICBpZiBkZWZpbmVkIChfU1RMUF9ORUVEU19FWFRSQV9URU1QTEFURV9DT05TVFJVQ1RPUlMpCisgIC8vIFZDKysgbmVlZHMgdGhpcyBjcmF6eW5lc3MKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICBzbGlzdChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisjICAgIGlmICFkZWZpbmVkIChfU1RMUF9VU0VfV1JBUFBFUl9JVEVSQVRPUikKKyAgICA6IF9NX2ltcGwoX19maXJzdCwgX19sYXN0KSB7fQorIyAgICBlbHNlCisgIHsgaW5zZXJ0X2FmdGVyKGJlZm9yZV9iZWdpbigpLCBfX2ZpcnN0LCBfX2xhc3QpOyB9CisjICAgIGVuZGlmCisjICBlbmRpZgorI2Vsc2UgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworICBzbGlzdChjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QsCisgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSAgYWxsb2NhdG9yX3R5cGUoKSApCisgICAgOiBfTV9pbXBsKF9CYXNlQ29uc3RJdGUoX19maXJzdC5fTV9ub2RlKSwgX0Jhc2VDb25zdEl0ZShfX2xhc3QuX01fbm9kZSksCisgICAgICAgICAgICAgIF9TVExQX0NPTlZFUlRfQUxMT0NBVE9SKF9fYSwgX1N0b3JhZ2VUeXBlKSkge30KKyAgc2xpc3QoY29uc3QgdmFsdWVfdHlwZSogX19maXJzdCwgY29uc3QgdmFsdWVfdHlwZSogX19sYXN0LAorICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gIGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfTV9pbXBsKGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3B0cihfX2ZpcnN0KSwgY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcHRyKF9fbGFzdCksCisgICAgICAgICAgICAgIF9TVExQX0NPTlZFUlRfQUxMT0NBVE9SKF9fYSwgX1N0b3JhZ2VUeXBlKSkge30KKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisKKyAgc2xpc3QoY29uc3QgX1NlbGYmIF9feCkgOiBfTV9pbXBsKF9feC5fTV9pbXBsKSB7fQorICBzbGlzdChfX21vdmVfc291cmNlPF9TZWxmPiBzcmMpCisgICAgOiBfTV9pbXBsKF9fbW92ZV9zb3VyY2U8X0Jhc2U+KHNyYy5nZXQoKS5fTV9pbXBsKSkge30KKworICBfU2VsZiYgb3BlcmF0b3I9IChjb25zdCBfU2VsZiYgX194KSB7IF9NX2ltcGwgPSBfX3guX01faW1wbDsgcmV0dXJuICp0aGlzOyB9CisKKyAgdm9pZCBhc3NpZ24oc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX192YWwpCisgIHsgX01faW1wbC5hc3NpZ24oX19uLCBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWYoX192YWwpKTsgfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyMgIGlmIGRlZmluZWQgKF9TVExQX1VTRV9JVEVSQVRPUl9XUkFQUEVSKQorcHJpdmF0ZToKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnRlZ2VyPgorICB2b2lkIF9NX2Fzc2lnbl9kaXNwYXRjaChfSW50ZWdlciBfX24sIF9JbnRlZ2VyIF9fdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX3RydWVfdHlwZSYpCisgIHsgX01faW1wbC5hc3NpZ24oX19uLCBfX3ZhbCk7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZvaWQgX01fYXNzaWduX2Rpc3BhdGNoKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19mYWxzZV90eXBlJikgeworICAgIF9NX2ltcGwuYXNzaWduKHR5cGVuYW1lIF9TVExQX1BSSVYgX0l0ZVdyYXBwZXI8X1N0b3JhZ2VUeXBlLCBfVHAsIF9JbnB1dEl0ZXJhdG9yPjo6X0l0ZShfX2ZpcnN0KSwKKyAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfU1RMUF9QUklWIF9JdGVXcmFwcGVyPF9TdG9yYWdlVHlwZSwgX1RwLCBfSW5wdXRJdGVyYXRvcj46Ol9JdGUoX19sYXN0KSk7CisgIH0KKworcHVibGljOgorIyAgZW5kaWYKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZvaWQgYXNzaWduKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkgeworIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX0lURVJBVE9SX1dSQVBQRVIpCisgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXNJbnRlZ3JhbDxfSW5wdXRJdGVyYXRvcj46Ol9SZXQgX0ludGVncmFsOworICAgIF9NX2Fzc2lnbl9kaXNwYXRjaChfX2ZpcnN0LCBfX2xhc3QsIF9JbnRlZ3JhbCgpKTsKKyMgIGVsc2UKKyAgICBfTV9pbXBsLmFzc2lnbihfX2ZpcnN0LCBfX2xhc3QpOworIyAgZW5kaWYKKyAgfQorI2Vsc2UKKyAgdm9pZCBhc3NpZ24oY29uc3QgdmFsdWVfdHlwZSAqX19maXJzdCwgY29uc3QgdmFsdWVfdHlwZSAqX19sYXN0KSB7CisgICAgX01faW1wbC5hc3NpZ24oY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcHRyKF9fZmlyc3QpLAorICAgICAgICAgICAgICAgICAgIGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3B0cihfX2xhc3QpKTsKKyAgfQorICB2b2lkIGFzc2lnbihjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpIHsKKyAgICBfTV9pbXBsLmFzc2lnbihfQmFzZUNvbnN0SXRlKF9fZmlyc3QuX01fbm9kZSksCisgICAgICAgICAgICAgICAgICAgX0Jhc2VDb25zdEl0ZShfX2xhc3QuX01fbm9kZSkpOworICB9CisjZW5kaWYgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworCisgIGl0ZXJhdG9yIGJlZm9yZV9iZWdpbigpICAgICAgICAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9NX2ltcGwuYmVmb3JlX2JlZ2luKCkuX01fbm9kZSk7IH0KKyAgY29uc3RfaXRlcmF0b3IgYmVmb3JlX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoY29uc3RfY2FzdDxfTm9kZV9iYXNlKj4oX01faW1wbC5iZWZvcmVfYmVnaW4oKS5fTV9ub2RlKSk7IH0KKworICBpdGVyYXRvciBiZWdpbigpICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBpdGVyYXRvcihfTV9pbXBsLmJlZ2luKCkuX01fbm9kZSk7IH0KKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCAgICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoY29uc3RfY2FzdDxfTm9kZV9iYXNlKj4oX01faW1wbC5iZWdpbigpLl9NX25vZGUpKTt9CisKKyAgaXRlcmF0b3IgZW5kKCkgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX01faW1wbC5lbmQoKS5fTV9ub2RlKTsgfQorICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCAgICAgICAgICB7IHJldHVybiBpdGVyYXRvcihfTV9pbXBsLmVuZCgpLl9NX25vZGUpOyB9CisKKyAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCAgICAgIHsgcmV0dXJuIF9NX2ltcGwuc2l6ZSgpOyB9CisgIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0ICB7IHJldHVybiBfTV9pbXBsLm1heF9zaXplKCk7IH0KKyAgYm9vbCBlbXB0eSgpIGNvbnN0ICAgICAgICAgIHsgcmV0dXJuIF9NX2ltcGwuZW1wdHkoKTsgfQorCisgIHZvaWQgc3dhcChfU2VsZiYgX194KSB7IF9NX2ltcGwuc3dhcChfX3guX01faW1wbCk7IH0KKworcHVibGljOgorICByZWZlcmVuY2UgZnJvbnQoKSAgICAgICAgICAgICB7IHJldHVybiAqYmVnaW4oKTsgfQorICBjb25zdF9yZWZlcmVuY2UgZnJvbnQoKSBjb25zdCB7IHJldHVybiAqYmVnaW4oKTsgfQorI2lmICFkZWZpbmVkKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pICYmICFkZWZpbmVkKF9TVExQX05PX0FOQUNIUk9OSVNNUykKKyAgdm9pZCBwdXNoX2Zyb250KGNvbnN0IHZhbHVlX3R5cGUmIF9feCA9IF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQodmFsdWVfdHlwZSkpCisjZWxzZQorICB2b2lkIHB1c2hfZnJvbnQoY29uc3QgdmFsdWVfdHlwZSYgX194KQorI2VuZGlmIC8qIV9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0gJiYgIV9TVExQX05PX0FOQUNIUk9OSVNNUyovCisgIHsgX01faW1wbC5wdXNoX2Zyb250KGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3JlZihfX3gpKTsgfQorCisjIGlmIGRlZmluZWQoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkgJiYgIWRlZmluZWQoX1NUTFBfTk9fQU5BQ0hST05JU01TKQorICB2b2lkIHB1c2hfZnJvbnQoKSB7IF9NX2ltcGwucHVzaF9mcm9udCgpO30KKyMgZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNICYmICFfU1RMUF9OT19BTkFDSFJPTklTTVMqLworCisgIHZvaWQgcG9wX2Zyb250KCkgeyBfTV9pbXBsLnBvcF9mcm9udCgpOyB9CisKKyAgaXRlcmF0b3IgcHJldmlvdXMoY29uc3RfaXRlcmF0b3IgX19wb3MpCisgIHsgcmV0dXJuIGl0ZXJhdG9yKF9NX2ltcGwucHJldmlvdXMoX0Jhc2VDb25zdEl0ZShfX3Bvcy5fTV9ub2RlKSkuX01fbm9kZSk7IH0KKyAgY29uc3RfaXRlcmF0b3IgcHJldmlvdXMoY29uc3RfaXRlcmF0b3IgX19wb3MpIGNvbnN0CisgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKGNvbnN0X2Nhc3Q8X05vZGVfYmFzZSo+KF9NX2ltcGwucHJldmlvdXMoX0Jhc2VDb25zdEl0ZShfX3Bvcy5fTV9ub2RlKSkuX01fbm9kZSkpOyB9CisKKyNpZiAhZGVmaW5lZChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQorICBpdGVyYXRvciBpbnNlcnRfYWZ0ZXIoaXRlcmF0b3IgX19wb3MsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCA9IF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQodmFsdWVfdHlwZSkpCisjZWxzZQorICBpdGVyYXRvciBpbnNlcnRfYWZ0ZXIoaXRlcmF0b3IgX19wb3MsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0qLworICB7IHJldHVybiBpdGVyYXRvcihfTV9pbXBsLmluc2VydF9hZnRlcihfQmFzZUl0ZShfX3Bvcy5fTV9ub2RlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcmVmKF9feCkpLl9NX25vZGUpOyB9CisKKyNpZiBkZWZpbmVkKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCisgIGl0ZXJhdG9yIGluc2VydF9hZnRlcihpdGVyYXRvciBfX3BvcykKKyAgeyByZXR1cm4gaXRlcmF0b3IoX01faW1wbC5pbnNlcnRfYWZ0ZXIoX0Jhc2VJdGUoX19wb3MuX01fbm9kZSkpLl9NX25vZGUpO30KKyNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0qLworCisgIHZvaWQgaW5zZXJ0X2FmdGVyKGl0ZXJhdG9yIF9fcG9zLCBzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgIHsgX01faW1wbC5pbnNlcnRfYWZ0ZXIoX0Jhc2VJdGUoX19wb3MuX01fbm9kZSksIF9fbiwgY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcmVmKF9feCkpOyB9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX0lURVJBVE9SX1dSQVBQRVIpCitwcml2YXRlOgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0ludGVnZXI+CisgIHZvaWQgX01faW5zZXJ0X2FmdGVyX2Rpc3BhdGNoKGl0ZXJhdG9yIF9fcG9zLCBfSW50ZWdlciBfX24sIF9JbnRlZ2VyIF9fdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX3RydWVfdHlwZSYpIHsKKyAgICBfTV9pbXBsLmluc2VydF9hZnRlcihfQmFzZUl0ZShfX3Bvcy5fTV9ub2RlKSwgX19uLCBfX3ZhbCk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZvaWQgX01faW5zZXJ0X2FmdGVyX2Rpc3BhdGNoKGl0ZXJhdG9yIF9fcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fZmFsc2VfdHlwZSYpIHsKKyAgICBfTV9pbXBsLmluc2VydF9hZnRlcihfQmFzZUl0ZShfX3Bvcy5fTV9ub2RlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfU1RMUF9QUklWIF9JdGVXcmFwcGVyPF9TdG9yYWdlVHlwZSwgX1RwLCBfSW5wdXRJdGVyYXRvcj46Ol9JdGUoX19maXJzdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX1NUTFBfUFJJViBfSXRlV3JhcHBlcjxfU3RvcmFnZVR5cGUsIF9UcCwgX0lucHV0SXRlcmF0b3I+OjpfSXRlKF9fbGFzdCkpOworICB9CisKK3B1YmxpYzoKKyMgIGVuZGlmCisKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICB2b2lkIGluc2VydF9hZnRlcihpdGVyYXRvciBfX3BvcywgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KSB7CisjICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfSVRFUkFUT1JfV1JBUFBFUikKKyAgICAvLyBDaGVjayB3aGV0aGVyIGl0J3MgYW4gaW50ZWdyYWwgdHlwZS4gIElmIHNvLCBpdCdzIG5vdCBhbiBpdGVyYXRvci4KKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Jc0ludGVncmFsPF9JbnB1dEl0ZXJhdG9yPjo6X1JldCBfSW50ZWdyYWw7CisgICAgX01faW5zZXJ0X2FmdGVyX2Rpc3BhdGNoKF9fcG9zLCBfX2ZpcnN0LCBfX2xhc3QsIF9JbnRlZ3JhbCgpKTsKKyMgIGVsc2UKKyAgICBfTV9pbXBsLmluc2VydF9hZnRlcihfQmFzZUl0ZShfX3Bvcy5fTV9ub2RlKSwgX19maXJzdCwgX19sYXN0KTsKKyMgIGVuZGlmCisgIH0KKworI2Vsc2UgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworICB2b2lkIGluc2VydF9hZnRlcihpdGVyYXRvciBfX3BvcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KQorICB7IF9NX2ltcGwuaW5zZXJ0X2FmdGVyKF9CYXNlSXRlKF9fcG9zLl9NX25vZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9CYXNlQ29uc3RJdGUoX19maXJzdC5fTV9ub2RlKSwgX0Jhc2VDb25zdEl0ZShfX2xhc3QuX01fbm9kZSkpOyB9CisgIHZvaWQgaW5zZXJ0X2FmdGVyKGl0ZXJhdG9yIF9fcG9zLAorICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZV90eXBlKiBfX2ZpcnN0LCBjb25zdCB2YWx1ZV90eXBlKiBfX2xhc3QpIHsKKyAgICBfTV9pbXBsLmluc2VydF9hZnRlcihfQmFzZUl0ZShfX3Bvcy5fTV9ub2RlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NwdHIoX19maXJzdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcHRyKF9fbGFzdCkpOworICB9CisjZW5kaWYgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworCisjaWYgIWRlZmluZWQoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKKyAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBjb25zdCB2YWx1ZV90eXBlJiBfX3ggPSBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKHZhbHVlX3R5cGUpKQorI2Vsc2UKKyAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisjZW5kaWYgLypfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKi8KKyAgeyByZXR1cm4gaXRlcmF0b3IoX01faW1wbC5pbnNlcnQoX0Jhc2VJdGUoX19wb3MuX01fbm9kZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3JlZihfX3gpKS5fTV9ub2RlKTsgfQorCisjaWYgZGVmaW5lZChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQorICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3IgX19wb3MpCisgIHsgcmV0dXJuIGl0ZXJhdG9yKF9NX2ltcGwuaW5zZXJ0KF9CYXNlSXRlKF9fcG9zLl9NX25vZGUpKS5fTV9ub2RlKTsgfQorI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCisKKyAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgeyBfTV9pbXBsLmluc2VydChfQmFzZUl0ZShfX3Bvcy5fTV9ub2RlKSwgX19uLCBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWYoX194KSk7IH0KKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisjICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfSVRFUkFUT1JfV1JBUFBFUikKK3ByaXZhdGU6CisgIHRlbXBsYXRlIDxjbGFzcyBfSW50ZWdlcj4KKyAgdm9pZCBfTV9pbnNlcnRfZGlzcGF0Y2goaXRlcmF0b3IgX19wb3MsIF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX192YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fdHJ1ZV90eXBlJikgeworICAgIF9NX2ltcGwuaW5zZXJ0KF9CYXNlSXRlKF9fcG9zLl9NX25vZGUpLCBfX24sIF9fdmFsKTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgdm9pZCBfTV9pbnNlcnRfZGlzcGF0Y2goaXRlcmF0b3IgX19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19mYWxzZV90eXBlJikgeworICAgIF9NX2ltcGwuaW5zZXJ0KF9CYXNlSXRlKF9fcG9zLl9NX25vZGUpLCB0eXBlbmFtZSBfU1RMUF9QUklWIF9JdGVXcmFwcGVyPF9TdG9yYWdlVHlwZSwgX1RwLCBfSW5wdXRJdGVyYXRvcj46Ol9JdGUoX19maXJzdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9TVExQX1BSSVYgX0l0ZVdyYXBwZXI8X1N0b3JhZ2VUeXBlLCBfVHAsIF9JbnB1dEl0ZXJhdG9yPjo6X0l0ZShfX2xhc3QpKTsKKyAgfQorCitwdWJsaWM6CisjICBlbmRpZgorCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkgeworIyAgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX0lURVJBVE9SX1dSQVBQRVIpCisgICAgLy8gQ2hlY2sgd2hldGhlciBpdCdzIGFuIGludGVncmFsIHR5cGUuICBJZiBzbywgaXQncyBub3QgYW4gaXRlcmF0b3IuCisgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXNJbnRlZ3JhbDxfSW5wdXRJdGVyYXRvcj46Ol9SZXQgX0ludGVncmFsOworICAgIF9NX2luc2VydF9kaXNwYXRjaChfX3BvcywgX19maXJzdCwgX19sYXN0LCBfSW50ZWdyYWwoKSk7CisjICBlbHNlCisgICAgX01faW1wbC5pbnNlcnQoX0Jhc2VJdGUoX19wb3MuX01fbm9kZSksIF9fZmlyc3QsIF9fbGFzdCk7CisjICBlbmRpZgorICB9CisKKyNlbHNlIC8qIF9TVExQX01FTUJFUl9URU1QTEFURVMgKi8KKyAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKKyAgeyBfTV9pbXBsLmluc2VydChfQmFzZUl0ZShfX3Bvcy5fTV9ub2RlKSwgX0Jhc2VDb25zdEl0ZShfX2ZpcnN0Ll9NX25vZGUpLCBfQmFzZUNvbnN0SXRlKF9fbGFzdC5fTV9ub2RlKSk7IH0KKyAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIGNvbnN0IHZhbHVlX3R5cGUqIF9fZmlyc3QsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbGFzdCkKKyAgeyBfTV9pbXBsLmluc2VydChfQmFzZUl0ZShfX3Bvcy5fTV9ub2RlKSwgY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcHRyKF9fZmlyc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NwdHIoX19sYXN0KSk7IH0KKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisKKyAgaXRlcmF0b3IgZXJhc2VfYWZ0ZXIoaXRlcmF0b3IgX19wb3MpCisgIHsgcmV0dXJuIGl0ZXJhdG9yKF9NX2ltcGwuZXJhc2VfYWZ0ZXIoX0Jhc2VJdGUoX19wb3MuX01fbm9kZSkpLl9NX25vZGUpOyB9CisgIGl0ZXJhdG9yIGVyYXNlX2FmdGVyKGl0ZXJhdG9yIF9fYmVmb3JlX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpCisgIHsgcmV0dXJuIGl0ZXJhdG9yKF9NX2ltcGwuZXJhc2VfYWZ0ZXIoX0Jhc2VJdGUoX19iZWZvcmVfZmlyc3QuX01fbm9kZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0Jhc2VJdGUoX19sYXN0Ll9NX25vZGUpKS5fTV9ub2RlKTsgfQorCisgIGl0ZXJhdG9yIGVyYXNlKGl0ZXJhdG9yIF9fcG9zKQorICB7IHJldHVybiBpdGVyYXRvcihfTV9pbXBsLmVyYXNlKF9CYXNlSXRlKF9fcG9zLl9NX25vZGUpKS5fTV9ub2RlKTsgfQorICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpCisgIHsgcmV0dXJuIGl0ZXJhdG9yKF9NX2ltcGwuZXJhc2UoX0Jhc2VJdGUoX19maXJzdC5fTV9ub2RlKSwgX0Jhc2VJdGUoX19sYXN0Ll9NX25vZGUpKS5fTV9ub2RlKTsgfQorCisjaWYgIWRlZmluZWQoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKKyAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9fbmV3X3NpemUsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCA9IF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQodmFsdWVfdHlwZSkpCisjZWxzZQorICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgX19uZXdfc2l6ZSwgY29uc3QgdmFsdWVfdHlwZSYgX194KQorI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCisgIHsgX01faW1wbC5yZXNpemUoX19uZXdfc2l6ZSwgY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcmVmKF9feCkpO30KKworI2lmIGRlZmluZWQoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkKKyAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9fbmV3X3NpemUpIHsgX01faW1wbC5yZXNpemUoX19uZXdfc2l6ZSk7IH0KKyNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0qLworCisgIHZvaWQgY2xlYXIoKSB7IF9NX2ltcGwuY2xlYXIoKTsgfQorCisgIHZvaWQgc3BsaWNlX2FmdGVyKGl0ZXJhdG9yIF9fcG9zLCBfU2VsZiYgX194LAorICAgICAgICAgICAgICAgICAgICBpdGVyYXRvciBfX2JlZm9yZV9maXJzdCwgaXRlcmF0b3IgX19iZWZvcmVfbGFzdCkKKyAgeyBfTV9pbXBsLnNwbGljZV9hZnRlcihfQmFzZUl0ZShfX3Bvcy5fTV9ub2RlKSwgX194Ll9NX2ltcGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgX0Jhc2VJdGUoX19iZWZvcmVfZmlyc3QuX01fbm9kZSksIF9CYXNlSXRlKF9fYmVmb3JlX2xhc3QuX01fbm9kZSkpOyB9CisgIHZvaWQgc3BsaWNlX2FmdGVyKGl0ZXJhdG9yIF9fcG9zLCBfU2VsZiYgX194LCBpdGVyYXRvciBfX3ByZXYpCisgIHsgX01faW1wbC5zcGxpY2VfYWZ0ZXIoX0Jhc2VJdGUoX19wb3MuX01fbm9kZSksIF9feC5fTV9pbXBsLCBfQmFzZUl0ZShfX3ByZXYuX01fbm9kZSkpOyB9CisgIHZvaWQgc3BsaWNlX2FmdGVyKGl0ZXJhdG9yIF9fcG9zLCBfU2VsZiYgX194KQorICB7IF9NX2ltcGwuc3BsaWNlX2FmdGVyKF9CYXNlSXRlKF9fcG9zLl9NX25vZGUpLCBfX3guX01faW1wbCk7IH0KKyAgdm9pZCBzcGxpY2UoaXRlcmF0b3IgX19wb3MsIF9TZWxmJiBfX3gpCisgIHsgX01faW1wbC5zcGxpY2UoX0Jhc2VJdGUoX19wb3MuX01fbm9kZSksIF9feC5fTV9pbXBsKTsgfQorICB2b2lkIHNwbGljZShpdGVyYXRvciBfX3BvcywgX1NlbGYmIF9feCwgaXRlcmF0b3IgX19pKQorICB7IF9NX2ltcGwuc3BsaWNlKF9CYXNlSXRlKF9fcG9zLl9NX25vZGUpLCBfX3guX01faW1wbCwgX0Jhc2VJdGUoX19pLl9NX25vZGUpKTsgfQorICB2b2lkIHNwbGljZShpdGVyYXRvciBfX3BvcywgX1NlbGYmIF9feCwgaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KQorICB7IF9NX2ltcGwuc3BsaWNlKF9CYXNlSXRlKF9fcG9zLl9NX25vZGUpLCBfX3guX01faW1wbCwKKyAgICAgICAgICAgICAgICAgICBfQmFzZUl0ZShfX2ZpcnN0Ll9NX25vZGUpLCBfQmFzZUl0ZShfX2xhc3QuX01fbm9kZSkpOyB9CisKKyAgdm9pZCByZXZlcnNlKCkgeyBfTV9pbXBsLnJldmVyc2UoKTsgfQorCisgIHZvaWQgcmVtb3ZlKGNvbnN0IHZhbHVlX3R5cGUmIF9fdmFsKSB7IF9NX2ltcGwucmVtb3ZlKGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3JlZihfX3ZhbCkpOyB9CisgIHZvaWQgdW5pcXVlKCkgICAgICAgICAgICAgICAgIHsgX01faW1wbC51bmlxdWUoKTsgfQorICB2b2lkIG1lcmdlKF9TZWxmJiBfX3gpICAgICAgICB7IF9NX2ltcGwubWVyZ2UoX194Ll9NX2ltcGwpOyB9CisgIHZvaWQgc29ydCgpICAgICAgICAgICAgICAgICAgIHtfTV9pbXBsLnNvcnQoKTsgfQorCisjaWZkZWYgX1NUTFBfTUVNQkVSX1RFTVBMQVRFUworICB0ZW1wbGF0ZSA8Y2xhc3MgX1ByZWRpY2F0ZT4KKyAgdm9pZCByZW1vdmVfaWYoX1ByZWRpY2F0ZSBfX3ByZWQpCisgIHsgX01faW1wbC5yZW1vdmVfaWYoX1NUTFBfUFJJViBfVW5hcnlQcmVkV3JhcHBlcjxfU3RvcmFnZVR5cGUsIF9UcCwgX1ByZWRpY2F0ZT4oX19wcmVkKSk7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0JpbmFyeVByZWRpY2F0ZT4KKyAgdm9pZCB1bmlxdWUoX0JpbmFyeVByZWRpY2F0ZSBfX3ByZWQpCisgIHsgX01faW1wbC51bmlxdWUoX1NUTFBfUFJJViBfQmluYXJ5UHJlZFdyYXBwZXI8X1N0b3JhZ2VUeXBlLCBfVHAsIF9CaW5hcnlQcmVkaWNhdGU+KF9fcHJlZCkpOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9TdHJpY3RXZWFrT3JkZXJpbmc+CisgIHZvaWQgbWVyZ2UoX1NlbGYmIF9feCwgX1N0cmljdFdlYWtPcmRlcmluZyBfX2NvbXApCisgIHsgX01faW1wbC5tZXJnZShfX3guX01faW1wbCwgX1NUTFBfUFJJViBfQmluYXJ5UHJlZFdyYXBwZXI8X1N0b3JhZ2VUeXBlLCBfVHAsIF9TdHJpY3RXZWFrT3JkZXJpbmc+KF9fY29tcCkpOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9TdHJpY3RXZWFrT3JkZXJpbmc+CisgIHZvaWQgc29ydChfU3RyaWN0V2Vha09yZGVyaW5nIF9fY29tcCkKKyAgeyBfTV9pbXBsLnNvcnQoX1NUTFBfUFJJViBfQmluYXJ5UHJlZFdyYXBwZXI8X1N0b3JhZ2VUeXBlLCBfVHAsIF9TdHJpY3RXZWFrT3JkZXJpbmc+KF9fY29tcCkpOyB9CisjZW5kaWYgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFUyAqLworCitwcml2YXRlOgorICBfQmFzZSBfTV9pbXBsOworfTsKKworI2lmIGRlZmluZWQgKHNsaXN0KQorIyAgdW5kZWYgc2xpc3QKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorI2VuZGlmCisKKyN1bmRlZiBTTElTVF9JTVBMCisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2VuZGlmIC8qIF9TVExQX1NQRUNJQUxJWkVEX1NMSVNUX0ggKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0bC9wb2ludGVycy9fdG9vbHMuaCBiL3N0bC9wb2ludGVycy9fdG9vbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDJmYzQyCi0tLSAvZGV2L251bGwKKysrIGIvc3RsL3BvaW50ZXJzL190b29scy5oCkBAIC0wLDAgKzEsNDAwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAzCisgKiBGcmFuY29pcyBEdW1vbnQKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworLyogTk9URTogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgU1RMIGhlYWRlcnMuCisgKiAgIFlvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LgorICovCisKKyNpZm5kZWYgX1NUTFBfUE9JTlRFUlNfU1BFQ19UT09MU19ICisjZGVmaW5lIF9TVExQX1BPSU5URVJTX1NQRUNfVE9PTFNfSAorCisjaWZuZGVmIF9TVExQX1RZUEVfVFJBSVRTX0gKKyMgIGluY2x1ZGUgPHN0bC90eXBlX3RyYWl0cy5oPgorI2VuZGlmCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisvL1NvbWUgdXNlZnVsbCBkZWNsYXJhdGlvbnM6Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgbGVzczsKKworX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1N0b3JhZ2VULCBjbGFzcyBfVmFsdWVULCBjbGFzcyBfQmluYXJ5UHJlZGljYXRlPgorc3RydWN0IF9CaW5hcnlQcmVkV3JhcHBlcjsKKworLyoKKyAqIFNpbmNlIHRoZSBjb21waWxlciBvbmx5IGFsbG93cyBhdCBtb3N0IG9uZSBub24tdHJpdmlhbAorICogaW1wbGljaXQgY29udmVyc2lvbiB3ZSBjYW4gbWFrZSB1c2Ugb2YgYSBzaGltIGNsYXNzIHRvCisgKiBiZSBzdXJlIHRoYXQgZnVuY3Rpb25zIGJlbG93IGRvZXNuJ3QgYWNjZXB0IGNsYXNzZXMgd2l0aAorICogaW1wbGljaXQgcG9pbnRlciBjb252ZXJzaW9uIG9wZXJhdG9ycworICovCitzdHJ1Y3QgX0NvbnN0Vm9sYXRpbGVWb2lkUG9pbnRlclNoaW0KK3sgX0NvbnN0Vm9sYXRpbGVWb2lkUG9pbnRlclNoaW0oY29uc3Qgdm9sYXRpbGUgdm9pZCopOyB9OworCisvL1RoZSBkaXNwYXRjaCBmdW5jdGlvbnM6CitzdHJ1Y3QgX1ZvaWRQb2ludGVyU2hpbQoreyBfVm9pZFBvaW50ZXJTaGltKHZvaWQqKTsgfTsKK3N0cnVjdCBfQ29uc3RWb2lkUG9pbnRlclNoaW0KK3sgX0NvbnN0Vm9pZFBvaW50ZXJTaGltKGNvbnN0IHZvaWQqKTsgfTsKK3N0cnVjdCBfVm9sYXRpbGVWb2lkUG9pbnRlclNoaW0KK3sgX1ZvbGF0aWxlVm9pZFBvaW50ZXJTaGltKHZvbGF0aWxlIHZvaWQqKTsgfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2NoYXIgX1VzZVZvaWRQdHJTdG9yYWdlVHlwZShjb25zdCBfX2ZhbHNlX3R5cGUmIC8qUE9EKi8sIGNvbnN0IF9UcCYpOworY2hhciBfVXNlVm9pZFB0clN0b3JhZ2VUeXBlKGNvbnN0IF9fdHJ1ZV90eXBlJiAvKlBPRCovLCAuLi4pOworY2hhciogX1VzZVZvaWRQdHJTdG9yYWdlVHlwZShjb25zdCBfX3RydWVfdHlwZSYgLypQT0QqLywgX1ZvaWRQb2ludGVyU2hpbSk7CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitjaGFyIF9Vc2VDb25zdFZvaWRQdHJTdG9yYWdlVHlwZShjb25zdCBfX2ZhbHNlX3R5cGUmIC8qUE9EKi8sIGNvbnN0IF9UcCYpOworY2hhciBfVXNlQ29uc3RWb2lkUHRyU3RvcmFnZVR5cGUoY29uc3QgX190cnVlX3R5cGUmIC8qUE9EKi8sIC4uLik7CitjaGFyKiBfVXNlQ29uc3RWb2lkUHRyU3RvcmFnZVR5cGUoY29uc3QgX190cnVlX3R5cGUmIC8qUE9EKi8sIF9Db25zdFZvaWRQb2ludGVyU2hpbSk7CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitjaGFyIF9Vc2VWb2xhdGlsZVZvaWRQdHJTdG9yYWdlVHlwZShjb25zdCBfX2ZhbHNlX3R5cGUmIC8qUE9EKi8sIGNvbnN0IF9UcCYpOworY2hhciBfVXNlVm9sYXRpbGVWb2lkUHRyU3RvcmFnZVR5cGUoY29uc3QgX190cnVlX3R5cGUmIC8qUE9EKi8sIC4uLik7CitjaGFyKiBfVXNlVm9sYXRpbGVWb2lkUHRyU3RvcmFnZVR5cGUoY29uc3QgX190cnVlX3R5cGUmIC8qUE9EKi8sIF9Wb2xhdGlsZVZvaWRQb2ludGVyU2hpbSk7CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitjaGFyIF9Vc2VDb25zdFZvbGF0aWxlVm9pZFB0clN0b3JhZ2VUeXBlKGNvbnN0IF9fZmFsc2VfdHlwZSYgLypQT0QqLywgY29uc3QgX1RwJik7CitjaGFyIF9Vc2VDb25zdFZvbGF0aWxlVm9pZFB0clN0b3JhZ2VUeXBlKGNvbnN0IF9fdHJ1ZV90eXBlJiAvKlBPRCovLCAuLi4pOworY2hhciogX1VzZUNvbnN0Vm9sYXRpbGVWb2lkUHRyU3RvcmFnZVR5cGUoY29uc3QgX190cnVlX3R5cGUmIC8qUE9EKi8sIF9Db25zdFZvbGF0aWxlVm9pZFBvaW50ZXJTaGltKTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfU3RvcmFnZVR5cGUgeworICB0eXBlZGVmIHR5cGVuYW1lIF9fdHlwZV90cmFpdHM8X1RwPjo6aXNfUE9EX3R5cGUgX1BPRFR5cGU7CisgIHN0YXRpYyBfVHAgX19udWxsX3JlcCgpOworCisgIGVudW0geyB1c2Vfdm9pZF9wdHIgPSAoc2l6ZW9mKF9Vc2VWb2lkUHRyU3RvcmFnZVR5cGUoX1BPRFR5cGUoKSwgX19udWxsX3JlcCgpKSkgPT0gc2l6ZW9mKGNoYXIqKSkgfTsKKyAgZW51bSB7IHVzZV9jb25zdF92b2lkX3B0ciA9IChzaXplb2YoX1VzZUNvbnN0Vm9pZFB0clN0b3JhZ2VUeXBlKF9QT0RUeXBlKCksIF9fbnVsbF9yZXAoKSkpID09IHNpemVvZihjaGFyKikpIH07CisgIGVudW0geyB1c2Vfdm9sYXRpbGVfdm9pZF9wdHIgPSAoc2l6ZW9mKF9Vc2VWb2xhdGlsZVZvaWRQdHJTdG9yYWdlVHlwZShfUE9EVHlwZSgpLCBfX251bGxfcmVwKCkpKSA9PSBzaXplb2YoY2hhciopKSB9OworICBlbnVtIHsgdXNlX2NvbnN0X3ZvbGF0aWxlX3ZvaWRfcHRyID0gKHNpemVvZihfVXNlQ29uc3RWb2xhdGlsZVZvaWRQdHJTdG9yYWdlVHlwZShfUE9EVHlwZSgpLCBfX251bGxfcmVwKCkpKSA9PSBzaXplb2YoY2hhciopKSB9OworCisgIHR5cGVkZWYgdHlwZW5hbWUgX19zZWxlY3Q8IXVzZV9jb25zdF92b2xhdGlsZV92b2lkX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVHAsCisgICAgICAgICAgdHlwZW5hbWUgX19zZWxlY3Q8dXNlX3ZvaWRfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqLAorICAgICAgICAgIHR5cGVuYW1lIF9fc2VsZWN0PHVzZV9jb25zdF92b2lkX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiwKKyAgICAgICAgICB0eXBlbmFtZSBfX3NlbGVjdDx1c2Vfdm9sYXRpbGVfdm9pZF9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sYXRpbGUgdm9pZCosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9sYXRpbGUgdm9pZCo+OjpfUmV0ID46Ol9SZXQgPjo6X1JldCA+OjpfUmV0IF9RdWFsaWZpZWRUeXBlOworCisjaWYgIWRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pCisgIC8qIElmIHRoZSBjb21waWxlciBkbyBub3Qgc3VwcG9ydCB0aGUgaXRlcmF0b3JfdHJhaXRzIHN0cnVjdHVyZSB3ZSBjYW5ub3Qgd3JhcAorICAgKiBpdGVyYXRvcnMgcGFzcyB0byBjb250YWluZXIgdGVtcGxhdGUgbWV0aG9kcy4gVGhlIGl0ZXJhdG9yIGRlcmVmZXJlbmNlZCB2YWx1ZQorICAgKiBoYXMgdG8gYmUgc3RvcmFibGUgd2l0aG91dCBhbnkgY2FzdCBpbiB0aGUgY2hvc2VuIHN0b3JhZ2UgdHlwZS4gVG8gZ3VhcmFudHkKKyAgICogdGhhdCB0aGUgdm9pZCBwb2ludGVyIGhhcyB0byBiZSBjb3JyZWN0bHkgcXVhbGlmaWVkLgorICAgKi8KKyAgdHlwZWRlZiBfUXVhbGlmaWVkVHlwZSBfVHlwZTsKKyNlbHNlCisgIC8qIFdpdGggaXRlcmF0b3JfdHJhaXRzIHdlIGNhbiB3cmFwIHBhc3NlZCBpdGVyYXRvcnMgYW5kIG1ha2UgdGhlIG5lY2Vzc2FyeSBjYXN0cy4KKyAgICogV2UgY2FuIGFsd2F5cyB1c2UgYSBzaW1wbGUgdm9pZCogc3RvcmFnZSB0eXBlOgorICAgKi8KKyAgdHlwZWRlZiB0eXBlbmFtZSBfX3NlbGVjdDx1c2VfY29uc3Rfdm9sYXRpbGVfdm9pZF9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1RwPjo6X1JldCBfVHlwZTsKKyNlbmRpZgorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmU+CitzdHJ1Y3QgX0Fzc29jU3RvcmFnZVR5cGVzIHsKKyAgdHlwZWRlZiBfU3RvcmFnZVR5cGU8X1RwPiBfU3RvcmFnZVR5cGVJbmZvOworICB0eXBlZGVmIHR5cGVuYW1lIF9TdG9yYWdlVHlwZUluZm86Ol9UeXBlIF9TVHlwZTsKKworICAvL1dlIG5lZWQgdG8gYWxzbyBjaGVjayB0aGF0IHRoZSBjb21wYXJpc29uIGZ1bmN0b3IgdXNlZCB0byBpbnN0YW5jaWF0ZSB0aGUgYXNzb2MgY29udGFpbmVyCisgIC8vaXMgdGhlIGRlZmF1bHQgU3RhbmRhcmQgbGVzcyBpbXBsZW1lbnRhdGlvbjoKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSXNTVExwb3J0Q2xhc3M8X0NvbXBhcmU+OjpfUmV0IF9TVExwb3J0TGVzczsKKyAgZW51bSB7IGlzX2RlZmF1bHRfbGVzcyA9IF9fdHlwZTJib29sPF9TVExwb3J0TGVzcz46Ol9SZXQgfTsKKworICB0eXBlZGVmIHR5cGVuYW1lIF9fc2VsZWN0PGlzX2RlZmF1bHRfbGVzcywgX1NUeXBlLCBfVHA+OjpfUmV0IF9LZXlTdG9yYWdlVHlwZTsKKyAgZW51bSB7IHB0cl90eXBlID0gX1N0b3JhZ2VUeXBlSW5mbzo6dXNlX2NvbnN0X3ZvbGF0aWxlX3ZvaWRfcHRyIH07CisgIHR5cGVkZWYgdHlwZW5hbWUgX19zZWxlY3Q8aXNfZGVmYXVsdF9sZXNzICYmIHB0cl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9CaW5hcnlQcmVkV3JhcHBlcjxfS2V5U3RvcmFnZVR5cGUsIF9UcCwgX0NvbXBhcmU+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Db21wYXJlPjo6X1JldCBfQ29tcGFyZVN0b3JhZ2VUeXBlOworfTsKKworCisjaWYgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikKKy8qCisgKiBCYXNlIHN0cnVjdCB0byBkZWFsIHdpdGggcXVhbGlmaWVycworICovCit0ZW1wbGF0ZSA8Y2xhc3MgX1N0b3JhZ2VULCBjbGFzcyBfUXVhbGlmaWVkU3RvcmFnZVQ+CitzdHJ1Y3QgX1ZvaWRDYXN0VHJhaXRzQXV4IHsKKyAgdHlwZWRlZiBfUXVhbGlmaWVkU3RvcmFnZVQgdm9pZF9jdl90eXBlOworICB0eXBlZGVmIF9TdG9yYWdlVCB2b2lkX3R5cGU7CisKKyAgc3RhdGljIHZvaWRfdHlwZSAqIHVuY3ZfcHRyKHZvaWRfY3ZfdHlwZSAqX19wdHIpCisgIHsgcmV0dXJuIF9fcHRyOyB9CisgIHN0YXRpYyB2b2lkX3R5cGUgY29uc3QqIHVuY3ZfY3B0cih2b2lkX2N2X3R5cGUgY29uc3QqX19wdHIpCisgIHsgcmV0dXJuIF9fcHRyOyB9CisgIHN0YXRpYyB2b2lkX3R5cGUgKiogdW5jdl9wcHRyKHZvaWRfY3ZfdHlwZSAqKl9fcHRyKQorICB7IHJldHVybiBfX3B0cjsgfQorICBzdGF0aWMgdm9pZF90eXBlICYgdW5jdl9yZWYodm9pZF9jdl90eXBlICYgX19yZWYpCisgIHsgcmV0dXJuIF9fcmVmOyB9CisgIHN0YXRpYyB2b2lkX3R5cGUgY29uc3QmIHVuY3ZfY3JlZih2b2lkX2N2X3R5cGUgY29uc3QmIF9fcmVmKQorICB7IHJldHVybiBfX3JlZjsgfQorICBzdGF0aWMgdm9pZF9jdl90eXBlKiBjdl9wdHIodm9pZF90eXBlICpfX3B0cikKKyAgeyByZXR1cm4gX19wdHI7IH0KKyAgc3RhdGljIHZvaWRfY3ZfdHlwZSBjb25zdCogY3ZfY3B0cih2b2lkX3R5cGUgY29uc3QqX19wdHIpCisgIHsgcmV0dXJuIF9fcHRyOyB9CisgIHN0YXRpYyB2b2lkX2N2X3R5cGUgKiogY3ZfcHB0cih2b2lkX3R5cGUgKipfX3B0cikKKyAgeyByZXR1cm4gX19wdHI7IH0KKyAgc3RhdGljIHZvaWRfY3ZfdHlwZSAmIGN2X3JlZih2b2lkX3R5cGUgJiBfX3JlZikKKyAgeyByZXR1cm4gX19yZWY7IH0KKyAgc3RhdGljIHZvaWRfY3ZfdHlwZSBjb25zdCYgY3ZfY3JlZih2b2lkX3R5cGUgY29uc3QmIF9fcmVmKQorICB7IHJldHVybiBfX3JlZjsgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9Wb2lkQ1ZUeXBlPgorc3RydWN0IF9Wb2lkQ2FzdFRyYWl0c0F1eEJhc2UgeworICB0eXBlZGVmIF9Wb2lkQ1ZUeXBlKiB2b2lkX2N2X3R5cGU7CisgIHR5cGVkZWYgdm9pZCogdm9pZF90eXBlOworCisgIHN0YXRpYyB2b2lkX3R5cGUqIHVuY3ZfcHRyKHZvaWRfY3ZfdHlwZSAqX19wdHIpCisgIHsgcmV0dXJuIF9fQ09OU1RfQ0FTVCh2b2lkX3R5cGUqLCBfX3B0cik7IH0KKyAgc3RhdGljIHZvaWRfdHlwZSBjb25zdCogdW5jdl9jcHRyKHZvaWRfY3ZfdHlwZSBjb25zdCpfX3B0cikKKyAgeyByZXR1cm4gX19DT05TVF9DQVNUKHZvaWRfdHlwZSBjb25zdCosIF9fcHRyKTsgfQorICBzdGF0aWMgdm9pZF90eXBlKiogdW5jdl9wcHRyKHZvaWRfY3ZfdHlwZSAqKl9fcHRyKQorICB7IHJldHVybiBfX0NPTlNUX0NBU1Qodm9pZF90eXBlKiosIF9fcHRyKTsgfQorICBzdGF0aWMgdm9pZF90eXBlJiB1bmN2X3JlZih2b2lkX2N2X3R5cGUgJl9fcmVmKQorICB7IHJldHVybiBfX0NPTlNUX0NBU1Qodm9pZF90eXBlJiwgX19yZWYpOyB9CisgIHN0YXRpYyB2b2lkX3R5cGUgY29uc3QmIHVuY3ZfY3JlZih2b2lkX2N2X3R5cGUgY29uc3QmIF9fcHRyKQorICB7IHJldHVybiBfX0NPTlNUX0NBU1Qodm9pZF90eXBlIGNvbnN0JiwgX19wdHIpOyB9CisgIC8vIFRoZSByZXZlcnNlIHZlcnNpb25zCisgIHN0YXRpYyB2b2lkX2N2X3R5cGUgKiBjdl9wdHIodm9pZF90eXBlICpfX3B0cikKKyAgeyByZXR1cm4gX19DT05TVF9DQVNUKHZvaWRfY3ZfdHlwZSAqLCBfX3B0cik7IH0KKyAgc3RhdGljIHZvaWRfY3ZfdHlwZSBjb25zdCogY3ZfY3B0cih2b2lkX3R5cGUgY29uc3QqX19wdHIpCisgIHsgcmV0dXJuIF9fQ09OU1RfQ0FTVCh2b2lkX2N2X3R5cGUgY29uc3QqLCBfX3B0cik7IH0KKyAgc3RhdGljIHZvaWRfY3ZfdHlwZSAqKiBjdl9wcHRyKHZvaWRfdHlwZSAqKl9fcHRyKQorICB7IHJldHVybiBfX0NPTlNUX0NBU1Qodm9pZF9jdl90eXBlKiosIF9fcHRyKTsgfQorICBzdGF0aWMgdm9pZF9jdl90eXBlICYgY3ZfcmVmKHZvaWRfdHlwZSAmX19yZWYpCisgIHsgcmV0dXJuIF9fQ09OU1RfQ0FTVCh2b2lkX2N2X3R5cGUgJiwgX19yZWYpOyB9CisgIHN0YXRpYyB2b2lkX2N2X3R5cGUgY29uc3QmIGN2X2NyZWYodm9pZF90eXBlIGNvbnN0JiBfX3JlZikKKyAgeyByZXR1cm4gX19DT05TVF9DQVNUKHZvaWRfY3ZfdHlwZSBjb25zdCYsIF9fcmVmKTsgfQorfTsKKworX1NUTFBfVEVNUExBVEVfTlVMTAorc3RydWN0IF9Wb2lkQ2FzdFRyYWl0c0F1eDx2b2lkKiwgY29uc3Qgdm9pZCo+IDogX1ZvaWRDYXN0VHJhaXRzQXV4QmFzZTx2b2lkIGNvbnN0Pgore307CitfU1RMUF9URU1QTEFURV9OVUxMCitzdHJ1Y3QgX1ZvaWRDYXN0VHJhaXRzQXV4PHZvaWQqLCB2b2xhdGlsZSB2b2lkKj4gOiBfVm9pZENhc3RUcmFpdHNBdXhCYXNlPHZvaWQgdm9sYXRpbGU+Cit7fTsKK19TVExQX1RFTVBMQVRFX05VTEwKK3N0cnVjdCBfVm9pZENhc3RUcmFpdHNBdXg8dm9pZCosIGNvbnN0IHZvbGF0aWxlIHZvaWQqPiA6IF9Wb2lkQ2FzdFRyYWl0c0F1eEJhc2U8dm9pZCBjb25zdCB2b2xhdGlsZT4KK3t9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1N0b3JhZ2VULCBjbGFzcyBfVmFsdWVUPgorc3RydWN0IF9DYXN0VHJhaXRzIHsKKyAgdHlwZWRlZiBfVmFsdWVUIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1N0b3JhZ2VUeXBlPF9WYWx1ZVQ+OjpfUXVhbGlmaWVkVHlwZSBfUXVhbGlmaWVkU3RvcmFnZVQ7CisgIHR5cGVkZWYgX1ZvaWRDYXN0VHJhaXRzQXV4PF9TdG9yYWdlVCwgX1F1YWxpZmllZFN0b3JhZ2VUPiBjdl90cmFpdHM7CisgIHR5cGVkZWYgdHlwZW5hbWUgY3ZfdHJhaXRzOjp2b2lkX3R5cGUgdm9pZF90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIGN2X3RyYWl0czo6dm9pZF9jdl90eXBlIHZvaWRfY3ZfdHlwZTsKKworICBzdGF0aWMgdmFsdWVfdHlwZSAqIHRvX3ZhbHVlX3R5cGVfcHRyKHZvaWRfdHlwZSAqX19wdHIpCisgIHsgcmV0dXJuIF9fUkVJTlRFUlBSRVRfQ0FTVCh2YWx1ZV90eXBlICosIGN2X3RyYWl0czo6Y3ZfcHRyKF9fcHRyKSk7IH0KKyAgc3RhdGljIHZhbHVlX3R5cGUgY29uc3QqIHRvX3ZhbHVlX3R5cGVfY3B0cih2b2lkX3R5cGUgY29uc3QqX19wdHIpCisgIHsgcmV0dXJuIF9fUkVJTlRFUlBSRVRfQ0FTVCh2YWx1ZV90eXBlIGNvbnN0KiwgY3ZfdHJhaXRzOjpjdl9jcHRyKF9fcHRyKSk7IH0KKyAgc3RhdGljIHZhbHVlX3R5cGUgKiogdG9fdmFsdWVfdHlwZV9wcHRyKHZvaWRfdHlwZSAqKl9fcHRyKQorICB7IHJldHVybiBfX1JFSU5URVJQUkVUX0NBU1QodmFsdWVfdHlwZSAqKiwgY3ZfdHJhaXRzOjpjdl9wcHRyKF9fcHRyKSk7IH0KKyAgc3RhdGljIHZhbHVlX3R5cGUgJiB0b192YWx1ZV90eXBlX3JlZih2b2lkX3R5cGUgJl9fcmVmKQorICB7IHJldHVybiBfX1JFSU5URVJQUkVUX0NBU1QodmFsdWVfdHlwZSAmLCBjdl90cmFpdHM6OmN2X3JlZihfX3JlZikpOyB9CisgIHN0YXRpYyB2YWx1ZV90eXBlIGNvbnN0JiB0b192YWx1ZV90eXBlX2NyZWYodm9pZF90eXBlIGNvbnN0JiBfX3B0cikKKyAgeyByZXR1cm4gX19SRUlOVEVSUFJFVF9DQVNUKHZhbHVlX3R5cGUgY29uc3QmLCBjdl90cmFpdHM6OmN2X2NyZWYoX19wdHIpKTsgfQorICAvLyBSZXZlcnNlIHZlcnNpb25zCisgIHN0YXRpYyB2b2lkX3R5cGUgKiB0b19zdG9yYWdlX3R5cGVfcHRyKHZhbHVlX3R5cGUgKl9fcHRyKQorICB7IHJldHVybiBjdl90cmFpdHM6OnVuY3ZfcHRyKF9fUkVJTlRFUlBSRVRfQ0FTVCh2b2lkX2N2X3R5cGUgKiwgX19wdHIpKTsgfQorICBzdGF0aWMgdm9pZF90eXBlIGNvbnN0KiB0b19zdG9yYWdlX3R5cGVfY3B0cih2YWx1ZV90eXBlIGNvbnN0Kl9fcHRyKQorICB7IHJldHVybiBjdl90cmFpdHM6OnVuY3ZfY3B0cihfX1JFSU5URVJQUkVUX0NBU1Qodm9pZF9jdl90eXBlIGNvbnN0KiwgX19wdHIpKTsgfQorICBzdGF0aWMgdm9pZF90eXBlICoqIHRvX3N0b3JhZ2VfdHlwZV9wcHRyKHZhbHVlX3R5cGUgKipfX3B0cikKKyAgeyByZXR1cm4gY3ZfdHJhaXRzOjp1bmN2X3BwdHIoX19SRUlOVEVSUFJFVF9DQVNUKHZvaWRfY3ZfdHlwZSAqKiwgX19wdHIpKTsgfQorICBzdGF0aWMgdm9pZF90eXBlIGNvbnN0JiB0b19zdG9yYWdlX3R5cGVfY3JlZih2YWx1ZV90eXBlIGNvbnN0JiBfX3JlZikKKyAgeyByZXR1cm4gY3ZfdHJhaXRzOjp1bmN2X2NyZWYoX19SRUlOVEVSUFJFVF9DQVNUKHZvaWRfY3ZfdHlwZSBjb25zdCYsIF9fcmVmKSk7IH0KKworICAvL01ldGhvZCB1c2VkIHRvIHRyZWF0IHNldCBjb250YWluZXIgdGVtcGxhdGUgbWV0aG9kIGV4dGVuc2lvbgorICBzdGF0aWMgdm9pZF90eXBlIGNvbnN0JiB0b19zdG9yYWdlX3R5cGVfY3JlZlQodmFsdWVfdHlwZSBjb25zdCYgX19yZWYpCisgIHsgcmV0dXJuIHRvX3N0b3JhZ2VfdHlwZV9jcmVmKF9fcmVmKTsgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfQ2FzdFRyYWl0czxfVHAsIF9UcD4geworICB0eXBlZGVmIF9UcCBzdG9yYWdlX3R5cGU7CisgIHR5cGVkZWYgX1RwIHZhbHVlX3R5cGU7CisKKyAgc3RhdGljIHZhbHVlX3R5cGUgKiB0b192YWx1ZV90eXBlX3B0cihzdG9yYWdlX3R5cGUgKl9fcHRyKQorICB7IHJldHVybiBfX3B0cjsgfQorICBzdGF0aWMgdmFsdWVfdHlwZSBjb25zdCogdG9fdmFsdWVfdHlwZV9jcHRyKHN0b3JhZ2VfdHlwZSBjb25zdCpfX3B0cikKKyAgeyByZXR1cm4gX19wdHI7IH0KKyAgc3RhdGljIHZhbHVlX3R5cGUgKiogdG9fdmFsdWVfdHlwZV9wcHRyKHN0b3JhZ2VfdHlwZSAqKl9fcHRyKQorICB7IHJldHVybiBfX3B0cjsgfQorICBzdGF0aWMgdmFsdWVfdHlwZSAmIHRvX3ZhbHVlX3R5cGVfcmVmKHN0b3JhZ2VfdHlwZSAmX19yZWYpCisgIHsgcmV0dXJuIF9fcmVmOyB9CisgIHN0YXRpYyB2YWx1ZV90eXBlIGNvbnN0JiB0b192YWx1ZV90eXBlX2NyZWYoc3RvcmFnZV90eXBlIGNvbnN0Jl9fcmVmKQorICB7IHJldHVybiBfX3JlZjsgfQorICAvLyBSZXZlcnNlIHZlcnNpb25zCisgIHN0YXRpYyBzdG9yYWdlX3R5cGUgKiB0b19zdG9yYWdlX3R5cGVfcHRyKHZhbHVlX3R5cGUgKl9fcHRyKQorICB7IHJldHVybiBfX3B0cjsgfQorICBzdGF0aWMgc3RvcmFnZV90eXBlIGNvbnN0KiB0b19zdG9yYWdlX3R5cGVfY3B0cih2YWx1ZV90eXBlIGNvbnN0Kl9fcHRyKQorICB7IHJldHVybiBfX3B0cjsgfQorICBzdGF0aWMgc3RvcmFnZV90eXBlICoqIHRvX3N0b3JhZ2VfdHlwZV9wcHRyKHZhbHVlX3R5cGUgKipfX3B0cikKKyAgeyByZXR1cm4gX19wdHI7IH0KKyAgc3RhdGljIHN0b3JhZ2VfdHlwZSBjb25zdCYgdG9fc3RvcmFnZV90eXBlX2NyZWYodmFsdWVfdHlwZSBjb25zdCYgX19yZWYpCisgIHsgcmV0dXJuIF9fcmVmOyB9CisKKyAgLy9NZXRob2QgdXNlZCB0byB0cmVhdCBzZXQgY29udGFpbmVyIHRlbXBsYXRlIG1ldGhvZCBleHRlbnNpb24KKyAgdGVtcGxhdGUgPGNsYXNzIF9UcDE+CisgIHN0YXRpYyBfVHAxIGNvbnN0JiB0b19zdG9yYWdlX3R5cGVfY3JlZlQoX1RwMSBjb25zdCYgX19yZWYpCisgIHsgcmV0dXJuIF9fcmVmOyB9Cit9OworCisjZGVmaW5lIF9TVExQX1VTRV9JVEVSQVRPUl9XUkFQUEVSCisKK3RlbXBsYXRlIDxjbGFzcyBfU3RvcmFnZVQsIGNsYXNzIF9WYWx1ZVQsIGNsYXNzIF9JdGVyYXRvcj4KK3N0cnVjdCBfSXRlV3JhcHBlciB7CisgIHR5cGVkZWYgX0Nhc3RUcmFpdHM8X1N0b3JhZ2VULCBfVmFsdWVUPiBjYXN0X3RyYWl0czsKKyAgdHlwZWRlZiBpdGVyYXRvcl90cmFpdHM8X0l0ZXJhdG9yPiBfSXRlVHJhaXRzOworCisgIHR5cGVkZWYgdHlwZW5hbWUgX0l0ZVRyYWl0czo6aXRlcmF0b3JfY2F0ZWdvcnkgaXRlcmF0b3JfY2F0ZWdvcnk7CisgIHR5cGVkZWYgX1N0b3JhZ2VUIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0l0ZVRyYWl0czo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKyAgdHlwZWRlZiB2YWx1ZV90eXBlKiBwb2ludGVyOworICB0eXBlZGVmIHZhbHVlX3R5cGUgY29uc3QmIGNvbnN0X3JlZmVyZW5jZTsKKyAgLy9UaGlzIHdyYXBwZXIgd29uJ3QgYmUgdXNlZCBmb3IgaW5wdXQgc28gdG8gYXZvaWQgc3VycHJpc2UKKyAgLy90aGUgcmVmZXJlbmNlIHR5cGUgd2lsbCBiZSBhIGNvbnN0IHJlZmVyZW5jZToKKyAgdHlwZWRlZiBjb25zdF9yZWZlcmVuY2UgcmVmZXJlbmNlOworCisgIHR5cGVkZWYgX0l0ZVdyYXBwZXI8X1N0b3JhZ2VULCBfVmFsdWVULCBfSXRlcmF0b3I+IF9TZWxmOworICB0eXBlZGVmIF9TZWxmIF9JdGU7CisKKyAgX0l0ZVdyYXBwZXIoX0l0ZXJhdG9yICZfX2l0ZSkgOiBfTV9pdGUoX19pdGUpIHt9CisKKyAgY29uc3RfcmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3JlZigqX01faXRlKTsgfQorCisgIF9TZWxmJiBvcGVyYXRvcj0gKF9TZWxmIGNvbnN0JiBfX3JocykgeworICAgIF9NX2l0ZSA9IF9fcmhzLl9NX2l0ZTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBfU2VsZiYgb3BlcmF0b3IrKygpIHsKKyAgICArK19NX2l0ZTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBfU2VsZiYgb3BlcmF0b3ItLSgpIHsKKyAgICAtLV9NX2l0ZTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBfU2VsZiYgb3BlcmF0b3IgKz0gKGRpZmZlcmVuY2VfdHlwZSBfX29mZnNldCkgeworICAgIF9NX2l0ZSArPSBfX29mZnNldDsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgZGlmZmVyZW5jZV90eXBlIG9wZXJhdG9yIC0oX1NlbGYgY29uc3QmIF9fb3RoZXIpIGNvbnN0CisgIHsgcmV0dXJuIF9NX2l0ZSAtIF9fb3RoZXIuX01faXRlOyB9CisKKyAgYm9vbCBvcGVyYXRvciA9PSAoX1NlbGYgY29uc3QmIF9fb3RoZXIpIGNvbnN0CisgIHsgcmV0dXJuIF9NX2l0ZSA9PSBfX290aGVyLl9NX2l0ZTsgfQorCisgIGJvb2wgb3BlcmF0b3IgIT0gKF9TZWxmIGNvbnN0JiBfX290aGVyKSBjb25zdAorICB7IHJldHVybiBfTV9pdGUgIT0gX19vdGhlci5fTV9pdGU7IH0KKworICBib29sIG9wZXJhdG9yIDwgKF9TZWxmIGNvbnN0JiBfX3JocykgY29uc3QKKyAgeyByZXR1cm4gX01faXRlIDwgX19yaHMuX01faXRlOyB9CisKK3ByaXZhdGU6CisgIF9JdGVyYXRvciBfTV9pdGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfSXRlcmF0b3I+CitzdHJ1Y3QgX0l0ZVdyYXBwZXI8X1RwLCBfVHAsIF9JdGVyYXRvcj4KK3sgdHlwZWRlZiBfSXRlcmF0b3IgX0l0ZTsgfTsKKworI2Vsc2UKKworLyoKKyAqIEluIHRoaXMgY29uZmlnIHRoZSBzdG9yYWdlIHR5cGUgaXMgcXVhbGlmaWVkIGluIHJlc3BlY3Qgb2YgdGhlCisgKiB2YWx1ZV90eXBlIHF1YWxpZmljYXRpb24uIFNpbXBsZSByZWludGVycHJldF9jYXN0IGlzIGVub3VnaC4KKyAqLwordGVtcGxhdGUgPGNsYXNzIF9TdG9yYWdlVCwgY2xhc3MgX1ZhbHVlVD4KK3N0cnVjdCBfQ2FzdFRyYWl0cyB7CisgIHR5cGVkZWYgX1N0b3JhZ2VUIHN0b3JhZ2VfdHlwZTsKKyAgdHlwZWRlZiBfVmFsdWVUIHZhbHVlX3R5cGU7CisKKyAgc3RhdGljIHZhbHVlX3R5cGUgKiB0b192YWx1ZV90eXBlX3B0cihzdG9yYWdlX3R5cGUgKl9fcHRyKQorICB7IHJldHVybiBfX1JFSU5URVJQUkVUX0NBU1QodmFsdWVfdHlwZSosIF9fcHRyKTsgfQorICBzdGF0aWMgdmFsdWVfdHlwZSBjb25zdCogdG9fdmFsdWVfdHlwZV9jcHRyKHN0b3JhZ2VfdHlwZSBjb25zdCpfX3B0cikKKyAgeyByZXR1cm4gX19SRUlOVEVSUFJFVF9DQVNUKHZhbHVlX3R5cGUgY29uc3QqLCBfX3B0cik7IH0KKyAgc3RhdGljIHZhbHVlX3R5cGUgKiogdG9fdmFsdWVfdHlwZV9wcHRyKHN0b3JhZ2VfdHlwZSAqKl9fcHRyKQorICB7IHJldHVybiBfX1JFSU5URVJQUkVUX0NBU1QodmFsdWVfdHlwZSAqKiwgX19wdHIpOyB9CisgIHN0YXRpYyB2YWx1ZV90eXBlICYgdG9fdmFsdWVfdHlwZV9yZWYoc3RvcmFnZV90eXBlICZfX3JlZikKKyAgeyByZXR1cm4gX19SRUlOVEVSUFJFVF9DQVNUKHZhbHVlX3R5cGUmLCBfX3JlZik7IH0KKyAgc3RhdGljIHZhbHVlX3R5cGUgY29uc3QmIHRvX3ZhbHVlX3R5cGVfY3JlZihzdG9yYWdlX3R5cGUgY29uc3QmX19yZWYpCisgIHsgcmV0dXJuIF9fUkVJTlRFUlBSRVRfQ0FTVCh2YWx1ZV90eXBlIGNvbnN0JiwgX19yZWYpOyB9CisgIC8vIFJldmVyc2UgdmVyc2lvbnMKKyAgc3RhdGljIHN0b3JhZ2VfdHlwZSAqIHRvX3N0b3JhZ2VfdHlwZV9wdHIodmFsdWVfdHlwZSAqX19wdHIpCisgIHsgcmV0dXJuIF9fUkVJTlRFUlBSRVRfQ0FTVChzdG9yYWdlX3R5cGUqLCBfX3B0cik7IH0KKyAgc3RhdGljIHN0b3JhZ2VfdHlwZSBjb25zdCogdG9fc3RvcmFnZV90eXBlX2NwdHIodmFsdWVfdHlwZSBjb25zdCpfX3B0cikKKyAgeyByZXR1cm4gX19SRUlOVEVSUFJFVF9DQVNUKHN0b3JhZ2VfdHlwZSBjb25zdCosIF9fcHRyKTsgfQorICBzdGF0aWMgc3RvcmFnZV90eXBlICoqIHRvX3N0b3JhZ2VfdHlwZV9wcHRyKHZhbHVlX3R5cGUgKipfX3B0cikKKyAgeyByZXR1cm4gX19SRUlOVEVSUFJFVF9DQVNUKHN0b3JhZ2VfdHlwZSAqKiwgX19wdHIpOyB9CisgIHN0YXRpYyBzdG9yYWdlX3R5cGUgY29uc3QmIHRvX3N0b3JhZ2VfdHlwZV9jcmVmKHZhbHVlX3R5cGUgY29uc3QmX19yZWYpCisgIHsgcmV0dXJuIF9fUkVJTlRFUlBSRVRfQ0FTVChzdG9yYWdlX3R5cGUgY29uc3QmLCBfX3JlZik7IH0KKyAgdGVtcGxhdGUgPGNsYXNzIF9UcDE+CisgIHN0YXRpYyBfVHAxIGNvbnN0JiB0b19zdG9yYWdlX3R5cGVfY3JlZlQoX1RwMSBjb25zdCYgX19yZWYpCisgIHsgcmV0dXJuIF9fcmVmOyB9Cit9OworCisjZW5kaWYKKworLy9XcmFwcGVyIGZ1bmN0b3JzOgordGVtcGxhdGUgPGNsYXNzIF9TdG9yYWdlVCwgY2xhc3MgX1ZhbHVlVCwgY2xhc3MgX1VuYXJ5UHJlZGljYXRlPgorc3RydWN0IF9VbmFyeVByZWRXcmFwcGVyIHsKKyAgdHlwZWRlZiBfQ2FzdFRyYWl0czxfU3RvcmFnZVQsIF9WYWx1ZVQ+IGNhc3RfdHJhaXRzOworCisgIF9VbmFyeVByZWRXcmFwcGVyIChfVW5hcnlQcmVkaWNhdGUgY29uc3QmIF9fcHJlZCkgOiBfTV9wcmVkKF9fcHJlZCkge30KKworICBib29sIG9wZXJhdG9yICgpIChfU3RvcmFnZVQgY29uc3QmIF9fcmVmKSBjb25zdAorICB7IHJldHVybiBfTV9wcmVkKGNhc3RfdHJhaXRzOjp0b192YWx1ZV90eXBlX2NyZWYoX19yZWYpKTsgfQorCitwcml2YXRlOgorICBfVW5hcnlQcmVkaWNhdGUgX01fcHJlZDsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfU3RvcmFnZVQsIGNsYXNzIF9WYWx1ZVQsIGNsYXNzIF9CaW5hcnlQcmVkaWNhdGU+CitzdHJ1Y3QgX0JpbmFyeVByZWRXcmFwcGVyIHsKKyAgdHlwZWRlZiBfQ2FzdFRyYWl0czxfU3RvcmFnZVQsIF9WYWx1ZVQ+IGNhc3RfdHJhaXRzOworCisgIF9CaW5hcnlQcmVkV3JhcHBlciAoKSB7fQorICBfQmluYXJ5UHJlZFdyYXBwZXIgKF9CaW5hcnlQcmVkaWNhdGUgY29uc3QmIF9fcHJlZCkgOiBfTV9wcmVkKF9fcHJlZCkge30KKworICBfQmluYXJ5UHJlZGljYXRlIGdldF9wcmVkKCkgY29uc3QgeyByZXR1cm4gX01fcHJlZDsgfQorCisgIGJvb2wgb3BlcmF0b3IgKCkgKF9TdG9yYWdlVCBjb25zdCYgX19mc3QsIF9TdG9yYWdlVCBjb25zdCYgX19zbmQpIGNvbnN0CisgIHsgcmV0dXJuIF9NX3ByZWQoY2FzdF90cmFpdHM6OnRvX3ZhbHVlX3R5cGVfY3JlZihfX2ZzdCksIGNhc3RfdHJhaXRzOjp0b192YWx1ZV90eXBlX2NyZWYoX19zbmQpKTsgfQorCisgIC8vQ2FzdCBvcGVyYXRvciB1c2VkIHRvIHRyYW5zcGFyZW50bHkgYWNjZXNzIHVuZGVybHlpbmcgcHJlZGljYXRlCisgIC8vaW4gc2V0OjprZXlfY29tcCgpIG1ldGhvZAorICBvcGVyYXRvciBfQmluYXJ5UHJlZGljYXRlKCkgY29uc3QKKyAgeyByZXR1cm4gX01fcHJlZDsgfQorCitwcml2YXRlOgorICBfQmluYXJ5UHJlZGljYXRlIF9NX3ByZWQ7Cit9OworCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYgLyogX1NUTFBfUE9JTlRFUlNfU1BFQ19UT09MU19IICovCmRpZmYgLS1naXQgYS9zdGwvcG9pbnRlcnMvX3ZlY3Rvci5oIGIvc3RsL3BvaW50ZXJzL192ZWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGU0YzAwCi0tLSAvZGV2L251bGwKKysrIGIvc3RsL3BvaW50ZXJzL192ZWN0b3IuaApAQCAtMCwwICsxLDIzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMworICogRnJhbmNvaXMgRHVtb250CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKy8qIE5PVEU6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIFNUTCBoZWFkZXJzLgorICogICBZb3Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4KKyAqLworCisjaWZuZGVmIF9TVExQX1NQRUNJQUxJWkVEX1ZFQ1RPUl9ICisjZGVmaW5lIF9TVExQX1NQRUNJQUxJWkVEX1ZFQ1RPUl9ICisKKyNpZm5kZWYgX1NUTFBfUE9JTlRFUlNfU1BFQ19UT09MU19ICisjICBpbmNsdWRlIDxzdGwvcG9pbnRlcnMvX3Rvb2xzLmg+CisjZW5kaWYKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKKyNkZWZpbmUgVkVDVE9SX0lNUEwgX1NUTFBfUFRSX0lNUExfTkFNRSh2ZWN0b3IpCisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfVEVNUExBVEVfRVhQT1JUKSAmJiAhZGVmaW5lZCAoX1NUTFBfVVNFX01TVkM2X01FTV9UX0JVR19XT1JLQVJPVU5EKQorX1NUTFBfRVhQT1JUX1RFTVBMQVRFX0NMQVNTIF9TVExQX1BSSVYgX1ZlY3Rvcl9iYXNlPHZvaWQqLGFsbG9jYXRvcjx2b2lkKj4gPjsKK19TVExQX0VYUE9SVF9URU1QTEFURV9DTEFTUyBfU1RMUF9QUklWIFZFQ1RPUl9JTVBMPHZvaWQqLCBhbGxvY2F0b3I8dm9pZCo+ID47CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX0RFQlVHKQorIyAgZGVmaW5lIHZlY3RvciBfU1RMUF9OT05fREJHX05BTUUodmVjdG9yKQorX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIF9TVExQX0RFRkFVTFRfQUxMT0NBVE9SX1NFTEVDVChfVHApID4KK2NsYXNzIHZlY3RvcgorI2lmIGRlZmluZWQgKF9TVExQX1VTRV9QQVJUSUFMX1NQRUNfV09SS0FST1VORCkgJiYgIWRlZmluZWQgKHZlY3RvcikKKyAgICAgICAgICAgICA6IHB1YmxpYyBfX3N0bHBvcnRfY2xhc3M8dmVjdG9yPF9UcCwgX0FsbG9jPiA+CisjZW5kaWYKK3sKKyAgLyogSW4gdGhlIHZlY3RvciBpbXBsZW1lbnRhdGlvbiBpdGVyYXRvcnMgYXJlIHBvaW50ZXIgd2hpY2ggZ2l2ZSBhIG51bWJlcgorICAgKiBvZiBvcHBvcnR1bml0aWVzIGZvciBvcHRpbWl6YXRpb24uIFRvIG5vdCBicmVhayB0aG9zZSBvcHRpbWl6YXRpb25zCisgICAqIGl0ZXJhdG9ycyBwYXNzZWQgdG8gdGVtcGxhdGUgc2hvdWxkIG5vdCBiZSB3cmFwcGVkIGZvciBjYXN0aW5nIHB1cnBvc2UuCisgICAqIFNvIHZlY3RvciBpbXBsZW1lbnRhdGlvbiB3aWxsIGFsd2F5cyB1c2UgYSBxdWFsaWZpZWQgdm9pZCBwb2ludGVyIHR5cGUgYW5kCisgICAqIHdvbid0IHVzZSBpdGVyYXRvciB3cmFwcGluZy4KKyAgICovCisgIHR5cGVkZWYgdHlwZW5hbWUgX1NUTFBfUFJJViBfU3RvcmFnZVR5cGU8X1RwPjo6X1F1YWxpZmllZFR5cGUgX1N0b3JhZ2VUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY190cmFpdHM8X1N0b3JhZ2VUeXBlLCBfQWxsb2M+OjphbGxvY2F0b3JfdHlwZSBfU3RvcmFnZVR5cGVBbGxvYzsKKyAgdHlwZWRlZiBfU1RMUF9QUklWIFZFQ1RPUl9JTVBMPF9TdG9yYWdlVHlwZSwgX1N0b3JhZ2VUeXBlQWxsb2M+IF9CYXNlOworICB0eXBlZGVmIHZlY3RvcjxfVHAsIF9BbGxvYz4gX1NlbGY7CisKKyAgdHlwZWRlZiBfU1RMUF9QUklWIF9DYXN0VHJhaXRzPF9TdG9yYWdlVHlwZSwgX1RwPiBjYXN0X3RyYWl0czsKKworcHVibGljOgorICB0eXBlZGVmIF9UcCB2YWx1ZV90eXBlOworICB0eXBlZGVmIHZhbHVlX3R5cGUqIHBvaW50ZXI7CisgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSogY29uc3RfcG9pbnRlcjsKKyAgdHlwZWRlZiB2YWx1ZV90eXBlKiBpdGVyYXRvcjsKKyAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlKiBjb25zdF9pdGVyYXRvcjsKKyAgdHlwZWRlZiB2YWx1ZV90eXBlJiByZWZlcmVuY2U7CisgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSYgY29uc3RfcmVmZXJlbmNlOworICB0eXBlZGVmIHNpemVfdCBzaXplX3R5cGU7CisgIHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKKyAgdHlwZWRlZiByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyBfSXRlcmF0b3JfY2F0ZWdvcnk7CisKKyAgX1NUTFBfREVDTEFSRV9SQU5ET01fQUNDRVNTX1JFVkVSU0VfSVRFUkFUT1JTOworICBfU1RMUF9GT1JDRV9BTExPQ0FUT1JTKHZhbHVlX3R5cGUsIF9BbGxvYykKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2NfdHJhaXRzPHZhbHVlX3R5cGUsIF9BbGxvYz46OmFsbG9jYXRvcl90eXBlIGFsbG9jYXRvcl90eXBlOworCisgIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdAorICB7IHJldHVybiBfU1RMUF9DT05WRVJUX0FMTE9DQVRPUihfTV9pbXBsLmdldF9hbGxvY2F0b3IoKSwgdmFsdWVfdHlwZSk7IH0KKworICBpdGVyYXRvciBiZWdpbigpICAgICAgICAgICAgIHsgcmV0dXJuIGNhc3RfdHJhaXRzOjp0b192YWx1ZV90eXBlX3B0cihfTV9pbXBsLmJlZ2luKCkpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gY2FzdF90cmFpdHM6OnRvX3ZhbHVlX3R5cGVfY3B0cihfTV9pbXBsLmJlZ2luKCkpOyB9CisgIGl0ZXJhdG9yIGVuZCgpICAgICAgICAgICAgICAgeyByZXR1cm4gY2FzdF90cmFpdHM6OnRvX3ZhbHVlX3R5cGVfcHRyKF9NX2ltcGwuZW5kKCkpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0ICAgeyByZXR1cm4gY2FzdF90cmFpdHM6OnRvX3ZhbHVlX3R5cGVfY3B0cihfTV9pbXBsLmVuZCgpKTsgfQorCisgIHJldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgICAgICAgICAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgY29uc3QgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisgIHJldmVyc2VfaXRlcmF0b3IgcmVuZCgpICAgICAgICAgICAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgY29uc3QgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorCisgIHNpemVfdHlwZSBzaXplKCkgY29uc3QgICAgICAgIHsgcmV0dXJuIF9NX2ltcGwuc2l6ZSgpOyB9CisgIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0ICAgIHsgcmV0dXJuIF9NX2ltcGwubWF4X3NpemUoKTsgfQorCisgIHNpemVfdHlwZSBjYXBhY2l0eSgpIGNvbnN0ICAgIHsgcmV0dXJuIF9NX2ltcGwuY2FwYWNpdHkoKTsgfQorICBib29sIGVtcHR5KCkgY29uc3QgICAgICAgICAgICB7IHJldHVybiBfTV9pbXBsLmVtcHR5KCk7IH0KKworICByZWZlcmVuY2Ugb3BlcmF0b3JbXShzaXplX3R5cGUgX19uKSB7IHJldHVybiBjYXN0X3RyYWl0czo6dG9fdmFsdWVfdHlwZV9yZWYoX01faW1wbFtfX25dKTsgfQorICBjb25zdF9yZWZlcmVuY2Ugb3BlcmF0b3JbXShzaXplX3R5cGUgX19uKSBjb25zdCB7IHJldHVybiBjYXN0X3RyYWl0czo6dG9fdmFsdWVfdHlwZV9jcmVmKF9NX2ltcGxbX19uXSk7IH0KKworICByZWZlcmVuY2UgZnJvbnQoKSAgICAgICAgICAgICB7IHJldHVybiBjYXN0X3RyYWl0czo6dG9fdmFsdWVfdHlwZV9yZWYoX01faW1wbC5mcm9udCgpKTsgfQorICBjb25zdF9yZWZlcmVuY2UgZnJvbnQoKSBjb25zdCB7IHJldHVybiBjYXN0X3RyYWl0czo6dG9fdmFsdWVfdHlwZV9jcmVmKF9NX2ltcGwuZnJvbnQoKSk7IH0KKyAgcmVmZXJlbmNlIGJhY2soKSAgICAgICAgICAgICAgeyByZXR1cm4gY2FzdF90cmFpdHM6OnRvX3ZhbHVlX3R5cGVfcmVmKF9NX2ltcGwuYmFjaygpKTsgfQorICBjb25zdF9yZWZlcmVuY2UgYmFjaygpIGNvbnN0ICB7IHJldHVybiBjYXN0X3RyYWl0czo6dG9fdmFsdWVfdHlwZV9jcmVmKF9NX2ltcGwuYmFjaygpKTsgfQorCisgIHJlZmVyZW5jZSBhdChzaXplX3R5cGUgX19uKSB7IHJldHVybiBjYXN0X3RyYWl0czo6dG9fdmFsdWVfdHlwZV9yZWYoX01faW1wbC5hdChfX24pKTsgfQorICBjb25zdF9yZWZlcmVuY2UgYXQoc2l6ZV90eXBlIF9fbikgY29uc3QgeyByZXR1cm4gY2FzdF90cmFpdHM6OnRvX3ZhbHVlX3R5cGVfY3JlZihfTV9pbXBsLmF0KF9fbikpOyB9CisKKyAgZXhwbGljaXQgdmVjdG9yKGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX01faW1wbChfU1RMUF9DT05WRVJUX0FMTE9DQVRPUihfX2EsIF9TdG9yYWdlVHlwZSkpIHt9CisKKyNpZiAhZGVmaW5lZChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQorICBleHBsaWNpdCB2ZWN0b3Ioc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX192YWwgPSBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKHZhbHVlX3R5cGUpLAorI2Vsc2UKKyAgdmVjdG9yKHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9fdmFsLAorI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCisgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9NX2ltcGwoX19uLCBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWYoX192YWwpLAorICAgICAgX1NUTFBfQ09OVkVSVF9BTExPQ0FUT1IoX19hLCBfU3RvcmFnZVR5cGUpKSB7fQorCisjaWYgZGVmaW5lZChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQorICBleHBsaWNpdCB2ZWN0b3Ioc2l6ZV90eXBlIF9fbikKKyAgICA6IF9NX2ltcGwoX19uLCBhbGxvY2F0b3JfdHlwZSgpICkge30KKyNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0qLworCisgIHZlY3Rvcihjb25zdCBfU2VsZiYgX194KQorICAgIDogX01faW1wbChfX3guX01faW1wbCkge30KKworICBleHBsaWNpdCB2ZWN0b3IoX19tb3ZlX3NvdXJjZTxfU2VsZj4gc3JjKQorICAgIDogX01faW1wbChfX21vdmVfc291cmNlPF9CYXNlPihzcmMuZ2V0KCkuX01faW1wbCkpIHt9CisKKyNpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVTKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgIHZlY3RvcihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hIF9TVExQX0FMTE9DQVRPUl9UWVBFX0RGTCApCisgIDogX01faW1wbChfX2ZpcnN0LCBfX2xhc3QsCisgICAgICAgICAgICBfU1RMUF9DT05WRVJUX0FMTE9DQVRPUihfX2EsIF9TdG9yYWdlVHlwZSkpIHt9CisKKyMgIGlmIGRlZmluZWQgKF9TVExQX05FRURTX0VYVFJBX1RFTVBMQVRFX0NPTlNUUlVDVE9SUykKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICB2ZWN0b3IoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgIDogX01faW1wbChfX2ZpcnN0LCBfX2xhc3QpIHt9CisjICBlbmRpZgorCisjZWxzZQorICB2ZWN0b3IoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfTV9pbXBsKGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3B0cihfX2ZpcnN0KSwgY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcHRyKF9fbGFzdCksCisgICAgICAgICAgICAgIF9TVExQX0NPTlZFUlRfQUxMT0NBVE9SKF9fYSwgX1N0b3JhZ2VUeXBlKSkge30KKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisKKyAgX1NlbGYmIG9wZXJhdG9yPShjb25zdCBfU2VsZiYgX194KSB7IF9NX2ltcGwgPSBfX3guX01faW1wbDsgcmV0dXJuICp0aGlzOyB9CisKKyAgdm9pZCByZXNlcnZlKHNpemVfdHlwZSBfX24pIHtfTV9pbXBsLnJlc2VydmUoX19uKTt9CisgIHZvaWQgYXNzaWduKHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9fdmFsKQorICB7IF9NX2ltcGwuYXNzaWduKF9fbiwgY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcmVmKF9fdmFsKSk7IH0KKworI2lmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURVMpCisgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgdm9pZCBhc3NpZ24oX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICB7IF9NX2ltcGwuYXNzaWduKF9fZmlyc3QsIF9fbGFzdCk7IH0KKyNlbHNlCisgIHZvaWQgYXNzaWduKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkgeworICAgIF9NX2ltcGwuYXNzaWduKGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3B0cihfX2ZpcnN0KSwKKyAgICAgICAgICAgICAgICAgICBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NwdHIoX19sYXN0KSk7CisgIH0KKyNlbmRpZiAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVTICovCisKKyNpZiAhZGVmaW5lZChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKSAmJiAhZGVmaW5lZChfU1RMUF9OT19BTkFDSFJPTklTTVMpCisgIHZvaWQgcHVzaF9iYWNrKGNvbnN0IHZhbHVlX3R5cGUmIF9feCA9IF9TVExQX0RFRkFVTFRfQ09OU1RSVUNURUQodmFsdWVfdHlwZSkpCisjZWxzZQorICB2b2lkIHB1c2hfYmFjayhjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisjZW5kaWYgLyohX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSAmJiAhX1NUTFBfTk9fQU5BQ0hST05JU01TKi8KKyAgeyBfTV9pbXBsLnB1c2hfYmFjayhjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWYoX194KSk7IH0KKworI2lmICFkZWZpbmVkKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pICYmICFkZWZpbmVkKF9TVExQX05PX0FOQUNIUk9OSVNNUykKKyAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBjb25zdCB2YWx1ZV90eXBlJiBfX3ggPSBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKHZhbHVlX3R5cGUpKQorI2Vsc2UKKyAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisjZW5kaWYgLyohX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSAmJiAhX1NUTFBfTk9fQU5BQ0hST05JU01TKi8KKyAgeyByZXR1cm4gY2FzdF90cmFpdHM6OnRvX3ZhbHVlX3R5cGVfcHRyKF9NX2ltcGwuaW5zZXJ0KGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfcHRyKF9fcG9zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3JlZihfX3gpKSk7IH0KKworI2lmIGRlZmluZWQoX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSkgJiYgIWRlZmluZWQoX1NUTFBfTk9fQU5BQ0hST05JU01TKQorICB2b2lkIHB1c2hfYmFjaygpIHsgX01faW1wbC5wdXNoX2JhY2soKTsgfQorICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3IgX19wb3MpCisgIHsgcmV0dXJuIF9NX2ltcGwuaW5zZXJ0KGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfcHRyKF9fcG9zKSk7IH0KKyNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0gJiYgIV9TVExQX05PX0FOQUNIUk9OSVNNUyovCisKKyAgdm9pZCBzd2FwKF9TZWxmJiBfX3gpIHsgX01faW1wbC5zd2FwKF9feC5fTV9pbXBsKTsgfQorCisjaWYgZGVmaW5lZCAoX1NUTFBfTUVNQkVSX1RFTVBMQVRFUykKKyAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICB2b2lkIGluc2VydChpdGVyYXRvciBfX3BvcywgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICB7IF9NX2ltcGwuaW5zZXJ0KGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfcHRyKF9fcG9zKSwgX19maXJzdCwgX19sYXN0KTsgfQorI2Vsc2UKKyAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkgeworICAgIF9NX2ltcGwuaW5zZXJ0KGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfcHRyKF9fcG9zKSwgY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcHRyKF9fZmlyc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzdF90cmFpdHM6OnRvX3N0b3JhZ2VfdHlwZV9jcHRyKF9fbGFzdCkpOworICB9CisjZW5kaWYKKworICB2b2lkIGluc2VydCAoaXRlcmF0b3IgX19wb3MsIHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkgeworICAgIF9NX2ltcGwuaW5zZXJ0KGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfcHRyKF9fcG9zKSwgX19uLCBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX2NyZWYoX194KSk7CisgIH0KKworICB2b2lkIHBvcF9iYWNrKCkge19NX2ltcGwucG9wX2JhY2soKTt9CisgIGl0ZXJhdG9yIGVyYXNlKGl0ZXJhdG9yIF9fcG9zKQorICB7cmV0dXJuIGNhc3RfdHJhaXRzOjp0b192YWx1ZV90eXBlX3B0cihfTV9pbXBsLmVyYXNlKGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfcHRyKF9fcG9zKSkpO30KKyAgaXRlcmF0b3IgZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KSB7CisgICAgcmV0dXJuIGNhc3RfdHJhaXRzOjp0b192YWx1ZV90eXBlX3B0cihfTV9pbXBsLmVyYXNlKGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfcHRyKF9fZmlyc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X3RyYWl0czo6dG9fc3RvcmFnZV90eXBlX3B0cihfX2xhc3QpKSk7CisgIH0KKworI2lmICFkZWZpbmVkKF9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0pCisgIHZvaWQgcmVzaXplKHNpemVfdHlwZSBfX25ld19zaXplLCBjb25zdCB2YWx1ZV90eXBlJiBfX3ggPSBfU1RMUF9ERUZBVUxUX0NPTlNUUlVDVEVEKHZhbHVlX3R5cGUpKQorI2Vsc2UKKyAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9fbmV3X3NpemUsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyNlbmRpZiAvKl9TVExQX0RPTlRfU1VQX0RGTFRfUEFSQU0qLworICB7IF9NX2ltcGwucmVzaXplKF9fbmV3X3NpemUsIGNhc3RfdHJhaXRzOjp0b19zdG9yYWdlX3R5cGVfY3JlZihfX3gpKTsgfQorCisjaWYgZGVmaW5lZChfU1RMUF9ET05UX1NVUF9ERkxUX1BBUkFNKQorICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgX19uZXdfc2l6ZSkgeyBfTV9pbXBsLnJlc2l6ZShfX25ld19zaXplKTsgfQorI2VuZGlmIC8qX1NUTFBfRE9OVF9TVVBfREZMVF9QQVJBTSovCisKKyAgdm9pZCBjbGVhcigpIHsgX01faW1wbC5jbGVhcigpOyB9CisKK3ByaXZhdGU6CisgIF9CYXNlIF9NX2ltcGw7Cit9OworCisjaWYgZGVmaW5lZCAodmVjdG9yKQorIyAgdW5kZWYgdmVjdG9yCitfU1RMUF9NT1ZFX1RPX1NURF9OQU1FU1BBQ0UKKyNlbmRpZgorCisjdW5kZWYgVkVDVE9SX0lNUEwKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjZW5kaWYgLyogX1NUTFBfU1BFQ0lBTElaRURfVkVDVE9SX0ggKi8KZGlmZiAtLWdpdCBhL3N0bC90eXBlX21hbmlwcy5oIGIvc3RsL3R5cGVfbWFuaXBzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE5NjBlMAotLS0gL2Rldi9udWxsCisrKyBiL3N0bC90eXBlX21hbmlwcy5oCkBAIC0wLDAgKzEsMzA1IEBACisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMworICogRnJhbudvaXMgRHVtb250CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKworI2lmbmRlZiBfU1RMUF9UWVBFX01BTklQU19ICisjZGVmaW5lIF9TVExQX1RZUEVfTUFOSVBTX0gKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKK3N0cnVjdCBfX3RydWVfdHlwZSB7fTsKK3N0cnVjdCBfX2ZhbHNlX3R5cGUge307CisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfTkFNRVNQQUNFUykKK19TVExQX01PVkVfVE9fUFJJVl9OQU1FU1BBQ0UKK3VzaW5nIF9TVExQX1NURDo6X190cnVlX3R5cGU7Cit1c2luZyBfU1RMUF9TVEQ6Ol9fZmFsc2VfdHlwZTsKK19TVExQX01PVkVfVE9fU1REX05BTUVTUEFDRQorI2VuZGlmCisKKy8vYm9vbCB0byB0eXBlCit0ZW1wbGF0ZSA8aW50IF9Jcz4KK3N0cnVjdCBfX2Jvb2wydHlwZQoreyB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9SZXQ7IH07CisKK19TVExQX1RFTVBMQVRFX05VTEwKK3N0cnVjdCBfX2Jvb2wydHlwZTwxPiB7IHR5cGVkZWYgX190cnVlX3R5cGUgX1JldDsgfTsKKworX1NUTFBfVEVNUExBVEVfTlVMTAorc3RydWN0IF9fYm9vbDJ0eXBlPDA+IHsgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgX1JldDsgfTsKKworLy90eXBlIHRvIGJvb2wKK3RlbXBsYXRlIDxjbGFzcyBfX2Jvb2xfdHlwZT4KK3N0cnVjdCBfX3R5cGUyYm9vbCB7IGVudW0ge19SZXQgPSAxfTsgfTsKKworX1NUTFBfVEVNUExBVEVfTlVMTAorc3RydWN0IF9fdHlwZTJib29sPF9fdHJ1ZV90eXBlPiB7IGVudW0ge19SZXQgPSAxfTsgfTsKKworX1NUTFBfVEVNUExBVEVfTlVMTAorc3RydWN0IF9fdHlwZTJib29sPF9fZmFsc2VfdHlwZT4geyBlbnVtIHtfUmV0ID0gMH07IH07CisKKy8vTmVnYXRpb24KK3RlbXBsYXRlIDxjbGFzcyBfQm9vbFR5cGU+CitzdHJ1Y3QgX05vdCB7IHR5cGVkZWYgX19mYWxzZV90eXBlIF9SZXQ7IH07CisKK19TVExQX1RFTVBMQVRFX05VTEwKK3N0cnVjdCBfTm90PF9fZmFsc2VfdHlwZT4geyB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9SZXQ7IH07CisKKy8vIGxvZ2ljYWwgYW5kIG9mIDIgcHJlZGljYXRlZAordGVtcGxhdGUgPGNsYXNzIF9QMSwgY2xhc3MgX1AyPgorc3RydWN0IF9MYW5kMiB7IHR5cGVkZWYgX19mYWxzZV90eXBlIF9SZXQ7IH07CisKK19TVExQX1RFTVBMQVRFX05VTEwKK3N0cnVjdCBfTGFuZDI8X190cnVlX3R5cGUsIF9fdHJ1ZV90eXBlPiB7IHR5cGVkZWYgX190cnVlX3R5cGUgX1JldDsgfTsKKworLy8gbG9naWNhbCBhbmQgb2YgMyBwcmVkaWNhdGVkCit0ZW1wbGF0ZSA8Y2xhc3MgX1AxLCBjbGFzcyBfUDIsIGNsYXNzIF9QMz4KK3N0cnVjdCBfTGFuZDMgeyB0eXBlZGVmIF9fZmFsc2VfdHlwZSBfUmV0OyB9OworCitfU1RMUF9URU1QTEFURV9OVUxMCitzdHJ1Y3QgX0xhbmQzPF9fdHJ1ZV90eXBlLCBfX3RydWVfdHlwZSwgX190cnVlX3R5cGU+IHsgdHlwZWRlZiBfX3RydWVfdHlwZSBfUmV0OyB9OworCisvL2xvZ2ljYWwgb3Igb2YgMiBwcmVkaWNhdGVkCit0ZW1wbGF0ZSA8Y2xhc3MgX1AxLCBjbGFzcyBfUDI+CitzdHJ1Y3QgX0xvcjIgeyB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9SZXQ7IH07CisKK19TVExQX1RFTVBMQVRFX05VTEwKK3N0cnVjdCBfTG9yMjxfX2ZhbHNlX3R5cGUsIF9fZmFsc2VfdHlwZT4geyB0eXBlZGVmIF9fZmFsc2VfdHlwZSBfUmV0OyB9OworCisvLyBsb2dpY2FsIG9yIG9mIDMgcHJlZGljYXRlZAordGVtcGxhdGUgPGNsYXNzIF9QMSwgY2xhc3MgX1AyLCBjbGFzcyBfUDM+CitzdHJ1Y3QgX0xvcjMgeyB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9SZXQ7IH07CisKK19TVExQX1RFTVBMQVRFX05VTEwKK3N0cnVjdCBfTG9yMzxfX2ZhbHNlX3R5cGUsIF9fZmFsc2VfdHlwZSwgX19mYWxzZV90eXBlPiB7IHR5cGVkZWYgX19mYWxzZV90eXBlIF9SZXQ7IH07CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBjbGFzcyB0ZW1wbGF0ZSBfX3NlbGVjdAorLy8gU2VsZWN0cyBvbmUgb2YgdHdvIHR5cGVzIGJhc2VkIHVwb24gYSBib29sZWFuIGNvbnN0YW50CisvLyBJbnZvY2F0aW9uOiBfX3NlbGVjdDxfQ29uZCwgVCwgVT46OlJlc3VsdAorLy8gd2hlcmU6CisvLyBmbGFnIGlzIGEgY29tcGlsZS10aW1lIGJvb2xlYW4gY29uc3RhbnQKKy8vIFQgYW5kIFUgYXJlIHR5cGVzCisvLyBSZXN1bHQgZXZhbHVhdGVzIHRvIFQgaWYgZmxhZyBpcyB0cnVlLCBhbmQgdG8gVSBvdGhlcndpc2UuCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQkVXQVJFOiBJZiB0aGUgY29tcGlsZXIgZG8gbm90IHN1cHBvcnQgcGFydGlhbCB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBvciBuZXN0ZWQgdGVtcGxhdGUKKy8vY2xhc3NlcyB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGUgX19zZWxlY3QgaXMgdG8gY29uc2lkZXIgdGhlIGNvbmRpdGlvbiBhcyBmYWxzZSBhbmQgc28gcmV0dXJuCisvL3RoZSBzZWNvbmQgdGVtcGxhdGUgdHlwZSEhCisKKyNpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQordGVtcGxhdGUgPGJvb2wgX0NvbmQsIGNsYXNzIF9UcDEsIGNsYXNzIF9UcDI+CitzdHJ1Y3QgX19zZWxlY3QgeyB0eXBlZGVmIF9UcDEgX1JldDsgfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcDEsIGNsYXNzIF9UcDI+CitzdHJ1Y3QgX19zZWxlY3Q8ZmFsc2UsIF9UcDEsIF9UcDI+IHsgdHlwZWRlZiBfVHAyIF9SZXQ7IH07CisKKyMgIGlmIGRlZmluZWQgKF9fQk9STEFORENfXykKK3RlbXBsYXRlIDxjbGFzcyBfQ29uZFQsIGNsYXNzIF9UcDEsIGNsYXNzIF9UcDI+CitzdHJ1Y3QgX19zZWxlY3RUIHsgdHlwZWRlZiBfVHAxIF9SZXQ7IH07CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAxLCBjbGFzcyBfVHAyPgorc3RydWN0IF9fc2VsZWN0VDxfX2ZhbHNlX3R5cGUsIF9UcDEsIF9UcDI+IHsgdHlwZWRlZiBfVHAyIF9SZXQ7IH07CisjICBlbmRpZgorCisjZWxzZSAvKiBfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OICovCisKKyMgIGlmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURV9DTEFTU0VTKQordGVtcGxhdGUgPGludCBfQ29uZD4KK3N0cnVjdCBfX3NlbGVjdF9hdXggeworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwMSwgY2xhc3MgX1RwMj4KKyAgc3RydWN0IF9JbiB7CisgICAgdHlwZWRlZiBfVHAxIF9SZXQ7CisgIH07Cit9OworCitfU1RMUF9URU1QTEFURV9OVUxMCitzdHJ1Y3QgX19zZWxlY3RfYXV4PDA+IHsKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcDEsIGNsYXNzIF9UcDI+CisgIHN0cnVjdCBfSW4geworICAgIHR5cGVkZWYgX1RwMiBfUmV0OworICB9OworfTsKKwordGVtcGxhdGUgPGludCBfQ29uZCwgY2xhc3MgX1RwMSwgY2xhc3MgX1RwMj4KK3N0cnVjdCBfX3NlbGVjdCB7CisgIHR5cGVkZWYgdHlwZW5hbWUgX19zZWxlY3RfYXV4PF9Db25kPjo6X1NUTFBfVEVNUExBVEUgX0luPF9UcDEsIF9UcDI+OjpfUmV0IF9SZXQ7Cit9OworIyAgZWxzZSAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVfQ0xBU1NFUyAqLworLy9kZWZhdWx0IGJlaGF2aW9yCit0ZW1wbGF0ZSA8aW50IF9Db25kLCBjbGFzcyBfVHAxLCBjbGFzcyBfVHAyPgorc3RydWN0IF9fc2VsZWN0IHsKKyAgdHlwZWRlZiBfVHAyIF9SZXQ7Cit9OworIyAgZW5kaWYgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFX0NMQVNTRVMgKi8KKworI2VuZGlmIC8qIF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04gKi8KKworI2lmIGRlZmluZWQgKF9TVExQX1NJTVVMQVRFX1BBUlRJQUxfU1BFQ19GT1JfVFlQRV9UUkFJVFMpCisvLyBCb3JpcyA6IHNpbXVsYXRpb24gdGVjaG5pcXVlIGlzIHVzZWQgaGVyZSBhY2NvcmRpbmcgdG8gQWRvYmUgT3BlbiBTb3VyY2UgTGljZW5zZSBWZXJzaW9uIDEuMC4KKy8vIENvcHlyaWdodCAyMDAwIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBBdXRob3JzOiBNYXQgTWFyY3VzIGFuZCBKZXNzZSBKb25lcworLy8gVGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhpcyBzb3VyY2UgY29kZSBtYXkgYmUgZm91bmQgYXQKKy8vIGh0dHA6Ly9vcGVuc291cmNlLmFkb2JlLmNvbS4KKworLy8gVGhlc2UgYXJlIHRoZSBkaXNjcmltaW5hdGluZyBmdW5jdGlvbnMKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitjaGFyIF9TVExQX0NBTEwgX0lzU2FtZUZ1bihib29sLCBfVHAgY29uc3Qgdm9sYXRpbGUqLCBfVHAgY29uc3Qgdm9sYXRpbGUqKTsgLy8gbm8gaW1wbGVtZW50YXRpb24gaXMgcmVxdWlyZWQKK2NoYXIqIF9TVExQX0NBTEwgX0lzU2FtZUZ1bihib29sLCAuLi4pOyAgICAgICAvLyBubyBpbXBsZW1lbnRhdGlvbiBpcyByZXF1aXJlZAorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwMSwgY2xhc3MgX1RwMj4KK3N0cnVjdCBfSXNTYW1lIHsKKyAgc3RhdGljIF9UcDEqIF9fbnVsbF9yZXAxKCk7CisgIHN0YXRpYyBfVHAyKiBfX251bGxfcmVwMigpOworICBlbnVtIHsgX1JldCA9IChzaXplb2YoX0lzU2FtZUZ1bihmYWxzZSxfX251bGxfcmVwMSgpLCBfX251bGxfcmVwMigpKSkgPT0gc2l6ZW9mKGNoYXIpKSB9OworICB0eXBlZGVmIHR5cGVuYW1lIF9fYm9vbDJ0eXBlPF9SZXQ+OjpfUmV0IF9SZXRUOworfTsKKworI2Vsc2UKKwordGVtcGxhdGUgPGNsYXNzIF9UcDEsIGNsYXNzIF9UcDI+CitzdHJ1Y3QgX0lzU2FtZUF1eCB7CisgIHR5cGVkZWYgX19mYWxzZV90eXBlIF9SZXRUOworICBlbnVtIHsgX1JldCA9IDAgfTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX1VuQ29uc3RUeXBlIHsgdHlwZWRlZiBfVHAgX1R5cGU7IH07CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX1VuVm9sYXRpbGVUeXBlIHsgdHlwZWRlZiBfVHAgX1R5cGU7IH07CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX1VuQ1ZUeXBlIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfVW5Wb2xhdGlsZVR5cGU8X1RwPjo6X1R5cGUgX1VuVlR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1VuQ29uc3RUeXBlPF9VblZUeXBlPjo6X1R5cGUgX1R5cGU7Cit9OworCisjICBpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfSXNTYW1lQXV4PF9UcCwgX1RwPiB7CisgIHR5cGVkZWYgX190cnVlX3R5cGUgX1JldFQ7CisgIGVudW0geyBfUmV0ID0gMSB9OworfTsKKworIyAgICBpZiAhZGVmaW5lZCAoX1NUTFBfUVVBTElGSUVEX1NQRUNJQUxJWkFUSU9OX0JVRykKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX1VuQ29uc3RUeXBlPGNvbnN0IF9UcD4geyB0eXBlZGVmIF9UcCBfVHlwZTsgfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfVW5Wb2xhdGlsZVR5cGU8dm9sYXRpbGUgX1RwPiB7IHR5cGVkZWYgX1RwIF9UeXBlOyB9OworIyAgICBlbmRpZgorCisjICAgIGlmIGRlZmluZWQoX19CT1JMQU5EQ19fKQordGVtcGxhdGU8Y2xhc3MgX1RwPgorc3RydWN0IF9VbkNvbnN0UHRyIHsgdHlwZWRlZiBfVHAgX1R5cGU7IH07CisKK3RlbXBsYXRlPGNsYXNzIF9UcD4KK3N0cnVjdCBfVW5Db25zdFB0cjxfVHAqPiB7IHR5cGVkZWYgX1RwIF9UeXBlOyB9OworCit0ZW1wbGF0ZTxjbGFzcyBfVHA+CitzdHJ1Y3QgX1VuQ29uc3RQdHI8Y29uc3QgX1RwKj4geyB0eXBlZGVmIF9UcCBfVHlwZTsgfTsKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAxLCBjbGFzcyBfVHAyPgorc3RydWN0IF9Jc1NhbWUgeworICB0eXBlZGVmIHR5cGVuYW1lIF9VbkNWVHlwZTxfVHAxPjo6X1R5cGUgX1R5cGUxOworICB0eXBlZGVmIHR5cGVuYW1lIF9VbkNWVHlwZTxfVHAyPjo6X1R5cGUgX1R5cGUyOworCisgIHR5cGVkZWYgX0lzU2FtZUF1eDxfVHlwZTEsIF9UeXBlMj4gX0F1eDsKKyAgZW51bSB7IF9SZXQgPSBfQXV4OjpfUmV0IH07CisgIHR5cGVkZWYgdHlwZW5hbWUgX0F1eDo6X1JldFQgX1JldFQ7Cit9OworI2VuZGlmCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIHN0cnVjdCB3aWxsIHRlbGwgeW91IGlmIDIgdHlwZXMgYXJlIHRoZSBzYW1lLCB0aGUgbGltaXRhdGlvbnMgYXJlOgorICogIC0gaXQgY29tcGFyZXMgdGhlIHR5cGVzIHdpdGhvdXQgdGhlIGNvbnN0IG9yIHZvbGF0aWxlIHF1YWxpZmllcnMsIGludCBhbmQgY29uc3QgaW50CisgKiAgICB3aWxsIGJlIGNvbnNpZGVyZWQgYXMgc2FtZSBmb3IgaW5zdGFuY2UuCisgKiAgLSB0aGUgcHJldmlvdXMgcmVtYXJrcyBkbyBub3QgYXBwbHkgdG8gcG9pbnRlciB0eXBlcywgaW50KiBhbmQgaW50IGNvbnN0KiB3b24ndCBiZQorICogICAgY29uc2lkZXJlZCBhcyBjb21wYXJhYmxlLiAoaW50ICogYW5kIGludCAqY29uc3QgYXJlKS4KKyAqLwordGVtcGxhdGUgPGNsYXNzIF9UcDEsIGNsYXNzIF9UcDI+CitzdHJ1Y3QgX0FyZVNhbWVVbkNWVHlwZXMgeworICBlbnVtIHsgX1NhbWUgPSBfSXNTYW1lPF9UcDEsIF9UcDI+OjpfUmV0IH07CisgIHR5cGVkZWYgdHlwZW5hbWUgX0lzU2FtZTxfVHAxLCBfVHAyPjo6X1JldFQgX1JldDsKK307CisKKy8qIFJhdGhlciB0aGFuIGludHJvZHVjaW5nIGEgbmV3IG1hY3JvIGZvciB0aGUgZm9sbG93aW5nIGNvbnN0cnV0aW9uIHdlIHVzZQorICogYW4gZXhpc3Rpbmcgb25lIChfU1RMUF9ET05UX1NJTVVMQVRFX1BBUlRJQUxfU1BFQ19GT1JfVFlQRV9UUkFJVFMpIHRoYXQKKyAqIGlzIHVzZWQgZm9yIGEgc2ltaWxhciBmZWF0dXJlLgorICovCisjaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfU0lNVUxBVEVfUEFSVElBTF9TUEVDX0ZPUl9UWVBFX1RSQUlUUykKK3RlbXBsYXRlIDxjbGFzcyBfU3JjLCBjbGFzcyBfRHN0Pgorc3RydWN0IF9Db252ZXJzaW9uSGVscGVyIHsKKyAgc3RhdGljIGNoYXIgX1Rlc3QoYm9vbCwgX0RzdCk7CisgIHN0YXRpYyBjaGFyKiBfVGVzdChib29sLCAuLi4pOworICBzdGF0aWMgX1NyYyBfTWFrZVNvdXJjZSgpOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9TcmMsIGNsYXNzIF9Ec3Q+CitzdHJ1Y3QgX0lzQ29udmVydGlibGUgeworICB0eXBlZGVmIF9Db252ZXJzaW9uSGVscGVyPF9TcmMqLCBjb25zdCB2b2xhdGlsZSBfRHN0Kj4gX0g7CisgIGVudW0geyB2YWx1ZSA9IChzaXplb2YoY2hhcikgPT0gc2l6ZW9mKF9IOjpfVGVzdChmYWxzZSwgX0g6Ol9NYWtlU291cmNlKCkpKSkgfTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX2Jvb2wydHlwZTx2YWx1ZT46Ol9SZXQgX1JldDsKK307CisKKy8qIFRoaXMgc3RydWN0IGlzIGludGVuZGVkIHRvIHNheSBpZiBhIHBvaW50ZXIgY2FuIGJlIGNvbnZlcnRpYmxlIHRvIGFuIG90aGVyCisgKiB0YWtpbmcgaW50byBhY2NvdW50IGN2IHF1YWxpZmljYXRpb25zLiBJdCBzaG91bGRuJ3QgYmUgaW5zdGFuY2lhdGVkIHdpdGgKKyAqIHNvbWV0aGluZyBlbHNlIHRoYW4gcG9pbnRlciB0eXBlIGFzIGl0IHVzZXMgcGFzcyBieSB2YWx1ZSBwYXJhbWV0ZXIgdGhhdAorICogcmVzdWx0cyBpbiBjb21waWxhdGlvbiBlcnJvciB3aGVuIHBhcmFtZXRlciB0eXBlIGhhcyBhIHNwZWNpYWwgbWVtb3J5CisgKiBhbGlnbm1lbnQKKyAqLwordGVtcGxhdGUgPGNsYXNzIF9TcmMsIGNsYXNzIF9Ec3Q+CitzdHJ1Y3QgX0lzQ1ZDb252ZXJ0aWJsZSB7CisjaWYgIWRlZmluZWQgKF9fQk9STEFORENfXykKKyAgdHlwZWRlZiBfQ29udmVyc2lvbkhlbHBlcjxfU3JjLCBfRHN0PiBfSDsKKyAgZW51bSB7IHZhbHVlID0gKHNpemVvZihjaGFyKSA9PSBzaXplb2YoX0g6Ol9UZXN0KGZhbHNlLCBfSDo6X01ha2VTb3VyY2UoKSkpKSB9OworI2Vsc2UKKyAgZW51bSB7IF9JczEgPSBfX3R5cGUyYm9vbDxfSXNDb25zdDxfU3JjPjo6X1JldD46Ol9SZXQgfTsKKyAgZW51bSB7IF9JczIgPSBfSXNDb252ZXJ0aWJsZTxfVW5Db25zdFB0cjxfU3JjPjo6X1R5cGUsIF9VbkNvbnN0UHRyPF9Ec3Q+OjpfVHlwZT46OnZhbHVlIH07CisgIGVudW0geyB2YWx1ZSA9IF9JczEgPyAwIDogX0lzMiB9OworI2VuZGlmCisgIHR5cGVkZWYgdHlwZW5hbWUgX19ib29sMnR5cGU8dmFsdWU+OjpfUmV0IF9SZXQ7Cit9OworCisjZWxzZQordGVtcGxhdGUgPGNsYXNzIF9TcmMsIGNsYXNzIF9Ec3Q+CitzdHJ1Y3QgX0lzQ29udmVydGlibGUgeworICBlbnVtIHt2YWx1ZSA9IDB9OworICB0eXBlZGVmIF9fZmFsc2VfdHlwZSBfUmV0OworfTsKKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9Jc0NvbnN0IHsgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgX1JldDsgfTsKKworI2lmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pICYmICFkZWZpbmVkIChfU1RMUF9RVUFMSUZJRURfU1BFQ0lBTElaQVRJT05fQlVHKQordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfSXNDb25zdCA8Y29uc3QgX1RwPiB7IHR5cGVkZWYgX190cnVlX3R5cGUgX1JldDsgfTsKKyNlbmRpZgorCisjICBpZiBkZWZpbmVkKF9fQk9STEFORENfXykKK3RlbXBsYXRlPGNsYXNzIF9UcD4KK3N0cnVjdCBfSXNDb25zdCA8Y29uc3QgX1RwKj4geyB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9SZXQ7IH07CisKK3RlbXBsYXRlPGNsYXNzIF9UcD4KK3N0cnVjdCBfSXNDb25zdCA8Y29uc3Qgdm9sYXRpbGUgX1RwKj4geyB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9SZXQ7IH07CisjICBlbmRpZgorCitfU1RMUF9FTkRfTkFNRVNQQUNFCisKKyNlbmRpZiAvKiBfU1RMUF9UWVBFX01BTklQU19IICovCmRpZmYgLS1naXQgYS9zdGwvdHlwZV90cmFpdHMuaCBiL3N0bC90eXBlX3RyYWl0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3YmM2OWYKLS0tIC9kZXYvbnVsbAorKysgYi9zdGwvdHlwZV90cmFpdHMuaApAQCAtMCwwICsxLDU3NyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBNb3Njb3cgQ2VudGVyIGZvciBTUEFSQyBUZWNobm9sb2d5CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmbmRlZiBfU1RMUF9UWVBFX1RSQUlUU19ICisjZGVmaW5lIF9TVExQX1RZUEVfVFJBSVRTX0gKKworLyoKK1RoaXMgaGVhZGVyIGZpbGUgcHJvdmlkZXMgYSBmcmFtZXdvcmsgZm9yIGFsbG93aW5nIGNvbXBpbGUgdGltZSBkaXNwYXRjaAorYmFzZWQgb24gdHlwZSBhdHRyaWJ1dGVzLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHdyaXRpbmcgdGVtcGxhdGUgY29kZS4KK0ZvciBleGFtcGxlLCB3aGVuIG1ha2luZyBhIGNvcHkgb2YgYW4gYXJyYXkgb2YgYW4gdW5rbm93biB0eXBlLCBpdCBoZWxwcwordG8ga25vdyBpZiB0aGUgdHlwZSBoYXMgYSB0cml2aWFsIGNvcHkgY29uc3RydWN0b3Igb3Igbm90LCB0byBoZWxwIGRlY2lkZQoraWYgYSBtZW1jcHkgY2FuIGJlIHVzZWQuCisKK1RoZSBjbGFzcyB0ZW1wbGF0ZSBfX3R5cGVfdHJhaXRzIHByb3ZpZGVzIGEgc2VyaWVzIG9mIHR5cGVkZWZzIGVhY2ggb2YKK3doaWNoIGlzIGVpdGhlciBfX3RydWVfdHlwZSBvciBfX2ZhbHNlX3R5cGUuIFRoZSBhcmd1bWVudCB0bworX190eXBlX3RyYWl0cyBjYW4gYmUgYW55IHR5cGUuIFRoZSB0eXBlZGVmcyB3aXRoaW4gdGhpcyB0ZW1wbGF0ZSB3aWxsCithdHRhaW4gdGhlaXIgY29ycmVjdCB2YWx1ZXMgYnkgb25lIG9mIHRoZXNlIG1lYW5zOgorICAgIDEuIFRoZSBnZW5lcmFsIGluc3RhbnRpYXRpb24gY29udGFpbiBjb25zZXJ2YXRpdmUgdmFsdWVzIHdoaWNoIHdvcmsKKyAgICAgICBmb3IgYWxsIHR5cGVzLgorICAgIDIuIFNwZWNpYWxpemF0aW9ucyBtYXkgYmUgZGVjbGFyZWQgdG8gbWFrZSBkaXN0aW5jdGlvbnMgYmV0d2VlbiB0eXBlcy4KKyAgICAzLiBTb21lIGNvbXBpbGVycyAoc3VjaCBhcyB0aGUgU2lsaWNvbiBHcmFwaGljcyBOMzIgYW5kIE42NCBjb21waWxlcnMpCisgICAgICAgd2lsbCBhdXRvbWF0aWNhbGx5IHByb3ZpZGUgdGhlIGFwcHJvcHJpYXRlIHNwZWNpYWxpemF0aW9ucyBmb3IgYWxsCisgICAgICAgdHlwZXMuCisKK0VYQU1QTEU6CisKKy8vQ29weSBhbiBhcnJheSBvZiBlbGVtZW50cyB3aGljaCBoYXZlIG5vbi10cml2aWFsIGNvcHkgY29uc3RydWN0b3JzCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gdm9pZCBjb3B5KFQqIHNvdXJjZSwgVCogZGVzdGluYXRpb24sIGludCBuLCBfX2ZhbHNlX3R5cGUpOworLy9Db3B5IGFuIGFycmF5IG9mIGVsZW1lbnRzIHdoaWNoIGhhdmUgdHJpdmlhbCBjb3B5IGNvbnN0cnVjdG9ycy4gVXNlIG1lbWNweS4KK3RlbXBsYXRlIDxjbGFzcyBUPiB2b2lkIGNvcHkoVCogc291cmNlLCBUKiBkZXN0aW5hdGlvbiwgaW50IG4sIF9fdHJ1ZV90eXBlKTsKKworLy9Db3B5IGFuIGFycmF5IG9mIGFueSB0eXBlIGJ5IHVzaW5nIHRoZSBtb3N0IGVmZmljaWVudCBjb3B5IG1lY2hhbmlzbQordGVtcGxhdGUgPGNsYXNzIFQ+IGlubGluZSB2b2lkIGNvcHkoVCogc291cmNlLFQqIGRlc3RpbmF0aW9uLGludCBuKSB7CisgICBjb3B5KHNvdXJjZSwgZGVzdGluYXRpb24sIG4sCisgICAgICAgIHR5cGVuYW1lIF9fdHlwZV90cmFpdHM8VD46Omhhc190cml2aWFsX2NvcHlfY29uc3RydWN0b3IoKSk7Cit9CisqLworCisjaWZkZWYgX19XQVRDT01DX18KKyMgIGluY2x1ZGUgPHN0bC9fY3djaGFyLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9UWVBFX01BTklQU19ICisjICBpbmNsdWRlIDxzdGwvdHlwZV9tYW5pcHMuaD4KKyNlbmRpZgorCisjaWZkZWYgX1NUTFBfVVNFX0JPT1NUX1NVUFBPUlQKKyMgIGluY2x1ZGUgPHN0bC9ib29zdF90eXBlX3RyYWl0cy5oPgorIyAgaW5jbHVkZSA8Ym9vc3QvdHlwZV90cmFpdHMvYWRkX3JlZmVyZW5jZS5ocHA+CisjICBpbmNsdWRlIDxib29zdC90eXBlX3RyYWl0cy9hZGRfY29uc3QuaHBwPgorI2VuZGlmIC8qIF9TVExQX1VTRV9CT09TVF9TVVBQT1JUICovCisKK19TVExQX0JFR0lOX05BTUVTUEFDRQorCisjaWYgIWRlZmluZWQgKF9TVExQX1VTRV9CT09TVF9TVVBQT1JUKQorCisvLyBUaGUgZm9sbG93aW5nIGNvdWxkIGJlIHdyaXR0ZW4gaW4gdGVybXMgb2YgbnVtZXJpY19saW1pdHMuCisvLyBXZSdyZSBkb2luZyBpdCBzZXBhcmF0ZWx5IHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGRlcGVuZGVuY2llcy4KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IF9Jc0ludGVncmFsCit7IHR5cGVkZWYgX19mYWxzZV90eXBlIF9SZXQ7IH07CisKKyMgIGlmbmRlZiBfU1RMUF9OT19CT09MCitfU1RMUF9URU1QTEFURV9OVUxMIHN0cnVjdCBfSXNJbnRlZ3JhbDxib29sPgoreyB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9SZXQ7IH07CisjICBlbmRpZiAvKiBfU1RMUF9OT19CT09MICovCisKK19TVExQX1RFTVBMQVRFX05VTEwgc3RydWN0IF9Jc0ludGVncmFsPGNoYXI+Cit7IHR5cGVkZWYgX190cnVlX3R5cGUgX1JldDsgfTsKKworIyAgaWZuZGVmIF9TVExQX05PX1NJR05FRF9CVUlMVElOUworX1NUTFBfVEVNUExBVEVfTlVMTCBzdHJ1Y3QgX0lzSW50ZWdyYWw8c2lnbmVkIGNoYXI+Cit7IHR5cGVkZWYgX190cnVlX3R5cGUgX1JldDsgfTsKKyMgIGVuZGlmCisKK19TVExQX1RFTVBMQVRFX05VTEwgc3RydWN0IF9Jc0ludGVncmFsPHVuc2lnbmVkIGNoYXI+Cit7IHR5cGVkZWYgX190cnVlX3R5cGUgX1JldDsgfTsKKworIyAgaWYgZGVmaW5lZCAoIF9TVExQX0hBU19XQ0hBUl9UICkgJiYgISBkZWZpbmVkIChfU1RMUF9XQ0hBUl9UX0lTX1VTSE9SVCkKK19TVExQX1RFTVBMQVRFX05VTEwgc3RydWN0IF9Jc0ludGVncmFsPHdjaGFyX3Q+Cit7IHR5cGVkZWYgX190cnVlX3R5cGUgX1JldDsgfTsKKyMgIGVuZGlmIC8qIF9TVExQX0hBU19XQ0hBUl9UICovCisKK19TVExQX1RFTVBMQVRFX05VTEwgc3RydWN0IF9Jc0ludGVncmFsPHNob3J0PgoreyB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9SZXQ7IH07CisKK19TVExQX1RFTVBMQVRFX05VTEwgc3RydWN0IF9Jc0ludGVncmFsPHVuc2lnbmVkIHNob3J0PgoreyB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9SZXQ7IH07CisKK19TVExQX1RFTVBMQVRFX05VTEwgc3RydWN0IF9Jc0ludGVncmFsPGludD4KK3sgdHlwZWRlZiBfX3RydWVfdHlwZSBfUmV0OyB9OworCitfU1RMUF9URU1QTEFURV9OVUxMIHN0cnVjdCBfSXNJbnRlZ3JhbDx1bnNpZ25lZCBpbnQ+Cit7IHR5cGVkZWYgX190cnVlX3R5cGUgX1JldDsgfTsKKworX1NUTFBfVEVNUExBVEVfTlVMTCBzdHJ1Y3QgX0lzSW50ZWdyYWw8bG9uZz4KK3sgdHlwZWRlZiBfX3RydWVfdHlwZSBfUmV0OyB9OworCitfU1RMUF9URU1QTEFURV9OVUxMIHN0cnVjdCBfSXNJbnRlZ3JhbDx1bnNpZ25lZCBsb25nPgoreyB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9SZXQ7IH07CisKKyMgIGlmZGVmIF9TVExQX0xPTkdfTE9ORworX1NUTFBfVEVNUExBVEVfTlVMTCBzdHJ1Y3QgX0lzSW50ZWdyYWw8X1NUTFBfTE9OR19MT05HPgoreyB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9SZXQ7IH07CisKK19TVExQX1RFTVBMQVRFX05VTEwgc3RydWN0IF9Jc0ludGVncmFsPHVuc2lnbmVkIF9TVExQX0xPTkdfTE9ORz4KK3sgdHlwZWRlZiBfX3RydWVfdHlwZSBfUmV0OyB9OworIyAgZW5kaWYgLyogX1NUTFBfTE9OR19MT05HICovCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCBfSXNSYXRpb25hbAoreyB0eXBlZGVmIF9fZmFsc2VfdHlwZSBfUmV0OyB9OworCitfU1RMUF9URU1QTEFURV9OVUxMIHN0cnVjdCBfSXNSYXRpb25hbDxmbG9hdD4KK3sgdHlwZWRlZiBfX3RydWVfdHlwZSBfUmV0OyB9OworCitfU1RMUF9URU1QTEFURV9OVUxMIHN0cnVjdCBfSXNSYXRpb25hbDxkb3VibGU+Cit7IHR5cGVkZWYgX190cnVlX3R5cGUgX1JldDsgfTsKKworIyAgaWYgIWRlZmluZWQgKCBfU1RMUF9OT19MT05HX0RPVUJMRSApCitfU1RMUF9URU1QTEFURV9OVUxMIHN0cnVjdCBfSXNSYXRpb25hbDxsb25nIGRvdWJsZT4KK3sgdHlwZWRlZiBfX3RydWVfdHlwZSBfUmV0OyB9OworIyAgZW5kaWYKKworLy8gRm9yd2FyZCBkZWNsYXJhdGlvbnMuCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX190eXBlX3RyYWl0czsKK3RlbXBsYXRlIDxjbGFzcyBfSXNQT0Q+IHN0cnVjdCBfX3R5cGVfdHJhaXRzX2F1eCB7CisgICB0eXBlZGVmIF9fZmFsc2VfdHlwZSAgICBoYXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yOworICAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgICAgaGFzX3RyaXZpYWxfY29weV9jb25zdHJ1Y3RvcjsKKyAgIHR5cGVkZWYgX19mYWxzZV90eXBlICAgIGhhc190cml2aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3I7CisgICB0eXBlZGVmIF9fZmFsc2VfdHlwZSAgICBoYXNfdHJpdmlhbF9kZXN0cnVjdG9yOworICAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgICAgaXNfUE9EX3R5cGU7Cit9OworCitfU1RMUF9URU1QTEFURV9OVUxMCitzdHJ1Y3QgX190eXBlX3RyYWl0c19hdXg8X19mYWxzZV90eXBlPiB7CisgICB0eXBlZGVmIF9fZmFsc2VfdHlwZSAgICBoYXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yOworICAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgICAgaGFzX3RyaXZpYWxfY29weV9jb25zdHJ1Y3RvcjsKKyAgIHR5cGVkZWYgX19mYWxzZV90eXBlICAgIGhhc190cml2aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3I7CisgICB0eXBlZGVmIF9fZmFsc2VfdHlwZSAgICBoYXNfdHJpdmlhbF9kZXN0cnVjdG9yOworICAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgICAgaXNfUE9EX3R5cGU7Cit9OworCitfU1RMUF9URU1QTEFURV9OVUxMCitzdHJ1Y3QgX190eXBlX3RyYWl0c19hdXg8X190cnVlX3R5cGU+IHsKKyAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yOworICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2NvcHlfY29uc3RydWN0b3I7CisgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfYXNzaWdubWVudF9vcGVyYXRvcjsKKyAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9kZXN0cnVjdG9yOworICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGlzX1BPRF90eXBlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfSXNSZWYgeworICB0eXBlZGVmIF9fZmFsc2VfdHlwZSBfUmV0OworfTsKKworIyAgaWYgZGVmaW5lZCAoX1NUTFBfU0lNVUxBVEVfUEFSVElBTF9TUEVDX0ZPUl9UWVBFX1RSQUlUUykKKy8qCisgKiBCb3JpcyA6IHNpbXVsYXRpb24gdGVjaG5pcXVlIGlzIHVzZWQgaGVyZSBhY2NvcmRpbmcgdG8gQWRvYmUgT3BlbiBTb3VyY2UgTGljZW5zZSBWZXJzaW9uIDEuMC4KKyAqIENvcHlyaWdodCAyMDAwIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBBdXRob3JzOiBNYXQgTWFyY3VzIGFuZCBKZXNzZSBKb25lcworICogVGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhpcyBzb3VyY2UgY29kZSBtYXkgYmUgZm91bmQgYXQKKyAqIGh0dHA6Ly9vcGVuc291cmNlLmFkb2JlLmNvbS4KKyAqLworCitzdHJ1Y3QgX1BvaW50ZXJTaGltIHsKKyAgLyoKKyAgICogU2luY2UgdGhlIGNvbXBpbGVyIG9ubHkgYWxsb3dzIGF0IG1vc3Qgb25lIG5vbi10cml2aWFsCisgICAqIGltcGxpY2l0IGNvbnZlcnNpb24gd2UgY2FuIG1ha2UgdXNlIG9mIGEgc2hpbSBjbGFzcyB0bworICAgKiBiZSBzdXJlIHRoYXQgSXNQdHIgYmVsb3cgZG9lc24ndCBhY2NlcHQgY2xhc3NlcyB3aXRoCisgICAqIGltcGxpY2l0IHBvaW50ZXIgY29udmVyc2lvbiBvcGVyYXRvcnMKKyAgICovCisgIF9Qb2ludGVyU2hpbShjb25zdCB2b2xhdGlsZSB2b2lkKik7IC8vIG5vIGltcGxlbWVudGF0aW9uCit9OworCisvLyBUaGVzZSBhcmUgdGhlIGRpc2NyaW1pbmF0aW5nIGZ1bmN0aW9ucworY2hhciBfU1RMUF9DQUxMIF9Jc1AoYm9vbCwgX1BvaW50ZXJTaGltKTsgIC8vIG5vIGltcGxlbWVudGF0aW9uIGlzIHJlcXVpcmVkCitjaGFyKiBfU1RMUF9DQUxMIF9Jc1AoYm9vbCwgLi4uKTsgICAgICAgICAgLy8gbm8gaW1wbGVtZW50YXRpb24gaXMgcmVxdWlyZWQKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfSXNQdHIgeworICAvKgorICAgKiBUaGlzIHRlbXBsYXRlIG1ldGEgZnVuY3Rpb24gdGFrZXMgYSB0eXBlIFQKKyAgICogYW5kIHJldHVybnMgdHJ1ZSBleGFjdGx5IHdoZW4gVCBpcyBhIHBvaW50ZXIuCisgICAqIE9uZSBjYW4gaW1hZ2luZSBtZXRhLWZ1bmN0aW9ucyBkaXNjcmltaW5hdGluZyBvbgorICAgKiBvdGhlciBjcml0ZXJpYS4KKyAgICovCisgIHN0YXRpYyBfVHAmIF9fbnVsbF9yZXAoKTsKKyAgZW51bSB7IF9QdHIgPSAoc2l6ZW9mKF9Jc1AoZmFsc2UsX19udWxsX3JlcCgpKSkgPT0gc2l6ZW9mKGNoYXIpKSB9OworICB0eXBlZGVmIHR5cGVuYW1lIF9fYm9vbDJ0eXBlPF9QdHI+OjpfUmV0IF9SZXQ7CisKK307CisKKy8vIHdlIG1ha2UgZ2VuZXJhbCBjYXNlIGRlcGVuZGFudCBvbiB0aGUgZmFjdCB0aGUgdHlwZSBpcyBhY3R1YWxseSBhIHBvaW50ZXIuCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9fdHlwZV90cmFpdHMgOiBfX3R5cGVfdHJhaXRzX2F1eDx0eXBlbmFtZSBfSXNQdHI8X1RwPjo6X1JldD4ge307CisKKyMgIGVsc2UgLyogX1NUTFBfU0lNVUxBVEVfUEFSVElBTF9TUEVDX0ZPUl9UWVBFX1RSQUlUUyAqLworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiAgc3RydWN0IF9Jc1B0ciB7CisgIHR5cGVkZWYgX19mYWxzZV90eXBlIF9SZXQ7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9fdHlwZV90cmFpdHMgeworICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICAgdGhpc19kdW1teV9tZW1iZXJfbXVzdF9iZV9maXJzdDsKKyAgICAgICAgICAgICAgICAgICAvKiBEbyBub3QgcmVtb3ZlIHRoaXMgbWVtYmVyLiBJdCBpbmZvcm1zIGEgY29tcGlsZXIgd2hpY2gKKyAgICAgICAgICAgICAgICAgICAgICBhdXRvbWF0aWNhbGx5IHNwZWNpYWxpemVzIF9fdHlwZV90cmFpdHMgdGhhdCB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgX190eXBlX3RyYWl0cyB0ZW1wbGF0ZSBpcyBzcGVjaWFsLiBJdCBqdXN0IG1ha2VzIHN1cmUgdGhhdAorICAgICAgICAgICAgICAgICAgICAgIHRoaW5ncyB3b3JrIGlmIGFuIGltcGxlbWVudGF0aW9uIGlzIHVzaW5nIGEgdGVtcGxhdGUKKyAgICAgICAgICAgICAgICAgICAgICBjYWxsZWQgX190eXBlX3RyYWl0cyBmb3Igc29tZXRoaW5nIHVucmVsYXRlZC4gKi8KKworICAgLyogVGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnMgc2hvdWxkIGJlIG9ic2VydmVkIGZvciB0aGUgc2FrZSBvZgorICAgICAgY29tcGlsZXJzIHdoaWNoIGF1dG9tYXRpY2FsbHkgcHJvZHVjZSB0eXBlIHNwZWNpZmljIHNwZWNpYWxpemF0aW9ucworICAgICAgb2YgdGhpcyBjbGFzczoKKyAgICAgICAgICAtIFlvdSBtYXkgcmVvcmRlciB0aGUgbWVtYmVycyBiZWxvdyBpZiB5b3Ugd2lzaAorICAgICAgICAgIC0gWW91IG1heSByZW1vdmUgYW55IG9mIHRoZSBtZW1iZXJzIGJlbG93IGlmIHlvdSB3aXNoCisgICAgICAgICAgLSBZb3UgbXVzdCBub3QgcmVuYW1lIG1lbWJlcnMgd2l0aG91dCBtYWtpbmcgdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAgICAgICAgIG5hbWUgY2hhbmdlIGluIHRoZSBjb21waWxlcgorICAgICAgICAgIC0gTWVtYmVycyB5b3UgYWRkIHdpbGwgYmUgdHJlYXRlZCBsaWtlIHJlZ3VsYXIgbWVtYmVycyB1bmxlc3MKKworICAgICAgICAgICAgeW91IGFkZCB0aGUgYXBwcm9wcmlhdGUgc3VwcG9ydCBpbiB0aGUgY29tcGlsZXIuICovCisjICBpZiAhZGVmaW5lZCAoX1NUTFBfSEFTX1RZUEVfVFJBSVRTX0lOVFJJTlNJQ1MpCisgICB0eXBlZGVmIF9fZmFsc2VfdHlwZSAgICBoYXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yOworICAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgICAgaGFzX3RyaXZpYWxfY29weV9jb25zdHJ1Y3RvcjsKKyAgIHR5cGVkZWYgX19mYWxzZV90eXBlICAgIGhhc190cml2aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3I7CisgICB0eXBlZGVmIF9fZmFsc2VfdHlwZSAgICBoYXNfdHJpdmlhbF9kZXN0cnVjdG9yOworICAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgICAgaXNfUE9EX3R5cGU7CisjICBlbHNlCisgICB0eXBlZGVmIHR5cGVuYW1lIF9fYm9vbDJ0eXBlPF9TVExQX0hBU19UUklWSUFMX0NPTlNUUlVDVE9SKF9UcCk+OjpfUmV0IGhhc190cml2aWFsX2RlZmF1bHRfY29uc3RydWN0b3I7CisgICB0eXBlZGVmIHR5cGVuYW1lIF9fYm9vbDJ0eXBlPF9TVExQX0hBU19UUklWSUFMX0NPUFkoX1RwKT46Ol9SZXQgaGFzX3RyaXZpYWxfY29weV9jb25zdHJ1Y3RvcjsKKyAgIHR5cGVkZWYgdHlwZW5hbWUgX19ib29sMnR5cGU8X1NUTFBfSEFTX1RSSVZJQUxfQVNTSUdOKF9UcCk+OjpfUmV0IGhhc190cml2aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3I7CisgICB0eXBlZGVmIHR5cGVuYW1lIF9fYm9vbDJ0eXBlPF9TVExQX0hBU19UUklWSUFMX0RFU1RSVUNUT1IoX1RwKT46Ol9SZXQgaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjsKKyAgIHR5cGVkZWYgdHlwZW5hbWUgX19ib29sMnR5cGU8X1NUTFBfSVNfUE9EKF9UcCk+OjpfUmV0IGlzX1BPRF90eXBlOworIyAgZW5kaWYKK307CisKKyMgICAgaWYgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCBfSXNQdHI8X1RwKj4KK3sgdHlwZWRlZiBfX3RydWVfdHlwZSBfUmV0OyB9OwordGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IF9Jc1JlZjxfVHAmPgoreyB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9SZXQ7IH07CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCBfX3R5cGVfdHJhaXRzPF9UcCo+IDogX190eXBlX3RyYWl0c19hdXg8X190cnVlX3R5cGU+Cit7fTsKKyMgICAgZW5kaWYgLyogX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTiAqLworCisjICBlbmRpZiAvKiBfU1RMUF9TSU1VTEFURV9QQVJUSUFMX1NQRUNfRk9SX1RZUEVfVFJBSVRTICovCisKKy8vIFByb3ZpZGUgc29tZSBzcGVjaWFsaXphdGlvbnMuICBUaGlzIGlzIGhhcm1sZXNzIGZvciBjb21waWxlcnMgdGhhdAorLy8gIGhhdmUgYnVpbHQtaW4gX190eXBlc190cmFpdHMgc3VwcG9ydCwgYW5kIGVzc2VudGlhbCBmb3IgY29tcGlsZXJzCisvLyAgdGhhdCBkb24ndC4KKyMgIGlmICFkZWZpbmVkIChfU1RMUF9RVUFMSUZJRURfU1BFQ0lBTElaQVRJT05fQlVHKQorIyAgICBkZWZpbmUgX1NUTFBfREVGSU5FX1RZUEVfVFJBSVRTX0ZPUihUeXBlKSBcCitfU1RMUF9URU1QTEFURV9OVUxMIHN0cnVjdCBfX3R5cGVfdHJhaXRzPCBUeXBlID4gOiBfX3R5cGVfdHJhaXRzX2F1eDxfX3RydWVfdHlwZT4ge307IFwKK19TVExQX1RFTVBMQVRFX05VTEwgc3RydWN0IF9fdHlwZV90cmFpdHM8IGNvbnN0IFR5cGUgPiA6IF9fdHlwZV90cmFpdHNfYXV4PF9fdHJ1ZV90eXBlPiB7fTsgXAorX1NUTFBfVEVNUExBVEVfTlVMTCBzdHJ1Y3QgX190eXBlX3RyYWl0czwgdm9sYXRpbGUgVHlwZSA+IDogX190eXBlX3RyYWl0c19hdXg8X190cnVlX3R5cGU+IHt9OyBcCitfU1RMUF9URU1QTEFURV9OVUxMIHN0cnVjdCBfX3R5cGVfdHJhaXRzPCBjb25zdCB2b2xhdGlsZSBUeXBlID4gOiBfX3R5cGVfdHJhaXRzX2F1eDxfX3RydWVfdHlwZT4ge30KKyMgIGVsc2UKKyMgICAgZGVmaW5lIF9TVExQX0RFRklORV9UWVBFX1RSQUlUU19GT1IoVHlwZSkgXAorX1NUTFBfVEVNUExBVEVfTlVMTCBzdHJ1Y3QgX190eXBlX3RyYWl0czwgVHlwZSA+IDogX190eXBlX3RyYWl0c19hdXg8X190cnVlX3R5cGU+IHt9OworIyAgZW5kaWYKKworIyAgaWZuZGVmIF9TVExQX05PX0JPT0wKK19TVExQX0RFRklORV9UWVBFX1RSQUlUU19GT1IoYm9vbCk7CisjICBlbmRpZiAvKiBfU1RMUF9OT19CT09MICovCitfU1RMUF9ERUZJTkVfVFlQRV9UUkFJVFNfRk9SKGNoYXIpOworIyAgaWZuZGVmIF9TVExQX05PX1NJR05FRF9CVUlMVElOUworX1NUTFBfREVGSU5FX1RZUEVfVFJBSVRTX0ZPUihzaWduZWQgY2hhcik7CisjICBlbmRpZgorX1NUTFBfREVGSU5FX1RZUEVfVFJBSVRTX0ZPUih1bnNpZ25lZCBjaGFyKTsKKyMgIGlmIGRlZmluZWQgKCBfU1RMUF9IQVNfV0NIQVJfVCApICYmICEgZGVmaW5lZCAoX1NUTFBfV0NIQVJfVF9JU19VU0hPUlQpCitfU1RMUF9ERUZJTkVfVFlQRV9UUkFJVFNfRk9SKHdjaGFyX3QpOworIyAgZW5kaWYgLyogX1NUTFBfSEFTX1dDSEFSX1QgKi8KKworX1NUTFBfREVGSU5FX1RZUEVfVFJBSVRTX0ZPUihzaG9ydCk7CitfU1RMUF9ERUZJTkVfVFlQRV9UUkFJVFNfRk9SKHVuc2lnbmVkIHNob3J0KTsKK19TVExQX0RFRklORV9UWVBFX1RSQUlUU19GT1IoaW50KTsKK19TVExQX0RFRklORV9UWVBFX1RSQUlUU19GT1IodW5zaWduZWQgaW50KTsKK19TVExQX0RFRklORV9UWVBFX1RSQUlUU19GT1IobG9uZyk7CitfU1RMUF9ERUZJTkVfVFlQRV9UUkFJVFNfRk9SKHVuc2lnbmVkIGxvbmcpOworCisjICBpZmRlZiBfU1RMUF9MT05HX0xPTkcKK19TVExQX0RFRklORV9UWVBFX1RSQUlUU19GT1IoX1NUTFBfTE9OR19MT05HKTsKK19TVExQX0RFRklORV9UWVBFX1RSQUlUU19GT1IodW5zaWduZWQgX1NUTFBfTE9OR19MT05HKTsKKyMgIGVuZGlmIC8qIF9TVExQX0xPTkdfTE9ORyAqLworCitfU1RMUF9ERUZJTkVfVFlQRV9UUkFJVFNfRk9SKGZsb2F0KTsKK19TVExQX0RFRklORV9UWVBFX1RSQUlUU19GT1IoZG91YmxlKTsKKworIyAgaWYgIWRlZmluZWQgKCBfU1RMUF9OT19MT05HX0RPVUJMRSApCitfU1RMUF9ERUZJTkVfVFlQRV9UUkFJVFNfRk9SKGxvbmcgZG91YmxlKTsKKyMgIGVuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQordGVtcGxhdGUgPGNsYXNzIF9BcmVQdHJzLCBjbGFzcyBfU3JjLCBjbGFzcyBfRHN0Pgorc3RydWN0IF9Jc0NWQ29udmVydGlibGVJZgoreyB0eXBlZGVmIHR5cGVuYW1lIF9Jc0NWQ29udmVydGlibGU8X1NyYywgX0RzdD46Ol9SZXQgX1JldDsgfTsKKwordGVtcGxhdGUgPGNsYXNzIF9TcmMsIGNsYXNzIF9Ec3Q+CitzdHJ1Y3QgX0lzQ1ZDb252ZXJ0aWJsZUlmPF9fZmFsc2VfdHlwZSwgX1NyYywgX0RzdD4KK3sgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgX1JldDsgfTsKKyNlbHNlCisjICBpZiBkZWZpbmVkIChfU1RMUF9NRU1CRVJfVEVNUExBVEVfQ0xBU1NFUykKK3RlbXBsYXRlIDxjbGFzcyBfQXJlUHRycz4KK3N0cnVjdCBfSXNDVkNvbnZlcnRpYmxlSWZBdXggeworICB0ZW1wbGF0ZSA8Y2xhc3MgX1NyYywgY2xhc3MgX0RzdD4KKyAgc3RydWN0IF9JbgorICB7IHR5cGVkZWYgdHlwZW5hbWUgX0lzQ1ZDb252ZXJ0aWJsZTxfU3JjLCBfRHN0Pjo6X1JldCBfUmV0OyB9OworfTsKKworX1NUTFBfVEVNUExBVEVfTlVMTAorc3RydWN0IF9Jc0NWQ29udmVydGlibGVJZkF1eDxfX2ZhbHNlX3R5cGU+IHsKKyAgdGVtcGxhdGUgPGNsYXNzIF9TcmMsIGNsYXNzIF9Ec3Q+CisgIHN0cnVjdCBfSW4KKyAgeyB0eXBlZGVmIF9fZmFsc2VfdHlwZSBfUmV0OyB9OworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9BcmVQdHJzLCBjbGFzcyBfU3JjLCBjbGFzcyBfRHN0Pgorc3RydWN0IF9Jc0NWQ29udmVydGlibGVJZiB7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0lzQ1ZDb252ZXJ0aWJsZUlmQXV4PF9BcmVQdHJzPjo6X1NUTFBfVEVNUExBVEUgX0luPF9TcmMsIF9Ec3Q+OjpfUmV0IF9SZXQ7Cit9OworIyAgZWxzZQorLyogZGVmYXVsdCBiZWhhdmlvcjogd2UgcHJlZmVyIHRvIG1pc3MgYW4gb3B0aW1pemF0aW9uIHJhdGhlciB0aGFuIHRha2luZyB0aGUgcmlzayBvZgorICogYSBjb21waWxhdGlvbiBlcnJvciBpZiBwbGF5aW5nIHdpdGggdHlwZXMgd2l0aCBleG90aWMgbWVtb3J5IGFsaWdubWVudC4KKyAqLwordGVtcGxhdGUgPGNsYXNzIF9BcmVQdHJzLCBjbGFzcyBfU3JjLCBjbGFzcyBfRHN0Pgorc3RydWN0IF9Jc0NWQ29udmVydGlibGVJZgoreyB0eXBlZGVmIF9fZmFsc2VfdHlwZSBfUmV0OyB9OworIyAgZW5kaWYKKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1NyYywgY2xhc3MgX0RzdD4KK3N0cnVjdCBfVHJpdmlhbE5hdGl2ZVR5cGVDb3B5IHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSXNQdHI8X1NyYz46Ol9SZXQgX1B0cjE7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0lzUHRyPF9Ec3Q+OjpfUmV0IF9QdHIyOworICB0eXBlZGVmIHR5cGVuYW1lIF9MYW5kMjxfUHRyMSwgX1B0cjI+OjpfUmV0IF9Cb3RoUHRyczsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSXNDVkNvbnZlcnRpYmxlSWY8X0JvdGhQdHJzLCBfU3JjLCBfRHN0Pjo6X1JldCBfQ29udmVydGlibGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0xhbmQyPF9Cb3RoUHRycywgX0NvbnZlcnRpYmxlPjo6X1JldCBfVHJpdmlhbDE7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX2Jvb2wydHlwZTwoc2l6ZW9mKF9TcmMpID09IHNpemVvZihfRHN0KSk+OjpfUmV0IF9TYW1lU2l6ZTsKKworICB0eXBlZGVmIHR5cGVuYW1lIF9Jc0ludGVncmFsPF9TcmM+OjpfUmV0IF9JbnQxOworICB0eXBlZGVmIHR5cGVuYW1lIF9Jc0ludGVncmFsPF9Ec3Q+OjpfUmV0IF9JbnQyOworICB0eXBlZGVmIHR5cGVuYW1lIF9MYW5kMjxfSW50MSwgX0ludDI+OjpfUmV0IF9Cb3RoSW50czsKKworICB0eXBlZGVmIHR5cGVuYW1lIF9Jc1JhdGlvbmFsPF9TcmM+OjpfUmV0IF9SYXQxOworICB0eXBlZGVmIHR5cGVuYW1lIF9Jc1JhdGlvbmFsPF9Ec3Q+OjpfUmV0IF9SYXQyOworICB0eXBlZGVmIHR5cGVuYW1lIF9MYW5kMjxfUmF0MSwgX1JhdDI+OjpfUmV0IF9Cb3RoUmF0czsKKworICB0eXBlZGVmIHR5cGVuYW1lIF9Mb3IyPF9Cb3RoSW50cywgX0JvdGhSYXRzPjo6X1JldCBfQm90aE5hdGl2ZXM7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0xhbmQyPF9Cb3RoTmF0aXZlcywgX1NhbWVTaXplPjo6X1JldCBfVHJpdmlhbDI7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBfTG9yMjxfVHJpdmlhbDEsIF9Ucml2aWFsMj46Ol9SZXQgX1JldDsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfU3JjLCBjbGFzcyBfRHN0Pgorc3RydWN0IF9Ucml2aWFsQ29weSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgX1RyaXZpYWxOYXRpdmVUeXBlQ29weTxfU3JjLCBfRHN0Pjo6X1JldCBfTmF0aXZlUmV0OworCisjaWYgIWRlZmluZWQgKF9fQk9STEFORENfXykgfHwgKF9fQk9STEFORENfXyAhPSAweDU2MCkKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX3R5cGVfdHJhaXRzPF9TcmM+OjpoYXNfdHJpdmlhbF9hc3NpZ25tZW50X29wZXJhdG9yIF9UcjE7CisjZWxzZQorICB0eXBlZGVmIHR5cGVuYW1lIF9VbkNvbnN0UHRyPF9TcmMqPjo6X1R5cGUgX1RwMzsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX3R5cGVfdHJhaXRzPF9UcDM+OjpoYXNfdHJpdmlhbF9hc3NpZ25tZW50X29wZXJhdG9yIF9UcjE7CisjZW5kaWYKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQXJlU2FtZVVuQ1ZUeXBlczxfU3JjLCBfRHN0Pjo6X1JldCBfVHIyOworICB0eXBlZGVmIHR5cGVuYW1lIF9MYW5kMjxfVHIxLCBfVHIyPjo6X1JldCBfVXNlclJldDsKKworICB0eXBlZGVmIHR5cGVuYW1lIF9Mb3IyPF9OYXRpdmVSZXQsIF9Vc2VyUmV0Pjo6X1JldCBfUmV0OworICBzdGF0aWMgX1JldCBfQW5zd2VyKCkgeyByZXR1cm4gX1JldCgpOyB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1NyYywgY2xhc3MgX0RzdD4KK3N0cnVjdCBfVHJpdmlhbFVDb3B5IHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfVHJpdmlhbE5hdGl2ZVR5cGVDb3B5PF9TcmMsIF9Ec3Q+OjpfUmV0IF9OYXRpdmVSZXQ7CisKKyNpZiAhZGVmaW5lZCAoX19CT1JMQU5EQ19fKSB8fCAoX19CT1JMQU5EQ19fICE9IDB4NTYwKQorICB0eXBlZGVmIHR5cGVuYW1lIF9fdHlwZV90cmFpdHM8X1NyYz46Omhhc190cml2aWFsX2NvcHlfY29uc3RydWN0b3IgX1RyMTsKKyNlbHNlCisgIHR5cGVkZWYgdHlwZW5hbWUgX1VuQ29uc3RQdHI8X1NyYyo+OjpfVHlwZSBfVHAzOworICB0eXBlZGVmIHR5cGVuYW1lIF9fdHlwZV90cmFpdHM8X1RwMz46Omhhc190cml2aWFsX2NvcHlfY29uc3RydWN0b3IgX1RyMTsKKyNlbmRpZgorICB0eXBlZGVmIHR5cGVuYW1lIF9BcmVTYW1lVW5DVlR5cGVzPF9TcmMsIF9Ec3Q+OjpfUmV0IF9UcjI7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0xhbmQyPF9UcjEsIF9UcjI+OjpfUmV0IF9Vc2VyUmV0OworCisgIHR5cGVkZWYgdHlwZW5hbWUgX0xvcjI8X05hdGl2ZVJldCwgX1VzZXJSZXQ+OjpfUmV0IF9SZXQ7CisgIHN0YXRpYyBfUmV0IF9BbnN3ZXIoKSB7IHJldHVybiBfUmV0KCk7IH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX0RlZmF1bHRaZXJvVmFsdWUgeworICB0eXBlZGVmIHR5cGVuYW1lIF9Jc0ludGVncmFsPF9UcD46Ol9SZXQgX1RyMTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSXNSYXRpb25hbDxfVHA+OjpfUmV0IF9UcjI7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0lzUHRyPF9UcD46Ol9SZXQgX1RyMzsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfTG9yMzxfVHIxLCBfVHIyLCBfVHIzPjo6X1JldCBfUmV0OworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfVHJpdmlhbEluaXQgeworI2lmICFkZWZpbmVkIChfX0JPUkxBTkRDX18pIHx8IChfX0JPUkxBTkRDX18gIT0gMHg1NjApCisgIHR5cGVkZWYgdHlwZW5hbWUgX190eXBlX3RyYWl0czxfVHA+OjpoYXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yIF9UcjE7CisjZWxzZQorICB0eXBlZGVmIHR5cGVuYW1lIF9VbkNvbnN0UHRyPF9UcCo+OjpfVHlwZSBfVHAxOworICB0eXBlZGVmIHR5cGVuYW1lIF9fdHlwZV90cmFpdHM8X1RwMT46Omhhc190cml2aWFsX2NvcHlfY29uc3RydWN0b3IgX1RyMTsKKyNlbmRpZgorICB0eXBlZGVmIHR5cGVuYW1lIF9EZWZhdWx0WmVyb1ZhbHVlPF9UcD46Ol9SZXQgX1RyMjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfTm90PF9UcjI+OjpfUmV0IF9UcjM7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0xhbmQyPF9UcjEsIF9UcjM+OjpfUmV0IF9SZXQ7CisgIHN0YXRpYyBfUmV0IF9BbnN3ZXIoKSB7IHJldHVybiBfUmV0KCk7IH0KK307CisKKyNlbmRpZiAvKiAhX1NUTFBfVVNFX0JPT1NUX1NVUFBPUlQgKi8KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfSXNQdHJUeXBlIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSXNQdHI8X1RwPjo6X1JldCBfVHlwZTsKKyAgc3RhdGljIF9UeXBlIF9SZXQoKSB7IHJldHVybiBfVHlwZSgpOyB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9Jc1JlZlR5cGUgeworICB0eXBlZGVmIHR5cGVuYW1lIF9Jc1JlZjxfVHA+OjpfUmV0IF9UeXBlOworICBzdGF0aWMgX1R5cGUgX1JldCgpIHsgcmV0dXJuIF9UeXBlKCk7fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfX2NhbGxfdHJhaXRzIHsKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfQk9PU1RfU1VQUE9SVCkgJiYgIWRlZmluZWQgKF9TVExQX05PX0VYVEVOU0lPTlMpCisgIHR5cGVkZWYgdHlwZW5hbWUgX19zZWxlY3Q8IDo6Ym9vc3Q6OmlzX3JlZmVyZW5jZTxfVHA+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1RwLCB0eXBlbmFtZSA6OmJvb3N0OjphZGRfcmVmZXJlbmNlPCB0eXBlbmFtZSA6OmJvb3N0OjphZGRfY29uc3Q8X1RwPjo6dHlwZSA+Ojp0eXBlPjo6X1JldCBwYXJhbV90eXBlOworI2Vsc2UKKyAgdHlwZWRlZiBjb25zdCBfVHAmIHBhcmFtX3R5cGU7CisjZW5kaWYgLyogX1NUTFBfVVNFX0JPT1NUX1NVUFBPUlQgKi8KK307CisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfVVNFX0JPT1NUX1NVUFBPUlQpICYmICFkZWZpbmVkIChfU1RMUF9OT19FWFRFTlNJT05TKSAmJiBkZWZpbmVkIChfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKQordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfX2NhbGxfdHJhaXRzPF9UcCY+Cit7IHR5cGVkZWYgX1RwJiBwYXJhbV90eXBlOyB9OworI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAxLCBjbGFzcyBfVHAyPgorc3RydWN0IF9Cb3RoUHRyVHlwZSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0lzUHRyPF9UcDE+OjpfUmV0IF9Jc1B0cjE7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0lzUHRyPF9UcDI+OjpfUmV0IF9Jc1B0cjI7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBfTGFuZDI8X0lzUHRyMSwgX0lzUHRyMj46Ol9SZXQgX1JldDsKKyAgc3RhdGljIF9SZXQgX0Fuc3dlcigpIHsgcmV0dXJuIF9SZXQoKTsgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcDEsIGNsYXNzIF9UcDIsIGNsYXNzIF9Jc1JlZjEsIGNsYXNzIF9Jc1JlZjI+CitzdHJ1Y3QgX09LVG9Td2FwIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfQXJlU2FtZVVuQ1ZUeXBlczxfVHAxLCBfVHAyPjo6X1JldCBfU2FtZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfTGFuZDM8X1NhbWUsIF9Jc1JlZjEsIF9Jc1JlZjI+OjpfUmV0IF9UeXBlOworICBzdGF0aWMgX1R5cGUgX0Fuc3dlcigpIHsgcmV0dXJuIF9UeXBlKCk7IH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAxLCBjbGFzcyBfVHAyLCBjbGFzcyBfSXNSZWYxLCBjbGFzcyBfSXNSZWYyPgoraW5saW5lIF9PS1RvU3dhcDxfVHAxLCBfVHAyLCBfSXNSZWYxLCBfSXNSZWYyPgorX0lzT0tUb1N3YXAoX1RwMSosIF9UcDIqLCBjb25zdCBfSXNSZWYxJiwgY29uc3QgX0lzUmVmMiYpCit7IHJldHVybiBfT0tUb1N3YXA8X1RwMSwgX1RwMiwgX0lzUmVmMSwgX0lzUmVmMj4oKTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1NyYywgY2xhc3MgX0RzdD4KK2lubGluZSBfVHJpdmlhbENvcHk8X1NyYywgX0RzdD4gX1VzZVRyaXZpYWxDb3B5KF9TcmMqLCBfRHN0KikKK3sgcmV0dXJuIF9Ucml2aWFsQ29weTxfU3JjLCBfRHN0PigpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfU3JjLCBjbGFzcyBfRHN0PgoraW5saW5lIF9Ucml2aWFsVUNvcHk8X1NyYywgX0RzdD4gX1VzZVRyaXZpYWxVQ29weShfU3JjKiwgX0RzdCopCit7IHJldHVybiBfVHJpdmlhbFVDb3B5PF9TcmMsIF9Ec3Q+KCk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfVHJpdmlhbEluaXQ8X1RwPiBfVXNlVHJpdmlhbEluaXQoX1RwKikKK3sgcmV0dXJuIF9Ucml2aWFsSW5pdDxfVHA+KCk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfSXNQT0QgeworICB0eXBlZGVmIHR5cGVuYW1lIF9fdHlwZV90cmFpdHM8X1RwPjo6aXNfUE9EX3R5cGUgX1R5cGU7CisgIHN0YXRpYyBfVHlwZSBfQW5zd2VyKCkgeyByZXR1cm4gX1R5cGUoKTsgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfSXNQT0Q8X1RwPiBfSXNfUE9EKF9UcCopCit7IHJldHVybiBfSXNQT0Q8X1RwPigpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX0RlZmF1bHRaZXJvVmFsdWVRdWVzdGlvbiB7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0RlZmF1bHRaZXJvVmFsdWU8X1RwPjo6X1JldCBfUmV0OworICBzdGF0aWMgX1JldCBfQW5zd2VyKCkgeyByZXR1cm4gX1JldCgpOyB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIF9EZWZhdWx0WmVyb1ZhbHVlUXVlc3Rpb248X1RwPiBfSGFzRGVmYXVsdFplcm9WYWx1ZShfVHAqKQoreyByZXR1cm4gX0RlZmF1bHRaZXJvVmFsdWVRdWVzdGlvbjxfVHA+KCk7IH0KKworLyoKKyAqIEJhc2UgY2xhc3MgdXNlZDoKKyAqIC0gdG8gc2ltdWxhdGUgcGFydGlhbCB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbgorICogLSB0byBzaW11bGF0ZSBwYXJ0aWFsIGZ1bmN0aW9uIG9yZGVyaW5nCisgKiAtIHRvIHJlY29nbml6ZSBTVExwb3J0IGNsYXNzIGZyb20gdXNlciBzcGVjaWFsaXplZCBvbmUKKyAqLwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfX3N0bHBvcnRfY2xhc3MKK3sgdHlwZWRlZiBfVHAgX1R5cGU7IH07CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX0lzU1RMcG9ydENsYXNzIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSXNDb252ZXJ0aWJsZTxfVHAsIF9fc3RscG9ydF9jbGFzczxfVHA+ID46Ol9SZXQgX1JldDsKKyNpZiBkZWZpbmVkIChfX0JPUkxBTkRDX18pCisgIGVudW0geyBfSXMgPSBfSXNDb252ZXJ0aWJsZTxfVHAsIF9fc3RscG9ydF9jbGFzczxfVHA+ID46OnZhbHVlIH07CisjZW5kaWYKK307CisKKyNpZiBkZWZpbmVkIChfU1RMUF9VU0VfUEFSVElBTF9TUEVDX1dPUktBUk9VTkQpICYmICFkZWZpbmVkIChfU1RMUF9GVU5DVElPTl9UTVBMX1BBUlRJQUxfT1JERVIpCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9Td2FwSW1wbGVtZW50ZWQgeworICB0eXBlZGVmIHR5cGVuYW1lIF9Jc1NUTHBvcnRDbGFzczxfVHA+OjpfUmV0IF9SZXQ7CisjICBpZiBkZWZpbmVkIChfX0JPUkxBTkRDX18pCisgIGVudW0geyBfSXMgPSBfSXNTVExwb3J0Q2xhc3M8X1RwPjo6X0lzIH07CisjICBlbmRpZgorfTsKKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorY2xhc3MgX1RwV2l0aFN0YXRlIDogcHJpdmF0ZSBfVHAgeworICBfVHBXaXRoU3RhdGUoKTsKKyAgaW50IF9zdGF0ZTsKK307CisKKy8qIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVscGVyIHN0cnVjdCB1c2VkIHRvIGd1ZXNzIGlmIHdlIGFyZSB3b3JraW5nCisgKiBvbiBhIHN0YXRlbGVzcyBjbGFzcy4gSXQgY2FuIG9ubHkgYmUgaW5zdGFuY2lhdGVkIHdpdGggYSBjbGFzcyB0eXBlLiAqLwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfSXNTdGF0ZWxlc3MgeworICBlbnVtIHsgX0lzID0gc2l6ZW9mKF9UcFdpdGhTdGF0ZTxfVHA+KSA9PSBzaXplb2YoaW50KSB9OworICB0eXBlZGVmIHR5cGVuYW1lIF9fYm9vbDJ0eXBlPF9Jcz46Ol9SZXQgX1JldDsKK307CisKK19TVExQX0VORF9OQU1FU1BBQ0UKKworI2lmZGVmIF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04KKyMgIGlmIGRlZmluZWQgKF9fQk9STEFORENfXykgfHwgXAorICAgICAgZGVmaW5lZCAoX19TVU5QUk9fQ0MpIHx8ICBcCisgICAgIChkZWZpbmVkIChfX01XRVJLU19fKSAmJiAoX19NV0VSS1NfXyA8PSAweDIzMDMpKSB8fCBcCisgICAgIChkZWZpbmVkIChfX3NnaSkgJiYgZGVmaW5lZCAoX0NPTVBJTEVSX1ZFUlNJT04pKSB8fCBcCisgICAgICBkZWZpbmVkIChfX0RNQ19fKQorIyAgICBkZWZpbmUgX1NUTFBfSVNfUE9EX0lURVIoX0l0LCBfVHApIF9fdHlwZV90cmFpdHM8IHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czwgX1RwID46OnZhbHVlX3R5cGUgPjo6aXNfUE9EX3R5cGUoKQorIyAgZWxzZQorIyAgICBkZWZpbmUgX1NUTFBfSVNfUE9EX0lURVIoX0l0LCBfVHApIHR5cGVuYW1lIF9fdHlwZV90cmFpdHM8IHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czwgX1RwID46OnZhbHVlX3R5cGUgPjo6aXNfUE9EX3R5cGUoKQorIyAgZW5kaWYKKyNlbHNlCisjICBkZWZpbmUgX1NUTFBfSVNfUE9EX0lURVIoX0l0LCBfVHApIF9Jc19QT0QoIF9TVExQX1ZBTFVFX1RZUEUoIF9JdCwgX1RwICkgKS5fQW5zd2VyKCkKKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfVFlQRV9UUkFJVFNfSCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RyZWFtYnVmIGIvc3RyZWFtYnVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhZDU3YzkKLS0tIC9kZXYvbnVsbAorKysgYi9zdHJlYW1idWYKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKyNpZm5kZWYgX1NUTFBfU1RSRUFNQlVGCisjZGVmaW5lIF9TVExQX1NUUkVBTUJVRgorCisjIGlmbmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDEwNjYKKyMgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+CisjIGVuZGlmCisKKyMgaWZkZWYgX1NUTFBfUFJBR01BX09OQ0UKKyMgIHByYWdtYSBvbmNlCisjIGVuZGlmCisKKyMgaW5jbHVkZSA8c3RsL19pb3NlcnIuaD4KKyMgaW5jbHVkZSA8c3RsL19zdHJlYW1idWYuaD4KKworIyBpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDEwNjYpCisjICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyBlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfU1RSRUFNQlVGICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS9zdHJlYW1idWYuaCBiL3N0cmVhbWJ1Zi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMmJmZjUKLS0tIC9kZXYvbnVsbAorKysgYi9zdHJlYW1idWYuaApAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworI2lmbmRlZiBfU1RMUF9TVFJFQU1CVUZfSAorI2RlZmluZSBfU1RMUF9TVFJFQU1CVUZfSAorCisjaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MjA2NworIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RsL19pb3NlcnIuaD4KKworI2luY2x1ZGUgPHN0cmVhbWJ1Zj4KKworI2luY2x1ZGUgPGlvcy5oPgorCisjaWZuZGVmIF9TVExQX0hBU19OT19OQU1FU1BBQ0VTCisjICBpZmRlZiBfU1RMUF9CUk9LRU5fVVNJTkdfRElSRUNUSVZFCitfU1RMUF9VU0lOR19OQU1FU1BBQ0Uoc3RscG9ydCkKKyMgIGVsc2UKK3VzaW5nIF9TVExQX1NURDo6YmFzaWNfc3RyZWFtYnVmOwordXNpbmcgX1NUTFBfU1REOjpzdHJlYW1idWY7CisjICAgIGlmbmRlZiBfU1RMUF9OT19XQ0hBUl9UCit1c2luZyBfU1RMUF9TVEQ6OndzdHJlYW1idWY7CisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmIC8qIF9TVExQX0hBU19OT19OQU1FU1BBQ0VTICovCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDIwNjcpCisjICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9TVFJFQU1CVUZfSCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3RyaW5nIGIvc3RyaW5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1M2Q2N2YKLS0tIC9kZXYvbnVsbAorKysgYi9zdHJpbmcKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5Ny0xOTk5CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX1NUUklORworIyBkZWZpbmUgX1NUTFBfU1RSSU5HCisKKyNpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHg2OAorIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KKyNlbmRpZgorCisjaWZkZWYgX1NUTFBfUFJBR01BX09OQ0UKKyMgIHByYWdtYSBvbmNlCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TVExQX1VTRV9PV05fTkFNRVNQQUNFKQorIyAgaW5jbHVkZSA8c3RsL19zdHJpbmcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RsL19zdHJpbmdfaGFzaC5oPgorCisjaWYgIWRlZmluZWQgKF9TVExQX1VTRV9OT19JT1NUUkVBTVMpCisjICBpbmNsdWRlIDxzdGwvX3N0cmluZ19pby5oPgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDY4KQorIyAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KKyMgIHVuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfU1RSSU5HICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CisKZGlmZiAtLWdpdCBhL3N0cmluZy5oIGIvc3RyaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM3YmRiNgotLS0gL2Rldi9udWxsCisrKyBiL3N0cmluZy5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisvKiBXb3JrYXJvdW5kIGZvciBhICJtaXNiZWhhdmlvdXIiIHdoZW4gY29tcGlsaW5nIHJlc291cmNlIHNjcmlwdHMgdXNpbmcKKyAqIGVNYmVkZGVkIFZpc3VhbCBDKysuIFRoZSBzdGFuZGFyZCAucmMgZmlsZSBpbmNsdWRlcyB3aW5kb3dzIGhlYWRlciBmaWxlcywKKyAqIHdoaWNoIGluIHR1cm4gaW5jbHVkZSBzdHJpbmcuaCwgd2hpY2ggcmVzdWx0cyBpbiB3YXJuaW5ncyBhbmQgZXJyb3JzCisgKi8KKyNpZm5kZWYgX1NUTFBfU1RSSU5HX0gKKworI2lmICFkZWZpbmVkIChSQ19JTlZPS0VEKQorCisjICBpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDI2OQorIyAgICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgorIyAgZWxpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDI2OSkgJiYgIWRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKKyMgICAgZGVmaW5lIF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRAorIyAgICBkZWZpbmUgX1NUTFBfU1RSSU5HX0gKKyMgIGVuZGlmCisKKyMgIGlmIGRlZmluZWQoX1NUTFBfV0NFX0VWQzMpCitzdHJ1Y3QgX2V4Y2VwdGlvbjsKKyMgIGVuZGlmCisjICBpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAhPSAweDI2OSkgfHwgZGVmaW5lZCAoX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lEKQorIyAgICBpbmNsdWRlIF9TVExQX05BVElWRV9DX0hFQURFUihzdHJpbmcuaCkKKyMgIGVsc2UKKyMgICAgaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKQorIyAgICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9DX0hFQURFUihfc3RyLmgpCisjICAgIGVsc2UKKyMgICAgICBpbmNsdWRlIF9TVExQX05BVElWRV9DX0hFQURFUihzdHJpbmcuaCkKKyMgICAgZW5kaWYKKworIyAgICBpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDI2OSkKKyMgICAgICBpZiBkZWZpbmVkIChfX0JPUkxBTkRDX18pICYmIGRlZmluZWQgKF9TVExQX0lNUE9SVF9WRU5ET1JfQ1NURCkKKyMgICAgICAgIGluY2x1ZGUgPHVzaW5nL2NzdHJpbmc+CisjICAgICAgZW5kaWYgLyogQk9STEFORCAqLworIyAgICBlbmRpZgorIyAgZW5kaWYKKworIyAgaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgyNjkpCisjICAgIGlmICFkZWZpbmVkIChfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQpCisjICAgICAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KKyMgICAgICB1bmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjICAgIGVsc2UKKyMgICAgICB1bmRlZiBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYgLyogUkNfSU5WT0tFRCAqLworI2VuZGlmIC8qIF9TVExQX1NUUklOR19IICovCmRpZmYgLS1naXQgYS9zdHJzdHJlYW0gYi9zdHJzdHJlYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYzYjVjZAotLS0gL2Rldi9udWxsCisrKyBiL3N0cnN0cmVhbQpAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworLy8gV0FSTklORzogVGhlIGNsYXNzZXMgZGVmaW5lZCBpbiB0aGlzIGhlYWRlciBhcmUgREVQUkVDQVRFRC4gIFRoaXMKKy8vIGhlYWRlciBpcyBkZWZpbmVkIGluIHNlY3Rpb24gRC43LjEgb2YgdGhlIEMrKyBzdGFuZGFyZCwgYW5kIGl0CisvLyBNQVkgQkUgUkVNT1ZFRCBpbiBhIGZ1dHVyZSBzdGFuZGFyZCByZXZpc2lvbi4gIFlvdSBzaG91bGQgdXNlIHRoZQorLy8gaGVhZGVyIDxzc3RyZWFtPiBpbnN0ZWFkLgorCisKKyNpZm5kZWYgX1NUTFBfU1RSU1RSRUFNCisjZGVmaW5lIF9TVExQX1NUUlNUUkVBTQorCisjaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MTA3MAorIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KKyNlbmRpZgorCisjaWZkZWYgX1NUTFBfUFJBR01BX09OQ0UKKyMgIHByYWdtYSBvbmNlCisjZW5kaWYKKworI2luY2x1ZGUgPHN0bC9faW9zZXJyLmg+CisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfU1RSU1RSRUFNCisjICBpbmNsdWRlIDxzdGwvX3N0cnN0cmVhbS5oPgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDEwNzApCisjICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9TVFJTVFJFQU0gKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3N0cnN0cmVhbS5oIGIvc3Ryc3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMwMmExNgotLS0gL2Rldi9udWxsCisrKyBiL3N0cnN0cmVhbS5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX1NUUlNUUkVBTV9ICisjIGRlZmluZSBfU1RMUF9TVFJTVFJFQU1fSAorCisjaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4MjA3MQorIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3Ryc3RyZWFtPgorCisjaW5jbHVkZSA8aW9zdHJlYW0uaD4KKworCisjaWZuZGVmIF9TVExQX0hBU19OT19OQU1FU1BBQ0VTCisKKyMgIGlmZGVmIF9TVExQX0JST0tFTl9VU0lOR19ESVJFQ1RJVkUKKwordXNpbmcgbmFtZXNwYWNlIF9TVExQX1NURDsKKworIyAgZWxzZQorCit1c2luZyBfU1RMUF9TVEQ6OnN0cnN0cmVhbWJ1ZjsKK3VzaW5nIF9TVExQX1NURDo6aXN0cnN0cmVhbTsKK3VzaW5nIF9TVExQX1NURDo6b3N0cnN0cmVhbTsKK3VzaW5nIF9TVExQX1NURDo6c3Ryc3RyZWFtOworCisjICBlbmRpZiAvKiBfU1RMUF9CUk9LRU5fVVNJTkdfRElSRUNUSVZFICovCisKKyNlbmRpZiAvKiBfU1RMUF9IQVNfTk9fTkFNRVNQQUNFUyAqLworCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgyMDcxKQorIyAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KKyMgIHVuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfU1RSU1RSRUFNX0ggKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3RpbWUuaCBiL3RpbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDEwYmZjCi0tLSAvZGV2L251bGwKKysrIGIvdGltZS5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWYgIWRlZmluZWQgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQpCisjICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDI3MgorIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KKyNlbGlmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MjcyKSAmJiAhIGRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKKyMgIGRlZmluZSBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKKyNlbmRpZgorCisjaWZkZWYgX1NUTFBfV0NFX0VWQzMKKy8vIG9ubHkgc2hvdyBtZXNzYWdlIHdoZW4gZGlyZWN0bHkgaW5jbHVkaW5nIHRoaXMgZmlsZSBpbiBhIG5vbi1saWJyYXJ5IGJ1aWxkCisjICBpZiAhZGVmaW5lZChfX0JVSUxESU5HX1NUTFBPUlQpICYmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4MjcyKQorIyAgICBwcmFnbWEgbWVzc2FnZSgiZU1iZWRkZWQgVmlzdWFsIEMrKyAzIGRvZXNuJ3QgaGF2ZSBhIHRpbWUuaCBoZWFkZXI7IFNUTHBvcnQgd29uJ3QgaW5jbHVkZSBuYXRpdmUgdGltZS5oIGhlcmUiKQorIyAgZW5kaWYKKyNlbHNlCisjICBpbmNsdWRlIF9TVExQX05BVElWRV9DX0hFQURFUih0aW1lLmgpCisjZW5kaWYKKworCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgyNzIpCisjICBpZiAhIGRlZmluZWQgKF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRCkKKyMgICAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KKyMgICAgdW5kZWYgIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGVsc2UKKyMgICAgdW5kZWYgIF9TVExQX0RPTlRfUE9QX0hFQURFUl9JRAorIyAgZW5kaWYKKyNlbmRpZgorCisvKiBMb2NhbCBWYXJpYWJsZXM6CisgKiBtb2RlOkMrKworICogRW5kOgorICovCmRpZmYgLS1naXQgYS90eXBlaW5mbyBiL3R5cGVpbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmYTUxYTcKLS0tIC9kZXYvbnVsbAorKysgYi90eXBlaW5mbwpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmbmRlZiBfU1RMUF9UWVBFSU5GTworCisjaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4NDczCisjICBkZWZpbmUgX1NUTFBfVFlQRUlORk8KKyMgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+CisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEICE9IDB4NDczKQorIyAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ1BQX1JVTlRJTUVfSEVBREVSKHR5cGVpbmZvKQorI2Vsc2UKKyMgIGlmbmRlZiBfU1RMUF9JTlRFUk5BTF9UWVBFSU5GTworIyAgICBpbmNsdWRlIDxzdGwvX3R5cGVpbmZvLmg+CisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDQ3MykKKyMgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+CisjICB1bmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjZW5kaWYKKworI2VuZGlmCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS90eXBlaW5mby5oIGIvdHlwZWluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjU2NWFmCi0tLSAvZGV2L251bGwKKysrIGIvdHlwZWluZm8uaApAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmbmRlZiBfU1RMUF9PTERTVERfdHlwZWluZm8KKyNkZWZpbmUgX1NUTFBfT0xEU1REX3R5cGVpbmZvCisKKyNpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHg4NzQKKyMgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+CisjZW5kaWYKKworI2lmbmRlZiBfU1RMUF9OT19UWVBFSU5GTworCisjICBpZiBkZWZpbmVkIChfX0dOVUNfXykKKyMgICAgdW5kZWYgX1NUTFBfT0xEU1REX3R5cGVpbmZvCisjICAgIGluY2x1ZGUgPHR5cGVpbmZvPgorIyAgICBkZWZpbmUgX1NUTFBfT0xEU1REX3R5cGVpbmZvCisjICBlbHNlCisjICAgIGlmICFkZWZpbmVkIChfX0JPUkxBTkRDX18pIHx8IChfX0JPUkxBTkRDX18gPCAweDU4MCkKKyMgICAgICBpbmNsdWRlIF9TVExQX05BVElWRV9DUFBfUlVOVElNRV9IRUFERVIodHlwZWluZm8uaCkKKyMgICAgZWxzZQorIyAgICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9DX0hFQURFUih0eXBlaW5mby5oKQorIyAgICBlbmRpZgorIyAgICBpZiBkZWZpbmVkIChfX0JPUkxBTkRDX18pICYmIChfX0JPUkxBTkRDX18gPj0gMHg1ODApIHx8IFwKKyAgICAgICAgZGVmaW5lZCAoX19ETUNfXykKK3VzaW5nIHN0ZDo6dHlwZV9pbmZvOwordXNpbmcgc3RkOjpiYWRfdHlwZWlkOwordXNpbmcgc3RkOjpiYWRfY2FzdDsKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisKKy8vIGlmIDx0eXBlaW5mbz4gYWxyZWFkeSBpbmNsdWRlZCwgZG8gbm90IGltcG9ydCBhbnl0aGluZworCisjICBpZiBkZWZpbmVkIChfU1RMUF9VU0VfT1dOX05BTUVTUEFDRSkgJiYgIShkZWZpbmVkIChfU1RMUF9UWVBFSU5GTykgJiYgIWRlZmluZWQgKF9TVExQX05PX05FV19ORVdfSEVBREVSKSkKKworX1NUTFBfQkVHSU5fTkFNRVNQQUNFCisKK3VzaW5nIC8qX1NUTFBfVkVORE9SX0VYQ0VQVF9TVEQgKi8gOjogdHlwZV9pbmZvOworIyAgICBpZiAhKGRlZmluZWQoX19NUkNfXykgfHwgKGRlZmluZWQoX19TQ19fKSAmJiAhZGVmaW5lZChfX0RNQ19fKSkpCit1c2luZyAvKiBfU1RMUF9WRU5ET1JfRVhDRVBUX1NURCAqLyA6OiBiYWRfdHlwZWlkOworIyAgICBlbmRpZgorCit1c2luZyAvKiBfU1RMUF9WRU5ET1JfRVhDRVBUX1NURCAqLyA6OiBiYWRfY2FzdDsKKworX1NUTFBfRU5EX05BTUVTUEFDRQorCisjICBlbmRpZiAvKiBfU1RMUF9PV05fTkFNRVNQQUNFICovCisKKyNlbmRpZiAvKiBfU1RMUF9OT19UWVBFSU5GTyAqLworCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHg4NzQpCisjICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9PTERTVERfdHlwZWluZm8gKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKZGlmZiAtLWdpdCBhL3Vub3JkZXJlZF9tYXAgYi91bm9yZGVyZWRfbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZmEwZDIKLS0tIC9kZXYvbnVsbAorKysgYi91bm9yZGVyZWRfbWFwCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsMjAwNQorICogRnJhbmNvaXMgRHVtb250CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfVU5PUkRFUkVEX01BUAorI2RlZmluZSBfU1RMUF9VTk9SREVSRURfTUFQCisKKyNpZm5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZGVmaW5lIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgMHg0MDMwCisjICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgorI2VuZGlmCisKKyNpZmRlZiBfU1RMUF9QUkFHTUFfT05DRQorIyAgcHJhZ21hIG9uY2UKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RsL191bm9yZGVyZWRfbWFwLmg+CisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDQwMzApCisjICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9VTk9SREVSRURfTUFQICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS91bm9yZGVyZWRfc2V0IGIvdW5vcmRlcmVkX3NldApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGRlNDM3Ci0tLSAvZGV2L251bGwKKysrIGIvdW5vcmRlcmVkX3NldApAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA0LDIwMDUKKyAqIEZyYW5jb2lzIER1bW9udAorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX1VOT1JERVJFRF9TRVQKKyNkZWZpbmUgX1NUTFBfVU5PUkRFUkVEX1NFVAorCisjaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4NDAzMQorIyAgaW5jbHVkZSA8c3RsL19wcm9sb2cuaD4KKyNlbmRpZgorCisjaWZkZWYgX1NUTFBfUFJBR01BX09OQ0UKKyMgIHByYWdtYSBvbmNlCisjZW5kaWYKKworI2luY2x1ZGUgPHN0bC9fdW5vcmRlcmVkX3NldC5oPgorCisjaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHg0MDMxKQorIyAgaW5jbHVkZSA8c3RsL19lcGlsb2cuaD4KKyMgIHVuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyNlbmRpZgorCisjZW5kaWYgLyogX1NUTFBfVU5PUkRFUkVEX1NFVCAqLworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvdXNpbmcvY3N0cmluZyBiL3VzaW5nL2NzdHJpbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU4MDYzOAotLS0gL2Rldi9udWxsCisrKyBiL3VzaW5nL2NzdHJpbmcKQEAgLTAsMCArMSw1OSBAQAordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnNpemVfdDsKKworI2lmICFkZWZpbmVkIChfU1RMUF9OT19DU1REX0ZVTkNUSU9OX0lNUE9SVFMpCisjICBpZiBkZWZpbmVkIChfX01TTF9fKSAmJiBfX01DNjhLX18gJiYgIV9Ob19CbG9ja01vdmUgJiYgX19kZXN0X29zID09IF9fbWFjX29zCisjICAgIHVuZGVmIG1lbWNweQorIyAgICB1bmRlZiBtZW1tb3ZlCitpbmxpbmUgdm9pZCogbWVtY3B5KHZvaWQqIGRzdCwgY29uc3Qgdm9pZCogc3JjLCBzaXplX3QgbGVuKQorewlyZXR1cm4gX1NUTFBfVkVORE9SX0NTVEQ6Ol9fbWVtY3B5KGRzdCwgc3JjLCBsZW4pOyB9CitpbmxpbmUgdm9pZCogbWVtbW92ZSh2b2lkKiBkc3QsIGNvbnN0IHZvaWQqIHNyYywgc2l6ZV90IGxlbikKK3sJcmV0dXJuIF9TVExQX1ZFTkRPUl9DU1REOjpfX21lbW1vdmUoZHN0LCBzcmMsIGxlbik7IH0KKyMgIGVsc2UKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjptZW1tb3ZlOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6Om1lbWNweTsKKyMgIGVuZGlmCisKKyMgIGlmICFkZWZpbmVkIChfU1RMUF9XQ0UpCisvLyB0aGVzZSBmdW5jdGlvbnMganVzdCBkb24ndCBleGlzdCBvbiBXaW5kb3dzIENFCisjICAgIGlmICFkZWZpbmVkIChBTkRST0lEKQorLy8gYW5kIHRoZXNlIGZ1bmN0aW9ucyBqdXN0IGRvbid0IGV4aXN0IG9uIEFuZHJvaWQKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpzdHJjb2xsOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnN0cnhmcm07CisjICAgIGVuZGlmCit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6c3RyZXJyb3I7CisjICBlbmRpZgorCisjICBpZiBkZWZpbmVkIChfX0JPUkxBTkRDX18pCitleHRlcm4gIkMrKyIgeworIyAgZW5kaWYKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjptZW1jaHI7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6c3RyY2hyOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnN0cnBicms7Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6c3RycmNocjsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpzdHJzdHI7CisjICBpZiBkZWZpbmVkIChfX0JPUkxBTkRDX18pCit9CisjICBlbmRpZgorCit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6bWVtY21wOwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6Om1lbXNldDsKKwordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnN0cmNhdDsKKworIyAgaWYgIWRlZmluZWQgKHN0cmNtcCkKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpzdHJjbXA7CisjICBlbmRpZgorCisjICBpZiAhZGVmaW5lZCAoc3RyY3B5KQordXNpbmcgX1NUTFBfVkVORE9SX0NTVEQ6OnN0cmNweTsKKyMgIGVuZGlmCit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6c3RyY3NwbjsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpzdHJsZW47Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6c3RybmNhdDsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpzdHJuY21wOworCit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6c3RybmNweTsKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpzdHJzcG47CisKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpzdHJ0b2s7CisjZW5kaWYgLyogX1NUTFBfTk9fQ1NURF9GVU5DVElPTl9JTVBPUlRTICovCmRpZmYgLS1naXQgYS91c2luZy9leHBvcnQgYi91c2luZy9leHBvcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQzYWZjZAotLS0gL2Rldi9udWxsCisrKyBiL3VzaW5nL2V4cG9ydApAQCAtMCwwICsxLDEyIEBACitjc3RyaW5nCitmc3RyZWFtCitpb21hbmlwCitpb3MKK2lvc2Z3ZAoraW9zdHJlYW0KK2lzdHJlYW0KK2xvY2FsZQorb3N0cmVhbQorc3N0cmVhbQorc3RyZWFtYnVmCitzdHJzdHJlYW0KZGlmZiAtLWdpdCBhL3VzaW5nL2ZzdHJlYW0gYi91c2luZy9mc3RyZWFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3OWUwNDgKLS0tIC9kZXYvbnVsbAorKysgYi91c2luZy9mc3RyZWFtCkBAIC0wLDAgKzEsMTkgQEAKKyNpZmRlZiBfU1RMUF9CUk9LRU5fVVNJTkdfRElSRUNUSVZFCit1c2luZyBuYW1lc3BhY2UgX1NUTFBfU1REOworI2Vsc2UKK3VzaW5nIF9TVExQX05FV19JT19OQU1FU1BBQ0U6OmJhc2ljX2ZpbGVidWY7Cit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjpmaWxlYnVmOwordXNpbmcgX1NUTFBfTkVXX0lPX05BTUVTUEFDRTo6YmFzaWNfaWZzdHJlYW07Cit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjpiYXNpY19vZnN0cmVhbTsKK3VzaW5nIF9TVExQX05FV19JT19OQU1FU1BBQ0U6Omlmc3RyZWFtOwordXNpbmcgX1NUTFBfTkVXX0lPX05BTUVTUEFDRTo6b2ZzdHJlYW07Cit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjpiYXNpY19mc3RyZWFtOwordXNpbmcgX1NUTFBfTkVXX0lPX05BTUVTUEFDRTo6ZnN0cmVhbTsKKworIyBpZm5kZWYgX1NUTFBfTk9fV0lERV9TVFJFQU1TCit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjp3b2ZzdHJlYW07Cit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjp3ZmlsZWJ1ZjsKK3VzaW5nIF9TVExQX05FV19JT19OQU1FU1BBQ0U6OndpZnN0cmVhbTsKK3VzaW5nIF9TVExQX05FV19JT19OQU1FU1BBQ0U6Ondmc3RyZWFtOworIyBlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS91c2luZy9oL2ZzdHJlYW0uaCBiL3VzaW5nL2gvZnN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2MDA1NjgKLS0tIC9kZXYvbnVsbAorKysgYi91c2luZy9oL2ZzdHJlYW0uaApAQCAtMCwwICsxLDQgQEAKK3VzaW5nIDo6c3RyZWFtYnVmOwordXNpbmcgOjppZnN0cmVhbTsKK3VzaW5nIDo6b2ZzdHJlYW07Cit1c2luZyA6OmZzdHJlYW07CmRpZmYgLS1naXQgYS91c2luZy9oL2lvbWFuaXAuaCBiL3VzaW5nL2gvaW9tYW5pcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5ZTQ4ZDkKLS0tIC9kZXYvbnVsbAorKysgYi91c2luZy9oL2lvbWFuaXAuaApAQCAtMCwwICsxLDYgQEAKK3VzaW5nIDo6c2V0aW9zZmxhZ3M7Cit1c2luZyA6OnJlc2V0aW9zZmxhZ3M7CisvLyB1c2luZyA6OnNldGJhc2U7Cit1c2luZyA6OnNldGZpbGw7Cit1c2luZyA6OnNldHByZWNpc2lvbjsKK3VzaW5nIDo6c2V0dzsKZGlmZiAtLWdpdCBhL3VzaW5nL2gvaW9zdHJlYW0uaCBiL3VzaW5nL2gvaW9zdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODVmNGUyCi0tLSAvZGV2L251bGwKKysrIGIvdXNpbmcvaC9pb3N0cmVhbS5oCkBAIC0wLDAgKzEsMjQgQEAKK3VzaW5nIF9TVExQX09MRF9JT19OQU1FU1BBQ0U6OmlzdHJlYW07Cit1c2luZyBfU1RMUF9PTERfSU9fTkFNRVNQQUNFOjpvc3RyZWFtOworCisvKiBIUCBhQ0MgaW5jbHVkZSBmaWxlcyByZS1kZWZpbmUgdGhlc2Ugd2hlbiBUSFJFQURfU0FGRSAqLworI2lmICFkZWZpbmVkKGNpbikKK3VzaW5nIF9TVExQX09MRF9JT19OQU1FU1BBQ0U6OmNpbjsKKyNlbmRpZgorI2lmICFkZWZpbmVkKGNvdXQpCit1c2luZyBfU1RMUF9PTERfSU9fTkFNRVNQQUNFOjpjb3V0OworI2VuZGlmCisjaWYgIWRlZmluZWQoY2VycikKK3VzaW5nIF9TVExQX09MRF9JT19OQU1FU1BBQ0U6OmNlcnI7CisjZW5kaWYKKyNpZiAhZGVmaW5lZChjbG9nKQordXNpbmcgX1NUTFBfT0xEX0lPX05BTUVTUEFDRTo6Y2xvZzsKKyNlbmRpZgorCit1c2luZyBfU1RMUF9PTERfSU9fTkFNRVNQQUNFOjplbmRsOwordXNpbmcgX1NUTFBfT0xEX0lPX05BTUVTUEFDRTo6ZW5kczsKKwordXNpbmcgX1NUTFBfT0xEX0lPX05BTUVTUEFDRTo6aW9zOwordXNpbmcgX1NUTFBfT0xEX0lPX05BTUVTUEFDRTo6Zmx1c2g7CisKKy8vIHVzaW5nIF9TVExQX09MRF9JT19OQU1FU1BBQ0U6OndzOwpkaWZmIC0tZ2l0IGEvdXNpbmcvaC9vc3RyZWFtLmggYi91c2luZy9oL29zdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmEzZjg4Ci0tLSAvZGV2L251bGwKKysrIGIvdXNpbmcvaC9vc3RyZWFtLmgKQEAgLTAsMCArMSw2IEBACit1c2luZyBfU1RMUF9PTERfSU9fTkFNRVNQQUNFOjpvc3RyZWFtOwordXNpbmcgX1NUTFBfT0xEX0lPX05BTUVTUEFDRTo6ZW5kbDsKK3VzaW5nIF9TVExQX09MRF9JT19OQU1FU1BBQ0U6OmVuZHM7Cit1c2luZyBfU1RMUF9PTERfSU9fTkFNRVNQQUNFOjpmbHVzaDsKKworLy8gdXNpbmcgX1NUTFBfT0xEX0lPX05BTUVTUEFDRTo6d3M7CmRpZmYgLS1naXQgYS91c2luZy9oL3N0cmVhbWJ1Zi5oIGIvdXNpbmcvaC9zdHJlYW1idWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTlkZTNkCi0tLSAvZGV2L251bGwKKysrIGIvdXNpbmcvaC9zdHJlYW1idWYuaApAQCAtMCwwICsxIEBACit1c2luZyA6OnN0cmVhbWJ1ZjsKZGlmZiAtLWdpdCBhL3VzaW5nL2gvc3Ryc3RyZWFtLmggYi91c2luZy9oL3N0cnN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ZDlmMTEKLS0tIC9kZXYvbnVsbAorKysgYi91c2luZy9oL3N0cnN0cmVhbS5oCkBAIC0wLDAgKzEsNCBAQAordXNpbmcgX1NUTFBfT0xEX0lPX05BTUVTUEFDRTo6c3Ryc3RyZWFtYnVmOwordXNpbmcgX1NUTFBfT0xEX0lPX05BTUVTUEFDRTo6aXN0cnN0cmVhbTsKK3VzaW5nIF9TVExQX09MRF9JT19OQU1FU1BBQ0U6Om9zdHJzdHJlYW07Cit1c2luZyBfU1RMUF9PTERfSU9fTkFNRVNQQUNFOjpzdHJzdHJlYW07CmRpZmYgLS1naXQgYS91c2luZy9pb21hbmlwIGIvdXNpbmcvaW9tYW5pcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTdjNzkyCi0tLSAvZGV2L251bGwKKysrIGIvdXNpbmcvaW9tYW5pcApAQCAtMCwwICsxLDYgQEAKK3VzaW5nIF9TVExQX05FV19JT19OQU1FU1BBQ0U6OnNldGlvc2ZsYWdzOwordXNpbmcgX1NUTFBfTkVXX0lPX05BTUVTUEFDRTo6cmVzZXRpb3NmbGFnczsKK3VzaW5nIF9TVExQX05FV19JT19OQU1FU1BBQ0U6OnNldGJhc2U7Cit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjpzZXRmaWxsOwordXNpbmcgX1NUTFBfTkVXX0lPX05BTUVTUEFDRTo6c2V0cHJlY2lzaW9uOwordXNpbmcgX1NUTFBfTkVXX0lPX05BTUVTUEFDRTo6c2V0dzsKZGlmZiAtLWdpdCBhL3VzaW5nL2lvcyBiL3VzaW5nL2lvcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODliNDk1Ci0tLSAvZGV2L251bGwKKysrIGIvdXNpbmcvaW9zCkBAIC0wLDAgKzEsNDEgQEAKKyMgIGlmZGVmIF9TVExQX0JST0tFTl9VU0lOR19ESVJFQ1RJVkUKK3VzaW5nIG5hbWVzcGFjZSBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOworIyAgZWxzZQorCit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjppb3M7Cit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjpzdHJlYW1vZmY7Cit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjpzdHJlYW1zaXplOworCit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjppb3NfYmFzZTsKK3VzaW5nIF9TVExQX05FV19JT19OQU1FU1BBQ0U6OmJhc2ljX2lvczsKKworLy8gX2xpYi5zdGQuaW9zLm1hbmlwXywgbWFuaXB1bGF0b3JzOgordXNpbmcgX1NUTFBfTkVXX0lPX05BTUVTUEFDRTo6Ym9vbGFscGhhOwordXNpbmcgX1NUTFBfTkVXX0lPX05BTUVTUEFDRTo6bm9ib29sYWxwaGE7Cit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjpzaG93YmFzZTsKK3VzaW5nIF9TVExQX05FV19JT19OQU1FU1BBQ0U6Om5vc2hvd2Jhc2U7Cit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjpzaG93cG9pbnQ7Cit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjpub3Nob3dwb2ludDsKK3VzaW5nIF9TVExQX05FV19JT19OQU1FU1BBQ0U6OnNob3dwb3M7Cit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjpub3Nob3dwb3M7Cit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjpza2lwd3M7Cit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjpub3NraXB3czsKK3VzaW5nIF9TVExQX05FV19JT19OQU1FU1BBQ0U6OnVwcGVyY2FzZTsKK3VzaW5nIF9TVExQX05FV19JT19OQU1FU1BBQ0U6Om5vdXBwZXJjYXNlOworCisvLyBfbGliLmFkanVzdGZpZWxkLm1hbmlwXyBhZGp1c3RmaWVsZDoKK3VzaW5nIF9TVExQX05FV19JT19OQU1FU1BBQ0U6OmludGVybmFsOwordXNpbmcgX1NUTFBfTkVXX0lPX05BTUVTUEFDRTo6bGVmdDsKK3VzaW5nIF9TVExQX05FV19JT19OQU1FU1BBQ0U6OnJpZ2h0OworCisvLyBfbGliLmJhc2VmaWVsZC5tYW5pcF8gYmFzZWZpZWxkOgordXNpbmcgX1NUTFBfTkVXX0lPX05BTUVTUEFDRTo6ZGVjOwordXNpbmcgX1NUTFBfTkVXX0lPX05BTUVTUEFDRTo6aGV4OwordXNpbmcgX1NUTFBfTkVXX0lPX05BTUVTUEFDRTo6b2N0OworCisvLyBfbGliLmZsb2F0ZmllbGQubWFuaXBfIGZsb2F0ZmllbGQ6Cit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjpmaXhlZDsKK3VzaW5nIF9TVExQX05FV19JT19OQU1FU1BBQ0U6OnNjaWVudGlmaWM7CisKKyMgIGVuZGlmICAvKiBfU1RMUF9CUk9LRU5fVVNJTkdfRElSRUNUSVZFICovCisKZGlmZiAtLWdpdCBhL3VzaW5nL2lvc2Z3ZCBiL3VzaW5nL2lvc2Z3ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTY0ZTgxCi0tLSAvZGV2L251bGwKKysrIGIvdXNpbmcvaW9zZndkCkBAIC0wLDAgKzEsNTQgQEAKKyMgaWYgZGVmaW5lZCAoX1NUTFBfVVNFX05FV19JT1NUUkVBTVMpCit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjpjaGFyX3RyYWl0czsKK3VzaW5nIF9TVExQX05FV19JT19OQU1FU1BBQ0U6OmJhc2ljX2lvczsKK3VzaW5nIF9TVExQX05FV19JT19OQU1FU1BBQ0U6OmJhc2ljX3N0cmVhbWJ1ZjsKK3VzaW5nIF9TVExQX05FV19JT19OQU1FU1BBQ0U6OmJhc2ljX2lzdHJlYW07Cit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjpiYXNpY19vc3RyZWFtOwordXNpbmcgX1NUTFBfTkVXX0lPX05BTUVTUEFDRTo6YmFzaWNfaW9zdHJlYW07Cit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjpiYXNpY19zdHJpbmdidWY7Cit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjpiYXNpY19pc3RyaW5nc3RyZWFtOwordXNpbmcgX1NUTFBfTkVXX0lPX05BTUVTUEFDRTo6YmFzaWNfb3N0cmluZ3N0cmVhbTsKK3VzaW5nIF9TVExQX05FV19JT19OQU1FU1BBQ0U6OmJhc2ljX3N0cmluZ3N0cmVhbTsKK3VzaW5nIF9TVExQX05FV19JT19OQU1FU1BBQ0U6OmJhc2ljX2ZpbGVidWY7Cit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjpiYXNpY19pZnN0cmVhbTsKK3VzaW5nIF9TVExQX05FV19JT19OQU1FU1BBQ0U6OmJhc2ljX29mc3RyZWFtOwordXNpbmcgX1NUTFBfTkVXX0lPX05BTUVTUEFDRTo6YmFzaWNfZnN0cmVhbTsKK3VzaW5nIF9TVExQX05FV19JT19OQU1FU1BBQ0U6OmZwb3M7Cit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjppc3RyZWFtYnVmX2l0ZXJhdG9yOwordXNpbmcgX1NUTFBfTkVXX0lPX05BTUVTUEFDRTo6b3N0cmVhbWJ1Zl9pdGVyYXRvcjsKK3VzaW5nIF9TVExQX05FV19JT19OQU1FU1BBQ0U6OnN0cmluZ2J1ZjsKK3VzaW5nIF9TVExQX05FV19JT19OQU1FU1BBQ0U6OmlzdHJpbmdzdHJlYW07Cit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgX1NUTFBfTkVXX0lPX05BTUVTUEFDRTo6c3RyaW5nc3RyZWFtOworIyBlbmRpZgorCit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjppb3M7Cit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjpzdHJlYW1idWY7Cit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjppc3RyZWFtOwordXNpbmcgX1NUTFBfTkVXX0lPX05BTUVTUEFDRTo6b3N0cmVhbTsKK3VzaW5nIF9TVExQX05FV19JT19OQU1FU1BBQ0U6Omlvc3RyZWFtOworCit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjpmaWxlYnVmOwordXNpbmcgX1NUTFBfTkVXX0lPX05BTUVTUEFDRTo6aWZzdHJlYW07Cit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjpvZnN0cmVhbTsKK3VzaW5nIF9TVExQX05FV19JT19OQU1FU1BBQ0U6OmZzdHJlYW07CisKK3VzaW5nIF9TVExQX05FV19JT19OQU1FU1BBQ0U6OnN0cmVhbXBvczsKK3VzaW5nIF9TVExQX05FV19JT19OQU1FU1BBQ0U6OnN0cmVhbW9mZjsKKworIyBpZiAhZGVmaW5lZCAoX1NUTFBfTk9fV0lERV9TVFJFQU1TKQordXNpbmcgX1NUTFBfTkVXX0lPX05BTUVTUEFDRTo6d2lvczsKK3VzaW5nIF9TVExQX05FV19JT19OQU1FU1BBQ0U6OndzdHJlYW1idWY7Cit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjp3aXN0cmVhbTsKK3VzaW5nIF9TVExQX05FV19JT19OQU1FU1BBQ0U6Ondvc3RyZWFtOwordXNpbmcgX1NUTFBfTkVXX0lPX05BTUVTUEFDRTo6d2lvc3RyZWFtOwordXNpbmcgX1NUTFBfTkVXX0lPX05BTUVTUEFDRTo6d3N0cmluZ2J1ZjsKK3VzaW5nIF9TVExQX05FV19JT19OQU1FU1BBQ0U6Ondpc3RyaW5nc3RyZWFtOwordXNpbmcgX1NUTFBfTkVXX0lPX05BTUVTUEFDRTo6d29zdHJpbmdzdHJlYW07Cit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjp3c3RyaW5nc3RyZWFtOwordXNpbmcgX1NUTFBfTkVXX0lPX05BTUVTUEFDRTo6d2ZpbGVidWY7Cit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjp3aWZzdHJlYW07Cit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjp3b2ZzdHJlYW07Cit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjp3ZnN0cmVhbTsKK3VzaW5nIF9TVExQX05FV19JT19OQU1FU1BBQ0U6OndzdHJlYW1wb3M7CisjIGVuZGlmCmRpZmYgLS1naXQgYS91c2luZy9pb3N0cmVhbSBiL3VzaW5nL2lvc3RyZWFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNjlhZmIKLS0tIC9kZXYvbnVsbAorKysgYi91c2luZy9pb3N0cmVhbQpAQCAtMCwwICsxLDE0IEBACisKKyMgaW5jbHVkZSA8dXNpbmcvaXN0cmVhbT4KKwordXNpbmcgX1NUTFBfVkVORE9SX1NURDo6Y2luOwordXNpbmcgX1NUTFBfVkVORE9SX1NURDo6Y291dDsKK3VzaW5nIF9TVExQX1ZFTkRPUl9TVEQ6OmNlcnI7Cit1c2luZyBfU1RMUF9WRU5ET1JfU1REOjpjbG9nOworCisjIGlmICEgZGVmaW5lZCAoX1NUTFBfTk9fV0lERV9TVFJFQU1TKQordXNpbmcgX1NUTFBfVkVORE9SX1NURDo6d2NpbjsKK3VzaW5nIF9TVExQX1ZFTkRPUl9TVEQ6Ondjb3V0OwordXNpbmcgX1NUTFBfVkVORE9SX1NURDo6d2NlcnI7Cit1c2luZyBfU1RMUF9WRU5ET1JfU1REOjp3Y2xvZzsKKyMgZW5kaWYKZGlmZiAtLWdpdCBhL3VzaW5nL2lzdHJlYW0gYi91c2luZy9pc3RyZWFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhZjEwZDIKLS0tIC9kZXYvbnVsbAorKysgYi91c2luZy9pc3RyZWFtCkBAIC0wLDAgKzEsMTYgQEAKKyMgaW5jbHVkZSA8dXNpbmcvb3N0cmVhbT4KKwordXNpbmcgX1NUTFBfTkVXX0lPX05BTUVTUEFDRTo6YmFzaWNfaXN0cmVhbTsKK3VzaW5nIF9TVExQX05FV19JT19OQU1FU1BBQ0U6OmJhc2ljX2lvc3RyZWFtOworCit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjppc3RyZWFtOwordXNpbmcgX1NUTFBfTkVXX0lPX05BTUVTUEFDRTo6aW9zdHJlYW07CisKKyMgaWYgIWRlZmluZWQgKF9TVExQX05PX05BVElWRV9XSURFX1NUUkVBTVMpCit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjp3aXN0cmVhbTsKK3VzaW5nIF9TVExQX05FV19JT19OQU1FU1BBQ0U6Ondpb3N0cmVhbTsKKyMgZW5kaWYKKworI2lmICEoZGVmaW5lZCAoX1NUTFBfTVNWQykgJiYgKF9TVExQX01TVkMgPCAxMjAwKSkKK3VzaW5nIF9TVExQX05FV19JT19OQU1FU1BBQ0U6OndzOworI2VuZGlmCmRpZmYgLS1naXQgYS91c2luZy9sb2NhbGUgYi91c2luZy9sb2NhbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE5OWI1YgotLS0gL2Rldi9udWxsCisrKyBiL3VzaW5nL2xvY2FsZQpAQCAtMCwwICsxLDY1IEBACisjaWYgIWRlZmluZWQoX1NUTFBfTk9fSU1QT1JUX0xPQ0FMRSkKKworLy8gZnJvbSA8Y3djaGFyPgorI2lmICFkZWZpbmVkIChfU1RMUF9OT19NQlNUQVRFX1QpCit1c2luZyBfU1RMUF9WRU5ET1JfTUJfTkFNRVNQQUNFOjptYnN0YXRlX3Q7CisjZW5kaWYKKworLy8gX2xpYi5sb2NhbGVfLCBsb2NhbGU6Cit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjpsb2NhbGU7Cit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjp1c2VfZmFjZXQ7Cit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjpoYXNfZmFjZXQ7CisKKy8vIF9saWIubG9jYWxlLmNvbnZlbmllbmNlXywgY29udmVuaWVuY2UgaW50ZXJmYWNlczoKK3VzaW5nIF9TVExQX05FV19JT19OQU1FU1BBQ0U6Omlzc3BhY2U7Cit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjppc3ByaW50OwordXNpbmcgX1NUTFBfTkVXX0lPX05BTUVTUEFDRTo6aXNjbnRybDsKK3VzaW5nIF9TVExQX05FV19JT19OQU1FU1BBQ0U6OmlzdXBwZXI7Cit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjppc2xvd2VyOwordXNpbmcgX1NUTFBfTkVXX0lPX05BTUVTUEFDRTo6aXNhbHBoYTsKK3VzaW5nIF9TVExQX05FV19JT19OQU1FU1BBQ0U6OmlzZGlnaXQ7Cit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjppc3B1bmN0OwordXNpbmcgX1NUTFBfTkVXX0lPX05BTUVTUEFDRTo6aXN4ZGlnaXQ7Cit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjppc2FsbnVtOwordXNpbmcgX1NUTFBfTkVXX0lPX05BTUVTUEFDRTo6aXNncmFwaDsKK3VzaW5nIF9TVExQX05FV19JT19OQU1FU1BBQ0U6OnRvdXBwZXI7Cit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjp0b2xvd2VyOworCisvLyBfbGliLmNhdGVnb3J5LmN0eXBlXyBhbmQgX2xpYi5mYWNldC5jdHlwZS5zcGVjaWFsXywgY3R5cGU6Cit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjpjdHlwZV9iYXNlOwordXNpbmcgX1NUTFBfTkVXX0lPX05BTUVTUEFDRTo6Y3R5cGU7Cit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjpjdHlwZV9ieW5hbWU7Cit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjpjb2RlY3Z0X2Jhc2U7Cit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjpjb2RlY3Z0OwordXNpbmcgX1NUTFBfTkVXX0lPX05BTUVTUEFDRTo6Y29kZWN2dF9ieW5hbWU7CisKKy8vIF9saWIuY2F0ZWdvcnkubnVtZXJpY18gYW5kIF9saWIuZmFjZXQubnVtcHVuY3RfLCBudW1lcmljOgordXNpbmcgX1NUTFBfTkVXX0lPX05BTUVTUEFDRTo6bnVtX2dldDsKK3VzaW5nIF9TVExQX05FV19JT19OQU1FU1BBQ0U6Om51bV9wdXQ7Cit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjpudW1wdW5jdDsKK3VzaW5nIF9TVExQX05FV19JT19OQU1FU1BBQ0U6Om51bXB1bmN0X2J5bmFtZTsKKworLy8gX2xpYi5jYXRlZ29yeS5jb2xsYXRlXywgY29sbGF0aW9uOgordXNpbmcgX1NUTFBfTkVXX0lPX05BTUVTUEFDRTo6Y29sbGF0ZTsKK3VzaW5nIF9TVExQX05FV19JT19OQU1FU1BBQ0U6OmNvbGxhdGVfYnluYW1lOworCisvLyBfbGliLmNhdGVnb3J5LnRpbWVfLCBkYXRlIGFuZCB0aW1lOgordXNpbmcgX1NUTFBfTkVXX0lPX05BTUVTUEFDRTo6dGltZV9iYXNlOwordXNpbmcgX1NUTFBfTkVXX0lPX05BTUVTUEFDRTo6dGltZV9nZXQ7Cit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjp0aW1lX2dldF9ieW5hbWU7Cit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjp0aW1lX3B1dDsKK3VzaW5nIF9TVExQX05FV19JT19OQU1FU1BBQ0U6OnRpbWVfcHV0X2J5bmFtZTsKKworLy8gX2xpYi5jYXRlZ29yeS5tb25ldGFyeV8sIG1vbmV5OgordXNpbmcgX1NUTFBfTkVXX0lPX05BTUVTUEFDRTo6bW9uZXlfYmFzZTsKK3VzaW5nIF9TVExQX05FV19JT19OQU1FU1BBQ0U6Om1vbmV5X2dldDsKK3VzaW5nIF9TVExQX05FV19JT19OQU1FU1BBQ0U6Om1vbmV5X3B1dDsKK3VzaW5nIF9TVExQX05FV19JT19OQU1FU1BBQ0U6Om1vbmV5cHVuY3Q7Cit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjptb25leXB1bmN0X2J5bmFtZTsKKworI2lmICFkZWZpbmVkIChfU1RMUF9PV05fSU9TVFJFQU1TKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fTkFUSVZFX01FU1NBR0VfRkFDRVQpCit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjptZXNzYWdlc19iYXNlOwordXNpbmcgX1NUTFBfTkVXX0lPX05BTUVTUEFDRTo6bWVzc2FnZXM7Cit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjptZXNzYWdlc19ieW5hbWU7CisjZW5kaWYgLy8gX01TTF9OT19NRVNTQUdFX0ZBQ0VUCisjZW5kaWYgLyogIWRlZmluZWQoX1NUTFBfTk9fSU1QT1JUX0xPQ0FMRSkgKi8KZGlmZiAtLWdpdCBhL3VzaW5nL29zdHJlYW0gYi91c2luZy9vc3RyZWFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MmIzMmQKLS0tIC9kZXYvbnVsbAorKysgYi91c2luZy9vc3RyZWFtCkBAIC0wLDAgKzEsMTAgQEAKK3VzaW5nIF9TVExQX05FV19JT19OQU1FU1BBQ0U6OmJhc2ljX29zdHJlYW07Cit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjpvc3RyZWFtOworCisjIGlmbmRlZiBfU1RMUF9OT19XSURFX1NUUkVBTVMKK3VzaW5nIF9TVExQX05FV19JT19OQU1FU1BBQ0U6Ondvc3RyZWFtOworIyBlbmRpZgorCit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjplbmRsOwordXNpbmcgX1NUTFBfTkVXX0lPX05BTUVTUEFDRTo6ZW5kczsKK3VzaW5nIF9TVExQX05FV19JT19OQU1FU1BBQ0U6OmZsdXNoOwpkaWZmIC0tZ2l0IGEvdXNpbmcvc3N0cmVhbSBiL3VzaW5nL3NzdHJlYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI1YzM3ZQotLS0gL2Rldi9udWxsCisrKyBiL3VzaW5nL3NzdHJlYW0KQEAgLTAsMCArMSwxNiBAQAordXNpbmcgX1NUTFBfTkVXX0lPX05BTUVTUEFDRTo6YmFzaWNfc3RyaW5nYnVmOwordXNpbmcgX1NUTFBfTkVXX0lPX05BTUVTUEFDRTo6c3RyaW5nYnVmOworCit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjpiYXNpY19pc3RyaW5nc3RyZWFtOwordXNpbmcgX1NUTFBfTkVXX0lPX05BTUVTUEFDRTo6YmFzaWNfb3N0cmluZ3N0cmVhbTsKK3VzaW5nIF9TVExQX05FV19JT19OQU1FU1BBQ0U6OmJhc2ljX3N0cmluZ3N0cmVhbTsKK3VzaW5nIF9TVExQX05FV19JT19OQU1FU1BBQ0U6OmlzdHJpbmdzdHJlYW07Cit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgX1NUTFBfTkVXX0lPX05BTUVTUEFDRTo6c3RyaW5nc3RyZWFtOworCisjaWZuZGVmIF9TVExQX05PX1dJREVfU1RSRUFNUwordXNpbmcgX1NUTFBfTkVXX0lPX05BTUVTUEFDRTo6d3N0cmluZ2J1ZjsKK3VzaW5nIF9TVExQX05FV19JT19OQU1FU1BBQ0U6Ondpc3RyaW5nc3RyZWFtOwordXNpbmcgX1NUTFBfTkVXX0lPX05BTUVTUEFDRTo6d29zdHJpbmdzdHJlYW07Cit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjp3c3RyaW5nc3RyZWFtOworI2VuZGlmCmRpZmYgLS1naXQgYS91c2luZy9zdHJlYW1idWYgYi91c2luZy9zdHJlYW1idWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA4MjQxZAotLS0gL2Rldi9udWxsCisrKyBiL3VzaW5nL3N0cmVhbWJ1ZgpAQCAtMCwwICsxLDUgQEAKK3VzaW5nIF9TVExQX05FV19JT19OQU1FU1BBQ0U6OmJhc2ljX3N0cmVhbWJ1ZjsKK3VzaW5nIF9TVExQX05FV19JT19OQU1FU1BBQ0U6OnN0cmVhbWJ1ZjsKKyNpZm5kZWYgX1NUTFBfTk9fV0lERV9TVFJFQU1TCit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjp3c3RyZWFtYnVmOworIyBlbmRpZgpkaWZmIC0tZ2l0IGEvdXNpbmcvc3Ryc3RyZWFtIGIvdXNpbmcvc3Ryc3RyZWFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMjZhYzEKLS0tIC9kZXYvbnVsbAorKysgYi91c2luZy9zdHJzdHJlYW0KQEAgLTAsMCArMSw0IEBACit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjpzdHJzdHJlYW1idWY7Cit1c2luZyBfU1RMUF9ORVdfSU9fTkFNRVNQQUNFOjppc3Ryc3RyZWFtOwordXNpbmcgX1NUTFBfTkVXX0lPX05BTUVTUEFDRTo6b3N0cnN0cmVhbTsKK3VzaW5nIF9TVExQX05FV19JT19OQU1FU1BBQ0U6OnN0cnN0cmVhbTsKZGlmZiAtLWdpdCBhL3V0aWxpdHkgYi91dGlsaXR5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyM2ZlMWUKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsaXR5CkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIEJvcmlzIEZvbWl0Y2hldgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGV4cHJlc3NlZAorICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIG9yIGNvcHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQKKyAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQgdGhlIGNvZGUgd2FzCisgKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICoKKyAqLworCisjaWZuZGVmIF9TVExQX1VUSUxJVFkKKyNkZWZpbmUgX1NUTFBfVVRJTElUWQorCisjaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4NzUKKyMgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+CisjZW5kaWYKKworI2lmZGVmIF9TVExQX1BSQUdNQV9PTkNFCisjICBwcmFnbWEgb25jZQorI2VuZGlmCisKKyNpZm5kZWYgX19UWVBFX1RSQUlUU19ICisjICBpbmNsdWRlIDxzdGwvdHlwZV90cmFpdHMuaD4KKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKF9TVExQX0RFQlVHX0gpICYmIChkZWZpbmVkICAoX1NUTFBfREVCVUcpIHx8IGRlZmluZWQgKF9TVExQX0FTU0VSVElPTlMpKQorIyAgaW5jbHVkZSA8c3RsL2RlYnVnL19kZWJ1Zy5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1NUTFBfSU5URVJOQUxfUEFJUl9ICisjICBpbmNsdWRlIDxzdGwvX3BhaXIuaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NUTFBfSU1QT1JUX1ZFTkRPUl9TVEQpCisjICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfSEVBREVSKHV0aWxpdHkpCisjZWxzZQorIyAgaWYgZGVmaW5lZCAoX1NUTFBfTVNWQykgJiYgIWRlZmluZWQgKF9TVExQX0lOVEVSTkFMX0lURVJBVE9SX0gpCisjICAgIGluY2x1ZGUgPHN0bC9faXRlcmF0b3IuaD4KKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4NzUpCisjICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9VVElMSVRZICovCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CisKZGlmZiAtLWdpdCBhL3ZhbGFycmF5IGIvdmFsYXJyYXkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NmNzFmMwotLS0gL2Rldi9udWxsCisrKyBiL3ZhbGFycmF5CkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZm5kZWYgX1NUTFBfVkFMQVJSQVkKKyNkZWZpbmUgX1NUTFBfVkFMQVJSQVkKKworI2lmbmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjICBkZWZpbmUgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCAweDc2CisjICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgorI2VuZGlmCisKKyNpZmRlZiBfU1RMUF9QUkFHTUFfT05DRQorIyAgcHJhZ21hIG9uY2UKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RsL192YWxhcnJheS5oPgorCisjaWYgZGVmaW5lZCAoX1NUTFBfSU1QT1JUX1ZFTkRPUl9TVEQpCisjICBpbmNsdWRlIF9TVExQX05BVElWRV9IRUFERVIodmFsYXJyYXkpCisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4NzYpCisjICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgdW5kZWYgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9WQUxBUlJBWSAqLworCisKKy8vIExvY2FsIFZhcmlhYmxlczoKKy8vIG1vZGU6QysrCisvLyBFbmQ6CmRpZmYgLS1naXQgYS92ZWN0b3IgYi92ZWN0b3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU4M2I5ZgotLS0gL2Rldi9udWxsCisrKyBiL3ZlY3RvcgpAQCAtMCwwICsxLDU3IEBACisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKiBCb3JpcyBGb21pdGNoZXYKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKKyAqIG9yIGltcGxpZWQuIEFueSB1c2UgaXMgYXQgeW91ciBvd24gcmlzay4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCisgKiB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzIGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcworICogbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqCisgKi8KKworI2lmbmRlZiBfU1RMUF9WRUNUT1IKKyNkZWZpbmUgX1NUTFBfVkVDVE9SCisKKyMgaWZuZGVmIF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4NzcKKyMgIGluY2x1ZGUgPHN0bC9fcHJvbG9nLmg+CisjIGVuZGlmCisKKyMgaWZkZWYgX1NUTFBfUFJBR01BX09OQ0UKKyMgIHByYWdtYSBvbmNlCisjIGVuZGlmCisKKyMgaWZuZGVmIF9TVExQX0lOVEVSTkFMX0FMR09CQVNFX0gKKyMgIGluY2x1ZGUgPHN0bC9fYWxnb2Jhc2UuaD4KKyMgZW5kaWYKKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9WRUNUT1JfSAorIyBpbmNsdWRlIDxzdGwvX3ZlY3Rvci5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU1RMUF9JTVBPUlRfVkVORE9SX1NURCkgJiYgISBkZWZpbmVkIChfU1RMUF9NSU5JTVVNX0lNUE9SVF9TVEQpCisjICBpbmNsdWRlIF9TVExQX05BVElWRV9IRUFERVIodmVjdG9yKQorI2VuZGlmCisKKyMgaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHg3NykKKyMgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+CisjICB1bmRlZiBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjIGVuZGlmCisKKyNlbmRpZiAvKiBfU1RMUF9WRUNUT1IgKi8KKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTpDKysKKy8vIEVuZDoKKwpkaWZmIC0tZ2l0IGEvd2NoYXIuaCBiL3djaGFyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I0OWM1ZAotLS0gL2Rldi9udWxsCisrKyBiL3djaGFyLmgKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCkKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4Mjc4CisjICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgorI2VsaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgyNzgpICYmICFkZWZpbmVkIChfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQpCisjICBkZWZpbmUgX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lECisjZW5kaWYKKworI2lmICFkZWZpbmVkIChfU1RMUF9XQ0VfRVZDMykgJiYgIWRlZmluZWQgKF9TVExQX05PX1dDSEFSX1QpCisKKyMgIGlmIGRlZmluZWQgKF9fQk9STEFORENfXykKKy8qCisjICBpbmNsdWRlIDxjc3RyaW5nPgorKi8KKyMgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ1BQX0NfSEVBREVSKF9zdHIuaCkKKyMgICAgaWZkZWYgX19jcGx1c3BsdXMKK3VzaW5nIF9TVExQX1ZFTkRPUl9DU1REOjpzdHJsZW47Cit1c2luZyBfU1RMUF9WRU5ET1JfQ1NURDo6c3Ryc3BuOworIyAgICBlbmRpZgorIyAgZW5kaWYKKworIyAgaWYgKCgoX19HTlVDX18gPCAzKSB8fCAoKF9fR05VQ19fID09IDMpICYmIChfX0dOVUNfTUlOT1JfXyA8IDMpKSkgJiYgZGVmaW5lZCAoX19BUFBMRV9fKSkgfHwgZGVmaW5lZCAoX19PcGVuQlNEX18pCisjICAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NfSEVBREVSKHN0ZGRlZi5oKQorIyAgZWxpZiBkZWZpbmVkKF9fTVdFUktTX18pICYmIGRlZmluZWQoTl9QTEFUX05MTSkKKy8qCisgKiBNU0wgbGlicmFyeSBoYXMgd3JvbmcgZGVmaW5pdGlvbiBvZiB3aW50X3QgKHdpdGggLXdjaGFyX3Qgb24pIGluIHdjaGFyX3QuaCBoZWFkZXIuCisgKiBJTUhPIHRoZSBiZXN0IHdheSBpcyB0byBjb21tZW50IGxpbmUKKyAqICAgICAgIHR5cGVkZWYgd2NoYXJfdCB3aW50X3Q7CisgKiAoSSB1c2UgdGhpcyB3YXkpLgorICoKKyAqIEFub3RoZXIgc29sdXRpb24gaXMgdG8gZGVmaW5lIF9XSU5UX1QgKHRvIGF2b2lkIGNvbmZsaWN0IHdpdGggd2ludF90IGRlZmluaXRpb25zIGluCisgKiBOb3ZlbGwgU0RLIGhlYWRlcnMsIF9XQ0hBUl9UIGRlZmluZWQgaW4gbmxtX3ByZWZpeC5oKS4gQnV0IHlvdSBzaG91bGQgZGVmaW5lIG9uZQorICogYmVmb3JlIGluY2x1ZGUgYW55IGhlYWRlciBmcm9tIE5vdmVsbCdzIFNESywgc28gdGhpcyBpc24ndCB0b28gZ29vZCBjaG9pY2UuCisgKgorICogQW5kIHRoaXJkIHNvbHV0aW9uIGlzIGRvbid0IHVzZSBhbnl3YXJlIChldmVuIGhlcmUpIHdjaGFyX3QuaAorICoKKyAqICAgICAgLSBwdHIsIDIwMDMgYW5kIDIwMDUtMDUtMDcKKyAqLworLyoKKyNpZiBfX29wdGlvbih3Y2hhcl90eXBlKQorIyBkZWZpbmUgX1dJTlRfVAorI2VuZGlmCisqLworIyAgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NQUF9DX0hFQURFUih3Y2hhcl90LmgpCisjICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ19IRUFERVIoc3RkZGVmLmgpCisjICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ19IRUFERVIoc3RkaW8uaCkKKyMgICBpbmNsdWRlIDx1bmljb2RlLmg+CitpbnQgd2NzbGVuKCBjb25zdCB3Y2hhcl90ICpfd2MgKTsKK2ludCB3Y3NjbXAoIGNvbnN0IHdjaGFyX3QgKl93YzEsIGNvbnN0IHdjaGFyX3QgKl93YzIgKTsKK2ludCB3Y3NuY21wKCBjb25zdCB3Y2hhcl90ICpfd2MxLCBjb25zdCB3Y2hhcl90ICpfd2MyLCBzaXplX3QgbiApOword2NoYXJfdCAqd2Nzc3RyKCBjb25zdCB3Y2hhcl90ICpfd2MxLCBjb25zdCB3Y2hhcl90ICpfd2MyICk7Cit3Y2hhcl90ICp3Y3NjaHIoIGNvbnN0IHdjaGFyX3QgKl93YzEsIHdjaGFyX3QgX3djMiApOword2NoYXJfdCAqd2NzcmNociggY29uc3Qgd2NoYXJfdCAqX3djMSwgd2NoYXJfdCBfd2MyICk7Cit3Y2hhcl90ICp3Y3NjcHkoIHdjaGFyX3QgKl93YzEsIGNvbnN0IHdjaGFyX3QgKl93YzIgKTsKK3djaGFyX3QgKndjc25jcHkoIHdjaGFyX3QgKl93YzEsIGNvbnN0IHdjaGFyX3QgKl93YzIsIHNpemVfdCBuICk7Cit3Y2hhcl90ICp3Y3NwYnJrKCBjb25zdCB3Y2hhcl90ICpfd2MsIGNvbnN0IHdjaGFyX3QgKl93YzIgKTsKKyMgIGVsc2UKKyMgICAgaW5jbHVkZSBfU1RMUF9OQVRJVkVfQ19IRUFERVIod2NoYXIuaCkKKyMgIGVuZGlmCisjZW5kaWYgLyogIWRlZmluZWQgKF9TVExQX1dDRV9FVkMzKSAmJiAhZGVmaW5lZCAoX1NUTFBfTk9fV0NIQVJfVCkgKi8KKworI2lmbmRlZiBfU1RMUF9JTlRFUk5BTF9NQlNUQVRFX1QKKyMgIGluY2x1ZGUgPHN0bC9fbWJzdGF0ZV90Lmg+CisjZW5kaWYKKworI2lmIChfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEID09IDB4Mjc4KQorIyAgaWYgISBkZWZpbmVkIChfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQpCisjICAgIGluY2x1ZGUgPHN0bC9fZXBpbG9nLmg+CisjICAgIHVuZGVmICBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lECisjICBlbHNlCisjICAgIHVuZGVmICBfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQKKyMgIGVuZGlmCisjZW5kaWYKKworLyoKKyBMb2NhbCBWYXJpYWJsZXM6CisgbW9kZTpDKysKKyBFbmQ6CisqLwpkaWZmIC0tZ2l0IGEvd2N0eXBlLmggYi93Y3R5cGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjVmMGQzCi0tLSAvZGV2L251bGwKKysrIGIvd2N0eXBlLmgKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICogQm9yaXMgRm9taXRjaGV2CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIGFic29sdXRlbHkgbm8gd2FycmFudHkgZXhwcmVzc2VkCisgKiBvciBpbXBsaWVkLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogUGVybWlzc2lvbiB0byB1c2Ugb3IgY29weSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAorICogcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdCB0aGUgY29kZSB3YXMKKyAqIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKgorICovCisKKyNpZiAhZGVmaW5lZCAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCkKKyMgIGRlZmluZSBfU1RMUF9PVVRFUk1PU1RfSEVBREVSX0lEIDB4Mjc5CisjICBpbmNsdWRlIDxzdGwvX3Byb2xvZy5oPgorI2VsaWYgKF9TVExQX09VVEVSTU9TVF9IRUFERVJfSUQgPT0gMHgyNzkpICYmICFkZWZpbmVkIChfU1RMUF9ET05UX1BPUF9IRUFERVJfSUQpCisjICBkZWZpbmUgX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lECisjZW5kaWYKKworLyogZXZjMyBkb2Vzbid0IGhhdmUgd2N0eXBlLmggKi8KKyNpZiAhZGVmaW5lZChfU1RMUF9XQ0VfRVZDMykgJiYgIWRlZmluZWQoTl9QTEFUX05MTSkKKyMgIGluY2x1ZGUgX1NUTFBfTkFUSVZFX0NfSEVBREVSKHdjdHlwZS5oKQorI2VuZGlmCisKKyNpZiAoX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRCA9PSAweDI3OSkKKyMgIGlmICEgZGVmaW5lZCAoX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lEKQorIyAgICBpbmNsdWRlIDxzdGwvX2VwaWxvZy5oPgorIyAgICB1bmRlZiAgX1NUTFBfT1VURVJNT1NUX0hFQURFUl9JRAorIyAgZWxzZQorIyAgICB1bmRlZiAgX1NUTFBfRE9OVF9QT1BfSEVBREVSX0lECisjICBlbmRpZgorI2VuZGlmCisKKy8qIExvY2FsIFZhcmlhYmxlczoKKyAqIG1vZGU6QysrCisgKiBFbmQ6CisgKi8K