LyogQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgoKICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHNlZQogICA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwoKI2luY2x1ZGUgPGFzc2VydC5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPGVycm9yLmg+CiNpbmNsdWRlIDxmY250bC5oPgojaW5jbHVkZSA8Z2V0b3B0Lmg+CiNpbmNsdWRlIDxpY29udi5oPgojaW5jbHVkZSA8bG9jYWxlLmg+CiNpbmNsdWRlIDxtY2hlY2suaD4KI2luY2x1ZGUgPHN0ZGludC5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDx0aW1lLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPHJlZ2V4Lmg+CgoKI2lmIGRlZmluZWQgX1BPU0lYX0NQVVRJTUUgJiYgX1BPU0lYX0NQVVRJTUUgPj0gMApzdGF0aWMgY2xvY2tpZF90IGNsOwpzdGF0aWMgaW50IHVzZV9jbG9jazsKI2VuZGlmCnN0YXRpYyBpY29udl90IGNkOwpzdGF0aWMgY2hhciAqbWVtOwpzdGF0aWMgY2hhciAqdW1lbTsKc3RhdGljIHNpemVfdCBtZW1sZW47CnN0YXRpYyBzaXplX3QgdW1lbWxlbjsKc3RhdGljIGludCB0aW1pbmc7CgpzdGF0aWMgaW50IHRlc3RfZXhwciAoY29uc3QgY2hhciAqZXhwciwgaW50IGV4cGVjdGVkLCBpbnQgZXhwZWN0ZWRpY2FzZSk7CnN0YXRpYyBpbnQgcnVuX3Rlc3QgKGNvbnN0IGNoYXIgKmV4cHIsIGNvbnN0IGNoYXIgKm1lbSwgc2l6ZV90IG1lbWxlbiwKCQkgICAgIGludCBpY2FzZSwgaW50IGV4cGVjdGVkKTsKc3RhdGljIGludCBydW5fdGVzdF9iYWNrd2FyZHMgKGNvbnN0IGNoYXIgKmV4cHIsIGNvbnN0IGNoYXIgKm1lbSwKCQkJICAgICAgIHNpemVfdCBtZW1sZW4sIGludCBpY2FzZSwgaW50IGV4cGVjdGVkKTsKCgpzdGF0aWMgaW50CmRvX3Rlc3QgKHZvaWQpCnsKICBjb25zdCBjaGFyICpmaWxlOwogIGludCBmZDsKICBzdHJ1Y3Qgc3RhdCBzdDsKICBpbnQgcmVzdWx0OwogIGNoYXIgKmlubWVtOwogIGNoYXIgKm91dG1lbTsKICBzaXplX3QgaW5sZW47CiAgc2l6ZV90IG91dGxlbjsKCiAgbXRyYWNlICgpOwoKICAvKiBNYWtlIHRoZSBjb250ZW50IG9mIHRoZSBmaWxlIGF2YWlsYWJsZSBpbiBtZW1vcnkuICAqLwogIGZpbGUgPSAiLi4vQ2hhbmdlTG9nLm9sZC9DaGFuZ2VMb2cuOCI7CiAgZmQgPSBvcGVuIChmaWxlLCBPX1JET05MWSk7CiAgaWYgKGZkID09IC0xKQogICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgZXJybm8sICJjYW5ub3Qgb3BlbiAlcyIsIGJhc2VuYW1lIChmaWxlKSk7CgogIGlmIChmc3RhdCAoZmQsICZzdCkgIT0gMCkKICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIGVycm5vLCAiY2Fubm90IHN0YXQgJXMiLCBiYXNlbmFtZSAoZmlsZSkpOwogIG1lbWxlbiA9IHN0LnN0X3NpemU7CgogIG1lbSA9IChjaGFyICopIG1hbGxvYyAobWVtbGVuICsgMSk7CiAgaWYgKG1lbSA9PSBOVUxMKQogICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgZXJybm8sICJ3aGlsZSBhbGxvY2F0aW5nIGJ1ZmZlciIpOwoKICBpZiAoKHNpemVfdCkgcmVhZCAoZmQsIG1lbSwgbWVtbGVuKSAhPSBtZW1sZW4pCiAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCAiY2Fubm90IHJlYWQgZW50aXJlIGZpbGUiKTsKICBtZW1bbWVtbGVuXSA9ICdcMCc7CgogIGNsb3NlIChmZCk7CgogIC8qIFdlIGhhdmUgdG8gY29udmVydCBhIGZldyB0aGluZ3MgZnJvbSBMYXRpbi0xIHRvIFVURi04LiAgKi8KICBjZCA9IGljb252X29wZW4gKCJVVEYtOCIsICJJU08tODg1OS0xIik7CiAgaWYgKGNkID09IChpY29udl90KSAtMSkKICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIGVycm5vLCAiY2Fubm90IGdldCBjb252ZXJzaW9uIGRlc2NyaXB0b3IiKTsKCiAgLyogRm9yIHRoZSBzZWNvbmQgdGVzdCB3ZSBoYXZlIHRvIGNvbnZlcnQgdGhlIGZpbGUgY29udGVudCB0byBVVEYtOC4KICAgICBTaW5jZSB0aGUgdGV4dCBpcyBtb3N0bHkgQVNDSUkgaXQgc2hvdWxkIGJlIGVub3VnaCB0byBhbGxvY2F0ZQogICAgIHR3aWNlIGFzIG11Y2ggbWVtb3J5IGZvciB0aGUgVVRGLTggdGV4dCB0aGFuIGZvciB0aGUgTGF0aW4tMQogICAgIHRleHQuICAqLwogIHVtZW0gPSAoY2hhciAqKSBjYWxsb2MgKDIsIG1lbWxlbik7CiAgaWYgKHVtZW0gPT0gTlVMTCkKICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIGVycm5vLCAid2hpbGUgYWxsb2NhdGluZyBidWZmZXIiKTsKCiAgaW5tZW0gPSBtZW07CiAgaW5sZW4gPSBtZW1sZW47CiAgb3V0bWVtID0gdW1lbTsKICBvdXRsZW4gPSAyICogbWVtbGVuIC0gMTsKICBpY29udiAoY2QsICZpbm1lbSwgJmlubGVuLCAmb3V0bWVtLCAmb3V0bGVuKTsKICB1bWVtbGVuID0gb3V0bWVtIC0gdW1lbTsKICBpZiAoaW5sZW4gIT0gMCkKICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIGVycm5vLCAiY2Fubm90IGNvbnZlcnQgYnVmZmVyIik7CgojaWYgZGVmaW5lZCBfUE9TSVhfQ1BVVElNRSAmJiBfUE9TSVhfQ1BVVElNRSA+PSAwCiMgaWYgX1BPU0lYX0NQVVRJTUUgPT0gMAogIGlmIChzeXNjb25mIChfU0NfQ1BVVElNRSkgPCAwKQogICAgdXNlX2Nsb2NrID0gMDsKICBlbHNlCiMgZW5kaWYKICAgIC8qIFNlZSB3aGV0aGVyIHdlIGNhbiB1c2UgdGhlIENQVSBjbG9jay4gICovCiAgICB1c2VfY2xvY2sgPSBjbG9ja19nZXRjcHVjbG9ja2lkICgwLCAmY2wpID09IDA7CiNlbmRpZgoKI2lmZGVmIERFQlVHCiAgcmVfc2V0X3N5bnRheCAoUkVfREVCVUcpOwojZW5kaWYKCiAgLyogUnVuIHRoZSBhY3R1YWwgdGVzdHMuICBBbGwgdGVzdHMgYXJlIHJ1biBpbiBhIHNpbmdsZS1ieXRlIGFuZCBhCiAgICAgbXVsdGktYnl0ZSBsb2NhbGUuICAqLwogIHJlc3VsdCA9IHRlc3RfZXhwciAoIlvk4eDi6ejq7ezu8fbz8vT8+vn7XSIsIDIsIDIpOwogIHJlc3VsdCB8PSB0ZXN0X2V4cHIgKCJHLnJhbiIsIDIsIDMpOwogIHJlc3VsdCB8PSB0ZXN0X2V4cHIgKCJHLlxcezFcXH1yYW4iLCAyLCAzKTsKICByZXN1bHQgfD0gdGVzdF9leHByICgiRy4qcmFuIiwgMywgNDQpOwogIHJlc3VsdCB8PSB0ZXN0X2V4cHIgKCJb5OHg4l0iLCAwLCAwKTsKICByZXN1bHQgfD0gdGVzdF9leHByICgiVWRkZWJvcmciLCAyLCAyKTsKICByZXN1bHQgfD0gdGVzdF9leHByICgiLlVkZGVib3JnIiwgMiwgMik7CgogIC8qIEZyZWUgdGhlIHJlc291cmNlcy4gICovCiAgZnJlZSAodW1lbSk7CiAgaWNvbnZfY2xvc2UgKGNkKTsKICBmcmVlIChtZW0pOwoKICByZXR1cm4gcmVzdWx0Owp9CgoKc3RhdGljIGludAp0ZXN0X2V4cHIgKGNvbnN0IGNoYXIgKmV4cHIsIGludCBleHBlY3RlZCwgaW50IGV4cGVjdGVkaWNhc2UpCnsKICBpbnQgcmVzdWx0OwogIGNoYXIgKmlubWVtOwogIGNoYXIgKm91dG1lbTsKICBzaXplX3QgaW5sZW47CiAgc2l6ZV90IG91dGxlbjsKICBjaGFyICp1ZXhwcjsKCiAgLyogRmlyc3QgdGVzdDogc2VhcmNoIHdpdGggYW4gSVNPLTg4NTktMSBsb2NhbGUuICAqLwogIGlmIChzZXRsb2NhbGUgKExDX0FMTCwgImRlX0RFLklTTy04ODU5LTEiKSA9PSBOVUxMKQogICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgImNhbm5vdCBzZXQgbG9jYWxlIGRlX0RFLklTTy04ODU5LTEiKTsKCiAgcHJpbnRmICgiXG5UZXN0IFwiJXNcIiB3aXRoIDgtYml0IGxvY2FsZVxuIiwgZXhwcik7CiAgcmVzdWx0ID0gcnVuX3Rlc3QgKGV4cHIsIG1lbSwgbWVtbGVuLCAwLCBleHBlY3RlZCk7CiAgcHJpbnRmICgiXG5UZXN0IFwiJXNcIiB3aXRoIDgtYml0IGxvY2FsZSwgY2FzZSBpbnNlbnNpdGl2ZVxuIiwgZXhwcik7CiAgcmVzdWx0IHw9IHJ1bl90ZXN0IChleHByLCBtZW0sIG1lbWxlbiwgMSwgZXhwZWN0ZWRpY2FzZSk7CiAgcHJpbnRmICgiXG5UZXN0IFwiJXNcIiBiYWNrd2FyZHMgd2l0aCA4LWJpdCBsb2NhbGVcbiIsIGV4cHIpOwogIHJlc3VsdCB8PSBydW5fdGVzdF9iYWNrd2FyZHMgKGV4cHIsIG1lbSwgbWVtbGVuLCAwLCBleHBlY3RlZCk7CiAgcHJpbnRmICgiXG5UZXN0IFwiJXNcIiBiYWNrd2FyZHMgd2l0aCA4LWJpdCBsb2NhbGUsIGNhc2UgaW5zZW5zaXRpdmVcbiIsCgkgIGV4cHIpOwogIHJlc3VsdCB8PSBydW5fdGVzdF9iYWNrd2FyZHMgKGV4cHIsIG1lbSwgbWVtbGVuLCAxLCBleHBlY3RlZGljYXNlKTsKCiAgLyogU2Vjb25kIHRlc3Q6IHNlYXJjaCB3aXRoIGFuIFVURi04IGxvY2FsZS4gICovCiAgaWYgKHNldGxvY2FsZSAoTENfQUxMLCAiZGVfREUuVVRGLTgiKSA9PSBOVUxMKQogICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgImNhbm5vdCBzZXQgbG9jYWxlIGRlX0RFLlVURi04Iik7CgogIGlubWVtID0gKGNoYXIgKikgZXhwcjsKICBpbmxlbiA9IHN0cmxlbiAoZXhwcik7CiAgb3V0bGVuID0gaW5sZW4gKiBNQl9DVVJfTUFYOwogIG91dG1lbSA9IHVleHByID0gYWxsb2NhIChvdXRsZW4gKyAxKTsKICBtZW1zZXQgKG91dG1lbSwgJ1wwJywgb3V0bGVuICsgMSk7CiAgaWNvbnYgKGNkLCAmaW5tZW0sICZpbmxlbiwgJm91dG1lbSwgJm91dGxlbik7CiAgaWYgKGlubGVuICE9IDApCiAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCBlcnJubywgImNhbm5vdCBjb252ZXJ0IGV4cHJlc3Npb24iKTsKCiAgLyogUnVuIHRoZSB0ZXN0cy4gICovCiAgcHJpbnRmICgiXG5UZXN0IFwiJXNcIiB3aXRoIG11bHRpLWJ5dGUgbG9jYWxlXG4iLCBleHByKTsKICByZXN1bHQgfD0gcnVuX3Rlc3QgKHVleHByLCB1bWVtLCB1bWVtbGVuLCAwLCBleHBlY3RlZCk7CiAgcHJpbnRmICgiXG5UZXN0IFwiJXNcIiB3aXRoIG11bHRpLWJ5dGUgbG9jYWxlLCBjYXNlIGluc2Vuc2l0aXZlXG4iLCBleHByKTsKICByZXN1bHQgfD0gcnVuX3Rlc3QgKHVleHByLCB1bWVtLCB1bWVtbGVuLCAxLCBleHBlY3RlZGljYXNlKTsKICBwcmludGYgKCJcblRlc3QgXCIlc1wiIGJhY2t3YXJkcyB3aXRoIG11bHRpLWJ5dGUgbG9jYWxlXG4iLCBleHByKTsKICByZXN1bHQgfD0gcnVuX3Rlc3RfYmFja3dhcmRzICh1ZXhwciwgdW1lbSwgdW1lbWxlbiwgMCwgZXhwZWN0ZWQpOwogIHByaW50ZiAoIlxuVGVzdCBcIiVzXCIgYmFja3dhcmRzIHdpdGggbXVsdGktYnl0ZSBsb2NhbGUsIGNhc2UgaW5zZW5zaXRpdmVcbiIsCgkgIGV4cHIpOwogIHJlc3VsdCB8PSBydW5fdGVzdF9iYWNrd2FyZHMgKHVleHByLCB1bWVtLCB1bWVtbGVuLCAxLCBleHBlY3RlZGljYXNlKTsKCiAgcmV0dXJuIHJlc3VsdDsKfQoKCnN0YXRpYyBpbnQKcnVuX3Rlc3QgKGNvbnN0IGNoYXIgKmV4cHIsIGNvbnN0IGNoYXIgKm1lbSwgc2l6ZV90IG1lbWxlbiwgaW50IGljYXNlLAoJICBpbnQgZXhwZWN0ZWQpCnsKI2lmIGRlZmluZWQgX1BPU0lYX0NQVVRJTUUgJiYgX1BPU0lYX0NQVVRJTUUgPj0gMAogIHN0cnVjdCB0aW1lc3BlYyBzdGFydDsKICBzdHJ1Y3QgdGltZXNwZWMgZmluaXNoOwojZW5kaWYKICByZWdleF90IHJlOwogIGludCBlcnI7CiAgc2l6ZV90IG9mZnNldDsKICBpbnQgY250OwoKI2lmIGRlZmluZWQgX1BPU0lYX0NQVVRJTUUgJiYgX1BPU0lYX0NQVVRJTUUgPj0gMAogIGlmICh1c2VfY2xvY2sgJiYgIXRpbWluZykKICAgIHVzZV9jbG9jayA9IGNsb2NrX2dldHRpbWUgKGNsLCAmc3RhcnQpID09IDA7CiNlbmRpZgoKICBlcnIgPSByZWdjb21wICgmcmUsIGV4cHIsIFJFR19ORVdMSU5FIHwgKGljYXNlID8gUkVHX0lDQVNFIDogMCkpOwogIGlmIChlcnIgIT0gUkVHX05PRVJST1IpCiAgICB7CiAgICAgIGNoYXIgYnVmWzIwMF07CiAgICAgIHJlZ2Vycm9yIChlcnIsICZyZSwgYnVmLCBzaXplb2YgYnVmKTsKICAgICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgImNhbm5vdCBjb21waWxlIGV4cHJlc3Npb246ICVzIiwgYnVmKTsKICAgIH0KCiAgY250ID0gMDsKICBvZmZzZXQgPSAwOwogIGFzc2VydCAobWVtW21lbWxlbl0gPT0gJ1wwJyk7CiAgd2hpbGUgKG9mZnNldCA8IG1lbWxlbikKICAgIHsKICAgICAgcmVnbWF0Y2hfdCBtYVsxXTsKICAgICAgY29uc3QgY2hhciAqc3A7CiAgICAgIGNvbnN0IGNoYXIgKmVwOwoKICAgICAgZXJyID0gcmVnZXhlYyAoJnJlLCBtZW0gKyBvZmZzZXQsIDEsIG1hLCAwKTsKICAgICAgaWYgKGVyciA9PSBSRUdfTk9NQVRDSCkKCWJyZWFrOwoKICAgICAgaWYgKGVyciAhPSBSRUdfTk9FUlJPUikKCXsKCSAgY2hhciBidWZbMjAwXTsKCSAgcmVnZXJyb3IgKGVyciwgJnJlLCBidWYsIHNpemVvZiBidWYpOwoJICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCAiY2Fubm90IHVzZSBleHByZXNzaW9uOiAlcyIsIGJ1Zik7Cgl9CgogICAgICBhc3NlcnQgKG1hWzBdLnJtX3NvID49IDApOwogICAgICBzcCA9IG1lbSArIG9mZnNldCArIG1hWzBdLnJtX3NvOwogICAgICB3aGlsZSAoc3AgPiBtZW0gJiYgc3BbLTFdICE9ICdcbicpCgktLXNwOwoKICAgICAgZXAgPSBtZW0gKyBvZmZzZXQgKyBtYVswXS5ybV9zbzsKICAgICAgd2hpbGUgKCplcCAhPSAnXDAnICYmICplcCAhPSAnXG4nKQoJKytlcDsKCiAgICAgIHByaW50ZiAoIm1hdGNoICVkOiBcIiUuKnNcIlxuIiwgKytjbnQsIChpbnQpIChlcCAtIHNwKSwgc3ApOwoKICAgICAgb2Zmc2V0ID0gZXAgKyAxIC0gbWVtOwogICAgfQoKICByZWdmcmVlICgmcmUpOwoKI2lmIGRlZmluZWQgX1BPU0lYX0NQVVRJTUUgJiYgX1BPU0lYX0NQVVRJTUUgPj0gMAogIGlmICh1c2VfY2xvY2sgJiYgIXRpbWluZykKICAgIHsKICAgICAgdXNlX2Nsb2NrID0gY2xvY2tfZ2V0dGltZSAoY2wsICZmaW5pc2gpID09IDA7CiAgICAgIGlmICh1c2VfY2xvY2spCgl7CgkgIGlmIChmaW5pc2gudHZfbnNlYyA8IHN0YXJ0LnR2X25zZWMpCgkgICAgewoJICAgICAgZmluaXNoLnR2X25zZWMgLT0gc3RhcnQudHZfbnNlYyAtIDEwMDAwMDAwMDA7CgkgICAgICBmaW5pc2gudHZfc2VjIC09IDEgKyBzdGFydC50dl9zZWM7CgkgICAgfQoJICBlbHNlCgkgICAgewoJICAgICAgZmluaXNoLnR2X25zZWMgLT0gc3RhcnQudHZfbnNlYzsKCSAgICAgIGZpbmlzaC50dl9zZWMgLT0gc3RhcnQudHZfc2VjOwoJICAgIH0KCgkgIHByaW50ZiAoImVsYXBzZWQgdGltZTogJWpkLiUwOWpkIHNlY1xuIiwKCQkgIChpbnRtYXhfdCkgZmluaXNoLnR2X3NlYywgKGludG1heF90KSBmaW5pc2gudHZfbnNlYyk7Cgl9CiAgICB9CgogIGlmICh1c2VfY2xvY2sgJiYgdGltaW5nKQogICAgewogICAgICBzdHJ1Y3QgdGltZXNwZWMgbWludGltZSA9IHsgLnR2X3NlYyA9IDI0ICogNjAgKiA2MCB9OwoKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgKytpKQoJewoJICBvZmZzZXQgPSAwOwoJICB1c2VfY2xvY2sgPSBjbG9ja19nZXR0aW1lIChjbCwgJnN0YXJ0KSA9PSAwOwoKCSAgaWYgKCF1c2VfY2xvY2spCgkgICAgY29udGludWU7CgoJICBlcnIgPSByZWdjb21wICgmcmUsIGV4cHIsIFJFR19ORVdMSU5FIHwgKGljYXNlID8gUkVHX0lDQVNFIDogMCkpOwoJICBpZiAoZXJyICE9IFJFR19OT0VSUk9SKQoJICAgIGNvbnRpbnVlOwoKCSAgd2hpbGUgKG9mZnNldCA8IG1lbWxlbikKCSAgICB7CgkgICAgICByZWdtYXRjaF90IG1hWzFdOwoKCSAgICAgIGVyciA9IHJlZ2V4ZWMgKCZyZSwgbWVtICsgb2Zmc2V0LCAxLCBtYSwgMCk7CgkgICAgICBpZiAoZXJyICE9IFJFR19OT0VSUk9SKQoJCWJyZWFrOwoKCSAgICAgIG9mZnNldCArPSBtYVswXS5ybV9lbzsKCSAgICB9CgoJICByZWdmcmVlICgmcmUpOwoKCSAgdXNlX2Nsb2NrID0gY2xvY2tfZ2V0dGltZSAoY2wsICZmaW5pc2gpID09IDA7CgkgIGlmICh1c2VfY2xvY2spCgkgICAgewoJICAgICAgaWYgKGZpbmlzaC50dl9uc2VjIDwgc3RhcnQudHZfbnNlYykKCQl7CgkJICBmaW5pc2gudHZfbnNlYyAtPSBzdGFydC50dl9uc2VjIC0gMTAwMDAwMDAwMDsKCQkgIGZpbmlzaC50dl9zZWMgLT0gMSArIHN0YXJ0LnR2X3NlYzsKCQl9CgkgICAgICBlbHNlCgkJewoJCSAgZmluaXNoLnR2X25zZWMgLT0gc3RhcnQudHZfbnNlYzsKCQkgIGZpbmlzaC50dl9zZWMgLT0gc3RhcnQudHZfc2VjOwoJCX0KCSAgICAgIGlmIChmaW5pc2gudHZfc2VjIDwgbWludGltZS50dl9zZWMKCQkgIHx8IChmaW5pc2gudHZfc2VjID09IG1pbnRpbWUudHZfc2VjCgkJICAgICAgJiYgZmluaXNoLnR2X25zZWMgPCBtaW50aW1lLnR2X25zZWMpKQoJCW1pbnRpbWUgPSBmaW5pc2g7CgkgICAgfQoJfQogICAgICBwcmludGYgKCJlbGFwc2VkIHRpbWU6ICVqZC4lMDlqZCBzZWNcbiIsCgkgICAgICAoaW50bWF4X3QpIG1pbnRpbWUudHZfc2VjLCAoaW50bWF4X3QpIG1pbnRpbWUudHZfbnNlYyk7CiAgICB9CiNlbmRpZgoKICAvKiBSZXR1cm4gYW4gZXJyb3IgaWYgdGhlIG51bWJlciBvZiBtYXRjaGVzIGZvdW5kIGlzIG5vdCBtYXRjaCB3ZQogICAgIGV4cGVjdC4gICovCiAgcmV0dXJuIGNudCAhPSBleHBlY3RlZDsKfQoKCnN0YXRpYyBpbnQKcnVuX3Rlc3RfYmFja3dhcmRzIChjb25zdCBjaGFyICpleHByLCBjb25zdCBjaGFyICptZW0sIHNpemVfdCBtZW1sZW4sCgkJICAgIGludCBpY2FzZSwgaW50IGV4cGVjdGVkKQp7CiNpZiBkZWZpbmVkIF9QT1NJWF9DUFVUSU1FICYmIF9QT1NJWF9DUFVUSU1FID49IDAKICBzdHJ1Y3QgdGltZXNwZWMgc3RhcnQ7CiAgc3RydWN0IHRpbWVzcGVjIGZpbmlzaDsKI2VuZGlmCiAgc3RydWN0IHJlX3BhdHRlcm5fYnVmZmVyIHJlOwogIGNvbnN0IGNoYXIgKmVycjsKICBzaXplX3Qgb2Zmc2V0OwogIGludCBjbnQ7CgojaWYgZGVmaW5lZCBfUE9TSVhfQ1BVVElNRSAmJiBfUE9TSVhfQ1BVVElNRSA+PSAwCiAgaWYgKHVzZV9jbG9jayAmJiAhdGltaW5nKQogICAgdXNlX2Nsb2NrID0gY2xvY2tfZ2V0dGltZSAoY2wsICZzdGFydCkgPT0gMDsKI2VuZGlmCgogIHJlX3NldF9zeW50YXggKChSRV9TWU5UQVhfUE9TSVhfQkFTSUMgJiB+UkVfRE9UX05FV0xJTkUpCgkJIHwgUkVfSEFUX0xJU1RTX05PVF9ORVdMSU5FCgkJIHwgKGljYXNlID8gUkVfSUNBU0UgOiAwKSk7CgogIG1lbXNldCAoJnJlLCAwLCBzaXplb2YgKHJlKSk7CiAgcmUuZmFzdG1hcCA9IG1hbGxvYyAoMjU2KTsKICBpZiAocmUuZmFzdG1hcCA9PSBOVUxMKQogICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgZXJybm8sICJjYW5ub3QgYWxsb2NhdGUgZmFzdG1hcCIpOwoKICBlcnIgPSByZV9jb21waWxlX3BhdHRlcm4gKGV4cHIsIHN0cmxlbiAoZXhwciksICZyZSk7CiAgaWYgKGVyciAhPSBOVUxMKQogICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgImNhbm5vdCBjb21waWxlIGV4cHJlc3Npb246ICVzIiwgZXJyKTsKCiAgaWYgKHJlX2NvbXBpbGVfZmFzdG1hcCAoJnJlKSkKICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsICJjb3VsZG4ndCBjb21waWxlIGZhc3RtYXAiKTsKCiAgY250ID0gMDsKICBvZmZzZXQgPSBtZW1sZW47CiAgYXNzZXJ0IChtZW1bbWVtbGVuXSA9PSAnXDAnKTsKICB3aGlsZSAob2Zmc2V0IDw9IG1lbWxlbikKICAgIHsKICAgICAgaW50IHN0YXJ0OwogICAgICBjb25zdCBjaGFyICpzcDsKICAgICAgY29uc3QgY2hhciAqZXA7CgogICAgICBzdGFydCA9IHJlX3NlYXJjaCAoJnJlLCBtZW0sIG1lbWxlbiwgb2Zmc2V0LCAtb2Zmc2V0LCBOVUxMKTsKICAgICAgaWYgKHN0YXJ0ID09IC0xKQoJYnJlYWs7CgogICAgICBpZiAoc3RhcnQgPT0gLTIpCgllcnJvciAoRVhJVF9GQUlMVVJFLCAwLCAiaW50ZXJuYWwgZXJyb3IgaW4gcmVfc2VhcmNoIik7CgogICAgICBzcCA9IG1lbSArIHN0YXJ0OwogICAgICB3aGlsZSAoc3AgPiBtZW0gJiYgc3BbLTFdICE9ICdcbicpCgktLXNwOwoKICAgICAgZXAgPSBtZW0gKyBzdGFydDsKICAgICAgd2hpbGUgKCplcCAhPSAnXDAnICYmICplcCAhPSAnXG4nKQoJKytlcDsKCiAgICAgIHByaW50ZiAoIm1hdGNoICVkOiBcIiUuKnNcIlxuIiwgKytjbnQsIChpbnQpIChlcCAtIHNwKSwgc3ApOwoKICAgICAgb2Zmc2V0ID0gc3AgLSAxIC0gbWVtOwogICAgfQoKICByZWdmcmVlICgmcmUpOwoKI2lmIGRlZmluZWQgX1BPU0lYX0NQVVRJTUUgJiYgX1BPU0lYX0NQVVRJTUUgPj0gMAogIGlmICh1c2VfY2xvY2sgJiYgIXRpbWluZykKICAgIHsKICAgICAgdXNlX2Nsb2NrID0gY2xvY2tfZ2V0dGltZSAoY2wsICZmaW5pc2gpID09IDA7CiAgICAgIGlmICh1c2VfY2xvY2spCgl7CgkgIGlmIChmaW5pc2gudHZfbnNlYyA8IHN0YXJ0LnR2X25zZWMpCgkgICAgewoJICAgICAgZmluaXNoLnR2X25zZWMgLT0gc3RhcnQudHZfbnNlYyAtIDEwMDAwMDAwMDA7CgkgICAgICBmaW5pc2gudHZfc2VjIC09IDEgKyBzdGFydC50dl9zZWM7CgkgICAgfQoJICBlbHNlCgkgICAgewoJICAgICAgZmluaXNoLnR2X25zZWMgLT0gc3RhcnQudHZfbnNlYzsKCSAgICAgIGZpbmlzaC50dl9zZWMgLT0gc3RhcnQudHZfc2VjOwoJICAgIH0KCgkgIHByaW50ZiAoImVsYXBzZWQgdGltZTogJWpkLiUwOWpkIHNlY1xuIiwKCQkgIChpbnRtYXhfdCkgZmluaXNoLnR2X3NlYywgKGludG1heF90KSBmaW5pc2gudHZfbnNlYyk7Cgl9CiAgICB9CgogIGlmICh1c2VfY2xvY2sgJiYgdGltaW5nKQogICAgewogICAgICBzdHJ1Y3QgdGltZXNwZWMgbWludGltZSA9IHsgLnR2X3NlYyA9IDI0ICogNjAgKiA2MCB9OwoKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgKytpKQoJewoJICBvZmZzZXQgPSBtZW1sZW47CgkgIHVzZV9jbG9jayA9IGNsb2NrX2dldHRpbWUgKGNsLCAmc3RhcnQpID09IDA7CgoJICBpZiAoIXVzZV9jbG9jaykKCSAgICBjb250aW51ZTsKCgkgIG1lbXNldCAoJnJlLCAwLCBzaXplb2YgKHJlKSk7CgkgIHJlLmZhc3RtYXAgPSBtYWxsb2MgKDI1Nik7CgkgIGlmIChyZS5mYXN0bWFwID09IE5VTEwpCgkgICAgY29udGludWU7CgoJICBlcnIgPSByZV9jb21waWxlX3BhdHRlcm4gKGV4cHIsIHN0cmxlbiAoZXhwciksICZyZSk7CgkgIGlmIChlcnIgIT0gTlVMTCkKCSAgICBjb250aW51ZTsKCgkgIGlmIChyZV9jb21waWxlX2Zhc3RtYXAgKCZyZSkpCgkgICAgewoJICAgICAgcmVnZnJlZSAoJnJlKTsKCSAgICAgIGNvbnRpbnVlOwoJICAgIH0KCgkgIHdoaWxlIChvZmZzZXQgPD0gbWVtbGVuKQoJICAgIHsKCSAgICAgIGludCBzdGFydDsKCSAgICAgIGNvbnN0IGNoYXIgKnNwOwoKCSAgICAgIHN0YXJ0ID0gcmVfc2VhcmNoICgmcmUsIG1lbSwgbWVtbGVuLCBvZmZzZXQsIC1vZmZzZXQsIE5VTEwpOwoJICAgICAgaWYgKHN0YXJ0IDwgLTEpCgkJYnJlYWs7CgoJICAgICAgc3AgPSBtZW0gKyBzdGFydDsKCSAgICAgIHdoaWxlIChzcCA+IG1lbSAmJiBzcFstMV0gIT0gJ1xuJykKCQktLXNwOwoKCSAgICAgIG9mZnNldCA9IHNwIC0gMSAtIG1lbTsKCSAgICB9CgoJICByZWdmcmVlICgmcmUpOwoKCSAgdXNlX2Nsb2NrID0gY2xvY2tfZ2V0dGltZSAoY2wsICZmaW5pc2gpID09IDA7CgkgIGlmICh1c2VfY2xvY2spCgkgICAgewoJICAgICAgaWYgKGZpbmlzaC50dl9uc2VjIDwgc3RhcnQudHZfbnNlYykKCQl7CgkJICBmaW5pc2gudHZfbnNlYyAtPSBzdGFydC50dl9uc2VjIC0gMTAwMDAwMDAwMDsKCQkgIGZpbmlzaC50dl9zZWMgLT0gMSArIHN0YXJ0LnR2X3NlYzsKCQl9CgkgICAgICBlbHNlCgkJewoJCSAgZmluaXNoLnR2X25zZWMgLT0gc3RhcnQudHZfbnNlYzsKCQkgIGZpbmlzaC50dl9zZWMgLT0gc3RhcnQudHZfc2VjOwoJCX0KCSAgICAgIGlmIChmaW5pc2gudHZfc2VjIDwgbWludGltZS50dl9zZWMKCQkgIHx8IChmaW5pc2gudHZfc2VjID09IG1pbnRpbWUudHZfc2VjCgkJICAgICAgJiYgZmluaXNoLnR2X25zZWMgPCBtaW50aW1lLnR2X25zZWMpKQoJCW1pbnRpbWUgPSBmaW5pc2g7CgkgICAgfQoJfQogICAgICBwcmludGYgKCJlbGFwc2VkIHRpbWU6ICVqZC4lMDlqZCBzZWNcbiIsCgkgICAgICAoaW50bWF4X3QpIG1pbnRpbWUudHZfc2VjLCAoaW50bWF4X3QpIG1pbnRpbWUudHZfbnNlYyk7CiAgICB9CiNlbmRpZgoKICAvKiBSZXR1cm4gYW4gZXJyb3IgaWYgdGhlIG51bWJlciBvZiBtYXRjaGVzIGZvdW5kIGlzIG5vdCBtYXRjaCB3ZQogICAgIGV4cGVjdC4gICovCiAgcmV0dXJuIGNudCAhPSBleHBlY3RlZDsKfQoKLyogSWYgLS10aW1pbmcgaXMgdXNlZCB3ZSB3aWxsIG5lZWQgYSBsYXJnZXIgdGltb3V0LiAgKi8KI2RlZmluZSBUSU1FT1VUIDUwCiNkZWZpbmUgQ01ETElORV9PUFRJT05TIFwKICAgeyJ0aW1pbmciLCBub19hcmd1bWVudCwgJnRpbWluZywgMSB9LAojZGVmaW5lIFRFU1RfRlVOQ1RJT04gZG9fdGVzdCAoKQojaW5jbHVkZSAiLi4vdGVzdC1za2VsZXRvbi5jIgo=