I2lmbmRlZiBHSU1fUkFESVhTT1JUX0hfSU5DTFVERUQKI2RlZmluZSBHSU1fUkFESVhTT1JUX0hfSU5DTFVERUQKLyohIFxmaWxlIGdpbV9yYWRpeHNvcnQuaApcYXV0aG9yIEZyYW5jaXNjbyBMZX9uIE7famVyYS4KQmFzZWQgb24gdGhlIHdvcmsgb2YgTWljaGFlbCBIZXJmIDogImZhc3QgZmxvYXRpbmctcG9pbnQgcmFkaXggc29ydCIKQXZhbGlhYmxlIG9uIGh0dHA6Ly93d3cuc3RlcmVvcHNpcy5jb20vcmFkaXguaHRtbAoqLwovKgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpUaGlzIHNvdXJjZSBmaWxlIGlzIHBhcnQgb2YgR0lNUEFDVCBMaWJyYXJ5LgoKRm9yIHRoZSBsYXRlc3QgaW5mbywgc2VlIGh0dHA6Ly9naW1wYWN0LnNvdXJjZWZvcmdlLm5ldC8KCkNvcHlyaWdodCAoYykgMjAwNiBGcmFuY2lzY28gTGVvbiBOYWplcmEuIEMuQy4gODAwODczNzEuCmVtYWlsOiBwcm9qZWN0aWxlbWFuQHlhaG9vLmNvbQoKIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgRUlUSEVSOgogICAoMSkgVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CiAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uIFRoZSB0ZXh0IG9mIHRoZSBHTlUgTGVzc2VyCiAgICAgICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIHdpdGggdGhpcyBsaWJyYXJ5IGluIHRoZQogICAgICAgZmlsZSBHSU1QQUNULUxJQ0VOU0UtTEdQTC5UWFQuCiAgICgyKSBUaGUgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBpcyBpbmNsdWRlZCB3aXRoIHRoaXMgbGlicmFyeSBpbgogICAgICAgdGhlIGZpbGUgR0lNUEFDVC1MSUNFTlNFLUJTRC5UWFQuCiAgICgzKSBUaGUgemxpYi9saWJwbmcgbGljZW5zZSB0aGF0IGlzIGluY2x1ZGVkIHdpdGggdGhpcyBsaWJyYXJ5IGluCiAgICAgICB0aGUgZmlsZSBHSU1QQUNULUxJQ0VOU0UtWkxJQi5UWFQuCgogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIGZpbGVzCiBHSU1QQUNULUxJQ0VOU0UtTEdQTC5UWFQsIEdJTVBBQ1QtTElDRU5TRS1aTElCLlRYVCBhbmQgR0lNUEFDVC1MSUNFTlNFLUJTRC5UWFQgZm9yIG1vcmUgZGV0YWlscy4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiovCgojaW5jbHVkZSAiZ2ltX21lbW9yeS5oIgoKLy8vTWFjcm9zIGZvciBzb3J0aW5nLgovLyEgUHJvdG90eXBlIGZvciBjb21wYXJhdG9ycwpjbGFzcyBsZXNzX2NvbXBhcmF0b3IKewoJcHVibGljOgoKCXRlbXBsYXRlPGNsYXNzIFQsY2xhc3MgWj4KCWlubGluZSBpbnQgb3BlcmF0b3IoKSAoIGNvbnN0IFQmIGEsIGNvbnN0IFomIGIgKQoJewoJCXJldHVybiAoIGE8Yj8tMTooYT5iPzE6MCkpOwoJfQp9OwoKLy8hIFByb3RvdHlwZSBmb3IgY29tcGFyYXRvcnMKY2xhc3MgaW50ZWdlcl9jb21wYXJhdG9yCnsKCXB1YmxpYzoKCgl0ZW1wbGF0ZTxjbGFzcyBUPgoJaW5saW5lIGludCBvcGVyYXRvcigpICggY29uc3QgVCYgYSwgY29uc3QgVCYgYiApCgl7CgkJcmV0dXJuIChpbnQpKGEtYik7Cgl9Cn07CgovLyFQcm90b3R5cGUgZm9yIGdldHRpbmcgdGhlIGludGVnZXIgcmVwcmVzZW50YXRpb24gb2YgYW4gb2JqZWN0CmNsYXNzIHVpbnRfa2V5X2Z1bmMKewpwdWJsaWM6Cgl0ZW1wbGF0ZTxjbGFzcyBUPgoJaW5saW5lIEdVSU5UIG9wZXJhdG9yKCkoIGNvbnN0IFQmIGEpCgl7CgkJcmV0dXJuIChHVUlOVClhOwoJfQp9OwoKCi8vIVByb3RvdHlwZSBmb3IgY29weWluZyBlbGVtZW50cwpjbGFzcyBjb3B5X2VsZW1lbnRzX2Z1bmMKewpwdWJsaWM6Cgl0ZW1wbGF0ZTxjbGFzcyBUPgoJaW5saW5lIHZvaWQgb3BlcmF0b3IoKShUJiBhLFQmIGIpCgl7CgkJYSA9IGI7Cgl9Cn07CgovLyFQcm90b3R5cGUgZm9yIGNvcHlpbmcgZWxlbWVudHMKY2xhc3MgbWVtY29weV9lbGVtZW50c19mdW5jCnsKcHVibGljOgoJdGVtcGxhdGU8Y2xhc3MgVD4KCWlubGluZSB2b2lkIG9wZXJhdG9yKCkoVCYgYSxUJiBiKQoJewoJCWdpbV9zaW1kX21lbWNweSgmYSwmYixzaXplb2YoVCkpOwoJfQp9OwoKCi8vISBAewpzdHJ1Y3QgR0lNX1JTT1JUX1RPS0VOCnsKICAgIEdVSU5UIG1fa2V5OwogICAgR1VJTlQgbV92YWx1ZTsKICAgIEdJTV9SU09SVF9UT0tFTigpCiAgICB7CiAgICB9CiAgICBHSU1fUlNPUlRfVE9LRU4oY29uc3QgR0lNX1JTT1JUX1RPS0VOJiBydG9rZW4pCiAgICB7CiAgICAJbV9rZXkgPSBydG9rZW4ubV9rZXk7CiAgICAJbV92YWx1ZSA9IHJ0b2tlbi5tX3ZhbHVlOwogICAgfQoKICAgIGlubGluZSBib29sIG9wZXJhdG9yIDwoY29uc3QgR0lNX1JTT1JUX1RPS0VOJiBvdGhlcikgY29uc3QKCXsKCQlyZXR1cm4gKG1fa2V5IDwgb3RoZXIubV9rZXkpOwoJfQoKCWlubGluZSBib29sIG9wZXJhdG9yID4oY29uc3QgR0lNX1JTT1JUX1RPS0VOJiBvdGhlcikgY29uc3QKCXsKCQlyZXR1cm4gKG1fa2V5ID4gb3RoZXIubV9rZXkpOwoJfQp9OwoKLy8hIFByb3RvdHlwZSBmb3IgY29tcGFyYXRvcnMKY2xhc3MgR0lNX1JTT1JUX1RPS0VOX0NPTVBBUkFUT1IKewoJcHVibGljOgoKCWlubGluZSBpbnQgb3BlcmF0b3IoKSggY29uc3QgR0lNX1JTT1JUX1RPS0VOJiBhLCBjb25zdCBHSU1fUlNPUlRfVE9LRU4mIGIgKQoJewoJCXJldHVybiAoaW50KSgoYS5tX2tleSkgLSAoYi5tX2tleSkpOwoJfQp9OwoKCgojZGVmaW5lIGtIaXN0IDIwNDgKLy8gLS0tLSB1dGlscyBmb3IgYWNjZXNzaW5nIDExLWJpdCBxdWFudGl0aWVzCiNkZWZpbmUgRDExXzAoeCkJKHggJiAweDdGRikKI2RlZmluZSBEMTFfMSh4KQkoeCA+PiAxMSAmIDB4N0ZGKQojZGVmaW5lIEQxMV8yKHgpCSh4ID4+IDIyICkKCgoKLy8vUmFkaXggc29ydCBmb3IgdW5zaWduZWQgaW50ZWdlciBrZXlzCmlubGluZSB2b2lkIGdpbV9yYWRpeF9zb3J0X3J0b2tlbnMoCgkJCQlHSU1fUlNPUlRfVE9LRU4gKiBhcnJheSwKCQkJCUdJTV9SU09SVF9UT0tFTiAqIHNvcnRlZCwgR1VJTlQgZWxlbWVudF9jb3VudCkKewoJR1VJTlQgaTsKCUdVSU5UIGIwW2tIaXN0ICogM107CglHVUlOVCAqYjEgPSBiMCArIGtIaXN0OwoJR1VJTlQgKmIyID0gYjEgKyBrSGlzdDsKCWZvciAoaSA9IDA7IGkgPCBrSGlzdCAqIDM7ICsraSkKCXsKCQliMFtpXSA9IDA7Cgl9CglHVUlOVCBmaTsKCUdVSU5UIHBvczsKCWZvciAoaSA9IDA7IGkgPCBlbGVtZW50X2NvdW50OyArK2kpCgl7CgkgICAgZmkgPSBhcnJheVtpXS5tX2tleTsKCQliMFtEMTFfMChmaSldICsrOwoJCWIxW0QxMV8xKGZpKV0gKys7CgkJYjJbRDExXzIoZmkpXSArKzsKCX0KCXsKCQlHVUlOVCBzdW0wID0gMCwgc3VtMSA9IDAsIHN1bTIgPSAwOwoJCUdVSU5UIHRzdW07CgkJZm9yIChpID0gMDsgaSA8IGtIaXN0OyArK2kpCgkJewoJCQl0c3VtID0gYjBbaV0gKyBzdW0wOwoJCQliMFtpXSA9IHN1bTAgLSAxOwoJCQlzdW0wID0gdHN1bTsKCQkJdHN1bSA9IGIxW2ldICsgc3VtMTsKCQkJYjFbaV0gPSBzdW0xIC0gMTsKCQkJc3VtMSA9IHRzdW07CgkJCXRzdW0gPSBiMltpXSArIHN1bTI7CgkJCWIyW2ldID0gc3VtMiAtIDE7CgkJCXN1bTIgPSB0c3VtOwoJCX0KCX0KCWZvciAoaSA9IDA7IGkgPCBlbGVtZW50X2NvdW50OyArK2kpCgl7CiAgICAgICAgZmkgPSBhcnJheVtpXS5tX2tleTsKCQlwb3MgPSBEMTFfMChmaSk7CgkJcG9zID0gKytiMFtwb3NdOwoJCXNvcnRlZFtwb3NdLm1fa2V5ID0gYXJyYXlbaV0ubV9rZXk7CgkJc29ydGVkW3Bvc10ubV92YWx1ZSA9IGFycmF5W2ldLm1fdmFsdWU7Cgl9Cglmb3IgKGkgPSAwOyBpIDwgZWxlbWVudF9jb3VudDsgKytpKQoJewogICAgICAgIGZpID0gc29ydGVkW2ldLm1fa2V5OwoJCXBvcyA9IEQxMV8xKGZpKTsKCQlwb3MgPSArK2IxW3Bvc107CgkJYXJyYXlbcG9zXS5tX2tleSA9IHNvcnRlZFtpXS5tX2tleTsKCQlhcnJheVtwb3NdLm1fdmFsdWUgPSBzb3J0ZWRbaV0ubV92YWx1ZTsKCX0KCWZvciAoaSA9IDA7IGkgPCBlbGVtZW50X2NvdW50OyArK2kpCgl7CiAgICAgICAgZmkgPSBhcnJheVtpXS5tX2tleTsKCQlwb3MgPSBEMTFfMihmaSk7CgkJcG9zID0gKytiMltwb3NdOwoJCXNvcnRlZFtwb3NdLm1fa2V5ID0gYXJyYXlbaV0ubV9rZXk7CgkJc29ydGVkW3Bvc10ubV92YWx1ZSA9IGFycmF5W2ldLm1fdmFsdWU7Cgl9Cn0KCgoKCi8vLyBHZXQgdGhlIHNvcnRlZCB0b2tlbnMgZnJvbSBhbiBhcnJheS4gRm9yIGdlbmVyaWMgdXNlLiBUb2tlbnMgYXJlIElSUl9SU09SVF9UT0tFTgovKiEKKlxwYXJhbSBhcnJheSBBcnJheSBvZiBlbGVtZW50cyB0byBzb3J0CipccGFyYW0gc29ydGVkX3Rva2VucyBUb2tlbnMgb2Ygc29ydGVkIGVsZW1lbnRzCipccGFyYW0gZWxlbWVudF9jb3VudCBlbGVtZW50IGNvdW50CipccGFyYW0gdWludGtleV9tYWNybyBGdW5jdG9yIHdoaWNoIHJldHJpZXZlcyB0aGUgaW50ZWdlciByZXByZXNlbnRhdGlvbiBvZiBhbiBhcnJheSBlbGVtZW50CiovCnRlbXBsYXRlPHR5cGVuYW1lIFQsIGNsYXNzIEdFVEtFWV9DTEFTUz4Kdm9pZCBnaW1fcmFkaXhfc29ydF9hcnJheV90b2tlbnMoCgkJCVQqIGFycmF5ICwKCQkJR0lNX1JTT1JUX1RPS0VOICogc29ydGVkX3Rva2VucywKCQkJR1VJTlQgZWxlbWVudF9jb3VudCxHRVRLRVlfQ0xBU1MgdWludGtleV9tYWNybykKewoJR0lNX1JTT1JUX1RPS0VOICogX3Vuc29ydGVkID0gKEdJTV9SU09SVF9UT0tFTiAqKSBnaW1fYWxsb2Moc2l6ZW9mKEdJTV9SU09SVF9UT0tFTikqZWxlbWVudF9jb3VudCk7CiAgICBmb3IgKEdVSU5UIF9pPTA7X2k8ZWxlbWVudF9jb3VudDsrK19pKQogICAgewogICAgICAgIF91bnNvcnRlZFtfaV0ubV9rZXkgPSB1aW50a2V5X21hY3JvKGFycmF5W19pXSk7CiAgICAgICAgX3Vuc29ydGVkW19pXS5tX3ZhbHVlID0gX2k7CiAgICB9CiAgICBnaW1fcmFkaXhfc29ydF9ydG9rZW5zKF91bnNvcnRlZCxzb3J0ZWRfdG9rZW5zLGVsZW1lbnRfY291bnQpOwogICAgZ2ltX2ZyZWUoX3Vuc29ydGVkKTsKICAgIGdpbV9mcmVlKF91bnNvcnRlZCk7Cn0KCi8vLyBTb3J0cyBhcnJheSBpbiBwbGFjZS4gRm9yIGdlbmVyaWMgdXNlCi8qIQpccGFyYW0gdHlwZSBUeXBlIG9mIHRoZSBhcnJheQpccGFyYW0gYXJyYXkKXHBhcmFtIGVsZW1lbnRfY291bnQKXHBhcmFtIGdldF91aW50a2V5X21hY3JvIE1hY3JvIGZvciBleHRyYWN0IHRoZSBJbnRlZ2VyIHZhbHVlIG9mIHRoZSBlbGVtZW50LiBTaW1pbGFyIHRvIFNJTVBMRV9HRVRfVUlOVEtFWQpccGFyYW0gY29weV9lbGVtZW50c19tYWNybyBNYWNybyBmb3IgY29weSBlbGVtZW50cywgc2ltaWxhciB0byBTSU1QTEVfQ09QWV9FTEVNRU5UUwoqLwp0ZW1wbGF0ZTx0eXBlbmFtZSBULCBjbGFzcyBHRVRLRVlfQ0xBU1MsIGNsYXNzIENPUFlfQ0xBU1M+CnZvaWQgZ2ltX3JhZGl4X3NvcnQoCglUICogYXJyYXksIEdVSU5UIGVsZW1lbnRfY291bnQsCglHRVRLRVlfQ0xBU1MgZ2V0X3VpbnRrZXlfbWFjcm8sIENPUFlfQ0xBU1MgY29weV9lbGVtZW50c19tYWNybykKewoJR0lNX1JTT1JUX1RPS0VOICogX3NvcnRlZCA9IChHSU1fUlNPUlRfVE9LRU4gICopIGdpbV9hbGxvYyhzaXplb2YoR0lNX1JTT1JUX1RPS0VOKSplbGVtZW50X2NvdW50KTsKICAgIGdpbV9yYWRpeF9zb3J0X2FycmF5X3Rva2VucyhhcnJheSxfc29ydGVkLGVsZW1lbnRfY291bnQsZ2V0X3VpbnRrZXlfbWFjcm8pOwogICAgVCAqIF9vcmlnaW5hbF9hcnJheSA9IChUICopIGdpbV9hbGxvYyhzaXplb2YoVCkqZWxlbWVudF9jb3VudCk7CiAgICBnaW1fc2ltZF9tZW1jcHkoX29yaWdpbmFsX2FycmF5LGFycmF5LHNpemVvZihUKSplbGVtZW50X2NvdW50KTsKICAgIGZvciAoR1VJTlQgX2k9MDtfaTxlbGVtZW50X2NvdW50OysrX2kpCiAgICB7CiAgICAgICAgY29weV9lbGVtZW50c19tYWNybyhhcnJheVtfaV0sX29yaWdpbmFsX2FycmF5W19zb3J0ZWRbX2ldLm1fdmFsdWVdKTsKICAgIH0KICAgIGdpbV9mcmVlKF9vcmlnaW5hbF9hcnJheSk7CiAgICBnaW1fZnJlZShfc29ydGVkKTsKfQoKLy8hIEZhaWxzYWZlIEl0ZXJhdGl2ZSBiaW5hcnkgc2VhcmNoLAovKiEKSWYgdGhlIGVsZW1lbnQgaXMgbm90IGZvdW5kLCBpdCByZXR1cm5zIHRoZSBuZWFyZXN0IHVwcGVyIGVsZW1lbnQgcG9zaXRpb24sIG1heSBiZSB0aGUgZnVydGhlciBwb3NpdGlvbiBhZnRlciB0aGUgbGFzdCBlbGVtZW50LgpccGFyYW0gX2FycmF5ClxwYXJhbSBfc3RhcnRfaSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheQpccGFyYW0gX2VuZF9pIHRoZSBlbmRpbmcgIGluZGV4IG9mIHRoZSBhcnJheQpccGFyYW0gX3NlYXJjaF9rZXkgVmFsdWUgdG8gZmluZApccGFyYW0gX2NvbXBfbWFjcm8gbWFjcm8gZm9yIGNvbXBhcmluZyBlbGVtZW50cwpccGFyYW0gX2ZvdW5kIElmIHRydWUgdGhlIHZhbHVlIGhhcyBmb3VuZC4gQm9vbGVhbgpccGFyYW0gX3Jlc3VsdF9pbmRleCB0aGUgaW5kZXggb2YgdGhlIGZvdW5kIGVsZW1lbnQsIG9yIGlmIG5vdCBmb3VuZCB0aGVuIGl0IHdpbGwgZ2V0IHRoZSBpbmRleCBvZiB0aGUgIGNsb3Nlc3QgYmlnZ2VyIHZhbHVlCiovCnRlbXBsYXRlPGNsYXNzIFQsIHR5cGVuYW1lIEtFWUNMQVNTLCB0eXBlbmFtZSBDT01QX0NMQVNTPgpib29sICBnaW1fYmluYXJ5X3NlYXJjaF9leCgKCQljb25zdCBUKiBfYXJyYXksIEdVSU5UIF9zdGFydF9pLAoJCUdVSU5UIF9lbmRfaSxHVUlOVCAmIF9yZXN1bHRfaW5kZXgsCgkJY29uc3QgS0VZQ0xBU1MgJiBfc2VhcmNoX2tleSwKCQlDT01QX0NMQVNTIF9jb21wX21hY3JvKQp7CglHVUlOVCBfazsKCWludCBfY29tcF9yZXN1bHQ7CglHVUlOVCBfaSA9IF9zdGFydF9pOwoJR1VJTlQgX2ogPSBfZW5kX2krMTsKCXdoaWxlIChfaSA8IF9qKQoJewoJCV9rID0gKF9qK19pLTEpLzI7CgkJX2NvbXBfcmVzdWx0ID0gX2NvbXBfbWFjcm8oX2FycmF5W19rXSwgX3NlYXJjaF9rZXkpOwoJCWlmIChfY29tcF9yZXN1bHQgPT0gMCkKCQl7CgkJCV9yZXN1bHRfaW5kZXggPSBfazsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCWVsc2UgaWYgKF9jb21wX3Jlc3VsdCA8IDApCgkJewoJCQlfaSA9IF9rKzE7CgkJfQoJCWVsc2UKCQl7CgkJCV9qID0gX2s7CgkJfQoJfQoJX3Jlc3VsdF9pbmRleCA9IF9pOwoJcmV0dXJuIGZhbHNlOwp9CgoKCi8vISBGYWlsc2FmZSBJdGVyYXRpdmUgYmluYXJ5IHNlYXJjaCxUZW1wbGF0ZSB2ZXJzaW9uCi8qIQpJZiB0aGUgZWxlbWVudCBpcyBub3QgZm91bmQsIGl0IHJldHVybnMgdGhlIG5lYXJlc3QgdXBwZXIgZWxlbWVudCBwb3NpdGlvbiwgbWF5IGJlIHRoZSBmdXJ0aGVyIHBvc2l0aW9uIGFmdGVyIHRoZSBsYXN0IGVsZW1lbnQuClxwYXJhbSBfYXJyYXkKXHBhcmFtIF9zdGFydF9pIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5ClxwYXJhbSBfZW5kX2kgdGhlIGVuZGluZyAgaW5kZXggb2YgdGhlIGFycmF5ClxwYXJhbSBfc2VhcmNoX2tleSBWYWx1ZSB0byBmaW5kClxwYXJhbSBfcmVzdWx0X2luZGV4IHRoZSBpbmRleCBvZiB0aGUgZm91bmQgZWxlbWVudCwgb3IgaWYgbm90IGZvdW5kIHRoZW4gaXQgd2lsbCBnZXQgdGhlIGluZGV4IG9mIHRoZSAgY2xvc2VzdCBiaWdnZXIgdmFsdWUKXHJldHVybiB0cnVlIGlmIGZvdW5kLCBlbHNlIGZhbHNlCiovCnRlbXBsYXRlPGNsYXNzIFQ+CmJvb2wgZ2ltX2JpbmFyeV9zZWFyY2goCgljb25zdCBUKl9hcnJheSxHVUlOVCBfc3RhcnRfaSwKCUdVSU5UIF9lbmRfaSxjb25zdCBUICYgX3NlYXJjaF9rZXksCglHVUlOVCAmIF9yZXN1bHRfaW5kZXgpCnsKCUdVSU5UIF9pID0gX3N0YXJ0X2k7CglHVUlOVCBfaiA9IF9lbmRfaSsxOwoJR1VJTlQgX2s7Cgl3aGlsZShfaSA8IF9qKQoJewoJCV9rID0gKF9qK19pLTEpLzI7CgkJaWYoX2FycmF5W19rXT09X3NlYXJjaF9rZXkpCgkJewoJCQlfcmVzdWx0X2luZGV4ID0gX2s7CgkJCXJldHVybiB0cnVlOwoJCX0KCQllbHNlIGlmIChfYXJyYXlbX2tdPF9zZWFyY2hfa2V5KQoJCXsKCQkJX2kgPSBfaysxOwoJCX0KCQllbHNlCgkJewoJCQlfaiA9IF9rOwoJCX0KCX0KCV9yZXN1bHRfaW5kZXggPSBfaTsKCXJldHVybiBmYWxzZTsKfQoKCgovLy9oZWFwIHNvcnQgZnJvbSBodHRwOi8vd3d3LmNzc2UubW9uYXNoLmVkdS5hdS9+bGxveWQvdGlsZGVBbGdEUy9Tb3J0L0hlYXAvCnRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBDT01QX0NMQVNTPgp2b2lkIGdpbV9kb3duX2hlYXAoVCAqcEFyciwgR1VJTlQgaywgR1VJTlQgbixDT01QX0NMQVNTIENvbXBhcmVGdW5jKQp7CgkvKiAgUFJFOiBhW2srMS4uTl0gaXMgYSBoZWFwICovCgkvKiBQT1NUOiAgYVtrLi5OXSAgaXMgYSBoZWFwICovCgoJVCB0ZW1wID0gcEFycltrIC0gMV07CgkvKiBrIGhhcyBjaGlsZChzKSAqLwoJd2hpbGUgKGsgPD0gbi8yKQoJewoJCWludCBjaGlsZCA9IDIqazsKCgkJaWYgKChjaGlsZCA8IChpbnQpbikgJiYgQ29tcGFyZUZ1bmMocEFycltjaGlsZCAtIDFdICwgcEFycltjaGlsZF0pPDApCgkJewoJCQljaGlsZCsrOwoJCX0KCQkvKiBwaWNrIGxhcmdlciBjaGlsZCAqLwoJCWlmIChDb21wYXJlRnVuYyh0ZW1wICwgcEFycltjaGlsZCAtIDFdKTwwKQoJCXsKCQkJLyogbW92ZSBjaGlsZCB1cCAqLwoJCQlwQXJyW2sgLSAxXSA9IHBBcnJbY2hpbGQgLSAxXTsKCQkJayA9IGNoaWxkOwoJCX0KCQllbHNlCgkJewoJCQlicmVhazsKCQl9Cgl9CglwQXJyW2sgLSAxXSA9IHRlbXA7Cn0gLypkb3duSGVhcCovCgoKdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIENPTVBfQ0xBU1M+CnZvaWQgZ2ltX2hlYXBfc29ydChUICpwQXJyLCBHVUlOVCBlbGVtZW50X2NvdW50LCBDT01QX0NMQVNTIENvbXBhcmVGdW5jKQp7CgkvKiBzb3J0IGFbMC4uTi0xXSwgIE4uQi4gMCB0byBOLTEgKi8KCUdVSU5UIGs7CglHVUlOVCBuID0gZWxlbWVudF9jb3VudDsKCWZvciAoayA9IG4vMjsgayA+IDA7IGstLSkKCXsKCQlnaW1fZG93bl9oZWFwKHBBcnIsIGssIG4sIENvbXBhcmVGdW5jKTsKCX0KCgkvKiBhWzEuLk5dIGlzIG5vdyBhIGhlYXAgKi8KCXdoaWxlICggbj49MiApCgl7CgkJZ2ltX3N3YXBfZWxlbWVudHMocEFyciwwLG4tMSk7IC8qIGxhcmdlc3Qgb2YgYVswLi5uLTFdICovCgkJLS1uOwoJCS8qIHJlc3RvcmUgYVsxLi5pLTFdIGhlYXAgKi8KCQlnaW1fZG93bl9oZWFwKHBBcnIsIDEsIG4sIENvbXBhcmVGdW5jKTsKCX0KfQoKCgoKI2VuZGlmIC8vIEdJTV9SQURJWFNPUlRfSF9JTkNMVURFRAo=